From 0d68adcde20eae54c03f1142d2ee0da855a9c76c Mon Sep 17 00:00:00 2001 From: Tomster Date: Sun, 26 Jun 2016 11:08:09 +0200 Subject: [PATCH 001/556] Initial Commit from Ember CLI v2.5.1 _..., ,:^;,...; -+===;. ,,--++====++-,,, .: /....., :::::~+++++#:,+#++++++++++++++++++#*..: /,...... (,,,,,,::=+++##++++++++++++++++++++++#. :....../ ...,,,,,::++++++++++++++++++++++++++++++*..,...: *..+...,#@@@@@@@@@++++++++++++++++++++++#*....* @#,;##############@@@+*+#@@@@@@@@@@#*++#..< *@##@@+,-*^^^*-+@####@@@######@@@#####@@,,,+ @#@* @#@@@@#@@+--*^^*--#@@@@@@# @#@. @# @##+++@#, .@@#@@ #@# @@ +@@++++#@@ @@ :@@ :@#* @#@++++++@#* #@ @@+ :*+@@#;,.__.+@#@+,-^^.++@# @@++ ;* :*@@@##@@@@;++r._j^.+@##@+,.__,,@@++. /* ........+++++++++++++#@@@@@###@@#++++, ,: ...,@@@#++===----==@@@####,,....+++++ .: ......@@##@\ ; :@####@,,...... +++. ; .........@###, ; ;xx#@;,,..... *;+, | ........,*;xxxx--^--=xxx,........ :+#; ; ......,,;xxxxxxxxxxxxx;,..... *+# ; ......,::xxxx;. ...... +. . *; ......... +### .... / ,. /:| ,. .+: ... ;##++##, . ,#. (..v..;*./ ** ## ###* .:*&&&+. \.,....<, #&+**==-..,,__ ;## ### :,*+&&&&&&&v+#&,,.._/ #&&&&*...,::,,. ##; ,##* .*****;:&&&&&&&&& ,+*+;~*..*** *.* ### ###* ******* *+#&;* ##,;## **** :, ** ##### ## ### ###, ######## .##### ;## ## ####### ;## #### ,###. ########## ######## ### #### ### ### ### ########## #### #### ,## ### #######* ### ,### ##############: ## ### #### ,## :#### ### ##; ########## ########### ## .## ,### ####### ##### :###### ###### .###### #### ## ### ### ######* :##### #### ############# #### ################ ######## ### #####* *#* #: :### *###* *#### #* --- .bowerrc | 4 ++ .editorconfig | 34 +++++++++++++++++ .ember-cli | 9 +++++ .gitignore | 17 +++++++++ .jshintrc | 32 ++++++++++++++++ .travis.yml | 22 +++++++++++ .watchmanconfig | 3 ++ README.md | 53 ++++++++++++++++++++++++++ app/app.js | 18 +++++++++ app/components/.gitkeep | 0 app/controllers/.gitkeep | 0 app/helpers/.gitkeep | 0 app/index.html | 25 ++++++++++++ app/models/.gitkeep | 0 app/resolver.js | 3 ++ app/router.js | 11 ++++++ app/routes/.gitkeep | 0 app/styles/app.css | 0 app/templates/application.hbs | 3 ++ app/templates/components/.gitkeep | 0 bower.json | 9 +++++ config/environment.js | 47 +++++++++++++++++++++++ ember-cli-build.js | 24 ++++++++++++ package.json | 42 ++++++++++++++++++++ public/crossdomain.xml | 15 ++++++++ public/robots.txt | 3 ++ testem.js | 13 +++++++ tests/.jshintrc | 52 +++++++++++++++++++++++++ tests/helpers/destroy-app.js | 5 +++ tests/helpers/module-for-acceptance.js | 23 +++++++++++ tests/helpers/resolver.js | 11 ++++++ tests/helpers/start-app.js | 18 +++++++++ tests/index.html | 34 +++++++++++++++++ tests/integration/.gitkeep | 0 tests/test-helper.js | 6 +++ tests/unit/.gitkeep | 0 vendor/.gitkeep | 0 37 files changed, 536 insertions(+) create mode 100644 .bowerrc create mode 100644 .editorconfig create mode 100644 .ember-cli create mode 100644 .gitignore create mode 100644 .jshintrc create mode 100644 .travis.yml create mode 100644 .watchmanconfig create mode 100644 README.md create mode 100644 app/app.js create mode 100644 app/components/.gitkeep create mode 100644 app/controllers/.gitkeep create mode 100644 app/helpers/.gitkeep create mode 100644 app/index.html create mode 100644 app/models/.gitkeep create mode 100644 app/resolver.js create mode 100644 app/router.js create mode 100644 app/routes/.gitkeep create mode 100644 app/styles/app.css create mode 100644 app/templates/application.hbs create mode 100644 app/templates/components/.gitkeep create mode 100644 bower.json create mode 100644 config/environment.js create mode 100644 ember-cli-build.js create mode 100644 package.json create mode 100644 public/crossdomain.xml create mode 100644 public/robots.txt create mode 100644 testem.js create mode 100644 tests/.jshintrc create mode 100644 tests/helpers/destroy-app.js create mode 100644 tests/helpers/module-for-acceptance.js create mode 100644 tests/helpers/resolver.js create mode 100644 tests/helpers/start-app.js create mode 100644 tests/index.html create mode 100644 tests/integration/.gitkeep create mode 100644 tests/test-helper.js create mode 100644 tests/unit/.gitkeep create mode 100644 vendor/.gitkeep diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..959e169 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "bower_components", + "analytics": false +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..47c5438 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,34 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.js] +indent_style = space +indent_size = 2 + +[*.hbs] +insert_final_newline = false +indent_style = space +indent_size = 2 + +[*.css] +indent_style = space +indent_size = 2 + +[*.html] +indent_style = space +indent_size = 2 + +[*.{diff,md}] +trim_trailing_whitespace = false diff --git a/.ember-cli b/.ember-cli new file mode 100644 index 0000000..ee64cfe --- /dev/null +++ b/.ember-cli @@ -0,0 +1,9 @@ +{ + /** + Ember CLI sends analytics information by default. The data is completely + anonymous, but there are times when you might want to disable this behavior. + + Setting `disableAnalytics` to true will prevent any data from being sent. + */ + "disableAnalytics": false +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..86fceae --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules +/bower_components + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..08096ef --- /dev/null +++ b/.jshintrc @@ -0,0 +1,32 @@ +{ + "predef": [ + "document", + "window", + "-Promise" + ], + "browser": true, + "boss": true, + "curly": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true, + "unused": true +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..64533be --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +--- +language: node_js +node_js: + - "4" + +sudo: false + +cache: + directories: + - node_modules + +before_install: + - npm config set spin false + - npm install -g bower + - npm install phantomjs-prebuilt + +install: + - npm install + - bower install + +script: + - npm test diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 0000000..e7834e3 --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1,3 @@ +{ + "ignore_dirs": ["tmp", "dist"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..4dff7cf --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# Villasweb-frontend + +This README outlines the details of collaborating on this Ember application. +A short introduction of this app could easily go here. + +## Prerequisites + +You will need the following things properly installed on your computer. + +* [Git](http://git-scm.com/) +* [Node.js](http://nodejs.org/) (with NPM) +* [Bower](http://bower.io/) +* [Ember CLI](http://ember-cli.com/) +* [PhantomJS](http://phantomjs.org/) + +## Installation + +* `git clone ` this repository +* change into the new directory +* `npm install` +* `bower install` + +## Running / Development + +* `ember server` +* Visit your app at [http://localhost:4200](http://localhost:4200). + +### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `ember test` +* `ember test --server` + +### Building + +* `ember build` (development) +* `ember build --environment production` (production) + +### Deploying + +Specify what it takes to deploy your app. + +## Further Reading / Useful Links + +* [ember.js](http://emberjs.com/) +* [ember-cli](http://ember-cli.com/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) + diff --git a/app/app.js b/app/app.js new file mode 100644 index 0000000..831ad61 --- /dev/null +++ b/app/app.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; +import Resolver from './resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from './config/environment'; + +let App; + +Ember.MODEL_FACTORY_INJECTIONS = true; + +App = Ember.Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver +}); + +loadInitializers(App, config.modulePrefix); + +export default App; diff --git a/app/components/.gitkeep b/app/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/helpers/.gitkeep b/app/helpers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000..fd514c9 --- /dev/null +++ b/app/index.html @@ -0,0 +1,25 @@ + + + + + + VILLASwebFrontend + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + diff --git a/app/models/.gitkeep b/app/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/resolver.js b/app/resolver.js new file mode 100644 index 0000000..2fb563d --- /dev/null +++ b/app/resolver.js @@ -0,0 +1,3 @@ +import Resolver from 'ember-resolver'; + +export default Resolver; diff --git a/app/router.js b/app/router.js new file mode 100644 index 0000000..3bba78e --- /dev/null +++ b/app/router.js @@ -0,0 +1,11 @@ +import Ember from 'ember'; +import config from './config/environment'; + +const Router = Ember.Router.extend({ + location: config.locationType +}); + +Router.map(function() { +}); + +export default Router; diff --git a/app/routes/.gitkeep b/app/routes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/styles/app.css b/app/styles/app.css new file mode 100644 index 0000000..e69de29 diff --git a/app/templates/application.hbs b/app/templates/application.hbs new file mode 100644 index 0000000..f8bc38e --- /dev/null +++ b/app/templates/application.hbs @@ -0,0 +1,3 @@ +

Welcome to Ember

+ +{{outlet}} diff --git a/app/templates/components/.gitkeep b/app/templates/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..edb8acd --- /dev/null +++ b/bower.json @@ -0,0 +1,9 @@ +{ + "name": "villasweb-frontend", + "dependencies": { + "ember": "~2.5.0", + "ember-cli-shims": "0.1.1", + "ember-cli-test-loader": "0.2.2", + "ember-qunit-notifications": "0.1.0" + } +} diff --git a/config/environment.js b/config/environment.js new file mode 100644 index 0000000..ea199a4 --- /dev/null +++ b/config/environment.js @@ -0,0 +1,47 @@ +/* jshint node: true */ + +module.exports = function(environment) { + var ENV = { + modulePrefix: 'villasweb-frontend', + environment: environment, + baseURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + } + }; + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.baseURL = '/'; + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + } + + if (environment === 'production') { + + } + + return ENV; +}; diff --git a/ember-cli-build.js b/ember-cli-build.js new file mode 100644 index 0000000..2537ce2 --- /dev/null +++ b/ember-cli-build.js @@ -0,0 +1,24 @@ +/*jshint node:true*/ +/* global require, module */ +var EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function(defaults) { + var app = new EmberApp(defaults, { + // Add options here + }); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..fc3c8dd --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "villasweb-frontend", + "version": "0.0.0", + "description": "Small description for villasweb-frontend goes here", + "private": true, + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "build": "ember build", + "start": "ember server", + "test": "ember test" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "broccoli-asset-rev": "^2.4.2", + "ember-ajax": "0.7.1", + "ember-cli": "2.5.1", + "ember-cli-app-version": "^1.0.0", + "ember-cli-babel": "^5.1.6", + "ember-cli-dependency-checker": "^1.2.0", + "ember-cli-htmlbars": "^1.0.3", + "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-inject-live-reload": "^1.4.0", + "ember-cli-jshint": "^1.0.0", + "ember-cli-qunit": "^1.4.0", + "ember-cli-release": "0.2.8", + "ember-cli-sri": "^2.1.0", + "ember-cli-uglify": "^1.2.0", + "ember-data": "^2.5.0", + "ember-export-application-global": "^1.0.5", + "ember-load-initializers": "^0.5.1", + "ember-resolver": "^2.0.3", + "loader.js": "^4.0.1" + } +} diff --git a/public/crossdomain.xml b/public/crossdomain.xml new file mode 100644 index 0000000..0c16a7a --- /dev/null +++ b/public/crossdomain.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..f591645 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# http://www.robotstxt.org +User-agent: * +Disallow: diff --git a/testem.js b/testem.js new file mode 100644 index 0000000..26044b2 --- /dev/null +++ b/testem.js @@ -0,0 +1,13 @@ +/*jshint node:true*/ +module.exports = { + "framework": "qunit", + "test_page": "tests/index.html?hidepassed", + "disable_watching": true, + "launch_in_ci": [ + "PhantomJS" + ], + "launch_in_dev": [ + "PhantomJS", + "Chrome" + ] +}; diff --git a/tests/.jshintrc b/tests/.jshintrc new file mode 100644 index 0000000..6ec0b7c --- /dev/null +++ b/tests/.jshintrc @@ -0,0 +1,52 @@ +{ + "predef": [ + "document", + "window", + "location", + "setTimeout", + "$", + "-Promise", + "define", + "console", + "visit", + "exists", + "fillIn", + "click", + "keyEvent", + "triggerEvent", + "find", + "findWithAssert", + "wait", + "DS", + "andThen", + "currentURL", + "currentPath", + "currentRouteName" + ], + "node": false, + "browser": false, + "boss": true, + "curly": true, + "debug": false, + "devel": false, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true, + "unused": true +} diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js new file mode 100644 index 0000000..c3d4d1a --- /dev/null +++ b/tests/helpers/destroy-app.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; + +export default function destroyApp(application) { + Ember.run(application, 'destroy'); +} diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js new file mode 100644 index 0000000..8c8b74e --- /dev/null +++ b/tests/helpers/module-for-acceptance.js @@ -0,0 +1,23 @@ +import { module } from 'qunit'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; + +export default function(name, options = {}) { + module(name, { + beforeEach() { + this.application = startApp(); + + if (options.beforeEach) { + options.beforeEach.apply(this, arguments); + } + }, + + afterEach() { + if (options.afterEach) { + options.afterEach.apply(this, arguments); + } + + destroyApp(this.application); + } + }); +} diff --git a/tests/helpers/resolver.js b/tests/helpers/resolver.js new file mode 100644 index 0000000..b208d38 --- /dev/null +++ b/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from '../../resolver'; +import config from '../../config/environment'; + +const resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js new file mode 100644 index 0000000..e098f1d --- /dev/null +++ b/tests/helpers/start-app.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; +import Application from '../../app'; +import config from '../../config/environment'; + +export default function startApp(attrs) { + let application; + + let attributes = Ember.merge({}, config.APP); + attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; + + Ember.run(() => { + application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + }); + + return application; +} diff --git a/tests/index.html b/tests/index.html new file mode 100644 index 0000000..9cffb74 --- /dev/null +++ b/tests/index.html @@ -0,0 +1,34 @@ + + + + + + VILLASwebFrontend Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + + + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + diff --git a/tests/integration/.gitkeep b/tests/integration/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/test-helper.js b/tests/test-helper.js new file mode 100644 index 0000000..e6cfb70 --- /dev/null +++ b/tests/test-helper.js @@ -0,0 +1,6 @@ +import resolver from './helpers/resolver'; +import { + setResolver +} from 'ember-qunit'; + +setResolver(resolver); diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/.gitkeep b/vendor/.gitkeep new file mode 100644 index 0000000..e69de29 From 9f8a165c690143c6d0b8ec20901cdf57720fbdfc Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 26 Jun 2016 13:35:06 +0200 Subject: [PATCH 002/556] Add user and project data from backend --- .gitignore | 2 + app/adapters/application.js | 8 ++ app/authenticators/custom.js | 47 +++++++++ app/authorizers/custom.js | 12 +++ app/controllers/application.js | 5 + app/controllers/login.js | 14 +++ app/controllers/project/new.js | 11 ++ app/models/project.js | 8 ++ app/models/user.js | 10 ++ app/router.js | 9 ++ app/routes/application.js | 10 ++ app/routes/index.js | 5 + app/routes/login.js | 4 + app/routes/project/delete.js | 4 + app/routes/project/edit.js | 4 + app/routes/project/index.js | 8 ++ app/routes/project/new.js | 4 + app/routes/projects.js | 8 ++ app/serializers/application.js | 5 + app/styles/app.css | 106 ++++++++++++++++++++ app/templates/application.hbs | 27 ++++- app/templates/index.hbs | 1 + app/templates/login.hbs | 19 ++++ app/templates/project/delete.hbs | 1 + app/templates/project/edit.hbs | 1 + app/templates/project/index.hbs | 4 + app/templates/project/new.hbs | 16 +++ app/templates/projects.hbs | 9 ++ package.json | 3 +- tests/unit/adapters/application-test.js | 12 +++ tests/unit/controllers/application-test.js | 12 +++ tests/unit/controllers/login-test.js | 12 +++ tests/unit/controllers/projects/new-test.js | 12 +++ tests/unit/models/project-test.js | 12 +++ tests/unit/models/user-test.js | 12 +++ tests/unit/routes/application-test.js | 11 ++ tests/unit/routes/index-test.js | 11 ++ tests/unit/routes/login-test.js | 11 ++ tests/unit/routes/projects-test.js | 11 ++ tests/unit/routes/projects/delete-test.js | 11 ++ tests/unit/routes/projects/edit-test.js | 11 ++ tests/unit/routes/projects/index-test.js | 11 ++ tests/unit/routes/projects/new-test.js | 11 ++ tests/unit/routes/projects/project-test.js | 11 ++ tests/unit/serializers/application-test.js | 15 +++ 45 files changed, 548 insertions(+), 3 deletions(-) create mode 100644 app/adapters/application.js create mode 100644 app/authenticators/custom.js create mode 100644 app/authorizers/custom.js create mode 100644 app/controllers/application.js create mode 100644 app/controllers/login.js create mode 100644 app/controllers/project/new.js create mode 100644 app/models/project.js create mode 100644 app/models/user.js create mode 100644 app/routes/application.js create mode 100644 app/routes/index.js create mode 100644 app/routes/login.js create mode 100644 app/routes/project/delete.js create mode 100644 app/routes/project/edit.js create mode 100644 app/routes/project/index.js create mode 100644 app/routes/project/new.js create mode 100644 app/routes/projects.js create mode 100644 app/serializers/application.js create mode 100644 app/templates/index.hbs create mode 100644 app/templates/login.hbs create mode 100644 app/templates/project/delete.hbs create mode 100644 app/templates/project/edit.hbs create mode 100644 app/templates/project/index.hbs create mode 100644 app/templates/project/new.hbs create mode 100644 app/templates/projects.hbs create mode 100644 tests/unit/adapters/application-test.js create mode 100644 tests/unit/controllers/application-test.js create mode 100644 tests/unit/controllers/login-test.js create mode 100644 tests/unit/controllers/projects/new-test.js create mode 100644 tests/unit/models/project-test.js create mode 100644 tests/unit/models/user-test.js create mode 100644 tests/unit/routes/application-test.js create mode 100644 tests/unit/routes/index-test.js create mode 100644 tests/unit/routes/login-test.js create mode 100644 tests/unit/routes/projects-test.js create mode 100644 tests/unit/routes/projects/delete-test.js create mode 100644 tests/unit/routes/projects/edit-test.js create mode 100644 tests/unit/routes/projects/index-test.js create mode 100644 tests/unit/routes/projects/new-test.js create mode 100644 tests/unit/routes/projects/project-test.js create mode 100644 tests/unit/serializers/application-test.js diff --git a/.gitignore b/.gitignore index 86fceae..b876c89 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ /libpeerconnection.log npm-debug.log testem.log + +.DS_Store diff --git a/app/adapters/application.js b/app/adapters/application.js new file mode 100644 index 0000000..615bbc0 --- /dev/null +++ b/app/adapters/application.js @@ -0,0 +1,8 @@ +import JSONAPIAdapter from 'ember-data/adapters/json-api'; +import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; + +export default JSONAPIAdapter.extend(DataAdapterMixin, { + host: 'http://192.168.99.100:3000', + namespace: 'api/v1', + authorizer: 'authorizer:custom' +}); diff --git a/app/authenticators/custom.js b/app/authenticators/custom.js new file mode 100644 index 0000000..5a05fe9 --- /dev/null +++ b/app/authenticators/custom.js @@ -0,0 +1,47 @@ +import Ember from 'ember'; +import Base from 'ember-simple-auth/authenticators/base'; + +export default Base.extend({ + tokenEndpoint: 'http://192.168.99.100:3000/api/v1/authenticate', + + restore(data) { + return new Ember.RSVP.Promise(function(resolve, reject) { + if (!Ember.isEmpty(data.token)) { + resolve(data); + } else { + reject(); + } + }); + }, + + authenticate(username, password) { + return new Ember.RSVP.Promise((resolve, reject) => { + Ember.$.ajax({ + url: this.tokenEndpoint, + type: 'POST', + data: JSON.stringify({ + username: username, + password: password + }), + contentType: 'application/json', + dataType: 'json' + }).then(function(response) { + Ember.run(function() { + resolve({ + token: response.token + }); + }); + }, function(xhr) { + var response = xhr.responseText; + Ember.run(function() { + reject(response); + }); + }); + }); + }, + + invalidate() { + console.log('invalidate...'); + return Ember.RSVP.resolve(); + } +}); diff --git a/app/authorizers/custom.js b/app/authorizers/custom.js new file mode 100644 index 0000000..e443104 --- /dev/null +++ b/app/authorizers/custom.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import Base from 'ember-simple-auth/authorizers/base'; + +export default Base.extend({ + session: Ember.inject.service('session'), + + authorize(data, block) { + if (this.get('session.isAuthenticated') && !Ember.isEmpty(data.token)) { + block('x-access-token', data.token); + } + } +}); diff --git a/app/controllers/application.js b/app/controllers/application.js new file mode 100644 index 0000000..932ac68 --- /dev/null +++ b/app/controllers/application.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + session: Ember.inject.service('session') +}); diff --git a/app/controllers/login.js b/app/controllers/login.js new file mode 100644 index 0000000..c7758d6 --- /dev/null +++ b/app/controllers/login.js @@ -0,0 +1,14 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + session: Ember.inject.service('session'), + + actions: { + authenticate() { + let { username, password } = this.getProperties('username', 'password'); + this.get('session').authenticate('authenticator:custom', username, password).catch((reason) => { + this.set('errorMessage', reason); + }); + } + } +}); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js new file mode 100644 index 0000000..20ff394 --- /dev/null +++ b/app/controllers/project/new.js @@ -0,0 +1,11 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + newProject() { + // create project from form values + let properties = this.getProperties('name'); + var project = this.store.createRecord('project', properties); + } + } +}); diff --git a/app/models/project.js b/app/models/project.js new file mode 100644 index 0000000..986980a --- /dev/null +++ b/app/models/project.js @@ -0,0 +1,8 @@ +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import belongsTo from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string')/*, + owner: belongsTo('user')*/ +}); diff --git a/app/models/user.js b/app/models/user.js new file mode 100644 index 0000000..3af5105 --- /dev/null +++ b/app/models/user.js @@ -0,0 +1,10 @@ +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import hasMany from 'ember-data/relationships'; + +export default Model.extend({ + username: attr('string'), + password: attr('string'), + adminLevel: attr('number')/*, + projects: hasMany('project')*/ +}); diff --git a/app/router.js b/app/router.js index 3bba78e..63851c6 100644 --- a/app/router.js +++ b/app/router.js @@ -6,6 +6,15 @@ const Router = Ember.Router.extend({ }); Router.map(function() { + this.route('login'); + + this.route('projects'); + this.route('project', function() { + this.route('index', { path: '/:projectid' }); + this.route('new'); + this.route('edit', { path: '/edit/:projectid' }); + this.route('delete', { path: '/delete/:projectid' }); + }); }); export default Router; diff --git a/app/routes/application.js b/app/routes/application.js new file mode 100644 index 0000000..4891b23 --- /dev/null +++ b/app/routes/application.js @@ -0,0 +1,10 @@ +import Ember from 'ember'; +import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; + +export default Ember.Route.extend(ApplicationRouteMixin, { + actions: { + invalidateSession() { + this.get('session').invalidate(); + } + } +}); diff --git a/app/routes/index.js b/app/routes/index.js new file mode 100644 index 0000000..30e4e30 --- /dev/null +++ b/app/routes/index.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { +}); diff --git a/app/routes/login.js b/app/routes/login.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/login.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/project/delete.js b/app/routes/project/delete.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/project/delete.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/project/edit.js b/app/routes/project/edit.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/project/edit.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/project/index.js b/app/routes/project/index.js new file mode 100644 index 0000000..b603665 --- /dev/null +++ b/app/routes/project/index.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('project', params.projectid); + } +}); diff --git a/app/routes/project/new.js b/app/routes/project/new.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/project/new.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/projects.js b/app/routes/projects.js new file mode 100644 index 0000000..ce96e88 --- /dev/null +++ b/app/routes/projects.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model() { + return this.store.findAll('project'); + } +}); diff --git a/app/serializers/application.js b/app/serializers/application.js new file mode 100644 index 0000000..8c80d9f --- /dev/null +++ b/app/serializers/application.js @@ -0,0 +1,5 @@ +import JSONSerializer from 'ember-data/serializers/json'; + +export default JSONSerializer.extend({ + primaryKey: '_id' +}); diff --git a/app/styles/app.css b/app/styles/app.css index e69de29..c3f270c 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -0,0 +1,106 @@ +* { + margin: 0; + padding: 0; +} + +/** + * Application skeleton + */ +.ember-application { + min-width: 800px; + + background: #ddd; + color: #4d4d4d; + + font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 300; + font-smoothing: antialiased; + -webkit-font-smoothing: antialiased; + -moz-font-smoothing: antialiased; +} + +header { + width: 100%; + height: 50px; + + padding: 10px 0 0 0; + + color: #fff; + background-color: #151; +} + +header h1 { + width: 100%; + + text-align: center +} + +footer { + width: 100%; + + color: #666; + + margin-top: 20px; + + text-align: center; +} + +/** + * Main layout + */ +#main-menu { + float: left; + + width: 125px; + + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), + 0 9px 18px 0 rgba(0, 0, 0, 0.1); + + margin: 20px 0 0 20px; + padding: 20px 20px 20px 30px; +} + +#wrapper { + min-height: 100px; + + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), + 0 9px 18px 0 rgba(0, 0, 0, 0.1); + + margin: 20px 20px 20px 220px; + padding: 20px; +} + +/** + * Login layout + */ +#login-container { + width: 320px; + height: 180px; + + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), + 0 9px 18px 0 rgba(0, 0, 0, 0.1); + + margin: 80px auto; + padding: 0px; +} + +#login-container h1 { + background-color: #cdcdcd; + + text-align: center; + + font-size: 24; + + padding: 10px 0; +} + +#login { + +} + +#login-form { + padding: 20px 20px; +} diff --git a/app/templates/application.hbs b/app/templates/application.hbs index f8bc38e..4767d55 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -1,3 +1,26 @@ -

Welcome to Ember

+
+

VILLAS

+
-{{outlet}} +{{#if session.isAuthenticated}} + + +
+ {{outlet}} +
+{{else}} + {{outlet}} +{{/if}} + +
+ Copyright © 2016 +
diff --git a/app/templates/index.hbs b/app/templates/index.hbs new file mode 100644 index 0000000..700204b --- /dev/null +++ b/app/templates/index.hbs @@ -0,0 +1 @@ +

Main Content

diff --git a/app/templates/login.hbs b/app/templates/login.hbs new file mode 100644 index 0000000..498b585 --- /dev/null +++ b/app/templates/login.hbs @@ -0,0 +1,19 @@ +
+

Login

+ +
+

+ + {{input id='username' placeholder='Enter username' value=username}} +

+

+ + {{input id='password' placeholder='Enter password' type='password' value=password}} +

+ + + {{#if errorMessage}} +

{{errorMessage.message}}

+ {{/if}} +
+
diff --git a/app/templates/project/delete.hbs b/app/templates/project/delete.hbs new file mode 100644 index 0000000..b797135 --- /dev/null +++ b/app/templates/project/delete.hbs @@ -0,0 +1 @@ +

Delete Project

diff --git a/app/templates/project/edit.hbs b/app/templates/project/edit.hbs new file mode 100644 index 0000000..5f7d84b --- /dev/null +++ b/app/templates/project/edit.hbs @@ -0,0 +1 @@ +

Edit {{model.name}}

diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs new file mode 100644 index 0000000..aa24e7a --- /dev/null +++ b/app/templates/project/index.hbs @@ -0,0 +1,4 @@ +

{{model.name}}

+ +{{#link-to "project.edit" model}}Edit project{{/link-to}} +{{#link-to "project.delete" model}}Delete project{{/link-to}} diff --git a/app/templates/project/new.hbs b/app/templates/project/new.hbs new file mode 100644 index 0000000..ac591bb --- /dev/null +++ b/app/templates/project/new.hbs @@ -0,0 +1,16 @@ +

New project

+ +
+
+

+ + {{input id='name' placeholder='Enter project name' value=name}} +

+ + + + {{#if errorMessage}} +

{{errorMessage.message}}

+ {{/if}} +
+
diff --git a/app/templates/projects.hbs b/app/templates/projects.hbs new file mode 100644 index 0000000..70aae57 --- /dev/null +++ b/app/templates/projects.hbs @@ -0,0 +1,9 @@ +

Projects

+ +
    + {{#each model as |project|}} +
  • {{#link-to "project.index" project.id}}{{project.name}}{{/link-to}}
  • + {{/each}} +
+ +{{#link-to "project.new"}}New project{{/link-to}} diff --git a/package.json b/package.json index fc3c8dd..7c3e27c 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "ember-export-application-global": "^1.0.5", "ember-load-initializers": "^0.5.1", "ember-resolver": "^2.0.3", - "loader.js": "^4.0.1" + "loader.js": "^4.0.1", + "ember-simple-auth": "^1.1.0" } } diff --git a/tests/unit/adapters/application-test.js b/tests/unit/adapters/application-test.js new file mode 100644 index 0000000..f0a2101 --- /dev/null +++ b/tests/unit/adapters/application-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('adapter:application', 'Unit | Adapter | application', { + // Specify the other units that are required for this test. + // needs: ['serializer:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let adapter = this.subject(); + assert.ok(adapter); +}); diff --git a/tests/unit/controllers/application-test.js b/tests/unit/controllers/application-test.js new file mode 100644 index 0000000..b71b4a5 --- /dev/null +++ b/tests/unit/controllers/application-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:application', 'Unit | Controller | application', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/login-test.js b/tests/unit/controllers/login-test.js new file mode 100644 index 0000000..b68f797 --- /dev/null +++ b/tests/unit/controllers/login-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:login', 'Unit | Controller | login', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/projects/new-test.js b/tests/unit/controllers/projects/new-test.js new file mode 100644 index 0000000..1a5e3ea --- /dev/null +++ b/tests/unit/controllers/projects/new-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:projects/new', 'Unit | Controller | projects/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/models/project-test.js b/tests/unit/models/project-test.js new file mode 100644 index 0000000..2dddcd6 --- /dev/null +++ b/tests/unit/models/project-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('project', 'Unit | Model | project', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/models/user-test.js b/tests/unit/models/user-test.js new file mode 100644 index 0000000..ba21110 --- /dev/null +++ b/tests/unit/models/user-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('user', 'Unit | Model | user', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/routes/application-test.js b/tests/unit/routes/application-test.js new file mode 100644 index 0000000..9808c43 --- /dev/null +++ b/tests/unit/routes/application-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:application', 'Unit | Route | application', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/index-test.js b/tests/unit/routes/index-test.js new file mode 100644 index 0000000..5d0f50d --- /dev/null +++ b/tests/unit/routes/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:index', 'Unit | Route | index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/login-test.js b/tests/unit/routes/login-test.js new file mode 100644 index 0000000..e78ebad --- /dev/null +++ b/tests/unit/routes/login-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:login', 'Unit | Route | login', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/projects-test.js b/tests/unit/routes/projects-test.js new file mode 100644 index 0000000..e5dfb65 --- /dev/null +++ b/tests/unit/routes/projects-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:projects', 'Unit | Route | projects', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/projects/delete-test.js b/tests/unit/routes/projects/delete-test.js new file mode 100644 index 0000000..7ce43e6 --- /dev/null +++ b/tests/unit/routes/projects/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:projects/delete', 'Unit | Route | projects/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/projects/edit-test.js b/tests/unit/routes/projects/edit-test.js new file mode 100644 index 0000000..545616f --- /dev/null +++ b/tests/unit/routes/projects/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:projects/edit', 'Unit | Route | projects/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/projects/index-test.js b/tests/unit/routes/projects/index-test.js new file mode 100644 index 0000000..c232f73 --- /dev/null +++ b/tests/unit/routes/projects/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:projects/index', 'Unit | Route | projects/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/projects/new-test.js b/tests/unit/routes/projects/new-test.js new file mode 100644 index 0000000..0bb6b03 --- /dev/null +++ b/tests/unit/routes/projects/new-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:projects/new', 'Unit | Route | projects/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/projects/project-test.js b/tests/unit/routes/projects/project-test.js new file mode 100644 index 0000000..fa2d3fe --- /dev/null +++ b/tests/unit/routes/projects/project-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:projects/project', 'Unit | Route | projects/project', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/serializers/application-test.js b/tests/unit/serializers/application-test.js new file mode 100644 index 0000000..705e9ec --- /dev/null +++ b/tests/unit/serializers/application-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('application', 'Unit | Serializer | application', { + // Specify the other units that are required for this test. + needs: ['serializer:application'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); From 548bbb5e1573f9615058a5883ee3bf1ef294f5a7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 27 Jun 2016 23:22:05 +0200 Subject: [PATCH 003/556] Add project create, delete and store in user data Change adapter and serializer to REST api. Add session-user to get logged-in user in every controller/route Change models to async relationships, this way the data is only loaded when requested. --- app/adapters/application.js | 9 ++++-- app/app.js | 4 +++ app/authenticators/custom.js | 4 +-- app/controllers/project/delete.js | 32 +++++++++++++++++++ app/controllers/project/new.js | 29 +++++++++++++++-- app/models/project.js | 6 ++-- app/models/user.js | 6 ++-- app/routes/application.js | 18 +++++++++++ app/routes/login.js | 3 +- app/routes/project/delete.js | 6 +++- app/routes/project/edit.js | 3 +- app/routes/project/new.js | 3 +- app/routes/projects.js | 8 ++++- app/serializers/application.js | 5 +-- app/serializers/project.js | 7 ++++ app/serializers/user.js | 7 ++++ app/services/session-user.js | 25 +++++++++++++++ app/templates/project/delete.hbs | 5 +++ app/templates/project/index.hbs | 4 +-- app/templates/project/new.hbs | 1 + tests/unit/controllers/project/delete-test.js | 12 +++++++ tests/unit/serializers/project-test.js | 15 +++++++++ tests/unit/serializers/user-test.js | 15 +++++++++ tests/unit/services/session-user-test.js | 12 +++++++ 24 files changed, 217 insertions(+), 22 deletions(-) create mode 100644 app/controllers/project/delete.js create mode 100644 app/serializers/project.js create mode 100644 app/serializers/user.js create mode 100644 app/services/session-user.js create mode 100644 tests/unit/controllers/project/delete-test.js create mode 100644 tests/unit/serializers/project-test.js create mode 100644 tests/unit/serializers/user-test.js create mode 100644 tests/unit/services/session-user-test.js diff --git a/app/adapters/application.js b/app/adapters/application.js index 615bbc0..b24b25b 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -1,8 +1,11 @@ -import JSONAPIAdapter from 'ember-data/adapters/json-api'; +import RESTAdapter from 'ember-data/adapters/rest'; import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; -export default JSONAPIAdapter.extend(DataAdapterMixin, { +export default RESTAdapter.extend(DataAdapterMixin, { host: 'http://192.168.99.100:3000', namespace: 'api/v1', - authorizer: 'authorizer:custom' + authorizer: 'authorizer:custom', + headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, + + }); diff --git a/app/app.js b/app/app.js index 831ad61..7266b19 100644 --- a/app/app.js +++ b/app/app.js @@ -13,6 +13,10 @@ App = Ember.Application.extend({ Resolver }); +Ember.RSVP.on('error', function(error) { + console.error(error.message); +}); + loadInitializers(App, config.modulePrefix); export default App; diff --git a/app/authenticators/custom.js b/app/authenticators/custom.js index 5a05fe9..54c6edf 100644 --- a/app/authenticators/custom.js +++ b/app/authenticators/custom.js @@ -32,9 +32,9 @@ export default Base.extend({ }); }); }, function(xhr) { - var response = xhr.responseText; + var response = JSON.parse(xhr.responseText); Ember.run(function() { - reject(response); + reject(response.message); }); }); }); diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js new file mode 100644 index 0000000..498cd53 --- /dev/null +++ b/app/controllers/project/delete.js @@ -0,0 +1,32 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + actions: { + cancelDelete() { + // go back to project view + let projectId = this.get('model.id'); + this.transitionToRoute('/project/' + projectId); + }, + + confirmDelete() { + // get current user object + var userId = this.get('sessionUser.user.id'); + var user = this.store.peekRecord('user', userId); + + // get the project + var project = this.get('model'); + let projectId = project.get('id'); + + // delete the project and remove from user projects + user.get('projects').removeObject(projectId); + user.save(); + + project.destroyRecord(); + + // go back to project list + this.transitionToRoute('/projects'); + } + } +}); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js index 20ff394..01229ab 100644 --- a/app/controllers/project/new.js +++ b/app/controllers/project/new.js @@ -1,11 +1,36 @@ import Ember from 'ember'; export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + actions: { newProject() { - // create project from form values - let properties = this.getProperties('name'); + // get current user object + var userId = this.get('sessionUser.user.id'); + var user = this.store.peekRecord('user', userId); + + // create new project from properties + var properties = this.getProperties('name'); + properties['owner'] = user; + var project = this.store.createRecord('project', properties); + var controller = this; + + // save the project and user + project.save().then(function() { + console.log(project.get('id')); + + // add the project to the user + user.get('projects').pushObject(project); + + user.save().then(function() { + controller.transitionToRoute('/projects'); + }); + }); + }, + + cancelNewProject() { + this.transitionToRoute('/projects'); } } }); diff --git a/app/models/project.js b/app/models/project.js index 986980a..377d618 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -1,8 +1,8 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import belongsTo from 'ember-data/relationships'; +import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ - name: attr('string')/*, - owner: belongsTo('user')*/ + name: attr('string'), + owner: belongsTo('user', { async: true }) }); diff --git a/app/models/user.js b/app/models/user.js index 3af5105..e028eff 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -1,10 +1,10 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import hasMany from 'ember-data/relationships'; +import { hasMany } from 'ember-data/relationships'; export default Model.extend({ username: attr('string'), password: attr('string'), - adminLevel: attr('number')/*, - projects: hasMany('project')*/ + adminLevel: attr('number'), + projects: hasMany('project', { async: true }) }); diff --git a/app/routes/application.js b/app/routes/application.js index 4891b23..49d79a7 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -1,7 +1,25 @@ import Ember from 'ember'; import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; +const { service } = Ember.inject; + export default Ember.Route.extend(ApplicationRouteMixin, { + sessionUser: service('session-user'), + + beforeModel() { + return this._loadCurrentUser(); + }, + + sessionAuthenticated() { + this._loadCurrentUser().then(() => { + this.transitionTo('/'); + }).catch(() => this.get('session').invalidate()); + }, + + _loadCurrentUser() { + return this.get('sessionUser').loadCurrentUser(); + }, + actions: { invalidateSession() { this.get('session').invalidate(); diff --git a/app/routes/login.js b/app/routes/login.js index 26d9f31..29e193c 100644 --- a/app/routes/login.js +++ b/app/routes/login.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(UnauthenticatedRouteMixin, { }); diff --git a/app/routes/project/delete.js b/app/routes/project/delete.js index 26d9f31..b603665 100644 --- a/app/routes/project/delete.js +++ b/app/routes/project/delete.js @@ -1,4 +1,8 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('project', params.projectid); + } }); diff --git a/app/routes/project/edit.js b/app/routes/project/edit.js index 26d9f31..30e4e30 100644 --- a/app/routes/project/edit.js +++ b/app/routes/project/edit.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { }); diff --git a/app/routes/project/new.js b/app/routes/project/new.js index 26d9f31..30e4e30 100644 --- a/app/routes/project/new.js +++ b/app/routes/project/new.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { }); diff --git a/app/routes/projects.js b/app/routes/projects.js index ce96e88..c992c7d 100644 --- a/app/routes/projects.js +++ b/app/routes/projects.js @@ -2,7 +2,13 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { + sessionUser: Ember.inject.service('session-user'), + model() { - return this.store.findAll('project'); + // get session user + var userId = this.get('sessionUser.user.id'); + let user = this.store.peekRecord('user', userId); + + return user.get('projects'); } }); diff --git a/app/serializers/application.js b/app/serializers/application.js index 8c80d9f..74ca08f 100644 --- a/app/serializers/application.js +++ b/app/serializers/application.js @@ -1,5 +1,6 @@ -import JSONSerializer from 'ember-data/serializers/json'; +import RESTSerializer from 'ember-data/serializers/rest'; +import DS from 'ember-data'; -export default JSONSerializer.extend({ +export default RESTSerializer.extend(DS.EmbeddedRecordsMixin, { primaryKey: '_id' }); diff --git a/app/serializers/project.js b/app/serializers/project.js new file mode 100644 index 0000000..cf2bb44 --- /dev/null +++ b/app/serializers/project.js @@ -0,0 +1,7 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + owner: { serialize: 'ids' } + } +}); diff --git a/app/serializers/user.js b/app/serializers/user.js new file mode 100644 index 0000000..9bdf029 --- /dev/null +++ b/app/serializers/user.js @@ -0,0 +1,7 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + projects: { serialize: 'ids' } + } +}); diff --git a/app/services/session-user.js b/app/services/session-user.js new file mode 100644 index 0000000..86d4cd7 --- /dev/null +++ b/app/services/session-user.js @@ -0,0 +1,25 @@ +import Ember from 'ember'; + +const { + inject: { service }, + RSVP +} = Ember; + +export default Ember.Service.extend({ + session: service('session'), + store: service(), + + loadCurrentUser() { + return new RSVP.Promise((resolve, reject) => { + const token = this.get('session.data.authenticated.token'); + if (!Ember.isEmpty(token)) { + return this.get('store').findRecord('user', 'me').then((user) => { + this.set('user', user); + resolve(); + }, reject); + } else { + resolve(); + } + }); + } +}); diff --git a/app/templates/project/delete.hbs b/app/templates/project/delete.hbs index b797135..2aa92ae 100644 --- a/app/templates/project/delete.hbs +++ b/app/templates/project/delete.hbs @@ -1 +1,6 @@

Delete Project

+ +

Are you sure you want to delete the project?

+ + + diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index aa24e7a..24f0c61 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -1,4 +1,4 @@

{{model.name}}

-{{#link-to "project.edit" model}}Edit project{{/link-to}} -{{#link-to "project.delete" model}}Delete project{{/link-to}} +{{#link-to "project.edit" model.id}}Edit project{{/link-to}} +{{#link-to "project.delete" model.id}}Delete project{{/link-to}} diff --git a/app/templates/project/new.hbs b/app/templates/project/new.hbs index ac591bb..e4989cb 100644 --- a/app/templates/project/new.hbs +++ b/app/templates/project/new.hbs @@ -7,6 +7,7 @@ {{input id='name' placeholder='Enter project name' value=name}}

+ {{#if errorMessage}} diff --git a/tests/unit/controllers/project/delete-test.js b/tests/unit/controllers/project/delete-test.js new file mode 100644 index 0000000..8b10820 --- /dev/null +++ b/tests/unit/controllers/project/delete-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:project/delete', 'Unit | Controller | project/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/serializers/project-test.js b/tests/unit/serializers/project-test.js new file mode 100644 index 0000000..f0131a1 --- /dev/null +++ b/tests/unit/serializers/project-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('project', 'Unit | Serializer | project', { + // Specify the other units that are required for this test. + needs: ['serializer:project'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); diff --git a/tests/unit/serializers/user-test.js b/tests/unit/serializers/user-test.js new file mode 100644 index 0000000..19e4a38 --- /dev/null +++ b/tests/unit/serializers/user-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('user', 'Unit | Serializer | user', { + // Specify the other units that are required for this test. + needs: ['serializer:user'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); diff --git a/tests/unit/services/session-user-test.js b/tests/unit/services/session-user-test.js new file mode 100644 index 0000000..230acec --- /dev/null +++ b/tests/unit/services/session-user-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('service:session-user', 'Unit | Service | session user', { + // Specify the other units that are required for this test. + // needs: ['service:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let service = this.subject(); + assert.ok(service); +}); From 75c8464b6c2ae08e0e8e13a4f54414b98266aa0e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Jun 2016 10:00:38 +0200 Subject: [PATCH 004/556] Add project and user edit, add user email --- app/controllers/project/edit.js | 21 +++++++++++++++++++++ app/controllers/project/new.js | 2 -- app/controllers/user/edit.js | 11 +++++++++++ app/models/user.js | 3 ++- app/router.js | 4 ++++ app/routes/project/edit.js | 3 +++ app/routes/user/edit.js | 12 ++++++++++++ app/templates/application.hbs | 4 ++-- app/templates/project/edit.hbs | 16 +++++++++++++++- app/templates/user/edit.hbs | 14 ++++++++++++++ tests/unit/controllers/project/edit-test.js | 12 ++++++++++++ tests/unit/controllers/user/edit-test.js | 12 ++++++++++++ tests/unit/routes/user/edit-test.js | 11 +++++++++++ 13 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 app/controllers/project/edit.js create mode 100644 app/controllers/user/edit.js create mode 100644 app/routes/user/edit.js create mode 100644 app/templates/user/edit.hbs create mode 100644 tests/unit/controllers/project/edit-test.js create mode 100644 tests/unit/controllers/user/edit-test.js create mode 100644 tests/unit/routes/user/edit-test.js diff --git a/app/controllers/project/edit.js b/app/controllers/project/edit.js new file mode 100644 index 0000000..1cd1566 --- /dev/null +++ b/app/controllers/project/edit.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + saveEdit() { + // save the changes + var project = this.get('model'); + let projectId = project.get('id'); + var controller = this; + + project.save().then(function() { + controller.transitionToRoute('/project/' + projectId); + }); + }, + + cancelEdit() { + let projectId = this.get('model.id'); + this.transitionToRoute('/project/' + projectId); + } + } +}); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js index 01229ab..1834a47 100644 --- a/app/controllers/project/new.js +++ b/app/controllers/project/new.js @@ -18,8 +18,6 @@ export default Ember.Controller.extend({ // save the project and user project.save().then(function() { - console.log(project.get('id')); - // add the project to the user user.get('projects').pushObject(project); diff --git a/app/controllers/user/edit.js b/app/controllers/user/edit.js new file mode 100644 index 0000000..d66f684 --- /dev/null +++ b/app/controllers/user/edit.js @@ -0,0 +1,11 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + changeUser() { + // save the changes + var user = this.get('model'); + user.save(); + } + } +}); diff --git a/app/models/user.js b/app/models/user.js index e028eff..bc61b02 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -6,5 +6,6 @@ export default Model.extend({ username: attr('string'), password: attr('string'), adminLevel: attr('number'), - projects: hasMany('project', { async: true }) + projects: hasMany('project', { async: true }), + mail: attr('string') }); diff --git a/app/router.js b/app/router.js index 63851c6..c17bdab 100644 --- a/app/router.js +++ b/app/router.js @@ -15,6 +15,10 @@ Router.map(function() { this.route('edit', { path: '/edit/:projectid' }); this.route('delete', { path: '/delete/:projectid' }); }); + + this.route('user', function() { + this.route('edit'); + }); }); export default Router; diff --git a/app/routes/project/edit.js b/app/routes/project/edit.js index 30e4e30..b603665 100644 --- a/app/routes/project/edit.js +++ b/app/routes/project/edit.js @@ -2,4 +2,7 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('project', params.projectid); + } }); diff --git a/app/routes/user/edit.js b/app/routes/user/edit.js new file mode 100644 index 0000000..9def44d --- /dev/null +++ b/app/routes/user/edit.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + sessionUser: Ember.inject.service('session-user'), + + model() { + // get session user + var userId = this.get('sessionUser.user.id'); + return this.store.findRecord('user', userId); + } +}); diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 4767d55..deb95e2 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -9,8 +9,8 @@
  • {{#link-to 'index'}}Home{{/link-to}}
  • {{#link-to 'projects'}}Projects{{/link-to}}
  • -
  • Preferences
  • -
  • Logout
  • +
  • {{#link-to 'user.edit'}}Preferences{{/link-to}}
  • +
  • Logout
diff --git a/app/templates/project/edit.hbs b/app/templates/project/edit.hbs index 5f7d84b..064d830 100644 --- a/app/templates/project/edit.hbs +++ b/app/templates/project/edit.hbs @@ -1 +1,15 @@ -

Edit {{model.name}}

+

Edit project

+ +
+

+ + {{input id='name' placeholder='Enter project name' value=model.name}} +

+ + + + + {{#if errorMessage}} +

{{errorMessage.message}}

+ {{/if}} +
diff --git a/app/templates/user/edit.hbs b/app/templates/user/edit.hbs new file mode 100644 index 0000000..55622f9 --- /dev/null +++ b/app/templates/user/edit.hbs @@ -0,0 +1,14 @@ +

Preferences

+ +
+

+ + {{input id='username' value=model.username readonly=true}} +

+

+ + {{input id='mail' value=model.mail placeholder='Enter e-mail'}} +

+ + +
diff --git a/tests/unit/controllers/project/edit-test.js b/tests/unit/controllers/project/edit-test.js new file mode 100644 index 0000000..9100007 --- /dev/null +++ b/tests/unit/controllers/project/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:project/edit', 'Unit | Controller | project/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/user/edit-test.js b/tests/unit/controllers/user/edit-test.js new file mode 100644 index 0000000..f06d390 --- /dev/null +++ b/tests/unit/controllers/user/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:user/edit', 'Unit | Controller | user/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/routes/user/edit-test.js b/tests/unit/routes/user/edit-test.js new file mode 100644 index 0000000..754cb31 --- /dev/null +++ b/tests/unit/routes/user/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/edit', 'Unit | Route | user/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); From 5bc260b81c5cbdaebcd862556017e02445f2cf2e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Jun 2016 10:57:34 +0200 Subject: [PATCH 005/556] Add visulization and plot Plot has no routes defined. Visualization edit and delete routes are not working. --- app/models/plot.js | 12 ++++++++++ app/models/project.js | 5 ++-- app/models/visualization.js | 8 +++++++ app/router.js | 6 +++++ app/routes/visualization/delete.js | 8 +++++++ app/routes/visualization/edit.js | 8 +++++++ app/routes/visualization/index.js | 8 +++++++ app/routes/visualization/new.js | 5 ++++ app/templates/project/index.hbs | 24 +++++++++++++++++-- app/templates/visualization/delete.hbs | 1 + app/templates/visualization/edit.hbs | 1 + app/templates/visualization/index.hbs | 6 +++++ app/templates/visualization/new.hbs | 1 + tests/unit/models/plot-test.js | 12 ++++++++++ tests/unit/models/visualization-test.js | 12 ++++++++++ .../unit/routes/visualization/delete-test.js | 11 +++++++++ tests/unit/routes/visualization/edit-test.js | 11 +++++++++ tests/unit/routes/visualization/index-test.js | 11 +++++++++ tests/unit/routes/visualization/new-test.js | 11 +++++++++ 19 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 app/models/plot.js create mode 100644 app/models/visualization.js create mode 100644 app/routes/visualization/delete.js create mode 100644 app/routes/visualization/edit.js create mode 100644 app/routes/visualization/index.js create mode 100644 app/routes/visualization/new.js create mode 100644 app/templates/visualization/delete.hbs create mode 100644 app/templates/visualization/edit.hbs create mode 100644 app/templates/visualization/index.hbs create mode 100644 app/templates/visualization/new.hbs create mode 100644 tests/unit/models/plot-test.js create mode 100644 tests/unit/models/visualization-test.js create mode 100644 tests/unit/routes/visualization/delete-test.js create mode 100644 tests/unit/routes/visualization/edit-test.js create mode 100644 tests/unit/routes/visualization/index-test.js create mode 100644 tests/unit/routes/visualization/new-test.js diff --git a/app/models/plot.js b/app/models/plot.js new file mode 100644 index 0000000..0f3204d --- /dev/null +++ b/app/models/plot.js @@ -0,0 +1,12 @@ +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string'), + signal: attr('string'), + //position: + //size: + title: attr('string') + //backgroundColor: +}); diff --git a/app/models/project.js b/app/models/project.js index 377d618..2ff9490 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -1,8 +1,9 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import { belongsTo } from 'ember-data/relationships'; +import { hasMany, belongsTo } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - owner: belongsTo('user', { async: true }) + owner: belongsTo('user', { async: true }), + visualizations: hasMany('visualization', { async: true }) }); diff --git a/app/models/visualization.js b/app/models/visualization.js new file mode 100644 index 0000000..709e47c --- /dev/null +++ b/app/models/visualization.js @@ -0,0 +1,8 @@ +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import { hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string'), + plots: hasMany('plot', { async: true }) +}); diff --git a/app/router.js b/app/router.js index c17bdab..3b52f3d 100644 --- a/app/router.js +++ b/app/router.js @@ -19,6 +19,12 @@ Router.map(function() { this.route('user', function() { this.route('edit'); }); + this.route('visualization', function() { + this.route('index', { path: '/:visualizationid' }); + this.route('new'); + this.route('edit', { path: '/edit/:visualizationid' }); + this.route('delete', { path: '/delete/:visualizationid' }); + }); }); export default Router; diff --git a/app/routes/visualization/delete.js b/app/routes/visualization/delete.js new file mode 100644 index 0000000..398a1e3 --- /dev/null +++ b/app/routes/visualization/delete.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('visualization', params.visualizationid); + } +}); diff --git a/app/routes/visualization/edit.js b/app/routes/visualization/edit.js new file mode 100644 index 0000000..398a1e3 --- /dev/null +++ b/app/routes/visualization/edit.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('visualization', params.visualizationid); + } +}); diff --git a/app/routes/visualization/index.js b/app/routes/visualization/index.js new file mode 100644 index 0000000..398a1e3 --- /dev/null +++ b/app/routes/visualization/index.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('visualization', params.visualizationid); + } +}); diff --git a/app/routes/visualization/new.js b/app/routes/visualization/new.js new file mode 100644 index 0000000..30e4e30 --- /dev/null +++ b/app/routes/visualization/new.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { +}); diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index 24f0c61..2ecd482 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -1,4 +1,24 @@

{{model.name}}

-{{#link-to "project.edit" model.id}}Edit project{{/link-to}} -{{#link-to "project.delete" model.id}}Delete project{{/link-to}} +
+ +

+

Visualizations

+ +
    + {{#each model.visualizations as |visualization|}} +
  • {{#link-to 'visualization.index' visualization.id}}{{visualization.name}}{{/link-to}}
  • + {{/each}} +
+ +
+ + {{#link-to 'visualization.new'}}New visualization{{/link-to}} +

+ +
+ +

+ {{#link-to "project.edit" model.id}}Edit project{{/link-to}} + {{#link-to "project.delete" model.id}}Delete project{{/link-to}} +

diff --git a/app/templates/visualization/delete.hbs b/app/templates/visualization/delete.hbs new file mode 100644 index 0000000..49e85ea --- /dev/null +++ b/app/templates/visualization/delete.hbs @@ -0,0 +1 @@ +

Delete

diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs new file mode 100644 index 0000000..a835e09 --- /dev/null +++ b/app/templates/visualization/edit.hbs @@ -0,0 +1 @@ +

Edit

diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs new file mode 100644 index 0000000..1156777 --- /dev/null +++ b/app/templates/visualization/index.hbs @@ -0,0 +1,6 @@ +

{{model.name}}

+ +

+ {{#link-to "visualization.edit" model.id}}Edit visualization{{/link-to}} + {{#link-to "visualization.delete" model.id}}Delete visualization{{/link-to}} +

diff --git a/app/templates/visualization/new.hbs b/app/templates/visualization/new.hbs new file mode 100644 index 0000000..c9904d4 --- /dev/null +++ b/app/templates/visualization/new.hbs @@ -0,0 +1 @@ +

New visualization

diff --git a/tests/unit/models/plot-test.js b/tests/unit/models/plot-test.js new file mode 100644 index 0000000..50a2df7 --- /dev/null +++ b/tests/unit/models/plot-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('plot', 'Unit | Model | plot', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/models/visualization-test.js b/tests/unit/models/visualization-test.js new file mode 100644 index 0000000..f84f9bc --- /dev/null +++ b/tests/unit/models/visualization-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('visualization', 'Unit | Model | visualization', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/routes/visualization/delete-test.js b/tests/unit/routes/visualization/delete-test.js new file mode 100644 index 0000000..635f4ac --- /dev/null +++ b/tests/unit/routes/visualization/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:visualization/delete', 'Unit | Route | visualization/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/visualization/edit-test.js b/tests/unit/routes/visualization/edit-test.js new file mode 100644 index 0000000..d04fad6 --- /dev/null +++ b/tests/unit/routes/visualization/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:visualization/edit', 'Unit | Route | visualization/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/visualization/index-test.js b/tests/unit/routes/visualization/index-test.js new file mode 100644 index 0000000..8dae607 --- /dev/null +++ b/tests/unit/routes/visualization/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:visualization/index', 'Unit | Route | visualization/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/visualization/new-test.js b/tests/unit/routes/visualization/new-test.js new file mode 100644 index 0000000..0f09f4a --- /dev/null +++ b/tests/unit/routes/visualization/new-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:visualization/new', 'Unit | Route | visualization/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); From 8337550390c0fccb60e6ac3c7a43a7804909b7fb Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Jun 2016 14:23:49 +0200 Subject: [PATCH 006/556] Add visualizations and plots Plots can be added via drag'n'drop. --- app/components/draggable-dropzone.js | 26 +++++++++++ app/components/draggable-item.js | 13 ++++++ app/components/plot-chart.js | 4 ++ app/components/plot-container.js | 17 +++++++ app/components/plot-table.js | 5 ++ app/components/plot-value.js | 4 ++ app/controllers/visualization/index.js | 31 +++++++++++++ app/models/plot-table.js | 7 +++ app/models/plot.js | 9 ++-- app/styles/app.css | 46 ++++++++++++++++++- .../components/draggable-dropzone.hbs | 1 + app/templates/components/draggable-item.hbs | 1 + app/templates/components/plot-chart.hbs | 1 + app/templates/components/plot-container.hbs | 5 ++ app/templates/components/plot-table.hbs | 8 ++++ app/templates/components/plot-value.hbs | 1 + app/templates/visualization/index.hbs | 23 ++++++++++ .../components/draggable-dropzone-test.js | 24 ++++++++++ .../components/draggable-item-test.js | 24 ++++++++++ .../integration/components/plot-chart-test.js | 24 ++++++++++ .../components/plot-container-test.js | 24 ++++++++++ .../integration/components/plot-table-test.js | 24 ++++++++++ .../integration/components/plot-value-test.js | 24 ++++++++++ .../controllers/visualization/index-test.js | 12 +++++ tests/unit/models/plot-table-test.js | 12 +++++ 25 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 app/components/draggable-dropzone.js create mode 100644 app/components/draggable-item.js create mode 100644 app/components/plot-chart.js create mode 100644 app/components/plot-container.js create mode 100644 app/components/plot-table.js create mode 100644 app/components/plot-value.js create mode 100644 app/controllers/visualization/index.js create mode 100644 app/models/plot-table.js create mode 100644 app/templates/components/draggable-dropzone.hbs create mode 100644 app/templates/components/draggable-item.hbs create mode 100644 app/templates/components/plot-chart.hbs create mode 100644 app/templates/components/plot-container.hbs create mode 100644 app/templates/components/plot-table.hbs create mode 100644 app/templates/components/plot-value.hbs create mode 100644 tests/integration/components/draggable-dropzone-test.js create mode 100644 tests/integration/components/draggable-item-test.js create mode 100644 tests/integration/components/plot-chart-test.js create mode 100644 tests/integration/components/plot-container-test.js create mode 100644 tests/integration/components/plot-table-test.js create mode 100644 tests/integration/components/plot-value-test.js create mode 100644 tests/unit/controllers/visualization/index-test.js create mode 100644 tests/unit/models/plot-table-test.js diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js new file mode 100644 index 0000000..aa5c2f1 --- /dev/null +++ b/app/components/draggable-dropzone.js @@ -0,0 +1,26 @@ +import Ember from 'ember'; + +var { set } = Ember; + +export default Ember.Component.extend({ + classNames: [ 'draggableDropzone' ], + classNameBindings: [ 'dragClass' ], + dragClass: 'deactivated', + + dragLeave(event) { + event.preventDefault(); + set(this, 'dragClass', 'deactivated'); + }, + + dragOver(event) { + event.preventDefault(); + set(this, 'dragClass', 'activated'); + }, + + drop(event) { + var data = event.dataTransfer.getData('text/data'); + this.sendAction('dropped', data); + + set(this, 'dragClass', 'deactivated'); + } +}); diff --git a/app/components/draggable-item.js b/app/components/draggable-item.js new file mode 100644 index 0000000..841bd98 --- /dev/null +++ b/app/components/draggable-item.js @@ -0,0 +1,13 @@ +import Ember from 'ember'; + +var { get } = Ember; + +export default Ember.Component.extend({ + classNames: [ 'draggableItem' ], + attributeBindings: [ 'draggable' ], + draggable: 'true', + + dragStart(event) { + return event.dataTransfer.setData('text/data', get(this, 'content')); + } +}); diff --git a/app/components/plot-chart.js b/app/components/plot-chart.js new file mode 100644 index 0000000..926b613 --- /dev/null +++ b/app/components/plot-chart.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ +}); diff --git a/app/components/plot-container.js b/app/components/plot-container.js new file mode 100644 index 0000000..125d433 --- /dev/null +++ b/app/components/plot-container.js @@ -0,0 +1,17 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + tagName: 'div', + attributeBindings: [ 'style' ], + + plot: null, + + style: function() { + return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; border: 1px solid black;'; + }.property('plot'), + + isTable: function() { + var modelName = this.get('plot.constructor.modelName'); + return modelName === 'plot-table'; + }.property('plot.type') +}); diff --git a/app/components/plot-table.js b/app/components/plot-table.js new file mode 100644 index 0000000..e4b1f11 --- /dev/null +++ b/app/components/plot-table.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + tagName: 'table' +}); diff --git a/app/components/plot-value.js b/app/components/plot-value.js new file mode 100644 index 0000000..926b613 --- /dev/null +++ b/app/components/plot-value.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ +}); diff --git a/app/controllers/visualization/index.js b/app/controllers/visualization/index.js new file mode 100644 index 0000000..a349f1c --- /dev/null +++ b/app/controllers/visualization/index.js @@ -0,0 +1,31 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + plots: [], + + actions: { + addPlot(name) { + var plot = null; + + if (name === 'chart') { + // create new chart plot + plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1' }); + } else if (name === 'table') { + plot = this.store.createRecord('plot-table', { name: 'Table 1', signal: 'Signal 1', width: 500 }); + } else if (name === 'value') { + plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1' }); + } else { + // DEBUG + console.log('Add plot: ' + name); + return; + } + + if (plot != null) { + // add plot to visualization + this.plots.pushObject(plot); + } else { + console.error('Unknown plot type: ' + name); + } + } + } +}); diff --git a/app/models/plot-table.js b/app/models/plot-table.js new file mode 100644 index 0000000..8832e27 --- /dev/null +++ b/app/models/plot-table.js @@ -0,0 +1,7 @@ +import Plot from './plot'; +// import attr from 'ember-data/attr'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Plot.extend({ + type: 'table' +}); diff --git a/app/models/plot.js b/app/models/plot.js index 0f3204d..82cf15c 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -5,8 +5,9 @@ import attr from 'ember-data/attr'; export default Model.extend({ name: attr('string'), signal: attr('string'), - //position: - //size: - title: attr('string') - //backgroundColor: + width: attr('number', { defaultValue: 100 }), + height: attr('number', { defaultValue: 100 }), + title: attr('string'), + + type: 'plot' }); diff --git a/app/styles/app.css b/app/styles/app.css index c3f270c..9530318 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -98,9 +98,53 @@ footer { } #login { - + } #login-form { padding: 20px 20px; } + +/** + * Visualization + */ +.plots { + margin-top: 20px; + margin-bottom: 20px; +} + +.plot-toolbox { + margin-top: 20px; +} + +.draggableDropzone { + display: block; + + min-height: 200px; + + padding-top: 5px; + padding-left: 10px; + + border: 3px dashed #aaa; + + &.activated { + border-color: #2ecc71; + } + &.deactivated { + border-color: #e1e1e1; + } +} + +.draggableItem[draggable=true] { + display: inline-block; + background: #e1e1e1; + cursor: move; + + padding: 5px 10px; + + border: 1px solid gray; + + &:hover { + background-color: #aaa; + } +} diff --git a/app/templates/components/draggable-dropzone.hbs b/app/templates/components/draggable-dropzone.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/draggable-dropzone.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/components/draggable-item.hbs b/app/templates/components/draggable-item.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/draggable-item.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/components/plot-chart.hbs b/app/templates/components/plot-chart.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/plot-chart.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs new file mode 100644 index 0000000..53fbc14 --- /dev/null +++ b/app/templates/components/plot-container.hbs @@ -0,0 +1,5 @@ +{{#if isTable}} + {{#plot-table plot=plot}}{{/plot-table}} +{{else}} + Plot +{{/if}} diff --git a/app/templates/components/plot-table.hbs b/app/templates/components/plot-table.hbs new file mode 100644 index 0000000..0a1d321 --- /dev/null +++ b/app/templates/components/plot-table.hbs @@ -0,0 +1,8 @@ + + Name + Value + + + Signal X + 1.234 + diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/plot-value.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/plot-value.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs index 1156777..b11c764 100644 --- a/app/templates/visualization/index.hbs +++ b/app/templates/visualization/index.hbs @@ -1,5 +1,28 @@

{{model.name}}

+
+

Toolbox

+ {{#draggable-item content='chart'}} + Chart + {{/draggable-item}} + + {{#draggable-item content='table'}} + Table + {{/draggable-item}} + + {{#draggable-item content='value'}} + Value + {{/draggable-item}} +
+ +
+ {{#draggable-dropzone dropped='addPlot'}} + {{#each plots as |plot|}} + {{#plot-container plot=plot}}{{/plot-container}} + {{/each}} + {{/draggable-dropzone}} +
+

{{#link-to "visualization.edit" model.id}}Edit visualization{{/link-to}} {{#link-to "visualization.delete" model.id}}Delete visualization{{/link-to}} diff --git a/tests/integration/components/draggable-dropzone-test.js b/tests/integration/components/draggable-dropzone-test.js new file mode 100644 index 0000000..68c8c69 --- /dev/null +++ b/tests/integration/components/draggable-dropzone-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('draggable-dropzone', 'Integration | Component | draggable dropzone', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{draggable-dropzone}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#draggable-dropzone}} + template block text + {{/draggable-dropzone}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/draggable-item-test.js b/tests/integration/components/draggable-item-test.js new file mode 100644 index 0000000..93830ba --- /dev/null +++ b/tests/integration/components/draggable-item-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('draggable-item', 'Integration | Component | draggable item', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{draggable-item}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#draggable-item}} + template block text + {{/draggable-item}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/plot-chart-test.js b/tests/integration/components/plot-chart-test.js new file mode 100644 index 0000000..17234e4 --- /dev/null +++ b/tests/integration/components/plot-chart-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('plot-chart', 'Integration | Component | plot chart', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{plot-chart}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#plot-chart}} + template block text + {{/plot-chart}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/plot-container-test.js b/tests/integration/components/plot-container-test.js new file mode 100644 index 0000000..a929846 --- /dev/null +++ b/tests/integration/components/plot-container-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('plot-container', 'Integration | Component | plot container', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{plot-container}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#plot-container}} + template block text + {{/plot-container}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/plot-table-test.js b/tests/integration/components/plot-table-test.js new file mode 100644 index 0000000..927514e --- /dev/null +++ b/tests/integration/components/plot-table-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('plot-table', 'Integration | Component | plot table', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{plot-table}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#plot-table}} + template block text + {{/plot-table}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/plot-value-test.js b/tests/integration/components/plot-value-test.js new file mode 100644 index 0000000..5a65558 --- /dev/null +++ b/tests/integration/components/plot-value-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('plot-value', 'Integration | Component | plot value', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{plot-value}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#plot-value}} + template block text + {{/plot-value}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/unit/controllers/visualization/index-test.js b/tests/unit/controllers/visualization/index-test.js new file mode 100644 index 0000000..d2ee03f --- /dev/null +++ b/tests/unit/controllers/visualization/index-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:visualization/index', 'Unit | Controller | visualization/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/models/plot-table-test.js b/tests/unit/models/plot-table-test.js new file mode 100644 index 0000000..d1406f5 --- /dev/null +++ b/tests/unit/models/plot-table-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('plot-table', 'Unit | Model | plot table', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); From 480c90530d9243d484cab9b86aaa8d14fdaaf336 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Jun 2016 22:05:54 +0200 Subject: [PATCH 007/556] Add visualization create, edit and delete All plots will be saved in the plot model (no subclasses). --- app/adapters/application.js | 4 +- app/components/plot-container.js | 4 +- app/controllers/project/delete.js | 20 ++++++++-- app/controllers/project/index.js | 22 +++++++++++ app/controllers/visualization/delete.js | 34 +++++++++++++++++ app/controllers/visualization/edit.js | 38 +++++++++++++++++++ app/controllers/visualization/index.js | 27 ------------- app/models/plot-table.js | 7 ---- app/models/plot.js | 3 +- app/models/visualization.js | 5 ++- app/serializers/project.js | 3 +- app/serializers/visualization.js | 8 ++++ app/templates/project/index.hbs | 2 +- app/templates/visualization/delete.hbs | 5 +++ app/templates/visualization/edit.hbs | 30 ++++++++++++++- app/templates/visualization/index.hbs | 23 ++--------- tests/unit/controllers/project/index-test.js | 12 ++++++ .../controllers/visualization/delete-test.js | 12 ++++++ .../controllers/visualization/edit-test.js | 12 ++++++ tests/unit/models/plot-table-test.js | 12 ------ tests/unit/serializers/visualization-test.js | 15 ++++++++ 21 files changed, 216 insertions(+), 82 deletions(-) create mode 100644 app/controllers/project/index.js create mode 100644 app/controllers/visualization/delete.js create mode 100644 app/controllers/visualization/edit.js delete mode 100644 app/models/plot-table.js create mode 100644 app/serializers/visualization.js create mode 100644 tests/unit/controllers/project/index-test.js create mode 100644 tests/unit/controllers/visualization/delete-test.js create mode 100644 tests/unit/controllers/visualization/edit-test.js delete mode 100644 tests/unit/models/plot-table-test.js create mode 100644 tests/unit/serializers/visualization-test.js diff --git a/app/adapters/application.js b/app/adapters/application.js index b24b25b..8eb0625 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -5,7 +5,5 @@ export default RESTAdapter.extend(DataAdapterMixin, { host: 'http://192.168.99.100:3000', namespace: 'api/v1', authorizer: 'authorizer:custom', - headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, - - + headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); diff --git a/app/components/plot-container.js b/app/components/plot-container.js index 125d433..b4b402b 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -11,7 +11,7 @@ export default Ember.Component.extend({ }.property('plot'), isTable: function() { - var modelName = this.get('plot.constructor.modelName'); - return modelName === 'plot-table'; + var type = this.get('plot.type'); + return type === 'table'; }.property('plot.type') }); diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js index 498cd53..6435bed 100644 --- a/app/controllers/project/delete.js +++ b/app/controllers/project/delete.js @@ -21,12 +21,24 @@ export default Ember.Controller.extend({ // delete the project and remove from user projects user.get('projects').removeObject(projectId); - user.save(); + user.save().then(function() { + // destroy all visualizations + var visualizations = project.get('visualizations'); + visualizations.forEach(function(visualization) { + // destroy all plots + var plots = visualization.get('plots'); + plots.forEach(function(plot) { + plot.destroyRecord(); + }); - project.destroyRecord(); + visualization.destroyRecord(); + }); - // go back to project list - this.transitionToRoute('/projects'); + project.destroyRecord(); + + // go back to project list + this.transitionToRoute('/projects'); + }); } } }); diff --git a/app/controllers/project/index.js b/app/controllers/project/index.js new file mode 100644 index 0000000..eb33367 --- /dev/null +++ b/app/controllers/project/index.js @@ -0,0 +1,22 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + newVisualization() { + // get the project + var project = this.get('model'); + var projectId = this.get('model.id'); + + // create the visualization + var visualization = this.store.createRecord('visualization', { name: 'Visualization', project: projectId }); + + // the visualization must be added to the project before the project is saved, otherwise ember will set the projectId to null! + project.get('visualizations').pushObject(visualization); + + // save the visualization and project + visualization.save().then(function() { + project.save(); + }); + } + } +}); diff --git a/app/controllers/visualization/delete.js b/app/controllers/visualization/delete.js new file mode 100644 index 0000000..6ceee2b --- /dev/null +++ b/app/controllers/visualization/delete.js @@ -0,0 +1,34 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + cancelDelete() { + // go back to visualization edit view + let visualizationId = this.get('model.id'); + this.transitionToRoute('/visualization/' + visualizationId); + }, + + confirmDelete() { + // get the objects + var visualization = this.get('model'); + let visualizationId = this.get('model.id'); + + var projectId = this.get('model.project.id'); + var project = this.store.peekRecord('project', projectId); + + // delete the visualization and remove from the project + project.get('visualizations').removeObject(visualizationId); + project.save().then(function() { + // destroy all plots + var plots = visualization.get('plots'); + plots.forEach(function(plot) { + plot.destroyRecord(); + }); + + visualization.destroyRecord(); + + this.transitionToRoute('/project/' + projectId); + }); + } + } +}); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js new file mode 100644 index 0000000..9dd113f --- /dev/null +++ b/app/controllers/visualization/edit.js @@ -0,0 +1,38 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + addPlot(name) { + var plot = null; + + if (name === 'chart') { + // create new chart plot + plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1', type: 'chart' }); + } else if (name === 'table') { + plot = this.store.createRecord('plot', { name: 'Table 1', signal: 'Signal 1', type: 'table', width: 500 }); + } else if (name === 'value') { + plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1', type: 'value' }); + } else { + // DEBUG + console.log('Add plot: ' + name); + return; + } + + if (plot != null) { + // add plot to visualization + this.get('model.plots').pushObject(plot); + + // save new plot + var visualization = this.get('model'); + + plot.save().then(function() { + // save the plot in the visualization + visualization.get('plots').pushObject(plot); + visualization.save(); + }); + } else { + console.error('Unknown plot type: ' + name); + } + } + } +}); diff --git a/app/controllers/visualization/index.js b/app/controllers/visualization/index.js index a349f1c..55ff9aa 100644 --- a/app/controllers/visualization/index.js +++ b/app/controllers/visualization/index.js @@ -1,31 +1,4 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - plots: [], - - actions: { - addPlot(name) { - var plot = null; - - if (name === 'chart') { - // create new chart plot - plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1' }); - } else if (name === 'table') { - plot = this.store.createRecord('plot-table', { name: 'Table 1', signal: 'Signal 1', width: 500 }); - } else if (name === 'value') { - plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1' }); - } else { - // DEBUG - console.log('Add plot: ' + name); - return; - } - - if (plot != null) { - // add plot to visualization - this.plots.pushObject(plot); - } else { - console.error('Unknown plot type: ' + name); - } - } - } }); diff --git a/app/models/plot-table.js b/app/models/plot-table.js deleted file mode 100644 index 8832e27..0000000 --- a/app/models/plot-table.js +++ /dev/null @@ -1,7 +0,0 @@ -import Plot from './plot'; -// import attr from 'ember-data/attr'; -// import { belongsTo, hasMany } from 'ember-data/relationships'; - -export default Plot.extend({ - type: 'table' -}); diff --git a/app/models/plot.js b/app/models/plot.js index 82cf15c..ec1bb8f 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -8,6 +8,5 @@ export default Model.extend({ width: attr('number', { defaultValue: 100 }), height: attr('number', { defaultValue: 100 }), title: attr('string'), - - type: 'plot' + type: attr('string') }); diff --git a/app/models/visualization.js b/app/models/visualization.js index 709e47c..3779d59 100644 --- a/app/models/visualization.js +++ b/app/models/visualization.js @@ -1,8 +1,9 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import { hasMany } from 'ember-data/relationships'; +import { belongsTo, hasMany } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - plots: hasMany('plot', { async: true }) + plots: hasMany('plot', { async: true }), + project: belongsTo('project', { async: true }) }); diff --git a/app/serializers/project.js b/app/serializers/project.js index cf2bb44..afe8e13 100644 --- a/app/serializers/project.js +++ b/app/serializers/project.js @@ -2,6 +2,7 @@ import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ attrs: { - owner: { serialize: 'ids' } + owner: { serialize: 'ids' }, + visualizations: { serialize: 'ids' } } }); diff --git a/app/serializers/visualization.js b/app/serializers/visualization.js new file mode 100644 index 0000000..eade34d --- /dev/null +++ b/app/serializers/visualization.js @@ -0,0 +1,8 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + project: { serialize: 'ids' }, + plots: { serialize: 'ids' } + } +}); diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index 2ecd482..d35cd7f 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -13,7 +13,7 @@
- {{#link-to 'visualization.new'}}New visualization{{/link-to}} + New visualization


diff --git a/app/templates/visualization/delete.hbs b/app/templates/visualization/delete.hbs index 49e85ea..0be5279 100644 --- a/app/templates/visualization/delete.hbs +++ b/app/templates/visualization/delete.hbs @@ -1 +1,6 @@

Delete

+ +

Are you sure you want to delete the visualization?

+ + + diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index a835e09..2a10125 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -1 +1,29 @@ -

Edit

+

{{model.name}}

+ +
+

Toolbox

+ {{#draggable-item content='chart'}} + Chart + {{/draggable-item}} + + {{#draggable-item content='table'}} + Table + {{/draggable-item}} + + {{#draggable-item content='value'}} + Value + {{/draggable-item}} +
+ +
+ {{#draggable-dropzone dropped='addPlot'}} + {{#each model.plots as |plot|}} + {{#plot-container plot=plot}}{{/plot-container}} + {{/each}} + {{/draggable-dropzone}} +
+ +

+ + +

diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs index b11c764..b41cca6 100644 --- a/app/templates/visualization/index.hbs +++ b/app/templates/visualization/index.hbs @@ -1,26 +1,9 @@

{{model.name}}

-
-

Toolbox

- {{#draggable-item content='chart'}} - Chart - {{/draggable-item}} - - {{#draggable-item content='table'}} - Table - {{/draggable-item}} - - {{#draggable-item content='value'}} - Value - {{/draggable-item}} -
-
- {{#draggable-dropzone dropped='addPlot'}} - {{#each plots as |plot|}} - {{#plot-container plot=plot}}{{/plot-container}} - {{/each}} - {{/draggable-dropzone}} + {{#each model.plots as |plot|}} + {{#plot-container plot=plot}}{{/plot-container}} + {{/each}}

diff --git a/tests/unit/controllers/project/index-test.js b/tests/unit/controllers/project/index-test.js new file mode 100644 index 0000000..b72dc07 --- /dev/null +++ b/tests/unit/controllers/project/index-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:project/index', 'Unit | Controller | project/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/visualization/delete-test.js b/tests/unit/controllers/visualization/delete-test.js new file mode 100644 index 0000000..dc98464 --- /dev/null +++ b/tests/unit/controllers/visualization/delete-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:visualization/delete', 'Unit | Controller | visualization/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/visualization/edit-test.js b/tests/unit/controllers/visualization/edit-test.js new file mode 100644 index 0000000..e0a5451 --- /dev/null +++ b/tests/unit/controllers/visualization/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:visualization/edit', 'Unit | Controller | visualization/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/models/plot-table-test.js b/tests/unit/models/plot-table-test.js deleted file mode 100644 index d1406f5..0000000 --- a/tests/unit/models/plot-table-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('plot-table', 'Unit | Model | plot table', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/serializers/visualization-test.js b/tests/unit/serializers/visualization-test.js new file mode 100644 index 0000000..f31eeec --- /dev/null +++ b/tests/unit/serializers/visualization-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('visualization', 'Unit | Serializer | visualization', { + // Specify the other units that are required for this test. + needs: ['serializer:visualization'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); From db993e2d2f8940fe8b13ee770c72c3ead23caa2a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 29 Jun 2016 17:08:42 +0200 Subject: [PATCH 008/556] Add todo.md Fix project and visualization delete Start with plot styling --- app/components/plot-container.js | 4 ++- app/components/plot-table.js | 5 +++- app/controllers/project/delete.js | 31 +++++++++++---------- app/controllers/visualization/delete.js | 20 +++++++------ app/router.js | 3 ++ app/routes/404.js | 4 +++ app/styles/app.css | 25 +++++++++++++++-- app/templates/404.hbs | 1 + app/templates/components/plot-container.hbs | 2 +- app/templates/components/plot-table.hbs | 24 ++++++++++------ app/templates/visualization/edit.hbs | 2 +- tests/unit/routes/404-test.js | 11 ++++++++ todo.md | 8 ++++++ 13 files changed, 101 insertions(+), 39 deletions(-) create mode 100644 app/routes/404.js create mode 100644 app/templates/404.hbs create mode 100644 tests/unit/routes/404-test.js create mode 100644 todo.md diff --git a/app/components/plot-container.js b/app/components/plot-container.js index b4b402b..2297b13 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -3,11 +3,13 @@ import Ember from 'ember'; export default Ember.Component.extend({ tagName: 'div', attributeBindings: [ 'style' ], + classNames: [ 'plotContainer' ], plot: null, + editing: false, style: function() { - return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; border: 1px solid black;'; + return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; }.property('plot'), isTable: function() { diff --git a/app/components/plot-table.js b/app/components/plot-table.js index e4b1f11..7c66b4e 100644 --- a/app/components/plot-table.js +++ b/app/components/plot-table.js @@ -1,5 +1,8 @@ import Ember from 'ember'; export default Ember.Component.extend({ - tagName: 'table' + tagName: 'div', + classNames: [ '' ], + + editing: false }); diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js index 6435bed..dbc5cc7 100644 --- a/app/controllers/project/delete.js +++ b/app/controllers/project/delete.js @@ -20,24 +20,25 @@ export default Ember.Controller.extend({ let projectId = project.get('id'); // delete the project and remove from user projects - user.get('projects').removeObject(projectId); - user.save().then(function() { - // destroy all visualizations - var visualizations = project.get('visualizations'); - visualizations.forEach(function(visualization) { - // destroy all plots - var plots = visualization.get('plots'); - plots.forEach(function(plot) { - plot.destroyRecord(); - }); - - visualization.destroyRecord(); + var visualizations = project.get('visualizations'); + visualizations.forEach(function(visualization) { + // destroy all plots + var plots = visualization.get('plots'); + plots.forEach(function(plot) { + plot.destroyRecord(); }); - project.destroyRecord(); + visualization.destroyRecord(); + }); - // go back to project list - this.transitionToRoute('/projects'); + project.destroyRecord(); + + // save the changes to project + var controller = this; + + user.get('projects').removeObject(projectId); + user.save().then(function() { + controller.transitionToRoute('/projects'); }); } } diff --git a/app/controllers/visualization/delete.js b/app/controllers/visualization/delete.js index 6ceee2b..37c2c9b 100644 --- a/app/controllers/visualization/delete.js +++ b/app/controllers/visualization/delete.js @@ -16,18 +16,20 @@ export default Ember.Controller.extend({ var projectId = this.get('model.project.id'); var project = this.store.peekRecord('project', projectId); + // destroy all plots + var plots = visualization.get('plots'); + plots.forEach(function(plot) { + plot.destroyRecord(); + }); + + visualization.destroyRecord(); + // delete the visualization and remove from the project + var controller = this; + project.get('visualizations').removeObject(visualizationId); project.save().then(function() { - // destroy all plots - var plots = visualization.get('plots'); - plots.forEach(function(plot) { - plot.destroyRecord(); - }); - - visualization.destroyRecord(); - - this.transitionToRoute('/project/' + projectId); + controller.transitionToRoute('/project/' + projectId); }); } } diff --git a/app/router.js b/app/router.js index 3b52f3d..c8d5437 100644 --- a/app/router.js +++ b/app/router.js @@ -19,12 +19,15 @@ Router.map(function() { this.route('user', function() { this.route('edit'); }); + this.route('visualization', function() { this.route('index', { path: '/:visualizationid' }); this.route('new'); this.route('edit', { path: '/edit/:visualizationid' }); this.route('delete', { path: '/delete/:visualizationid' }); }); + + this.route('404', { path: '/*path' }); }); export default Router; diff --git a/app/routes/404.js b/app/routes/404.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/404.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/styles/app.css b/app/styles/app.css index 9530318..83d5df6 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -122,9 +122,6 @@ footer { min-height: 200px; - padding-top: 5px; - padding-left: 10px; - border: 3px dashed #aaa; &.activated { @@ -148,3 +145,25 @@ footer { background-color: #aaa; } } + +.plotContainer { + border: 1px solid lightgray; + + margin: 10px; + padding: 5px 10px; +} + +.plotTable { + width: 100%; + height: 100%; + + border: 1px solid gray; + + border-collapse: collapse; +} + +.plotTable td, th { + border: 1px solid gray; + + padding: 2px 5px; +} diff --git a/app/templates/404.hbs b/app/templates/404.hbs new file mode 100644 index 0000000..9a83fd7 --- /dev/null +++ b/app/templates/404.hbs @@ -0,0 +1 @@ +

404 - Not found

diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs index 53fbc14..b223224 100644 --- a/app/templates/components/plot-container.hbs +++ b/app/templates/components/plot-container.hbs @@ -1,5 +1,5 @@ {{#if isTable}} - {{#plot-table plot=plot}}{{/plot-table}} + {{#plot-table plot=plot editing=editing}}{{/plot-table}} {{else}} Plot {{/if}} diff --git a/app/templates/components/plot-table.hbs b/app/templates/components/plot-table.hbs index 0a1d321..6b2091a 100644 --- a/app/templates/components/plot-table.hbs +++ b/app/templates/components/plot-table.hbs @@ -1,8 +1,16 @@ - - Name - Value - - - Signal X - 1.234 - +{{#if editing}} + {{input value=plot.title placeholder='Enter title'}} +{{else}} +

{{plot.title}}

+{{/if}} + + + + + + + + + + +
NameValue
Signal X1.234
diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index 2a10125..d23a362 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -18,7 +18,7 @@
{{#draggable-dropzone dropped='addPlot'}} {{#each model.plots as |plot|}} - {{#plot-container plot=plot}}{{/plot-container}} + {{#plot-container plot=plot editing=true}}{{/plot-container}} {{/each}} {{/draggable-dropzone}}
diff --git a/tests/unit/routes/404-test.js b/tests/unit/routes/404-test.js new file mode 100644 index 0000000..260a5bc --- /dev/null +++ b/tests/unit/routes/404-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:404', 'Unit | Route | 404', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..a4fc8ca --- /dev/null +++ b/todo.md @@ -0,0 +1,8 @@ +# To-Do + - Logout route + - Change password + - Create/register user + - User management + - Rename preferences into account + - ! Don't save user password + - ! Fix user logged-in on invalidate account (after account was deleted) From 6b8223df430d5bccca65e020a1dd0cf6e00de0ab Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 5 Jul 2016 11:50:31 +0200 Subject: [PATCH 009/556] Fix user login/logout Add logout route as buffer between logged-in state and login form Fix setting current user in service Fix message on invalid credentials in login form Don't save the user password --- app/models/user.js | 1 - app/router.js | 1 + app/routes/application.js | 11 ++++------- app/routes/logout.js | 8 ++++++++ app/services/session-user.js | 11 ++++++++--- app/templates/application.hbs | 2 +- app/templates/login.hbs | 2 +- app/templates/logout.hbs | 1 + tests/unit/routes/logout-test.js | 11 +++++++++++ todo.md | 3 --- 10 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 app/routes/logout.js create mode 100644 app/templates/logout.hbs create mode 100644 tests/unit/routes/logout-test.js diff --git a/app/models/user.js b/app/models/user.js index bc61b02..d343d10 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -4,7 +4,6 @@ import { hasMany } from 'ember-data/relationships'; export default Model.extend({ username: attr('string'), - password: attr('string'), adminLevel: attr('number'), projects: hasMany('project', { async: true }), mail: attr('string') diff --git a/app/router.js b/app/router.js index c8d5437..8f2875d 100644 --- a/app/router.js +++ b/app/router.js @@ -28,6 +28,7 @@ Router.map(function() { }); this.route('404', { path: '/*path' }); + this.route('logout'); }); export default Router; diff --git a/app/routes/application.js b/app/routes/application.js index 49d79a7..0596a73 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -13,16 +13,13 @@ export default Ember.Route.extend(ApplicationRouteMixin, { sessionAuthenticated() { this._loadCurrentUser().then(() => { this.transitionTo('/'); - }).catch(() => this.get('session').invalidate()); + }).catch(function(/* reason */) { + //console.log(reason); + this.get('session').invalidate(); + }); }, _loadCurrentUser() { return this.get('sessionUser').loadCurrentUser(); - }, - - actions: { - invalidateSession() { - this.get('session').invalidate(); - } } }); diff --git a/app/routes/logout.js b/app/routes/logout.js new file mode 100644 index 0000000..52daa5f --- /dev/null +++ b/app/routes/logout.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + beforeModel() { + this.get('session').invalidate(); + } +}); diff --git a/app/services/session-user.js b/app/services/session-user.js index 86d4cd7..5f18491 100644 --- a/app/services/session-user.js +++ b/app/services/session-user.js @@ -10,13 +10,18 @@ export default Ember.Service.extend({ store: service(), loadCurrentUser() { + var _this = this; + return new RSVP.Promise((resolve, reject) => { const token = this.get('session.data.authenticated.token'); if (!Ember.isEmpty(token)) { - return this.get('store').findRecord('user', 'me').then((user) => { - this.set('user', user); + return this.get('store').findRecord('user', 'me').then(function(user) { + _this.set('user', user); resolve(); - }, reject); + }, function() { + _this.get('session').invalidate(); + reject(); + }); } else { resolve(); } diff --git a/app/templates/application.hbs b/app/templates/application.hbs index deb95e2..4621e6e 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -10,7 +10,7 @@
  • {{#link-to 'index'}}Home{{/link-to}}
  • {{#link-to 'projects'}}Projects{{/link-to}}
  • {{#link-to 'user.edit'}}Preferences{{/link-to}}
  • -
  • Logout
  • +
  • {{#link-to 'logout'}}Logout{{/link-to}}
  • diff --git a/app/templates/login.hbs b/app/templates/login.hbs index 498b585..734af5e 100644 --- a/app/templates/login.hbs +++ b/app/templates/login.hbs @@ -13,7 +13,7 @@ {{#if errorMessage}} -

    {{errorMessage.message}}

    +

    {{errorMessage}}

    {{/if}} diff --git a/app/templates/logout.hbs b/app/templates/logout.hbs new file mode 100644 index 0000000..c24cd68 --- /dev/null +++ b/app/templates/logout.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/tests/unit/routes/logout-test.js b/tests/unit/routes/logout-test.js new file mode 100644 index 0000000..64613a0 --- /dev/null +++ b/tests/unit/routes/logout-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:logout', 'Unit | Route | logout', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/todo.md b/todo.md index a4fc8ca..b83c6c3 100644 --- a/todo.md +++ b/todo.md @@ -1,8 +1,5 @@ # To-Do - - Logout route - Change password - Create/register user - User management - Rename preferences into account - - ! Don't save user password - - ! Fix user logged-in on invalidate account (after account was deleted) From ddd2680d0dc147017166de688d49eba8a7bb22b2 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 11 Jul 2016 22:03:47 +0200 Subject: [PATCH 010/556] Add user management. Move relationship building to server side Admins can create/edit and delete users (with all their projects etc.) Deleting a user/project/visualization automatically deletes all its belonging data (e.g. deleting a visualization deletes all plots). When creating and deleting objects the relationship is (mostly) handled server side. Only the first required relationship (e.g. when creating a new project, the project's owner is set client-side, the rest is matched on the server). --- app/controllers/me.js | 16 ++++++++++++ app/controllers/project/delete.js | 28 ++------------------- app/controllers/project/index.js | 7 ++---- app/controllers/project/new.js | 13 +++------- app/controllers/user/delete.js | 19 ++++++++++++++ app/controllers/user/edit.js | 12 +++++++-- app/controllers/user/index.js | 17 +++++++++++++ app/controllers/user/new.js | 21 ++++++++++++++++ app/controllers/visualization/delete.js | 19 ++------------ app/models/user.js | 1 + app/router.js | 12 ++++++--- app/routes/me.js | 9 +++++++ app/routes/user/delete.js | 8 ++++++ app/routes/user/edit.js | 8 ++---- app/routes/user/index.js | 8 ++++++ app/routes/user/new.js | 5 ++++ app/templates/application.hbs | 2 +- app/templates/me.hbs | 20 +++++++++++++++ app/templates/user/delete.hbs | 10 ++++++++ app/templates/user/edit.hbs | 8 +++--- app/templates/user/index.hbs | 11 ++++++++ app/templates/user/new.hbs | 21 ++++++++++++++++ package.json | 4 +-- tests/unit/controllers/users/delete-test.js | 12 +++++++++ tests/unit/controllers/users/edit-test.js | 12 +++++++++ tests/unit/controllers/users/index-test.js | 12 +++++++++ tests/unit/controllers/users/new-test.js | 12 +++++++++ tests/unit/routes/me-test.js | 11 ++++++++ tests/unit/routes/user/delete-test.js | 11 ++++++++ tests/unit/routes/user/index-test.js | 11 ++++++++ tests/unit/routes/user/new-test.js | 11 ++++++++ todo.md | 2 +- 32 files changed, 295 insertions(+), 78 deletions(-) create mode 100644 app/controllers/me.js create mode 100644 app/controllers/user/delete.js create mode 100644 app/controllers/user/index.js create mode 100644 app/controllers/user/new.js create mode 100644 app/routes/me.js create mode 100644 app/routes/user/delete.js create mode 100644 app/routes/user/index.js create mode 100644 app/routes/user/new.js create mode 100644 app/templates/me.hbs create mode 100644 app/templates/user/delete.hbs create mode 100644 app/templates/user/index.hbs create mode 100644 app/templates/user/new.hbs create mode 100644 tests/unit/controllers/users/delete-test.js create mode 100644 tests/unit/controllers/users/edit-test.js create mode 100644 tests/unit/controllers/users/index-test.js create mode 100644 tests/unit/controllers/users/new-test.js create mode 100644 tests/unit/routes/me-test.js create mode 100644 tests/unit/routes/user/delete-test.js create mode 100644 tests/unit/routes/user/index-test.js create mode 100644 tests/unit/routes/user/new-test.js diff --git a/app/controllers/me.js b/app/controllers/me.js new file mode 100644 index 0000000..eac3232 --- /dev/null +++ b/app/controllers/me.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + isAdmin: function() { + var level = this.get('model.adminLevel'); + return level >= 1; + }.property('model'), + + actions: { + changeUser() { + // save the changes + var user = this.get('model'); + user.save(); + } + } +}); diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js index dbc5cc7..212648b 100644 --- a/app/controllers/project/delete.js +++ b/app/controllers/project/delete.js @@ -11,35 +11,11 @@ export default Ember.Controller.extend({ }, confirmDelete() { - // get current user object - var userId = this.get('sessionUser.user.id'); - var user = this.store.peekRecord('user', userId); - - // get the project + // delete the project var project = this.get('model'); - let projectId = project.get('id'); - - // delete the project and remove from user projects - var visualizations = project.get('visualizations'); - visualizations.forEach(function(visualization) { - // destroy all plots - var plots = visualization.get('plots'); - plots.forEach(function(plot) { - plot.destroyRecord(); - }); - - visualization.destroyRecord(); - }); - project.destroyRecord(); - // save the changes to project - var controller = this; - - user.get('projects').removeObject(projectId); - user.save().then(function() { - controller.transitionToRoute('/projects'); - }); + this.transitionToRoute('/projects'); } } }); diff --git a/app/controllers/project/index.js b/app/controllers/project/index.js index eb33367..e949d77 100644 --- a/app/controllers/project/index.js +++ b/app/controllers/project/index.js @@ -10,13 +10,10 @@ export default Ember.Controller.extend({ // create the visualization var visualization = this.store.createRecord('visualization', { name: 'Visualization', project: projectId }); - // the visualization must be added to the project before the project is saved, otherwise ember will set the projectId to null! + // this change will not be saved, but it is nessecary otherwise ember will omit the project's id in the post request project.get('visualizations').pushObject(visualization); - // save the visualization and project - visualization.save().then(function() { - project.save(); - }); + visualization.save(); } } }); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js index 1834a47..c786f7e 100644 --- a/app/controllers/project/new.js +++ b/app/controllers/project/new.js @@ -5,9 +5,8 @@ export default Ember.Controller.extend({ actions: { newProject() { - // get current user object - var userId = this.get('sessionUser.user.id'); - var user = this.store.peekRecord('user', userId); + // get current user + var user = this.get('sessionUser.user'); // create new project from properties var properties = this.getProperties('name'); @@ -16,14 +15,8 @@ export default Ember.Controller.extend({ var project = this.store.createRecord('project', properties); var controller = this; - // save the project and user project.save().then(function() { - // add the project to the user - user.get('projects').pushObject(project); - - user.save().then(function() { - controller.transitionToRoute('/projects'); - }); + controller.transitionToRoute('/projects'); }); }, diff --git a/app/controllers/user/delete.js b/app/controllers/user/delete.js new file mode 100644 index 0000000..ef1e8a0 --- /dev/null +++ b/app/controllers/user/delete.js @@ -0,0 +1,19 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + actions: { + cancelDelete() { + this.transitionToRoute('/user/'); + }, + + confirmDelete() { + // delete all projects + var user = this.get('model'); + user.destroyRecord(); + + this.transitionToRoute('/user/'); + } + } +}); diff --git a/app/controllers/user/edit.js b/app/controllers/user/edit.js index d66f684..e47d437 100644 --- a/app/controllers/user/edit.js +++ b/app/controllers/user/edit.js @@ -2,10 +2,18 @@ import Ember from 'ember'; export default Ember.Controller.extend({ actions: { - changeUser() { + saveEdit() { // save the changes var user = this.get('model'); - user.save(); + var controller = this; + + user.save().then(function() { + controller.transitionToRoute('/user/'); + }); + }, + + cancelEdit() { + this.transitionToRoute('/user/'); } } }); diff --git a/app/controllers/user/index.js b/app/controllers/user/index.js new file mode 100644 index 0000000..0b0c945 --- /dev/null +++ b/app/controllers/user/index.js @@ -0,0 +1,17 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + users: function() { + var filteredUsers = this.get('model'); + filteredUsers.forEach(function(user) { + // catch undefined user + if (user) { + if (user.get('id') === 'me') { + filteredUsers.removeObject(user); + } + } + }); + + return filteredUsers; + }.property('model.@each') +}); diff --git a/app/controllers/user/new.js b/app/controllers/user/new.js new file mode 100644 index 0000000..3da5896 --- /dev/null +++ b/app/controllers/user/new.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + newUser() { + // create new user from properties + var properties = this.getProperties('username', 'password'); + + var user = this.store.createRecord('user', properties); + var controller = this; + + user.save().then(function() { + controller.transitionToRoute('/user'); + }); + }, + + cancelNewUser() { + this.transitionToRoute('/user'); + } + } +}); diff --git a/app/controllers/visualization/delete.js b/app/controllers/visualization/delete.js index 37c2c9b..14db97b 100644 --- a/app/controllers/visualization/delete.js +++ b/app/controllers/visualization/delete.js @@ -10,27 +10,12 @@ export default Ember.Controller.extend({ confirmDelete() { // get the objects - var visualization = this.get('model'); - let visualizationId = this.get('model.id'); - var projectId = this.get('model.project.id'); - var project = this.store.peekRecord('project', projectId); - - // destroy all plots - var plots = visualization.get('plots'); - plots.forEach(function(plot) { - plot.destroyRecord(); - }); + var visualization = this.get('model'); visualization.destroyRecord(); - // delete the visualization and remove from the project - var controller = this; - - project.get('visualizations').removeObject(visualizationId); - project.save().then(function() { - controller.transitionToRoute('/project/' + projectId); - }); + this.transitionToRoute('/project/' + projectId); } } }); diff --git a/app/models/user.js b/app/models/user.js index d343d10..bc61b02 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -4,6 +4,7 @@ import { hasMany } from 'ember-data/relationships'; export default Model.extend({ username: attr('string'), + password: attr('string'), adminLevel: attr('number'), projects: hasMany('project', { async: true }), mail: attr('string') diff --git a/app/router.js b/app/router.js index 8f2875d..03ad117 100644 --- a/app/router.js +++ b/app/router.js @@ -7,6 +7,7 @@ const Router = Ember.Router.extend({ Router.map(function() { this.route('login'); + this.route('logout'); this.route('projects'); this.route('project', function() { @@ -16,9 +17,7 @@ Router.map(function() { this.route('delete', { path: '/delete/:projectid' }); }); - this.route('user', function() { - this.route('edit'); - }); + this.route('me'); this.route('visualization', function() { this.route('index', { path: '/:visualizationid' }); @@ -27,8 +26,13 @@ Router.map(function() { this.route('delete', { path: '/delete/:visualizationid' }); }); + this.route('user', function() { + this.route('edit', { path: '/edit/:userid' }); + this.route('new'); + this.route('delete', { path: '/delete/:userid' }); + }); + this.route('404', { path: '/*path' }); - this.route('logout'); }); export default Router; diff --git a/app/routes/me.js b/app/routes/me.js new file mode 100644 index 0000000..b8e23aa --- /dev/null +++ b/app/routes/me.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model() { + // get session user + return this.store.findRecord('user', 'me'); + } +}); diff --git a/app/routes/user/delete.js b/app/routes/user/delete.js new file mode 100644 index 0000000..7fa7c6a --- /dev/null +++ b/app/routes/user/delete.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('user', params.userid); + } +}); diff --git a/app/routes/user/edit.js b/app/routes/user/edit.js index 9def44d..7fa7c6a 100644 --- a/app/routes/user/edit.js +++ b/app/routes/user/edit.js @@ -2,11 +2,7 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { - sessionUser: Ember.inject.service('session-user'), - - model() { - // get session user - var userId = this.get('sessionUser.user.id'); - return this.store.findRecord('user', userId); + model(params) { + return this.store.findRecord('user', params.userid); } }); diff --git a/app/routes/user/index.js b/app/routes/user/index.js new file mode 100644 index 0000000..f4885a9 --- /dev/null +++ b/app/routes/user/index.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model() { + return this.store.findAll('user'); + } +}); diff --git a/app/routes/user/new.js b/app/routes/user/new.js new file mode 100644 index 0000000..30e4e30 --- /dev/null +++ b/app/routes/user/new.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { +}); diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 4621e6e..457586e 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -9,7 +9,7 @@
    • {{#link-to 'index'}}Home{{/link-to}}
    • {{#link-to 'projects'}}Projects{{/link-to}}
    • -
    • {{#link-to 'user.edit'}}Preferences{{/link-to}}
    • +
    • {{#link-to 'me'}}Account{{/link-to}}
    • {{#link-to 'logout'}}Logout{{/link-to}}
    diff --git a/app/templates/me.hbs b/app/templates/me.hbs new file mode 100644 index 0000000..eeb3fb9 --- /dev/null +++ b/app/templates/me.hbs @@ -0,0 +1,20 @@ +

    Preferences

    + +
    +

    + + {{input id='username' value=model.username readonly=true}} +

    +

    + + {{input id='mail' value=model.mail placeholder='Enter e-mail'}} +

    + + +
    + +{{#if isAdmin}} +
    + {{#link-to 'user'}}Users{{/link-to}} +
    +{{/if}} diff --git a/app/templates/user/delete.hbs b/app/templates/user/delete.hbs new file mode 100644 index 0000000..b8173d5 --- /dev/null +++ b/app/templates/user/delete.hbs @@ -0,0 +1,10 @@ +

    Delete User

    + +

    + Are you sure you want to delete the user "{{model.username}}"? +
    + This will also delete all projects belonging to this user! +

    + + + diff --git a/app/templates/user/edit.hbs b/app/templates/user/edit.hbs index 55622f9..b44372f 100644 --- a/app/templates/user/edit.hbs +++ b/app/templates/user/edit.hbs @@ -1,14 +1,14 @@ -

    Preferences

    +

    Edit

    -
    +

    - {{input id='username' value=model.username readonly=true}} + {{input id='username' value=model.username}}

    {{input id='mail' value=model.mail placeholder='Enter e-mail'}}

    - +
    diff --git a/app/templates/user/index.hbs b/app/templates/user/index.hbs new file mode 100644 index 0000000..9a7c1cb --- /dev/null +++ b/app/templates/user/index.hbs @@ -0,0 +1,11 @@ +

    Users

    + +{{#link-to 'user.new'}}New user{{/link-to}} + +
    +
      + {{#each users as |user|}} +
    • {{#link-to 'user.edit' user.id}}{{user.username}}{{/link-to}} {{#link-to 'user.delete' user.id}}X{{/link-to}}
    • + {{/each}} +
    +
    diff --git a/app/templates/user/new.hbs b/app/templates/user/new.hbs new file mode 100644 index 0000000..0e8598b --- /dev/null +++ b/app/templates/user/new.hbs @@ -0,0 +1,21 @@ +

    New user

    + +
    +
    +

    + + {{input id='username' placeholder='Enter username' value=username}} +

    +

    + + {{input id='password' placeholder='Enter password' type='password' value=password}} +

    + + + + + {{#if errorMessage}} +

    {{errorMessage.message}}

    + {{/if}} +
    +
    diff --git a/package.json b/package.json index 7c3e27c..5e45d0c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "ember-export-application-global": "^1.0.5", "ember-load-initializers": "^0.5.1", "ember-resolver": "^2.0.3", - "loader.js": "^4.0.1", - "ember-simple-auth": "^1.1.0" + "ember-simple-auth": "^1.1.0", + "loader.js": "^4.0.1" } } diff --git a/tests/unit/controllers/users/delete-test.js b/tests/unit/controllers/users/delete-test.js new file mode 100644 index 0000000..68f802f --- /dev/null +++ b/tests/unit/controllers/users/delete-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/delete', 'Unit | Controller | users/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/users/edit-test.js b/tests/unit/controllers/users/edit-test.js new file mode 100644 index 0000000..debcf46 --- /dev/null +++ b/tests/unit/controllers/users/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/edit', 'Unit | Controller | users/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/users/index-test.js b/tests/unit/controllers/users/index-test.js new file mode 100644 index 0000000..2395bc6 --- /dev/null +++ b/tests/unit/controllers/users/index-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/index', 'Unit | Controller | users/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/users/new-test.js b/tests/unit/controllers/users/new-test.js new file mode 100644 index 0000000..113f11e --- /dev/null +++ b/tests/unit/controllers/users/new-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/new', 'Unit | Controller | users/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/routes/me-test.js b/tests/unit/routes/me-test.js new file mode 100644 index 0000000..9719ac5 --- /dev/null +++ b/tests/unit/routes/me-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:me', 'Unit | Route | me', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/user/delete-test.js b/tests/unit/routes/user/delete-test.js new file mode 100644 index 0000000..4be7323 --- /dev/null +++ b/tests/unit/routes/user/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/delete', 'Unit | Route | user/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/user/index-test.js b/tests/unit/routes/user/index-test.js new file mode 100644 index 0000000..fe27105 --- /dev/null +++ b/tests/unit/routes/user/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/index', 'Unit | Route | user/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/user/new-test.js b/tests/unit/routes/user/new-test.js new file mode 100644 index 0000000..5032fa8 --- /dev/null +++ b/tests/unit/routes/user/new-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/new', 'Unit | Route | user/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/todo.md b/todo.md index b83c6c3..020a1c8 100644 --- a/todo.md +++ b/todo.md @@ -2,4 +2,4 @@ - Change password - Create/register user - User management - - Rename preferences into account + - Don't log out on unauthorized access (admin level lower than required) From dbf95bc86259dafa4bff87e367d5223a7e90fec8 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 12 Jul 2016 00:03:20 +0200 Subject: [PATCH 011/556] Only save changes on project on save button --- app/controllers/project/edit.js | 9 ++++++++- app/templates/project/edit.hbs | 2 +- todo.md | 2 -- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/controllers/project/edit.js b/app/controllers/project/edit.js index 1cd1566..dc98e3f 100644 --- a/app/controllers/project/edit.js +++ b/app/controllers/project/edit.js @@ -1,10 +1,17 @@ import Ember from 'ember'; export default Ember.Controller.extend({ + name: function() { + return this.get('model.name'); + }.property('model.name'), + actions: { saveEdit() { - // save the changes + // apply the changes var project = this.get('model'); + project.set('name', this.get('name')); + + // save the changes let projectId = project.get('id'); var controller = this; diff --git a/app/templates/project/edit.hbs b/app/templates/project/edit.hbs index 064d830..1c42a97 100644 --- a/app/templates/project/edit.hbs +++ b/app/templates/project/edit.hbs @@ -3,7 +3,7 @@

    - {{input id='name' placeholder='Enter project name' value=model.name}} + {{input id='name' placeholder='Enter project name' value=name}}

    diff --git a/todo.md b/todo.md index 020a1c8..3f09a5b 100644 --- a/todo.md +++ b/todo.md @@ -1,5 +1,3 @@ # To-Do - Change password - - Create/register user - - User management - Don't log out on unauthorized access (admin level lower than required) From 15d29d23b200686c119341326336494fa49499b6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 15 Jul 2016 12:09:31 +0200 Subject: [PATCH 012/556] Add jQuery UI Add resizeable, droppable and draggable mixins Add API_HOST in environment.js --- app/adapters/application.js | 3 +- app/authenticators/custom.js | 3 +- app/components/draggable-dropzone.js | 3 +- app/components/draggable-item.js | 1 + app/components/plot-container.js | 21 +++--- app/components/plot-table.js | 18 ++++- app/components/plot-value.js | 21 +++++- app/controllers/visualization/edit.js | 2 +- app/mixins/draggable.js | 73 +++++++++++++++++++++ app/mixins/droppable.js | 72 ++++++++++++++++++++ app/mixins/resizable.js | 71 ++++++++++++++++++++ app/models/plot.js | 7 +- app/models/visualization.js | 3 +- app/styles/app.css | 22 ++++++- app/templates/components/plot-container.hbs | 6 +- app/templates/components/plot-value.hbs | 2 +- app/templates/visualization/edit.hbs | 16 +++-- bower.json | 3 +- config/environment.js | 3 +- package.json | 1 + tests/unit/mixins/draggable-test.js | 12 ++++ tests/unit/mixins/droppable-test.js | 12 ++++ tests/unit/mixins/resizable-test.js | 12 ++++ todo.md | 9 +++ 24 files changed, 361 insertions(+), 35 deletions(-) create mode 100644 app/mixins/draggable.js create mode 100644 app/mixins/droppable.js create mode 100644 app/mixins/resizable.js create mode 100644 tests/unit/mixins/draggable-test.js create mode 100644 tests/unit/mixins/droppable-test.js create mode 100644 tests/unit/mixins/resizable-test.js diff --git a/app/adapters/application.js b/app/adapters/application.js index 8eb0625..67eee3f 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -1,8 +1,9 @@ import RESTAdapter from 'ember-data/adapters/rest'; import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; +import ENV from '../config/environment'; export default RESTAdapter.extend(DataAdapterMixin, { - host: 'http://192.168.99.100:3000', + host: 'http://' + ENV.APP.API_HOST, namespace: 'api/v1', authorizer: 'authorizer:custom', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } diff --git a/app/authenticators/custom.js b/app/authenticators/custom.js index 54c6edf..e05c9d1 100644 --- a/app/authenticators/custom.js +++ b/app/authenticators/custom.js @@ -1,8 +1,9 @@ import Ember from 'ember'; import Base from 'ember-simple-auth/authenticators/base'; +import ENV from '../config/environment'; export default Base.extend({ - tokenEndpoint: 'http://192.168.99.100:3000/api/v1/authenticate', + tokenEndpoint: 'http://' + ENV.APP.API_HOST + '/api/v1/authenticate', restore(data) { return new Ember.RSVP.Promise(function(resolve, reject) { diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index aa5c2f1..3eacd71 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -3,7 +3,8 @@ import Ember from 'ember'; var { set } = Ember; export default Ember.Component.extend({ - classNames: [ 'draggableDropzone' ], + tagName: 'div', + classNames: [ 'draggableDropzone plots' ], classNameBindings: [ 'dragClass' ], dragClass: 'deactivated', diff --git a/app/components/draggable-item.js b/app/components/draggable-item.js index 841bd98..b02d4ac 100644 --- a/app/components/draggable-item.js +++ b/app/components/draggable-item.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import Draggable from '../mixins/draggable'; var { get } = Ember; diff --git a/app/components/plot-container.js b/app/components/plot-container.js index 2297b13..a9c99bb 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -1,19 +1,18 @@ import Ember from 'ember'; export default Ember.Component.extend({ - tagName: 'div', - attributeBindings: [ 'style' ], - classNames: [ 'plotContainer' ], - - plot: null, - editing: false, - - style: function() { - return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; - }.property('plot'), - isTable: function() { var type = this.get('plot.type'); return type === 'table'; + }.property('plot.type'), + + isChart: function() { + var type = this.get('plot.type'); + return type === 'chart'; + }.property('plot.type'), + + isValue: function() { + var type = this.get('plot.type'); + return type === 'value'; }.property('plot.type') }); diff --git a/app/components/plot-table.js b/app/components/plot-table.js index 7c66b4e..d8a74a2 100644 --- a/app/components/plot-table.js +++ b/app/components/plot-table.js @@ -1,8 +1,20 @@ import Ember from 'ember'; +import Resizable from '../mixins/resizable'; -export default Ember.Component.extend({ +export default Ember.Component.extend(Resizable, { tagName: 'div', - classNames: [ '' ], + attributeBindings: [ 'style' ], + classNames: [ 'plotContainer', 'plotTable' ], - editing: false + plot: null, + editing: false, + + style: function() { + return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; + }.property('plot'), + + stop_resize(event, ui) { + this.set('plot.width', this.$().width()); + this.set('plot.height', this.$().height()); + } }); diff --git a/app/components/plot-value.js b/app/components/plot-value.js index 926b613..bb27fb4 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -1,4 +1,23 @@ import Ember from 'ember'; +import Resizable from '../mixins/resizable'; -export default Ember.Component.extend({ +export default Ember.Component.extend(Resizable, { + tagName: 'div', + attributeBindings: [ 'style' ], + classNames: [ 'plotContainer', 'plotValue' ], + + plot: null, + editing: false, + + minWidth_resize: 50, + minHeight_resize: 20, + + style: function() { + return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; + }.property('plot'), + + stop_resize(event, ui) { + this.set('plot.width', this.$().width()); + this.set('plot.height', this.$().height()); + } }); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 9dd113f..7ca0e6f 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -9,7 +9,7 @@ export default Ember.Controller.extend({ // create new chart plot plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1', type: 'chart' }); } else if (name === 'table') { - plot = this.store.createRecord('plot', { name: 'Table 1', signal: 'Signal 1', type: 'table', width: 500 }); + plot = this.store.createRecord('plot', { name: 'Table 1', signal: 'Signal 1', type: 'table', width: 500, height: 200 }); } else if (name === 'value') { plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1', type: 'value' }); } else { diff --git a/app/mixins/draggable.js b/app/mixins/draggable.js new file mode 100644 index 0000000..0fb10eb --- /dev/null +++ b/app/mixins/draggable.js @@ -0,0 +1,73 @@ +import Ember from 'ember'; + +export default Ember.Mixin.create({ + uiDragOptions: [ 'disabled_drag', 'addClasses_drag', 'appendTo_drag', 'axis_drag', + 'cancel_drag', 'connectToSortable_drag', 'containment_drag', 'cursor_drag', + 'delay_drag', 'distance_drag', 'grid_drag', 'handle_drag','helper_drag', + 'iframeFix_drag','opacity_drag','scope_drag', 'snap_drag', 'snapMode_drag', 'stack_drag' ], + uiDragEvents: [ 'create_drag', 'start_drag', 'drag_drag', 'stop_drag' ], + + didInsertElement() { + this._super(); + + // get available options and events + var options = this._gatherDragOptions(); + this._gatherDragEvents(options); + + // create a new jQuery UI widget + var ui = Ember.$.ui['draggable'](options, this.get('element')); + this.set('ui', ui); + }, + + willDestroyElement() { + var ui = this.get('ui'); + + if (ui) { + // remove all observers for jQuery UI widget + var observers = this._observers; + for (var property in observers) { + this.removeObserver(property, observers[property]); + } + + ui.destroy(); + } + }, + + _gatherDragOptions() { + // parse all options and add observers for them + var uiDragOptions = this.get('uiDragOptions') || []; + var options = {}; + + uiDragOptions.forEach(function(key) { + // save the drag option without the prefix + options[key.split('_')[0]] = this.get(key); + + // create an observer for this option + var observer = function() { + var value = this.get(key); + this.get('ui').option(key.split('_')[0], value); + }; + + this.addObserver(key, observer); + + // save observer to remove it later on + this._observers = this._observers || {}; + this._observers[key] = observer; + }, this); + + return options; + }, + + _gatherDragEvents(options) { + // register callbacks for each event + var uiDragEvents = this.get('uiDragEvents') || []; + uiDragEvents.forEach(function(event) { + var callback = this[event]; + if (callback) { + options[event.split('_')[0]] = function(event, ui) { + callback.call(this, event, ui); + }; + } + }, this); + } +}); diff --git a/app/mixins/droppable.js b/app/mixins/droppable.js new file mode 100644 index 0000000..e3c2b7f --- /dev/null +++ b/app/mixins/droppable.js @@ -0,0 +1,72 @@ +import Ember from 'ember'; + +export default Ember.Mixin.create({ + uiDropOptions: [ 'accept_drop', 'addClasses_drop', 'disabled_drop', 'greedy_drop', + 'hoverClass_drop', 'scope_drop' ], + uiDropEvents: [ 'create_drop', 'activate_drop', 'deactivate_drop', 'over_drop', + 'out_drop', 'drop_drop' ], + + didInsertElement() { + this._super(); + + // get available options and events + var options = this._gatherDropOptions(); + this._gatherDropEvents(options); + + // create a new jQuery UI widget + var ui = Ember.$.ui['droppable'](options, this.get('element')); + this.set('ui', ui); + }, + + willDestroyElement() { + var ui = this.get('ui'); + + if (ui) { + // remove all observers for jQuery UI widget + var observers = this._observers; + for (var property in observers) { + this.removeObserver(property, observers[property]); + } + + ui.destroy(); + } + }, + + _gatherDropOptions() { + // parse all options and add observers for them + var uiDropOptions = this.get('uiDropOptions') || []; + var options = {}; + + uiDropOptions.forEach(function(key) { + // save the drop option without the postfix + options[key.split('_')[0]] = this.get(key); + + // create an observer for this option + var observer = function() { + var value = this.get(key); + this.get('ui').option(key.split('_')[0], value); + }; + + this.addObserver(key, observer); + + // save observer to remove it later on + this._observers = this._observers || {}; + this._observers[key] = observer; + }, this); + + return options; + }, + + _gatherDropEvents(options) { + // register callbacks for each event + var uiDropEvents = this.get('uiDropEvents') || []; + uiDropEvents.forEach(function(event) { + var callback = this[event]; + if (callback) { + options[event.split('_')[0]] = function(event, ui) { + callback.call(this, event, ui); + }; + } + }, this); + } +}); diff --git a/app/mixins/resizable.js b/app/mixins/resizable.js new file mode 100644 index 0000000..83fa97e --- /dev/null +++ b/app/mixins/resizable.js @@ -0,0 +1,71 @@ +import Ember from 'ember'; + +export default Ember.Mixin.create({ + uiResizeOptions: [ 'disable_resize', 'alsoResize_resize', 'animate_resize', + 'animateDuration_resize', 'animateEasing_resize', 'aspectRatio_resize', + 'autoHide_resize', 'cancel_resize', 'containment_resize', 'delay_resize', + 'distance_resize', 'ghost_resize', 'grid_resize', 'handles_resize', 'helper_resize', + 'maxHeight_resize', 'maxWidth_resize', 'minHeight_resize', 'minWidth_resize' ], + uiResizeEvents: [ 'create_resize', 'start_resize', 'resize_resize', 'stop_resize' ], + + didInsertElement() { + this._super(); + + var options = this._gatherResizeOptions(); + + this._gatherResizeEvents(options); + + var ui = Ember.$.ui['resizable'](options, this.get('element')); + + this.set('ui', ui); + }, + + willDestroyElement() { + var ui = this.get('ui'); + + if (ui) { + var observers = this._observers; + for (var prop in observers) { + if (observers.hasOwnProperty(prop)) { + this.removeObserver(prop, observers[prop]); + } + } + + ui._destroy(); + } + }, + + _gatherResizeOptions() { + var uiResizeOptions = this.get('uiResizeOptions'), options = {}; + + uiResizeOptions.forEach(function(key) { + options[key.split('_')[0]] = this.get(key); + + var observer = function() { + var value = this.get(key); + console.log(key + ': ' + value); + this.get('ui').option(key.split('_')[0], value); + }; + + this.addObserver(key, observer); + + this._observers = this._observers || {}; + this._observers[key] = observer; + }, this); + + return options; + }, + + _gatherResizeEvents(options) { + var uiResizeEvents = this.get('uiResizeEvents') || [], self = this; + uiResizeEvents.forEach(function(event) { + var callback = self[event]; + + if (callback) { + options[event.split('_')[0]] = function(event, ui) { + callback.call(self, event, ui); + }; + } + }); + } +}); diff --git a/app/models/plot.js b/app/models/plot.js index ec1bb8f..2e88f8a 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -1,6 +1,6 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -// import { belongsTo, hasMany } from 'ember-data/relationships'; +import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), @@ -8,5 +8,8 @@ export default Model.extend({ width: attr('number', { defaultValue: 100 }), height: attr('number', { defaultValue: 100 }), title: attr('string'), - type: attr('string') + type: attr('string'), + row: attr('number'), + column: attr('number'), + visualization: belongsTo('Visualization', { async: true }) }); diff --git a/app/models/visualization.js b/app/models/visualization.js index 3779d59..016fb6e 100644 --- a/app/models/visualization.js +++ b/app/models/visualization.js @@ -5,5 +5,6 @@ import { belongsTo, hasMany } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), plots: hasMany('plot', { async: true }), - project: belongsTo('project', { async: true }) + project: belongsTo('project', { async: true }), + rows: attr('number', { defaultValue: 1 }) }); diff --git a/app/styles/app.css b/app/styles/app.css index 83d5df6..9487c40 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -43,6 +43,8 @@ footer { margin-top: 20px; text-align: center; + + clear: both; } /** @@ -111,16 +113,28 @@ footer { .plots { margin-top: 20px; margin-bottom: 20px; + + overflow: auto; } .plot-toolbox { margin-top: 20px; } +.plot-add-row { + font-size: 100px; + font-weight: 800; + + text-align: center; + + margin: 0; + margin-top: -25px; +} + .draggableDropzone { display: block; - min-height: 200px; + min-height: 100px; border: 3px dashed #aaa; @@ -151,6 +165,12 @@ footer { margin: 10px; padding: 5px 10px; + + float: left; +} + +.plotValue { + } .plotTable { diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs index b223224..b8a5f06 100644 --- a/app/templates/components/plot-container.hbs +++ b/app/templates/components/plot-container.hbs @@ -1,5 +1,9 @@ {{#if isTable}} {{#plot-table plot=plot editing=editing}}{{/plot-table}} +{{else if isChart}} + {{#plot-chart plot=plot editing=editing}}{{/plot-chart}} +{{else if isValue}} + {{#plot-value plot=plot editing=editing}}{{/plot-value}} {{else}} - Plot + Unknown Plot {{/if}} diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/plot-value.hbs index 889d9ee..af53c9c 100644 --- a/app/templates/components/plot-value.hbs +++ b/app/templates/components/plot-value.hbs @@ -1 +1 @@ -{{yield}} +Value diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index d23a362..2ced225 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -15,13 +15,15 @@ {{/draggable-item}} -
    - {{#draggable-dropzone dropped='addPlot'}} - {{#each model.plots as |plot|}} - {{#plot-container plot=plot editing=true}}{{/plot-container}} - {{/each}} - {{/draggable-dropzone}} -
    +{{#draggable-dropzone dropped='addPlot'}} + {{#each model.plots as |plot|}} + {{#plot-container plot=plot editing=true}}{{/plot-container}} + {{/each}} +{{/draggable-dropzone}} + +{{#draggable-dropzone dropped='addRowWithPlot'}} +
    +
    +{{/draggable-dropzone}}

    diff --git a/bower.json b/bower.json index edb8acd..d2c82e9 100644 --- a/bower.json +++ b/bower.json @@ -4,6 +4,7 @@ "ember": "~2.5.0", "ember-cli-shims": "0.1.1", "ember-cli-test-loader": "0.2.2", - "ember-qunit-notifications": "0.1.0" + "ember-qunit-notifications": "0.1.0", + "jquery-ui": "1.11.4" } } diff --git a/config/environment.js b/config/environment.js index ea199a4..f359e20 100644 --- a/config/environment.js +++ b/config/environment.js @@ -14,8 +14,7 @@ module.exports = function(environment) { }, APP: { - // Here you can pass flags/options to your application instance - // when it is created + API_HOST: 'localhost:3000' } }; diff --git a/package.json b/package.json index 5e45d0c..39de3e5 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "ember-cli-htmlbars": "^1.0.3", "ember-cli-htmlbars-inline-precompile": "^0.3.1", "ember-cli-inject-live-reload": "^1.4.0", + "ember-cli-jquery-ui": "0.0.20", "ember-cli-jshint": "^1.0.0", "ember-cli-qunit": "^1.4.0", "ember-cli-release": "0.2.8", diff --git a/tests/unit/mixins/draggable-test.js b/tests/unit/mixins/draggable-test.js new file mode 100644 index 0000000..e13c254 --- /dev/null +++ b/tests/unit/mixins/draggable-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import DraggableMixin from 'villasweb-frontend/mixins/draggable'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | draggable'); + +// Replace this with your real tests. +test('it works', function(assert) { + let DraggableObject = Ember.Object.extend(DraggableMixin); + let subject = DraggableObject.create(); + assert.ok(subject); +}); diff --git a/tests/unit/mixins/droppable-test.js b/tests/unit/mixins/droppable-test.js new file mode 100644 index 0000000..41976f3 --- /dev/null +++ b/tests/unit/mixins/droppable-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import DroppableMixin from 'villasweb-frontend/mixins/droppable'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | droppable'); + +// Replace this with your real tests. +test('it works', function(assert) { + let DroppableObject = Ember.Object.extend(DroppableMixin); + let subject = DroppableObject.create(); + assert.ok(subject); +}); diff --git a/tests/unit/mixins/resizable-test.js b/tests/unit/mixins/resizable-test.js new file mode 100644 index 0000000..eaec854 --- /dev/null +++ b/tests/unit/mixins/resizable-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import ResizableMixin from 'villasweb-frontend/mixins/resizable'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | resizable'); + +// Replace this with your real tests. +test('it works', function(assert) { + let ResizableObject = Ember.Object.extend(ResizableMixin); + let subject = ResizableObject.create(); + assert.ok(subject); +}); diff --git a/todo.md b/todo.md index 3f09a5b..4b9a455 100644 --- a/todo.md +++ b/todo.md @@ -1,3 +1,12 @@ # To-Do - Change password - Don't log out on unauthorized access (admin level lower than required) + - Move plot attributes/styling from plot-container into actual plots + - Move drag-n-drop to mixins + - Websocket node is working in develop branch + - Add API host to config/environment.js + - Empty visualization after delete + + +websocketserverip/config.json +websocketserverip/nodes.json From da09935de1aba1201c0f13485b70cc855dbfd1d3 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 17 Jul 2016 18:43:08 +0200 Subject: [PATCH 013/556] Add plot-abstract component plot-abstract is the base object for all plots. Size changes on plots are saved to the server on the save button. Add sortable mixin. --- app/components/draggable-dropzone.js | 5 +- app/components/plot-abstract.js | 33 ++++++++ app/components/plot-container.js | 3 + app/components/plot-table.js | 18 +--- app/components/plot-value.js | 19 +---- app/controllers/visualization/edit.js | 19 +++++ app/mixins/draggable.js | 8 +- app/mixins/droppable.js | 8 +- app/mixins/resizable.js | 28 ++++--- app/mixins/sortable.js | 82 +++++++++++++++++++ app/styles/app.css | 23 ++++-- app/templates/components/plot-abstract.hbs | 1 + app/templates/visualization/edit.hbs | 14 ++-- .../components/plot-abstract-test.js | 24 ++++++ tests/unit/mixins/sortable-test.js | 12 +++ todo.md | 2 +- 16 files changed, 240 insertions(+), 59 deletions(-) create mode 100644 app/components/plot-abstract.js create mode 100644 app/mixins/sortable.js create mode 100644 app/templates/components/plot-abstract.hbs create mode 100644 tests/integration/components/plot-abstract-test.js create mode 100644 tests/unit/mixins/sortable-test.js diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index 3eacd71..e708e90 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -1,13 +1,16 @@ import Ember from 'ember'; +import Sortable from '../mixins/sortable'; var { set } = Ember; -export default Ember.Component.extend({ +export default Ember.Component.extend(Sortable, { tagName: 'div', classNames: [ 'draggableDropzone plots' ], classNameBindings: [ 'dragClass' ], dragClass: 'deactivated', + placeholder_sort: 'plot-placeholder', + dragLeave(event) { event.preventDefault(); set(this, 'dragClass', 'deactivated'); diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js new file mode 100644 index 0000000..779c646 --- /dev/null +++ b/app/components/plot-abstract.js @@ -0,0 +1,33 @@ +import Ember from 'ember'; +import Resizable from '../mixins/resizable'; + +export default Ember.Component.extend(Resizable, { + attributeBindings: [ 'style' ], + + plot: null, + + disabled_resize: false, + autoHide_resize: false, + + style: function() { + return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; + }.property('plot'), + + stop_resize(event, ui) { + var width = ui.size.width; + var height = ui.size.height; + + this.set('plot.width', width); + this.set('plot.height', height); + }, + + _updateUI: function() { + if (this.get('editing') === true) { + this.set('disabled_resize', false); + this.set('autoHide_resize', false); + } else { + this.set('disabled_resize', true); + this.set('autoHide_resize', true); + } + }.observes('editing').on('init') +}); diff --git a/app/components/plot-container.js b/app/components/plot-container.js index a9c99bb..da80664 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -1,6 +1,9 @@ import Ember from 'ember'; export default Ember.Component.extend({ + classNames: [ 'plot' ], + editing: false, + isTable: function() { var type = this.get('plot.type'); return type === 'table'; diff --git a/app/components/plot-table.js b/app/components/plot-table.js index d8a74a2..584fd9c 100644 --- a/app/components/plot-table.js +++ b/app/components/plot-table.js @@ -1,20 +1,10 @@ import Ember from 'ember'; -import Resizable from '../mixins/resizable'; +import PlotAbstract from './plot-abstract'; -export default Ember.Component.extend(Resizable, { +export default PlotAbstract.extend({ tagName: 'div', - attributeBindings: [ 'style' ], classNames: [ 'plotContainer', 'plotTable' ], - plot: null, - editing: false, - - style: function() { - return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; - }.property('plot'), - - stop_resize(event, ui) { - this.set('plot.width', this.$().width()); - this.set('plot.height', this.$().height()); - } + minWidth_resize: 200, + minHeight_resize: 60 }); diff --git a/app/components/plot-value.js b/app/components/plot-value.js index bb27fb4..5992e34 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -1,23 +1,10 @@ import Ember from 'ember'; -import Resizable from '../mixins/resizable'; +import PlotAbstract from './plot-abstract'; -export default Ember.Component.extend(Resizable, { +export default PlotAbstract.extend({ tagName: 'div', - attributeBindings: [ 'style' ], classNames: [ 'plotContainer', 'plotValue' ], - plot: null, - editing: false, - minWidth_resize: 50, - minHeight_resize: 20, - - style: function() { - return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; - }.property('plot'), - - stop_resize(event, ui) { - this.set('plot.width', this.$().width()); - this.set('plot.height', this.$().height()); - } + minHeight_resize: 20 }); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 7ca0e6f..38e9f0c 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -33,6 +33,25 @@ export default Ember.Controller.extend({ } else { console.error('Unknown plot type: ' + name); } + }, + + saveEdit() { + // save changes to store + var plots = this.get('model.plots'); + plots.forEach(function(plot) { + plot.save(); + }); + + // go back to index + var id = this.get('model.id'); + this.transitionToRoute('/visualization/' + id); + }, + + cancelEdit() { + // TODO: revert changes + + let id = this.get('model.id'); + this.transitionToRoute('/visualization/' + id); } } }); diff --git a/app/mixins/draggable.js b/app/mixins/draggable.js index 0fb10eb..1e89d90 100644 --- a/app/mixins/draggable.js +++ b/app/mixins/draggable.js @@ -61,13 +61,15 @@ export default Ember.Mixin.create({ _gatherDragEvents(options) { // register callbacks for each event var uiDragEvents = this.get('uiDragEvents') || []; + var _this = this; + uiDragEvents.forEach(function(event) { - var callback = this[event]; + var callback = _this[event]; if (callback) { options[event.split('_')[0]] = function(event, ui) { - callback.call(this, event, ui); + callback.call(_this, event, ui); }; } - }, this); + }); } }); diff --git a/app/mixins/droppable.js b/app/mixins/droppable.js index e3c2b7f..eb1c57a 100644 --- a/app/mixins/droppable.js +++ b/app/mixins/droppable.js @@ -60,13 +60,15 @@ export default Ember.Mixin.create({ _gatherDropEvents(options) { // register callbacks for each event var uiDropEvents = this.get('uiDropEvents') || []; + var _this = this; + uiDropEvents.forEach(function(event) { - var callback = this[event]; + var callback = _this[event]; if (callback) { options[event.split('_')[0]] = function(event, ui) { - callback.call(this, event, ui); + callback.call(_this, event, ui); }; } - }, this); + }); } }); diff --git a/app/mixins/resizable.js b/app/mixins/resizable.js index 83fa97e..7a102d1 100644 --- a/app/mixins/resizable.js +++ b/app/mixins/resizable.js @@ -1,9 +1,9 @@ import Ember from 'ember'; export default Ember.Mixin.create({ - uiResizeOptions: [ 'disable_resize', 'alsoResize_resize', 'animate_resize', + uiResizeOptions: [ 'disabled_resize', 'alsoResize_resize', 'animate_resize', 'animateDuration_resize', 'animateEasing_resize', 'aspectRatio_resize', - 'autoHide_resize', 'cancel_resize', 'containment_resize', 'delay_resize', + 'autoHide_resize', 'cancel_resize', 'containment_resize', 'delay_resize', 'distance_resize', 'ghost_resize', 'grid_resize', 'handles_resize', 'helper_resize', 'maxHeight_resize', 'maxWidth_resize', 'minHeight_resize', 'minWidth_resize' ], uiResizeEvents: [ 'create_resize', 'start_resize', 'resize_resize', 'stop_resize' ], @@ -11,12 +11,12 @@ export default Ember.Mixin.create({ didInsertElement() { this._super(); + // get available options and events var options = this._gatherResizeOptions(); - this._gatherResizeEvents(options); + // create a new jQuery UI widget var ui = Ember.$.ui['resizable'](options, this.get('element')); - this.set('ui', ui); }, @@ -24,6 +24,7 @@ export default Ember.Mixin.create({ var ui = this.get('ui'); if (ui) { + // remove all observers for jQuery UI widget var observers = this._observers; for (var prop in observers) { if (observers.hasOwnProperty(prop)) { @@ -31,16 +32,20 @@ export default Ember.Mixin.create({ } } - ui._destroy(); + ui.destroy(); } }, _gatherResizeOptions() { - var uiResizeOptions = this.get('uiResizeOptions'), options = {}; + // parse all options and add observers for them + var uiResizeOptions = this.get('uiResizeOptions') || []; + var options = {}; uiResizeOptions.forEach(function(key) { + // save the resize option without the postfix options[key.split('_')[0]] = this.get(key); + // create an observer for this option var observer = function() { var value = this.get(key); console.log(key + ': ' + value); @@ -49,6 +54,7 @@ export default Ember.Mixin.create({ this.addObserver(key, observer); + // save observer to remove it later on this._observers = this._observers || {}; this._observers[key] = observer; }, this); @@ -57,13 +63,15 @@ export default Ember.Mixin.create({ }, _gatherResizeEvents(options) { - var uiResizeEvents = this.get('uiResizeEvents') || [], self = this; - uiResizeEvents.forEach(function(event) { - var callback = self[event]; + // register callbacks for each event + var uiResizeEvents = this.get('uiResizeEvents') || []; + var _this = this; + uiResizeEvents.forEach(function(event) { + var callback = _this[event]; if (callback) { options[event.split('_')[0]] = function(event, ui) { - callback.call(self, event, ui); + callback.call(_this, event, ui); }; } }); diff --git a/app/mixins/sortable.js b/app/mixins/sortable.js new file mode 100644 index 0000000..603dfde --- /dev/null +++ b/app/mixins/sortable.js @@ -0,0 +1,82 @@ +import Ember from 'ember'; + +export default Ember.Mixin.create({ + uiSortOptions: [ 'appendTo_sort', 'axis_sort', 'cancel_sort', 'connectWith_sort', + 'containment_sort', 'cursor_sort', 'cursorAt_sort', 'delay_sort', 'disabled_sort', + 'distance_sort', 'dropOnEmpty_sort', 'forceHelperSize_sort', 'forcePlaceholderSize_sort', + 'grid_sort', 'handle_sort', 'helper_sort', 'items_sort', 'opacity_sort', + 'placeholder_sort', 'revert_sort', 'scroll_sort', 'scrollSensitivity_sort', + 'scrollSpeed_sort', 'tolerance_sort', 'zIndex_sort' ], + uiSortEvents: [ 'activate_sort', 'beforeStop_sort', 'change_sort', 'create_sort', + 'deactivate_sort', 'out_sort', 'over_sort', 'receive_sort', 'remove_sort', + 'sort_sort', 'start_sort', 'stop_sort', 'update_sort' ], + + didInsertElement() { + this._super(); + + // get available options and events + var options = this._gatherSortOptions(); + this._gatherSortEvents(options); + + // create a new jQuery UI widget + var ui = Ember.$.ui['sortable'](options, this.get('element')); + this.set('ui', ui); + }, + + willDestroyElement() { + var ui = this.get('ui'); + + if (ui) { + // remove all observers for jQuery UI widget + var observers = this._observers; + for (var prop in observers) { + if (observers.hasOwnProperty(prop)) { + this.removeObserver(prop, observers[prop]); + } + } + + ui.destroy(); + } + }, + + _gatherSortOptions() { + // parse all options and add observers for them + var uiSortOptions = this.get('uiSortOptions') || []; + var options = {}; + + uiSortOptions.forEach(function(key) { + // save the sort option without the postfix + options[key.split('_')[0]] = this.get(key); + + // create an observer for this option + var observer = function() { + var value = this.get(key); + console.log(key + ': ' + value); + this.get('ui').option(key.split('_')[0], value); + }; + + this.addObserver(key, observer); + + // save observer to remove it later on + this._observers = this._observers || {}; + this._observers[key] = observer; + }, this); + + return options; + }, + + _gatherSortEvents(options) { + // register callbacks for each event + var uiSortEvents = this.get('uiSortEvents') || []; + var _this = this; + + uiSortEvents.forEach(function(event) { + var callback = _this[event]; + if (callback) { + options[event.split('_')[0]] = function(event, ui) { + callback.call(_this, event, ui); + }; + } + }); + } +}); diff --git a/app/styles/app.css b/app/styles/app.css index 9487c40..82ea5c9 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -117,8 +117,8 @@ footer { overflow: auto; } -.plot-toolbox { - margin-top: 20px; +.plots > div { + float: left; } .plot-add-row { @@ -126,9 +126,22 @@ footer { font-weight: 800; text-align: center; +} - margin: 0; - margin-top: -25px; +.plot-add-row > div { + float: none; +} + +.plot-toolbox { + margin-top: 20px; +} + +.plot-placeholder { + border: 1px dotted black; + width: 100px; + height: 100px; + + margin: 10px; } .draggableDropzone { @@ -166,7 +179,7 @@ footer { margin: 10px; padding: 5px 10px; - float: left; + display: inline-block; } .plotValue { diff --git a/app/templates/components/plot-abstract.hbs b/app/templates/components/plot-abstract.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/plot-abstract.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index 2ced225..f3ffa5d 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -15,17 +15,19 @@ {{/draggable-item}} -{{#draggable-dropzone dropped='addPlot'}} - {{#each model.plots as |plot|}} - {{#plot-container plot=plot editing=true}}{{/plot-container}} - {{/each}} -{{/draggable-dropzone}} +

    + {{#draggable-dropzone dropped='addPlot'}} + {{#each model.plots as |plot|}} + {{#plot-container plot=plot editing=true}}{{/plot-container}} + {{/each}} + {{/draggable-dropzone}} +
    {{#draggable-dropzone dropped='addRowWithPlot'}}
    +
    {{/draggable-dropzone}} -

    +

    diff --git a/tests/integration/components/plot-abstract-test.js b/tests/integration/components/plot-abstract-test.js new file mode 100644 index 0000000..392a7fb --- /dev/null +++ b/tests/integration/components/plot-abstract-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('plot-abstract', 'Integration | Component | plot abstract', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{plot-abstract}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#plot-abstract}} + template block text + {{/plot-abstract}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/unit/mixins/sortable-test.js b/tests/unit/mixins/sortable-test.js new file mode 100644 index 0000000..2efc2c2 --- /dev/null +++ b/tests/unit/mixins/sortable-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import SortableMixin from 'villasweb-frontend/mixins/sortable'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | sortable'); + +// Replace this with your real tests. +test('it works', function(assert) { + let SortableObject = Ember.Object.extend(SortableMixin); + let subject = SortableObject.create(); + assert.ok(subject); +}); diff --git a/todo.md b/todo.md index 4b9a455..b0982cf 100644 --- a/todo.md +++ b/todo.md @@ -6,7 +6,7 @@ - Websocket node is working in develop branch - Add API host to config/environment.js - Empty visualization after delete - + - Go into edit mode if visualization is empty websocketserverip/config.json websocketserverip/nodes.json From 77ebf05526f214fcab153917c031af24b238d643 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 19 Jul 2016 16:13:56 +0200 Subject: [PATCH 014/556] Change plots to free arrangement Plots can be positioned freely. The plot area does not scrolls yet while editing, but scales to fit all plots which are inside. --- app/components/draggable-dropzone.js | 7 ++-- app/components/draggable-item.js | 1 - app/components/plot-abstract.js | 17 ++++++++-- app/components/plot-container.js | 33 ++++++++++-------- app/components/plot-table.js | 1 - app/components/plot-value.js | 1 - app/controllers/visualization/edit.js | 6 ++-- app/models/plot.js | 4 +-- app/styles/app.css | 37 ++++++--------------- app/templates/components/plot-container.hbs | 12 ++----- app/templates/visualization/edit.hbs | 14 ++------ app/templates/visualization/index.hbs | 6 +--- 12 files changed, 59 insertions(+), 80 deletions(-) diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index e708e90..635485e 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -1,16 +1,13 @@ import Ember from 'ember'; -import Sortable from '../mixins/sortable'; var { set } = Ember; -export default Ember.Component.extend(Sortable, { +export default Ember.Component.extend({ tagName: 'div', - classNames: [ 'draggableDropzone plots' ], + classNames: [ 'draggableDropzone' ], classNameBindings: [ 'dragClass' ], dragClass: 'deactivated', - placeholder_sort: 'plot-placeholder', - dragLeave(event) { event.preventDefault(); set(this, 'dragClass', 'deactivated'); diff --git a/app/components/draggable-item.js b/app/components/draggable-item.js index b02d4ac..841bd98 100644 --- a/app/components/draggable-item.js +++ b/app/components/draggable-item.js @@ -1,5 +1,4 @@ import Ember from 'ember'; -import Draggable from '../mixins/draggable'; var { get } = Ember; diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 779c646..75efb26 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -1,16 +1,22 @@ import Ember from 'ember'; import Resizable from '../mixins/resizable'; +import Draggable from '../mixins/draggable'; -export default Ember.Component.extend(Resizable, { +export default Ember.Component.extend(Resizable, Draggable, { attributeBindings: [ 'style' ], plot: null, disabled_resize: false, autoHide_resize: false, + grid_resize: [ 10, 10 ], + + disabled_drag: false, + containment_drag: 'parent', + grid_drag: [ 10, 10 ], style: function() { - return 'width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px;'; + return Ember.String.htmlSafe('width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; left: ' + this.get('plot.x') + 'px; top: ' + this.get('plot.y') + 'px;'); }.property('plot'), stop_resize(event, ui) { @@ -21,13 +27,20 @@ export default Ember.Component.extend(Resizable, { this.set('plot.height', height); }, + stop_drag(event, ui) { + this.set('plot.x', ui.position.left); + this.set('plot.y', ui.position.top); + }, + _updateUI: function() { if (this.get('editing') === true) { this.set('disabled_resize', false); this.set('autoHide_resize', false); + this.set('disabled_drag', false); } else { this.set('disabled_resize', true); this.set('autoHide_resize', true); + this.set('disabled_drag', true); } }.observes('editing').on('init') }); diff --git a/app/components/plot-container.js b/app/components/plot-container.js index da80664..0461155 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -1,21 +1,28 @@ import Ember from 'ember'; export default Ember.Component.extend({ - classNames: [ 'plot' ], + tagName: 'div', + classNames: [ 'plots' ], + attributeBindings: [ 'style' ], editing: false, - isTable: function() { - var type = this.get('plot.type'); - return type === 'table'; - }.property('plot.type'), + plots: null, - isChart: function() { - var type = this.get('plot.type'); - return type === 'chart'; - }.property('plot.type'), + style: function() { + return Ember.String.htmlSafe('height: ' + this._calculateHeight() + 'px;'); + }.property('plots.@each.height', 'plots.@each.y'), - isValue: function() { - var type = this.get('plot.type'); - return type === 'value'; - }.property('plot.type') + _calculateHeight() { + var maxHeight = 0; + var plots = this.get('plots'); + + plots.forEach(function(plot) { + var plotHeight = plot.get('y') + plot.get('height'); + if (plotHeight > maxHeight) { + maxHeight = plotHeight; + } + }); + + return maxHeight; + } }); diff --git a/app/components/plot-table.js b/app/components/plot-table.js index 584fd9c..a416184 100644 --- a/app/components/plot-table.js +++ b/app/components/plot-table.js @@ -1,4 +1,3 @@ -import Ember from 'ember'; import PlotAbstract from './plot-abstract'; export default PlotAbstract.extend({ diff --git a/app/components/plot-value.js b/app/components/plot-value.js index 5992e34..155ccb9 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -1,4 +1,3 @@ -import Ember from 'ember'; import PlotAbstract from './plot-abstract'; export default PlotAbstract.extend({ diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 38e9f0c..c1926eb 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -7,11 +7,11 @@ export default Ember.Controller.extend({ if (name === 'chart') { // create new chart plot - plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1', type: 'chart' }); + plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1', type: 'plot-chart' }); } else if (name === 'table') { - plot = this.store.createRecord('plot', { name: 'Table 1', signal: 'Signal 1', type: 'table', width: 500, height: 200 }); + plot = this.store.createRecord('plot', { name: 'Table 1', signal: 'Signal 1', type: 'plot-table', width: 500, height: 200, title: 'Table 1' }); } else if (name === 'value') { - plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1', type: 'value' }); + plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1', type: 'plot-value' }); } else { // DEBUG console.log('Add plot: ' + name); diff --git a/app/models/plot.js b/app/models/plot.js index 2e88f8a..ae6c0f3 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -9,7 +9,7 @@ export default Model.extend({ height: attr('number', { defaultValue: 100 }), title: attr('string'), type: attr('string'), - row: attr('number'), - column: attr('number'), + x: attr('number', { defaultValue: 0 }), + y: attr('number', { defaultValue: 0 }), visualization: belongsTo('Visualization', { async: true }) }); diff --git a/app/styles/app.css b/app/styles/app.css index 82ea5c9..3b45171 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -114,40 +114,19 @@ footer { margin-top: 20px; margin-bottom: 20px; - overflow: auto; -} + overflow: visible; -.plots > div { - float: left; -} - -.plot-add-row { - font-size: 100px; - font-weight: 800; - - text-align: center; -} - -.plot-add-row > div { - float: none; + position: relative; } .plot-toolbox { margin-top: 20px; } -.plot-placeholder { - border: 1px dotted black; - width: 100px; - height: 100px; - - margin: 10px; -} - .draggableDropzone { display: block; - min-height: 100px; + min-height: 400px; border: 3px dashed #aaa; @@ -179,16 +158,20 @@ footer { margin: 10px; padding: 5px 10px; - display: inline-block; + /*display: inline-block;*/ + + /*position: absolute;*/ } .plotValue { - + position: absolute; } .plotTable { + position: absolute; + width: 100%; - height: 100%; + /*height: 100%;*/ border: 1px solid gray; diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs index b8a5f06..883eed7 100644 --- a/app/templates/components/plot-container.hbs +++ b/app/templates/components/plot-container.hbs @@ -1,9 +1,3 @@ -{{#if isTable}} - {{#plot-table plot=plot editing=editing}}{{/plot-table}} -{{else if isChart}} - {{#plot-chart plot=plot editing=editing}}{{/plot-chart}} -{{else if isValue}} - {{#plot-value plot=plot editing=editing}}{{/plot-value}} -{{else}} - Unknown Plot -{{/if}} +{{#each plots as |plot|}} + {{component plot.type plot=plot editing=editing}} +{{/each}} diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index f3ffa5d..ea00cf5 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -15,19 +15,11 @@ {{/draggable-item}} -
    - {{#draggable-dropzone dropped='addPlot'}} - {{#each model.plots as |plot|}} - {{#plot-container plot=plot editing=true}}{{/plot-container}} - {{/each}} - {{/draggable-dropzone}} -
    - -{{#draggable-dropzone dropped='addRowWithPlot'}} -
    +
    +{{#draggable-dropzone dropped='addPlot'}} + {{plot-container plots=model.plots editing=true}} {{/draggable-dropzone}} -

    +

    diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs index b41cca6..b85b398 100644 --- a/app/templates/visualization/index.hbs +++ b/app/templates/visualization/index.hbs @@ -1,10 +1,6 @@

    {{model.name}}

    -
    - {{#each model.plots as |plot|}} - {{#plot-container plot=plot}}{{/plot-container}} - {{/each}} -
    +{{plot-container plots=model.plots}}

    {{#link-to "visualization.edit" model.id}}Edit visualization{{/link-to}} From 7bca56a8c8a2d555ea93cd12c0da207b76645b4f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 19 Jul 2016 16:45:45 +0200 Subject: [PATCH 015/556] Add plots.css Add grid option to plots. --- app/components/plot-abstract.js | 15 +++++- app/components/plot-container.js | 6 ++- app/components/plot-table.js | 3 +- app/components/plot-value.js | 3 +- app/styles/app.css | 47 +----------------- app/styles/plots.css | 55 +++++++++++++++++++++ app/templates/components/plot-container.hbs | 2 +- 7 files changed, 79 insertions(+), 52 deletions(-) create mode 100644 app/styles/plots.css diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 75efb26..933d85f 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -3,9 +3,13 @@ import Resizable from '../mixins/resizable'; import Draggable from '../mixins/draggable'; export default Ember.Component.extend(Resizable, Draggable, { + tagName: 'div', + classNames: [ 'plotAbstract' ], attributeBindings: [ 'style' ], plot: null, + editing: false, + grid: false, disabled_resize: false, autoHide_resize: false, @@ -14,6 +18,7 @@ export default Ember.Component.extend(Resizable, Draggable, { disabled_drag: false, containment_drag: 'parent', grid_drag: [ 10, 10 ], + scroll_drag: true, style: function() { return Ember.String.htmlSafe('width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; left: ' + this.get('plot.x') + 'px; top: ' + this.get('plot.y') + 'px;'); @@ -42,5 +47,13 @@ export default Ember.Component.extend(Resizable, Draggable, { this.set('autoHide_resize', true); this.set('disabled_drag', true); } - }.observes('editing').on('init') + + if (this.get('grid') === true) { + this.set('grid_resize', [ 10, 10 ]); + this.set('grid_drag', [ 10, 10 ]); + } else { + this.set('grid_resize', false); + this.set('grid_drag', false); + } + }.observes('editing', 'grid').on('init') }); diff --git a/app/components/plot-container.js b/app/components/plot-container.js index 0461155..3dfba34 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -4,9 +4,10 @@ export default Ember.Component.extend({ tagName: 'div', classNames: [ 'plots' ], attributeBindings: [ 'style' ], - editing: false, plots: null, + editing: false, + grid: true, style: function() { return Ember.String.htmlSafe('height: ' + this._calculateHeight() + 'px;'); @@ -23,6 +24,9 @@ export default Ember.Component.extend({ } }); + // add padding to height + maxHeight += 40; + return maxHeight; } }); diff --git a/app/components/plot-table.js b/app/components/plot-table.js index a416184..be84e2e 100644 --- a/app/components/plot-table.js +++ b/app/components/plot-table.js @@ -1,8 +1,7 @@ import PlotAbstract from './plot-abstract'; export default PlotAbstract.extend({ - tagName: 'div', - classNames: [ 'plotContainer', 'plotTable' ], + classNames: [ 'plotTable' ], minWidth_resize: 200, minHeight_resize: 60 diff --git a/app/components/plot-value.js b/app/components/plot-value.js index 155ccb9..e36977c 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -1,8 +1,7 @@ import PlotAbstract from './plot-abstract'; export default PlotAbstract.extend({ - tagName: 'div', - classNames: [ 'plotContainer', 'plotValue' ], + classNames: [ 'plotValue' ], minWidth_resize: 50, minHeight_resize: 20 diff --git a/app/styles/app.css b/app/styles/app.css index 3b45171..b2ae1e3 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -1,3 +1,5 @@ +@import 'plots.css'; + * { margin: 0; padding: 0; @@ -110,19 +112,6 @@ footer { /** * Visualization */ -.plots { - margin-top: 20px; - margin-bottom: 20px; - - overflow: visible; - - position: relative; -} - -.plot-toolbox { - margin-top: 20px; -} - .draggableDropzone { display: block; @@ -151,35 +140,3 @@ footer { background-color: #aaa; } } - -.plotContainer { - border: 1px solid lightgray; - - margin: 10px; - padding: 5px 10px; - - /*display: inline-block;*/ - - /*position: absolute;*/ -} - -.plotValue { - position: absolute; -} - -.plotTable { - position: absolute; - - width: 100%; - /*height: 100%;*/ - - border: 1px solid gray; - - border-collapse: collapse; -} - -.plotTable td, th { - border: 1px solid gray; - - padding: 2px 5px; -} diff --git a/app/styles/plots.css b/app/styles/plots.css new file mode 100644 index 0000000..061ed34 --- /dev/null +++ b/app/styles/plots.css @@ -0,0 +1,55 @@ +/** + * Component: plot-container + */ +.plots { + overflow: scroll; + + position: relative; +} + +/** + * Component: plot-toolbox + */ +.plot-toolbox { + margin: 20px 0; +} + +/** + * Component: plot-abstract + */ +.plotAbstract { + border: 1px solid lightgray; + + margin: 10px; + padding: 5px 10px; + + position: absolute; +} + +/** + * Component: plot-value + */ +.plotValue { + +} + +/** + * Component: plot-table + */ +.plotTable { + +} + +.plotTable table { + width: 100%; + /*height: 100%;*/ + + border: 1px solid gray; + border-collapse: collapse; +} + +.plotTable td, th { + border: 1px solid gray; + + padding: 2px 5px; +} diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs index 883eed7..2c29da4 100644 --- a/app/templates/components/plot-container.hbs +++ b/app/templates/components/plot-container.hbs @@ -1,3 +1,3 @@ {{#each plots as |plot|}} - {{component plot.type plot=plot editing=editing}} + {{component plot.type plot=plot editing=editing grid=grid}} {{/each}} From f3fd704b91dd83e8812907150788559a9bf54f2a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 20 Jul 2016 12:25:51 +0200 Subject: [PATCH 016/556] Add comment header to files --- app/adapters/application.js | 9 +++++++++ app/app.js | 9 +++++++++ app/authenticators/custom.js | 9 +++++++++ app/authorizers/custom.js | 9 +++++++++ app/components/draggable-dropzone.js | 9 +++++++++ app/components/draggable-item.js | 9 +++++++++ app/components/plot-abstract.js | 9 +++++++++ app/components/plot-chart.js | 9 +++++++++ app/components/plot-container.js | 9 +++++++++ app/components/plot-table.js | 9 +++++++++ app/components/plot-value.js | 9 +++++++++ app/controllers/application.js | 9 +++++++++ app/controllers/login.js | 9 +++++++++ app/controllers/me.js | 9 +++++++++ app/controllers/project/delete.js | 9 +++++++++ app/controllers/project/edit.js | 9 +++++++++ app/controllers/project/index.js | 9 +++++++++ app/controllers/project/new.js | 9 +++++++++ app/controllers/user/delete.js | 9 +++++++++ app/controllers/user/edit.js | 9 +++++++++ app/controllers/user/index.js | 9 +++++++++ app/controllers/user/new.js | 9 +++++++++ app/controllers/visualization/delete.js | 9 +++++++++ app/controllers/visualization/edit.js | 9 +++++++++ app/controllers/visualization/index.js | 9 +++++++++ app/mixins/draggable.js | 9 +++++++++ app/mixins/droppable.js | 9 +++++++++ app/mixins/resizable.js | 9 +++++++++ app/mixins/sortable.js | 9 +++++++++ app/models/plot.js | 9 +++++++++ app/models/project.js | 9 +++++++++ app/models/user.js | 9 +++++++++ app/models/visualization.js | 9 +++++++++ app/resolver.js | 9 +++++++++ app/router.js | 9 +++++++++ app/routes/404.js | 9 +++++++++ app/routes/application.js | 9 +++++++++ app/routes/index.js | 9 +++++++++ app/routes/login.js | 9 +++++++++ app/routes/logout.js | 9 +++++++++ app/routes/me.js | 9 +++++++++ app/routes/project/delete.js | 9 +++++++++ app/routes/project/edit.js | 9 +++++++++ app/routes/project/index.js | 9 +++++++++ app/routes/project/new.js | 9 +++++++++ app/routes/projects.js | 9 +++++++++ app/routes/user/delete.js | 9 +++++++++ app/routes/user/edit.js | 9 +++++++++ app/routes/user/index.js | 9 +++++++++ app/routes/user/new.js | 9 +++++++++ app/routes/visualization/delete.js | 9 +++++++++ app/routes/visualization/edit.js | 9 +++++++++ app/routes/visualization/index.js | 9 +++++++++ app/routes/visualization/new.js | 9 +++++++++ app/serializers/application.js | 9 +++++++++ app/serializers/project.js | 9 +++++++++ app/serializers/user.js | 9 +++++++++ app/serializers/visualization.js | 9 +++++++++ app/services/session-user.js | 9 +++++++++ app/styles/app.css | 9 +++++++++ app/styles/plots.css | 9 +++++++++ 61 files changed, 549 insertions(+) diff --git a/app/adapters/application.js b/app/adapters/application.js index 67eee3f..961ded9 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -1,3 +1,12 @@ +/** + * File: application.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import RESTAdapter from 'ember-data/adapters/rest'; import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; import ENV from '../config/environment'; diff --git a/app/app.js b/app/app.js index 7266b19..01d4b13 100644 --- a/app/app.js +++ b/app/app.js @@ -1,3 +1,12 @@ +/** + * File: app.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; diff --git a/app/authenticators/custom.js b/app/authenticators/custom.js index e05c9d1..017b976 100644 --- a/app/authenticators/custom.js +++ b/app/authenticators/custom.js @@ -1,3 +1,12 @@ +/** + * File: custom.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import Base from 'ember-simple-auth/authenticators/base'; import ENV from '../config/environment'; diff --git a/app/authorizers/custom.js b/app/authorizers/custom.js index e443104..2711f0d 100644 --- a/app/authorizers/custom.js +++ b/app/authorizers/custom.js @@ -1,3 +1,12 @@ +/** + * File: custom.js + * Author: Markus Grigull + * Date: 04.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import Base from 'ember-simple-auth/authorizers/base'; diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index 635485e..d0497dc 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -1,3 +1,12 @@ +/** + * File: draggable-dropzone.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; var { set } = Ember; diff --git a/app/components/draggable-item.js b/app/components/draggable-item.js index 841bd98..087c843 100644 --- a/app/components/draggable-item.js +++ b/app/components/draggable-item.js @@ -1,3 +1,12 @@ +/** + * File: draggable-item.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; var { get } = Ember; diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 933d85f..47f1dd7 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -1,3 +1,12 @@ +/** + * File: plot-abstract.js + * Author: Markus Grigull + * Date: 15.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import Resizable from '../mixins/resizable'; import Draggable from '../mixins/draggable'; diff --git a/app/components/plot-chart.js b/app/components/plot-chart.js index 926b613..354418b 100644 --- a/app/components/plot-chart.js +++ b/app/components/plot-chart.js @@ -1,3 +1,12 @@ +/** + * File: plot-chart.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/components/plot-container.js b/app/components/plot-container.js index 3dfba34..de61a77 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -1,3 +1,12 @@ +/** + * File: plot-container.js + * Author: Markus Grigull + * Date: 05.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Component.extend({ diff --git a/app/components/plot-table.js b/app/components/plot-table.js index be84e2e..07758c4 100644 --- a/app/components/plot-table.js +++ b/app/components/plot-table.js @@ -1,3 +1,12 @@ +/** + * File: plot-table.js + * Author: Markus Grigull + * Date: 05.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import PlotAbstract from './plot-abstract'; export default PlotAbstract.extend({ diff --git a/app/components/plot-value.js b/app/components/plot-value.js index e36977c..2c91b59 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -1,3 +1,12 @@ +/** + * File: plot-value.js + * Author: Markus Grigull + * Date: 04.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import PlotAbstract from './plot-abstract'; export default PlotAbstract.extend({ diff --git a/app/controllers/application.js b/app/controllers/application.js index 932ac68..37164b4 100644 --- a/app/controllers/application.js +++ b/app/controllers/application.js @@ -1,3 +1,12 @@ +/** + * File: application.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/login.js b/app/controllers/login.js index c7758d6..699eaa1 100644 --- a/app/controllers/login.js +++ b/app/controllers/login.js @@ -1,3 +1,12 @@ +/** + * File: login.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/me.js b/app/controllers/me.js index eac3232..0374c40 100644 --- a/app/controllers/me.js +++ b/app/controllers/me.js @@ -1,3 +1,12 @@ +/** + * File: me.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js index 212648b..b9b6c96 100644 --- a/app/controllers/project/delete.js +++ b/app/controllers/project/delete.js @@ -1,3 +1,12 @@ +/** + * File: delete.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/project/edit.js b/app/controllers/project/edit.js index dc98e3f..574a5ff 100644 --- a/app/controllers/project/edit.js +++ b/app/controllers/project/edit.js @@ -1,3 +1,12 @@ +/** + * File: edit.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/project/index.js b/app/controllers/project/index.js index e949d77..1437734 100644 --- a/app/controllers/project/index.js +++ b/app/controllers/project/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js index c786f7e..500e75e 100644 --- a/app/controllers/project/new.js +++ b/app/controllers/project/new.js @@ -1,3 +1,12 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/user/delete.js b/app/controllers/user/delete.js index ef1e8a0..19046dc 100644 --- a/app/controllers/user/delete.js +++ b/app/controllers/user/delete.js @@ -1,3 +1,12 @@ +/** + * File: delete.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/user/edit.js b/app/controllers/user/edit.js index e47d437..b44440a 100644 --- a/app/controllers/user/edit.js +++ b/app/controllers/user/edit.js @@ -1,3 +1,12 @@ +/** + * File: edit.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/user/index.js b/app/controllers/user/index.js index 0b0c945..6a44737 100644 --- a/app/controllers/user/index.js +++ b/app/controllers/user/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/user/new.js b/app/controllers/user/new.js index 3da5896..249f448 100644 --- a/app/controllers/user/new.js +++ b/app/controllers/user/new.js @@ -1,3 +1,12 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/visualization/delete.js b/app/controllers/visualization/delete.js index 14db97b..99bb874 100644 --- a/app/controllers/visualization/delete.js +++ b/app/controllers/visualization/delete.js @@ -1,3 +1,12 @@ +/** + * File: delete.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index c1926eb..063bd58 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -1,3 +1,12 @@ +/** + * File: edit.js + * Author: Markus Grigull + * Date: 05.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/controllers/visualization/index.js b/app/controllers/visualization/index.js index 55ff9aa..bfe1beb 100644 --- a/app/controllers/visualization/index.js +++ b/app/controllers/visualization/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ diff --git a/app/mixins/draggable.js b/app/mixins/draggable.js index 1e89d90..811b31e 100644 --- a/app/mixins/draggable.js +++ b/app/mixins/draggable.js @@ -1,3 +1,12 @@ +/** + * File: draggable.js + * Author: Markus Grigull + * Date: 15.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Mixin.create({ diff --git a/app/mixins/droppable.js b/app/mixins/droppable.js index eb1c57a..7e557e8 100644 --- a/app/mixins/droppable.js +++ b/app/mixins/droppable.js @@ -1,3 +1,12 @@ +/** + * File: droppable.js + * Author: Markus Grigull + * Date: 15.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Mixin.create({ diff --git a/app/mixins/resizable.js b/app/mixins/resizable.js index 7a102d1..2c67704 100644 --- a/app/mixins/resizable.js +++ b/app/mixins/resizable.js @@ -1,3 +1,12 @@ +/** + * File: resizable.js + * Author: Markus Grigull + * Date: 12.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Mixin.create({ diff --git a/app/mixins/sortable.js b/app/mixins/sortable.js index 603dfde..f7633a1 100644 --- a/app/mixins/sortable.js +++ b/app/mixins/sortable.js @@ -1,3 +1,12 @@ +/** + * File: sortable.js + * Author: Markus Grigull + * Date: 15.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Mixin.create({ diff --git a/app/models/plot.js b/app/models/plot.js index ae6c0f3..e7dd0ba 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -1,3 +1,12 @@ +/** + * File: plot.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Model from 'ember-data/model'; import attr from 'ember-data/attr'; import { belongsTo } from 'ember-data/relationships'; diff --git a/app/models/project.js b/app/models/project.js index 2ff9490..9c16f6d 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -1,3 +1,12 @@ +/** + * File: project.js + * Author: Markus Grigull + * Date: 04.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Model from 'ember-data/model'; import attr from 'ember-data/attr'; import { hasMany, belongsTo } from 'ember-data/relationships'; diff --git a/app/models/user.js b/app/models/user.js index bc61b02..2015875 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -1,3 +1,12 @@ +/** + * File: user.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Model from 'ember-data/model'; import attr from 'ember-data/attr'; import { hasMany } from 'ember-data/relationships'; diff --git a/app/models/visualization.js b/app/models/visualization.js index 016fb6e..659ecb0 100644 --- a/app/models/visualization.js +++ b/app/models/visualization.js @@ -1,3 +1,12 @@ +/** + * File: visualization.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Model from 'ember-data/model'; import attr from 'ember-data/attr'; import { belongsTo, hasMany } from 'ember-data/relationships'; diff --git a/app/resolver.js b/app/resolver.js index 2fb563d..50a19ab 100644 --- a/app/resolver.js +++ b/app/resolver.js @@ -1,3 +1,12 @@ +/** + * File: resolver.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Resolver from 'ember-resolver'; export default Resolver; diff --git a/app/router.js b/app/router.js index 03ad117..a2e4e7a 100644 --- a/app/router.js +++ b/app/router.js @@ -1,3 +1,12 @@ +/** + * File: router.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import config from './config/environment'; diff --git a/app/routes/404.js b/app/routes/404.js index 26d9f31..b93ac29 100644 --- a/app/routes/404.js +++ b/app/routes/404.js @@ -1,3 +1,12 @@ +/** + * File: 404.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Route.extend({ diff --git a/app/routes/application.js b/app/routes/application.js index 0596a73..e68dd55 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -1,3 +1,12 @@ +/** + * File: application.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; diff --git a/app/routes/index.js b/app/routes/index.js index 30e4e30..e4d4e02 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/login.js b/app/routes/login.js index 29e193c..21647e9 100644 --- a/app/routes/login.js +++ b/app/routes/login.js @@ -1,3 +1,12 @@ +/** + * File: login.js + * Author: Markus Grigull + * Date: 25.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin'; diff --git a/app/routes/logout.js b/app/routes/logout.js index 52daa5f..2f18620 100644 --- a/app/routes/logout.js +++ b/app/routes/logout.js @@ -1,3 +1,12 @@ +/** + * File: logout.js + * Author: Markus Grigull + * Date: 05.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/me.js b/app/routes/me.js index b8e23aa..d9e456c 100644 --- a/app/routes/me.js +++ b/app/routes/me.js @@ -1,3 +1,12 @@ +/** + * File: me.js + * Author: Markus Grigull + * Date: 27.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/project/delete.js b/app/routes/project/delete.js index b603665..ec3a964 100644 --- a/app/routes/project/delete.js +++ b/app/routes/project/delete.js @@ -1,3 +1,12 @@ +/** + * File: delete.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/project/edit.js b/app/routes/project/edit.js index b603665..6e52fe9 100644 --- a/app/routes/project/edit.js +++ b/app/routes/project/edit.js @@ -1,3 +1,12 @@ +/** + * File: edit.js + * Author: Markus Grigull + * Date: 05.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/project/index.js b/app/routes/project/index.js index b603665..10bd7ed 100644 --- a/app/routes/project/index.js +++ b/app/routes/project/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/project/new.js b/app/routes/project/new.js index 30e4e30..38e760a 100644 --- a/app/routes/project/new.js +++ b/app/routes/project/new.js @@ -1,3 +1,12 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/projects.js b/app/routes/projects.js index c992c7d..2908aa4 100644 --- a/app/routes/projects.js +++ b/app/routes/projects.js @@ -1,3 +1,12 @@ +/** + * File: project.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/user/delete.js b/app/routes/user/delete.js index 7fa7c6a..8ac9611 100644 --- a/app/routes/user/delete.js +++ b/app/routes/user/delete.js @@ -1,3 +1,12 @@ +/** + * File: delete.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/user/edit.js b/app/routes/user/edit.js index 7fa7c6a..3918d6d 100644 --- a/app/routes/user/edit.js +++ b/app/routes/user/edit.js @@ -1,3 +1,12 @@ +/** + * File: edit.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/user/index.js b/app/routes/user/index.js index f4885a9..7d89a0c 100644 --- a/app/routes/user/index.js +++ b/app/routes/user/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/user/new.js b/app/routes/user/new.js index 30e4e30..38c73e5 100644 --- a/app/routes/user/new.js +++ b/app/routes/user/new.js @@ -1,3 +1,12 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 11.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/visualization/delete.js b/app/routes/visualization/delete.js index 398a1e3..a6f5f3e 100644 --- a/app/routes/visualization/delete.js +++ b/app/routes/visualization/delete.js @@ -1,3 +1,12 @@ +/** + * File: delete.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/visualization/edit.js b/app/routes/visualization/edit.js index 398a1e3..e665763 100644 --- a/app/routes/visualization/edit.js +++ b/app/routes/visualization/edit.js @@ -1,3 +1,12 @@ +/** + * File: edit.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/visualization/index.js b/app/routes/visualization/index.js index 398a1e3..35a7beb 100644 --- a/app/routes/visualization/index.js +++ b/app/routes/visualization/index.js @@ -1,3 +1,12 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/routes/visualization/new.js b/app/routes/visualization/new.js index 30e4e30..12d85c7 100644 --- a/app/routes/visualization/new.js +++ b/app/routes/visualization/new.js @@ -1,3 +1,12 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; diff --git a/app/serializers/application.js b/app/serializers/application.js index 74ca08f..913c92f 100644 --- a/app/serializers/application.js +++ b/app/serializers/application.js @@ -1,3 +1,12 @@ +/** + * File: application.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import RESTSerializer from 'ember-data/serializers/rest'; import DS from 'ember-data'; diff --git a/app/serializers/project.js b/app/serializers/project.js index afe8e13..f0bd705 100644 --- a/app/serializers/project.js +++ b/app/serializers/project.js @@ -1,3 +1,12 @@ +/** + * File: project.js + * Author: Markus Grigull + * Date: 04.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ diff --git a/app/serializers/user.js b/app/serializers/user.js index 9bdf029..677cee0 100644 --- a/app/serializers/user.js +++ b/app/serializers/user.js @@ -1,3 +1,12 @@ +/** + * File: user.js + * Author: Markus Grigull + * Date: 27.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ diff --git a/app/serializers/visualization.js b/app/serializers/visualization.js index eade34d..d5e10b5 100644 --- a/app/serializers/visualization.js +++ b/app/serializers/visualization.js @@ -1,3 +1,12 @@ +/** + * File: visualization.js + * Author: Markus Grigull + * Date: 28.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ diff --git a/app/services/session-user.js b/app/services/session-user.js index 5f18491..ed736ac 100644 --- a/app/services/session-user.js +++ b/app/services/session-user.js @@ -1,3 +1,12 @@ +/** + * File: session-user.js + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; const { diff --git a/app/styles/app.css b/app/styles/app.css index b2ae1e3..b07b286 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -1,3 +1,12 @@ +/** + * File: app.css + * Author: Markus Grigull + * Date: 26.06.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + @import 'plots.css'; * { diff --git a/app/styles/plots.css b/app/styles/plots.css index 061ed34..34ee417 100644 --- a/app/styles/plots.css +++ b/app/styles/plots.css @@ -1,3 +1,12 @@ +/** + * File: plots.css + * Author: Markus Grigull + * Date: 19.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + /** * Component: plot-container */ From d9e18196454674837068c46119d25e0f62bbbd46 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 20 Jul 2016 16:54:20 +0200 Subject: [PATCH 017/556] Add simulation-model model and routes --- app/controllers/simulation-model/delete.js | 4 ++ app/controllers/simulation-model/edit.js | 4 ++ app/controllers/simulation-model/index.js | 4 ++ app/controllers/simulation-model/new.js | 39 +++++++++++++++++++ app/models/simulation-model.js | 19 +++++++++ app/models/user.js | 1 + app/router.js | 8 ++++ app/routes/simulation-model/delete.js | 4 ++ app/routes/simulation-model/edit.js | 4 ++ app/routes/simulation-model/index.js | 4 ++ app/routes/simulation-model/new.js | 14 +++++++ app/routes/simulation-models.js | 21 ++++++++++ app/serializers/simulation-model.js | 17 ++++++++ app/templates/application.hbs | 1 + app/templates/simulation-model/delete.hbs | 1 + app/templates/simulation-model/edit.hbs | 1 + app/templates/simulation-model/index.hbs | 1 + app/templates/simulation-model/new.hbs | 11 ++++++ app/templates/simulation-models.hbs | 9 +++++ .../simulation-model/delete-test.js | 12 ++++++ .../controllers/simulation-model/edit-test.js | 12 ++++++ .../simulation-model/index-test.js | 12 ++++++ .../controllers/simulation-model/new-test.js | 12 ++++++ tests/unit/models/simulation-model-test.js | 12 ++++++ tests/unit/routes/models-test.js | 11 ++++++ .../routes/simulation-model/delete-test.js | 11 ++++++ .../unit/routes/simulation-model/edit-test.js | 11 ++++++ .../routes/simulation-model/index-test.js | 11 ++++++ .../unit/routes/simulation-model/new-test.js | 11 ++++++ .../unit/serializers/simulation-model-test.js | 15 +++++++ 30 files changed, 297 insertions(+) create mode 100644 app/controllers/simulation-model/delete.js create mode 100644 app/controllers/simulation-model/edit.js create mode 100644 app/controllers/simulation-model/index.js create mode 100644 app/controllers/simulation-model/new.js create mode 100644 app/models/simulation-model.js create mode 100644 app/routes/simulation-model/delete.js create mode 100644 app/routes/simulation-model/edit.js create mode 100644 app/routes/simulation-model/index.js create mode 100644 app/routes/simulation-model/new.js create mode 100644 app/routes/simulation-models.js create mode 100644 app/serializers/simulation-model.js create mode 100644 app/templates/simulation-model/delete.hbs create mode 100644 app/templates/simulation-model/edit.hbs create mode 100644 app/templates/simulation-model/index.hbs create mode 100644 app/templates/simulation-model/new.hbs create mode 100644 app/templates/simulation-models.hbs create mode 100644 tests/unit/controllers/simulation-model/delete-test.js create mode 100644 tests/unit/controllers/simulation-model/edit-test.js create mode 100644 tests/unit/controllers/simulation-model/index-test.js create mode 100644 tests/unit/controllers/simulation-model/new-test.js create mode 100644 tests/unit/models/simulation-model-test.js create mode 100644 tests/unit/routes/models-test.js create mode 100644 tests/unit/routes/simulation-model/delete-test.js create mode 100644 tests/unit/routes/simulation-model/edit-test.js create mode 100644 tests/unit/routes/simulation-model/index-test.js create mode 100644 tests/unit/routes/simulation-model/new-test.js create mode 100644 tests/unit/serializers/simulation-model-test.js diff --git a/app/controllers/simulation-model/delete.js b/app/controllers/simulation-model/delete.js new file mode 100644 index 0000000..55ff9aa --- /dev/null +++ b/app/controllers/simulation-model/delete.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ +}); diff --git a/app/controllers/simulation-model/edit.js b/app/controllers/simulation-model/edit.js new file mode 100644 index 0000000..55ff9aa --- /dev/null +++ b/app/controllers/simulation-model/edit.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ +}); diff --git a/app/controllers/simulation-model/index.js b/app/controllers/simulation-model/index.js new file mode 100644 index 0000000..55ff9aa --- /dev/null +++ b/app/controllers/simulation-model/index.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ +}); diff --git a/app/controllers/simulation-model/new.js b/app/controllers/simulation-model/new.js new file mode 100644 index 0000000..a5d0eba --- /dev/null +++ b/app/controllers/simulation-model/new.js @@ -0,0 +1,39 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + actions: { + newModel() { + // get current user + var user = this.get('sessionUser.user'); + + // create new model from properties + var properties = this.getProperties('name'); + properties['owner'] = user; + + var simulationModel = this.store.createRecord('simulation-model', properties); + var controller = this; + + simulationModel.save().then(function() { + Ember.debug('Saved new model'); + controller.transitionToRoute('/simulation-models'); + }, function() { + Ember.debug('Error saving new model'); + }); + }, + + cancelNewModel() { + this.transitionToRoute('/simulation-models'); + } + } +}); diff --git a/app/models/simulation-model.js b/app/models/simulation-model.js new file mode 100644 index 0000000..f970b7e --- /dev/null +++ b/app/models/simulation-model.js @@ -0,0 +1,19 @@ +/** + * File: simulation-model.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string'), + running: attr('boolean'), + owner: belongsTo('user', { async: true }), + projects: hasMany('project', { async: true }) +}); diff --git a/app/models/user.js b/app/models/user.js index 2015875..9acf731 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -16,5 +16,6 @@ export default Model.extend({ password: attr('string'), adminLevel: attr('number'), projects: hasMany('project', { async: true }), + simulationModels: hasMany('simulation-model', { async: true }), mail: attr('string') }); diff --git a/app/router.js b/app/router.js index a2e4e7a..b0d9b40 100644 --- a/app/router.js +++ b/app/router.js @@ -42,6 +42,14 @@ Router.map(function() { }); this.route('404', { path: '/*path' }); + + this.route('simulation-model', function() { + this.route('index', { path: '/:modelid' }); + this.route('new'); + this.route('delete', { path: '/delete/:modelid' }); + this.route('edit', { path: '/edit/:modelid' }); + }); + this.route('simulation-models'); }); export default Router; diff --git a/app/routes/simulation-model/delete.js b/app/routes/simulation-model/delete.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/simulation-model/delete.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/simulation-model/edit.js b/app/routes/simulation-model/edit.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/simulation-model/edit.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/simulation-model/index.js b/app/routes/simulation-model/index.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/simulation-model/index.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/simulation-model/new.js b/app/routes/simulation-model/new.js new file mode 100644 index 0000000..79bcf5f --- /dev/null +++ b/app/routes/simulation-model/new.js @@ -0,0 +1,14 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { +}); diff --git a/app/routes/simulation-models.js b/app/routes/simulation-models.js new file mode 100644 index 0000000..f026c22 --- /dev/null +++ b/app/routes/simulation-models.js @@ -0,0 +1,21 @@ +/** + * File: simulation-models.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + sessionUser: Ember.inject.service('session-user'), + + model() { + // get models for current user + var user = this.get('sessionUser.user'); + return user.get('simulationModels'); + } +}); diff --git a/app/serializers/simulation-model.js b/app/serializers/simulation-model.js new file mode 100644 index 0000000..ee69978 --- /dev/null +++ b/app/serializers/simulation-model.js @@ -0,0 +1,17 @@ +/** + * File: simulation-model.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + owner: { serialize: 'ids' }, + projects: { serialize: 'ids' } + } +}); diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 457586e..0309741 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -9,6 +9,7 @@

    • {{#link-to 'index'}}Home{{/link-to}}
    • {{#link-to 'projects'}}Projects{{/link-to}}
    • +
    • {{#link-to 'simulation-models'}}Models{{/link-to}}
    • {{#link-to 'me'}}Account{{/link-to}}
    • {{#link-to 'logout'}}Logout{{/link-to}}
    diff --git a/app/templates/simulation-model/delete.hbs b/app/templates/simulation-model/delete.hbs new file mode 100644 index 0000000..c24cd68 --- /dev/null +++ b/app/templates/simulation-model/delete.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/app/templates/simulation-model/edit.hbs b/app/templates/simulation-model/edit.hbs new file mode 100644 index 0000000..c24cd68 --- /dev/null +++ b/app/templates/simulation-model/edit.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/app/templates/simulation-model/index.hbs b/app/templates/simulation-model/index.hbs new file mode 100644 index 0000000..c24cd68 --- /dev/null +++ b/app/templates/simulation-model/index.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/app/templates/simulation-model/new.hbs b/app/templates/simulation-model/new.hbs new file mode 100644 index 0000000..8056de7 --- /dev/null +++ b/app/templates/simulation-model/new.hbs @@ -0,0 +1,11 @@ +

    New model

    + + +

    + + {{input id='name' placeholder='Enter model name' value=name}} +

    + + + + diff --git a/app/templates/simulation-models.hbs b/app/templates/simulation-models.hbs new file mode 100644 index 0000000..e92a9cf --- /dev/null +++ b/app/templates/simulation-models.hbs @@ -0,0 +1,9 @@ +

    Models

    + +
      + {{#each model as |simulationModel|}} +
    • {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}}
    • + {{/each}} +
    + +{{#link-to "simulation-model.new"}}New model{{/link-to}} diff --git a/tests/unit/controllers/simulation-model/delete-test.js b/tests/unit/controllers/simulation-model/delete-test.js new file mode 100644 index 0000000..b8ccc6b --- /dev/null +++ b/tests/unit/controllers/simulation-model/delete-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation-model/delete', 'Unit | Controller | simulation-model/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/simulation-model/edit-test.js b/tests/unit/controllers/simulation-model/edit-test.js new file mode 100644 index 0000000..252b107 --- /dev/null +++ b/tests/unit/controllers/simulation-model/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation-model/edit', 'Unit | Controller | simulation-model/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/simulation-model/index-test.js b/tests/unit/controllers/simulation-model/index-test.js new file mode 100644 index 0000000..023e3c5 --- /dev/null +++ b/tests/unit/controllers/simulation-model/index-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation-model/index', 'Unit | Controller | simulation-model/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/simulation-model/new-test.js b/tests/unit/controllers/simulation-model/new-test.js new file mode 100644 index 0000000..ae144f9 --- /dev/null +++ b/tests/unit/controllers/simulation-model/new-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation-model/new', 'Unit | Controller | simulation-model/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/models/simulation-model-test.js b/tests/unit/models/simulation-model-test.js new file mode 100644 index 0000000..01f173b --- /dev/null +++ b/tests/unit/models/simulation-model-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulation-model', 'Unit | Model | simulation-model', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/routes/models-test.js b/tests/unit/routes/models-test.js new file mode 100644 index 0000000..a6182e6 --- /dev/null +++ b/tests/unit/routes/models-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:models', 'Unit | Route | models', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation-model/delete-test.js b/tests/unit/routes/simulation-model/delete-test.js new file mode 100644 index 0000000..b333a4a --- /dev/null +++ b/tests/unit/routes/simulation-model/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation-model/delete', 'Unit | Route | simulation-model/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation-model/edit-test.js b/tests/unit/routes/simulation-model/edit-test.js new file mode 100644 index 0000000..8da4968 --- /dev/null +++ b/tests/unit/routes/simulation-model/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation-model/edit', 'Unit | Route | simulation-model/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation-model/index-test.js b/tests/unit/routes/simulation-model/index-test.js new file mode 100644 index 0000000..ae828d2 --- /dev/null +++ b/tests/unit/routes/simulation-model/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation-model/index', 'Unit | Route | simulation-model/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation-model/new-test.js b/tests/unit/routes/simulation-model/new-test.js new file mode 100644 index 0000000..67f77f4 --- /dev/null +++ b/tests/unit/routes/simulation-model/new-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation-model/new', 'Unit | Route | simulation-model/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/serializers/simulation-model-test.js b/tests/unit/serializers/simulation-model-test.js new file mode 100644 index 0000000..32b3e21 --- /dev/null +++ b/tests/unit/serializers/simulation-model-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulation-model', 'Unit | Serializer | simulation-model', { + // Specify the other units that are required for this test. + needs: ['serializer:simulation-model'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); From b2eac536757c3c538ea343352084b7791528a640 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 20 Jul 2016 17:47:52 +0200 Subject: [PATCH 018/556] Add models.css stylesheet --- app/styles/app.css | 1 + app/styles/models.css | 51 +++++++++++++++++++++++++++++ app/templates/simulation-models.hbs | 27 +++++++++++---- 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 app/styles/models.css diff --git a/app/styles/app.css b/app/styles/app.css index b07b286..730f10e 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -8,6 +8,7 @@ **********************************************************************************/ @import 'plots.css'; +@import 'models.css'; * { margin: 0; diff --git a/app/styles/models.css b/app/styles/models.css new file mode 100644 index 0000000..e2fe0c3 --- /dev/null +++ b/app/styles/models.css @@ -0,0 +1,51 @@ +/** + * File: models.css + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +/** + * Route: simulation-models + */ +.simulation-models-container { + margin-top: 20px; +} + +.simulation-models-container table { + width: 100%; + + border: 0; + border-collapse: collapse; +} + +.simulation-models-container th, td { + padding: 5px; + + text-align: left; + + border: 0; +} + +.simulation-models-container th { + background-color: #151; + color: #fff; +} + +.simulation-models-row-controls { + float: right; +} + +.simulation-models-row-controls a { + margin-left: 10px; +} + +.simulation-models-container tr:nth-child(even) { + background-color: #ddd; +} + +.simulation-models-new-container { + margin-top: 20px; +} diff --git a/app/templates/simulation-models.hbs b/app/templates/simulation-models.hbs index e92a9cf..ca7dd24 100644 --- a/app/templates/simulation-models.hbs +++ b/app/templates/simulation-models.hbs @@ -1,9 +1,24 @@

    Models

    -
      - {{#each model as |simulationModel|}} -
    • {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}}
    • - {{/each}} -
    +
    + + + + + {{#each model as |simulationModel|}} + + + + {{/each}} +
    Name
    + {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}} +
    + {{#link-to "simulation-model.edit" simulationModel.id}}Edit{{/link-to}} + {{#link-to "simulation-model.delete" simulationModel.id}}Delete{{/link-to}} +
    +
    +
    -{{#link-to "simulation-model.new"}}New model{{/link-to}} +
    + {{#link-to "simulation-model.new"}}New model{{/link-to}} +
    From 4a9563f603a44ee0af53415c6627d55b1ecc4cb3 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 21 Jul 2016 08:57:04 +0200 Subject: [PATCH 019/556] Add websocket data receiving Very buggy early tests --- app/adapters/simulation-data.js | 108 ++++++++++++++++++ app/models/simulation-data.js | 18 +++ app/routes/simulation-model/edit.js | 3 + app/routes/simulation-model/index.js | 17 ++- app/serializers/simulation-data.js | 23 ++++ app/templates/simulation-model/edit.hbs | 2 +- app/templates/simulation-model/index.hbs | 10 +- app/transforms/array.js | 20 ++++ config/environment.js | 3 +- tests/unit/adapters/simulation-data-test.js | 12 ++ tests/unit/models/simulation-data-test.js | 12 ++ .../unit/serializers/simulation-data-test.js | 15 +++ tests/unit/transforms/array-test.js | 12 ++ 13 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 app/adapters/simulation-data.js create mode 100644 app/models/simulation-data.js create mode 100644 app/serializers/simulation-data.js create mode 100644 app/transforms/array.js create mode 100644 tests/unit/adapters/simulation-data-test.js create mode 100644 tests/unit/models/simulation-data-test.js create mode 100644 tests/unit/serializers/simulation-data-test.js create mode 100644 tests/unit/transforms/array-test.js diff --git a/app/adapters/simulation-data.js b/app/adapters/simulation-data.js new file mode 100644 index 0000000..7fba6e0 --- /dev/null +++ b/app/adapters/simulation-data.js @@ -0,0 +1,108 @@ +/** + * File: simulation-data.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import DS from 'ember-data'; +import ENV from '../config/environment'; + +export default DS.Adapter.extend({ + host: 'ws://' + ENV.APP.LIVE_HOST, + namespace: '', + + socket: null, + + findRecord(store, type, id, snapshot) { + this._init(); + + return new Ember.RSVP.Promise(function(resolve, reject) { + //reject(new Error('no record')); + reject(); + }); + }, + + _init() { + if (this.socket === null) { + // create new websocket + this.socket = new WebSocket(this.host + this.namespace); + this.socket.binaryType = 'arraybuffer'; + + // register event callbacks + var self = this; + this.socket.onopen = function(event) { + self.open.apply(self, [event]); + }; + + this.socket.onmessage = function(event) { + self.message.apply(self, [event]); + }; + + this.socket.onerror = function(event) { + self.error.apply(self, [event]); + }; + + this.socket.onclose = function(event) { + self.close.apply(self, [event]); + }; + } + }, + + open(event) { + Ember.debug('websocket opened'); + }, + + close(event) { + Ember.debug('websocket closed: ' + event.code); + }, + + message(event) { + // read the message into JSON + var message = this._messageToJSON(event.data); + var id = 0; + + var simulationData = this.store.peekRecord('simulation-data', id); + if (simulationData != null) { + simulationData.set('sequence', message.sequence); + simulationData.set('values', message.values); + } else { + this.store.createRecord('simulation-data', { + sequence: message.sequence, + values: message.values, + id: id + }); + } + }, + + error(err) { + Ember.debug('websocket error'); + }, + + _messageToJSON(blob) { + var data = new DataView(blob); + + let OFFSET_ENDIAN = 1; + let OFFSET_TYPE = 2; + let OFFSET_VERSION = 4; + + var bits = data.getUint8(0); + var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; + var length = data.getUint16(0x02, endian); + + var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); + + return { + endian: endian, + version: (bits >> OFFSET_VERSION) & 0xF, + type: (bits >> OFFSET_TYPE) & 0x3, + length: length, + sequence: data.getUint32(0x04, endian), + timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, + values: values + }; + } +}); diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js new file mode 100644 index 0000000..d7af5bc --- /dev/null +++ b/app/models/simulation-data.js @@ -0,0 +1,18 @@ +/** + * File: simulation-data.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +// import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + simulator: attr('number'), + sequence: attr('number'), + values: attr('array') +}); diff --git a/app/routes/simulation-model/edit.js b/app/routes/simulation-model/edit.js index 26d9f31..f2d770f 100644 --- a/app/routes/simulation-model/edit.js +++ b/app/routes/simulation-model/edit.js @@ -1,4 +1,7 @@ import Ember from 'ember'; export default Ember.Route.extend({ + /*model() { + return this.store.findRecord('simulation-data', 0); + }*/ }); diff --git a/app/routes/simulation-model/index.js b/app/routes/simulation-model/index.js index 26d9f31..d520ee0 100644 --- a/app/routes/simulation-model/index.js +++ b/app/routes/simulation-model/index.js @@ -1,4 +1,17 @@ -import Ember from 'ember'; +/** + * File: index.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ -export default Ember.Route.extend({ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('simulation-model', params.modelid); + } }); diff --git a/app/serializers/simulation-data.js b/app/serializers/simulation-data.js new file mode 100644 index 0000000..919e22c --- /dev/null +++ b/app/serializers/simulation-data.js @@ -0,0 +1,23 @@ +/** + * File: simulation-data.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import DS from 'ember-data'; + +export default DS.Serializer.extend({ + normalizeResponse(store, primaryModelClass, payload, id, requestType) { + console.log('normalizeResponse'); + return {}; + }, + + serialize(record, options) { + console.log('serialize'); + return null; + } +}); diff --git a/app/templates/simulation-model/edit.hbs b/app/templates/simulation-model/edit.hbs index c24cd68..8b13789 100644 --- a/app/templates/simulation-model/edit.hbs +++ b/app/templates/simulation-model/edit.hbs @@ -1 +1 @@ -{{outlet}} + diff --git a/app/templates/simulation-model/index.hbs b/app/templates/simulation-model/index.hbs index c24cd68..2c69e6f 100644 --- a/app/templates/simulation-model/index.hbs +++ b/app/templates/simulation-model/index.hbs @@ -1 +1,9 @@ -{{outlet}} +

    {{model.name}}

    + +

    + Running: {{#if model.running}} + true + {{else}} + false + {{/if}} +

    diff --git a/app/transforms/array.js b/app/transforms/array.js new file mode 100644 index 0000000..7e1093f --- /dev/null +++ b/app/transforms/array.js @@ -0,0 +1,20 @@ +import Ember from 'ember'; +import Transform from 'ember-data/transform'; + +export default Transform.extend({ + deserialize(serialized) { + if (Ember.isArray(serialized)) { + return serialized; + } else { + return []; + } + }, + + serialize(deserialized) { + if (Ember.isArray(deserialized)) { + return deserialized; + } else { + return []; + } + } +}); diff --git a/config/environment.js b/config/environment.js index f359e20..b440274 100644 --- a/config/environment.js +++ b/config/environment.js @@ -14,7 +14,8 @@ module.exports = function(environment) { }, APP: { - API_HOST: 'localhost:3000' + API_HOST: 'localhost:3000', + LIVE_HOST: 'localhost:4000' } }; diff --git a/tests/unit/adapters/simulation-data-test.js b/tests/unit/adapters/simulation-data-test.js new file mode 100644 index 0000000..7a55f5e --- /dev/null +++ b/tests/unit/adapters/simulation-data-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('adapter:simulation-data', 'Unit | Adapter | simulation data', { + // Specify the other units that are required for this test. + // needs: ['serializer:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let adapter = this.subject(); + assert.ok(adapter); +}); diff --git a/tests/unit/models/simulation-data-test.js b/tests/unit/models/simulation-data-test.js new file mode 100644 index 0000000..8faab14 --- /dev/null +++ b/tests/unit/models/simulation-data-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulation-data', 'Unit | Model | simulation data', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/serializers/simulation-data-test.js b/tests/unit/serializers/simulation-data-test.js new file mode 100644 index 0000000..607b2cb --- /dev/null +++ b/tests/unit/serializers/simulation-data-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulation-data', 'Unit | Serializer | simulation data', { + // Specify the other units that are required for this test. + needs: ['serializer:simulation-data'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); diff --git a/tests/unit/transforms/array-test.js b/tests/unit/transforms/array-test.js new file mode 100644 index 0000000..372f9af --- /dev/null +++ b/tests/unit/transforms/array-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('transform:array', 'Unit | Transform | array', { + // Specify the other units that are required for this test. + // needs: ['serializer:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let transform = this.subject(); + assert.ok(transform); +}); From 5b09486d3c2967bdf400fcbc86a1ed48ec6b83b8 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 26 Jul 2016 14:40:23 +0200 Subject: [PATCH 020/556] Move websocket live stream into mixin Add simulator to websocket message Add history to simulator-data --- app/adapters/simulation-data.js | 108 ------------------ app/controllers/simulation-model/edit.js | 17 +++ app/mixins/websocket-live-stream-mixin.js | 77 +++++++++++++ app/models/simulation-data.js | 18 ++- app/routes/index.js | 3 +- app/routes/simulation-model/edit.js | 6 +- app/serializers/simulation-data.js | 23 ---- app/templates/simulation-model/edit.hbs | 7 ++ tests/unit/adapters/simulation-data-test.js | 12 -- .../websocket-live-stream-mixin-test.js | 12 ++ .../unit/serializers/simulation-data-test.js | 15 --- 11 files changed, 134 insertions(+), 164 deletions(-) delete mode 100644 app/adapters/simulation-data.js create mode 100644 app/mixins/websocket-live-stream-mixin.js delete mode 100644 app/serializers/simulation-data.js delete mode 100644 tests/unit/adapters/simulation-data-test.js create mode 100644 tests/unit/mixins/websocket-live-stream-mixin-test.js delete mode 100644 tests/unit/serializers/simulation-data-test.js diff --git a/app/adapters/simulation-data.js b/app/adapters/simulation-data.js deleted file mode 100644 index 7fba6e0..0000000 --- a/app/adapters/simulation-data.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * File: simulation-data.js - * Author: Markus Grigull - * Date: 20.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import DS from 'ember-data'; -import ENV from '../config/environment'; - -export default DS.Adapter.extend({ - host: 'ws://' + ENV.APP.LIVE_HOST, - namespace: '', - - socket: null, - - findRecord(store, type, id, snapshot) { - this._init(); - - return new Ember.RSVP.Promise(function(resolve, reject) { - //reject(new Error('no record')); - reject(); - }); - }, - - _init() { - if (this.socket === null) { - // create new websocket - this.socket = new WebSocket(this.host + this.namespace); - this.socket.binaryType = 'arraybuffer'; - - // register event callbacks - var self = this; - this.socket.onopen = function(event) { - self.open.apply(self, [event]); - }; - - this.socket.onmessage = function(event) { - self.message.apply(self, [event]); - }; - - this.socket.onerror = function(event) { - self.error.apply(self, [event]); - }; - - this.socket.onclose = function(event) { - self.close.apply(self, [event]); - }; - } - }, - - open(event) { - Ember.debug('websocket opened'); - }, - - close(event) { - Ember.debug('websocket closed: ' + event.code); - }, - - message(event) { - // read the message into JSON - var message = this._messageToJSON(event.data); - var id = 0; - - var simulationData = this.store.peekRecord('simulation-data', id); - if (simulationData != null) { - simulationData.set('sequence', message.sequence); - simulationData.set('values', message.values); - } else { - this.store.createRecord('simulation-data', { - sequence: message.sequence, - values: message.values, - id: id - }); - } - }, - - error(err) { - Ember.debug('websocket error'); - }, - - _messageToJSON(blob) { - var data = new DataView(blob); - - let OFFSET_ENDIAN = 1; - let OFFSET_TYPE = 2; - let OFFSET_VERSION = 4; - - var bits = data.getUint8(0); - var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; - var length = data.getUint16(0x02, endian); - - var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); - - return { - endian: endian, - version: (bits >> OFFSET_VERSION) & 0xF, - type: (bits >> OFFSET_TYPE) & 0x3, - length: length, - sequence: data.getUint32(0x04, endian), - timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, - values: values - }; - } -}); diff --git a/app/controllers/simulation-model/edit.js b/app/controllers/simulation-model/edit.js index 55ff9aa..e38e81d 100644 --- a/app/controllers/simulation-model/edit.js +++ b/app/controllers/simulation-model/edit.js @@ -1,4 +1,21 @@ import Ember from 'ember'; export default Ember.Controller.extend({ + sequence: function() { + return this.get('model.sequence'); + }.property('model.sequence'), + + values: function() { + return this.get('model.values'); + }.property('model.values.@each'), + + _updateModel: function() { + if (this.get('model') === null) { + Ember.run.later(this, function() { + var simulationData = this.store.peekRecord('simulation-data', 1); + this.set('model', simulationData); + this.notifyPropertyChange('model'); + }, 500); + } + }.observes('model').on('init') }); diff --git a/app/mixins/websocket-live-stream-mixin.js b/app/mixins/websocket-live-stream-mixin.js new file mode 100644 index 0000000..eaaf392 --- /dev/null +++ b/app/mixins/websocket-live-stream-mixin.js @@ -0,0 +1,77 @@ +import Ember from 'ember'; +import ENV from '../config/environment'; + +export default Ember.Mixin.create({ + host: 'ws://' + ENV.APP.LIVE_HOST, + namespace: '', + + init() { + this._super(...arguments); + + // create socket + var socket = new WebSocket(this.host + this.namespace); + socket.binaryType = 'arraybuffer'; + + // register event callbacks + var self = this; + socket.onopen = function(event) { self.onopen.apply(self, [event]); }; + socket.onclose = function(event) { self.onclose.apply(self, [event]); }; + socket.onmessage = function(event) { self.onmessage.apply(self, [event]); }; + socket.onerror = function(event) { self.onerror.apply(self, [event]); }; + }, + + onopen(event) { + Ember.debug('websocket opened'); + }, + + onclose(event) { + Ember.debug('websocket closed: ' + event.code); + }, + + onmessage(event) { + // read the message into JSON + var message = this._messageToJSON(event.data); + + var simulationData = this.store.peekRecord('simulation-data', message.simulator); + if (simulationData != null) { + simulationData.set('sequence', message.sequence); + simulationData.set('values', message.values); + } else { + this.store.createRecord('simulation-data', { + sequence: message.sequence, + values: message.values, + id: message.simulator + }); + } + }, + + onerror(event) { + Ember.debug('websocket error'); + }, + + _messageToJSON(blob) { + var data = new DataView(blob); + + let OFFSET_ENDIAN = 1; + let OFFSET_TYPE = 2; + let OFFSET_VERSION = 4; + + var bits = data.getUint8(0); + var simulator = data.getUint8(0x01); + var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; + var length = data.getUint16(0x02, endian); + + var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); + + return { + endian: endian, + version: (bits >> OFFSET_VERSION) & 0xF, + type: (bits >> OFFSET_TYPE) & 0x3, + length: length, + sequence: data.getUint32(0x04, endian), + timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, + values: values, + simulator: simulator + }; + } +}); diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index d7af5bc..b5cffe8 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -7,12 +7,26 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ +import Ember from 'ember'; import Model from 'ember-data/model'; import attr from 'ember-data/attr'; // import { belongsTo, hasMany } from 'ember-data/relationships'; export default Model.extend({ - simulator: attr('number'), + simulator: Ember.computed.alias('id'), sequence: attr('number'), - values: attr('array') + values: attr('array'), + + historyValues() { + return this._history; + }, + + _history: [], + + _updateHistory: function() { + this._history.unshift(this.get('values')); + while (this._history.length > 500) { + this._history.shift(); + } + }.observes('values') }); diff --git a/app/routes/index.js b/app/routes/index.js index e4d4e02..ab4ab0a 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -9,6 +9,7 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; +import WebsocketLiveStreamMixin from '../mixins/websocket-live-stream-mixin'; -export default Ember.Route.extend(AuthenticatedRouteMixin, { +export default Ember.Route.extend(AuthenticatedRouteMixin, WebsocketLiveStreamMixin, { }); diff --git a/app/routes/simulation-model/edit.js b/app/routes/simulation-model/edit.js index f2d770f..992b1b1 100644 --- a/app/routes/simulation-model/edit.js +++ b/app/routes/simulation-model/edit.js @@ -1,7 +1,7 @@ import Ember from 'ember'; export default Ember.Route.extend({ - /*model() { - return this.store.findRecord('simulation-data', 0); - }*/ + model() { + return this.store.peekRecord('simulation-data', 1); + } }); diff --git a/app/serializers/simulation-data.js b/app/serializers/simulation-data.js deleted file mode 100644 index 919e22c..0000000 --- a/app/serializers/simulation-data.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * File: simulation-data.js - * Author: Markus Grigull - * Date: 20.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import DS from 'ember-data'; - -export default DS.Serializer.extend({ - normalizeResponse(store, primaryModelClass, payload, id, requestType) { - console.log('normalizeResponse'); - return {}; - }, - - serialize(record, options) { - console.log('serialize'); - return null; - } -}); diff --git a/app/templates/simulation-model/edit.hbs b/app/templates/simulation-model/edit.hbs index 8b13789..5db3453 100644 --- a/app/templates/simulation-model/edit.hbs +++ b/app/templates/simulation-model/edit.hbs @@ -1 +1,8 @@ +{{sequence}} +
    + +{{#each values as |value|}} + {{value}} +
    +{{/each}} diff --git a/tests/unit/adapters/simulation-data-test.js b/tests/unit/adapters/simulation-data-test.js deleted file mode 100644 index 7a55f5e..0000000 --- a/tests/unit/adapters/simulation-data-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('adapter:simulation-data', 'Unit | Adapter | simulation data', { - // Specify the other units that are required for this test. - // needs: ['serializer:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let adapter = this.subject(); - assert.ok(adapter); -}); diff --git a/tests/unit/mixins/websocket-live-stream-mixin-test.js b/tests/unit/mixins/websocket-live-stream-mixin-test.js new file mode 100644 index 0000000..7cc9580 --- /dev/null +++ b/tests/unit/mixins/websocket-live-stream-mixin-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import WebsocketLiveStreamMixinMixin from 'villasweb-frontend/mixins/websocket-live-stream-mixin'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | websocket live stream mixin'); + +// Replace this with your real tests. +test('it works', function(assert) { + let WebsocketLiveStreamMixinObject = Ember.Object.extend(WebsocketLiveStreamMixinMixin); + let subject = WebsocketLiveStreamMixinObject.create(); + assert.ok(subject); +}); diff --git a/tests/unit/serializers/simulation-data-test.js b/tests/unit/serializers/simulation-data-test.js deleted file mode 100644 index 607b2cb..0000000 --- a/tests/unit/serializers/simulation-data-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulation-data', 'Unit | Serializer | simulation data', { - // Specify the other units that are required for this test. - needs: ['serializer:simulation-data'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); From a4507f095c5aec7cfbad6c99354edacf00f89452 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 26 Jul 2016 19:26:15 +0200 Subject: [PATCH 021/556] Add simulations The simulation model replaces what simulation-model was before. A simulation is a construct of multiple simulation-models to represent the different simulator in the simulation. Added new styling guidelines and global styles for elements. --- app/controllers/simulation-model/new.js | 21 +++-- app/controllers/simulation/delete.js | 4 + app/controllers/simulation/edit.js | 4 + app/controllers/simulation/index.js | 4 + app/controllers/simulation/new.js | 38 +++++++++ app/models/project.js | 3 +- app/models/simulation-data.js | 2 +- app/models/simulation-model.js | 7 +- app/models/simulation.js | 20 +++++ app/models/user.js | 2 +- app/router.js | 10 ++- app/routes/simulation-model/new.js | 3 + app/routes/simulation-models.js | 7 -- app/routes/simulation/delete.js | 4 + app/routes/simulation/edit.js | 4 + app/routes/simulation/index.js | 17 ++++ app/routes/simulation/new.js | 14 ++++ app/routes/simulations.js | 21 +++++ app/serializers/simulation-model.js | 3 +- app/serializers/simulation.js | 18 ++++ app/styles/app.css | 82 +++++++++++++++++++ app/styles/projects.css | 27 ++++++ app/styles/simulations.css | 47 +++++++++++ app/templates/application.hbs | 2 +- app/templates/project/new.hbs | 35 ++++---- app/templates/projects.hbs | 30 +++++-- app/templates/simulation-model/new.hbs | 33 ++++++-- app/templates/simulation/delete.hbs | 1 + app/templates/simulation/edit.hbs | 1 + app/templates/simulation/index.hbs | 31 +++++++ app/templates/simulation/new.hbs | 20 +++++ app/templates/simulations.hbs | 27 ++++++ .../controllers/simulation/delete-test.js | 12 +++ .../unit/controllers/simulation/edit-test.js | 12 +++ .../unit/controllers/simulation/index-test.js | 12 +++ tests/unit/controllers/simulation/new-test.js | 12 +++ tests/unit/models/simulation-test.js | 12 +++ tests/unit/routes/simulation/delete-test.js | 11 +++ tests/unit/routes/simulation/edit-test.js | 11 +++ tests/unit/routes/simulation/index-test.js | 11 +++ tests/unit/routes/simulation/new-test.js | 11 +++ tests/unit/routes/simulations-test.js | 11 +++ tests/unit/serializers/simulation-test.js | 15 ++++ 43 files changed, 619 insertions(+), 53 deletions(-) create mode 100644 app/controllers/simulation/delete.js create mode 100644 app/controllers/simulation/edit.js create mode 100644 app/controllers/simulation/index.js create mode 100644 app/controllers/simulation/new.js create mode 100644 app/models/simulation.js create mode 100644 app/routes/simulation/delete.js create mode 100644 app/routes/simulation/edit.js create mode 100644 app/routes/simulation/index.js create mode 100644 app/routes/simulation/new.js create mode 100644 app/routes/simulations.js create mode 100644 app/serializers/simulation.js create mode 100644 app/styles/projects.css create mode 100644 app/styles/simulations.css create mode 100644 app/templates/simulation/delete.hbs create mode 100644 app/templates/simulation/edit.hbs create mode 100644 app/templates/simulation/index.hbs create mode 100644 app/templates/simulation/new.hbs create mode 100644 app/templates/simulations.hbs create mode 100644 tests/unit/controllers/simulation/delete-test.js create mode 100644 tests/unit/controllers/simulation/edit-test.js create mode 100644 tests/unit/controllers/simulation/index-test.js create mode 100644 tests/unit/controllers/simulation/new-test.js create mode 100644 tests/unit/models/simulation-test.js create mode 100644 tests/unit/routes/simulation/delete-test.js create mode 100644 tests/unit/routes/simulation/edit-test.js create mode 100644 tests/unit/routes/simulation/index-test.js create mode 100644 tests/unit/routes/simulation/new-test.js create mode 100644 tests/unit/routes/simulations-test.js create mode 100644 tests/unit/serializers/simulation-test.js diff --git a/app/controllers/simulation-model/new.js b/app/controllers/simulation-model/new.js index a5d0eba..bb24e26 100644 --- a/app/controllers/simulation-model/new.js +++ b/app/controllers/simulation-model/new.js @@ -10,30 +10,35 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - sessionUser: Ember.inject.service('session-user'), + simulator: 1, actions: { newModel() { - // get current user - var user = this.get('sessionUser.user'); + // get the simulation + var simulation = this.get('model'); + var simulationId = this.get('model.id'); // create new model from properties - var properties = this.getProperties('name'); - properties['owner'] = user; + var properties = this.getProperties('name', 'simulator'); + properties['simulation'] = simulationId; var simulationModel = this.store.createRecord('simulation-model', properties); + + // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request + simulation.get('models').pushObject(simulationModel); + var controller = this; simulationModel.save().then(function() { - Ember.debug('Saved new model'); - controller.transitionToRoute('/simulation-models'); + controller.transitionToRoute('/simulation/' + simulationId); }, function() { Ember.debug('Error saving new model'); }); }, cancelNewModel() { - this.transitionToRoute('/simulation-models'); + var simulationId = this.get('model.id'); + this.transitionToRoute('/simulation/' + simulationId); } } }); diff --git a/app/controllers/simulation/delete.js b/app/controllers/simulation/delete.js new file mode 100644 index 0000000..55ff9aa --- /dev/null +++ b/app/controllers/simulation/delete.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ +}); diff --git a/app/controllers/simulation/edit.js b/app/controllers/simulation/edit.js new file mode 100644 index 0000000..55ff9aa --- /dev/null +++ b/app/controllers/simulation/edit.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ +}); diff --git a/app/controllers/simulation/index.js b/app/controllers/simulation/index.js new file mode 100644 index 0000000..55ff9aa --- /dev/null +++ b/app/controllers/simulation/index.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ +}); diff --git a/app/controllers/simulation/new.js b/app/controllers/simulation/new.js new file mode 100644 index 0000000..bf6255d --- /dev/null +++ b/app/controllers/simulation/new.js @@ -0,0 +1,38 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + actions: { + newSimulation() { + // get current user + var user = this.get('sessionUser.user'); + + // create new simulation from properties + var properties = this.getProperties('name'); + properties['owner'] = user; + + var simulation = this.store.createRecord('simulation', properties); + var controller = this; + + simulation.save().then(function() { + controller.transitionToRoute('/simulations'); + }, function() { + Ember.debug('Error saving new simulation'); + }); + }, + + cancelNewSimulation() { + this.transitionToRoute('/simulations'); + } + } +}); diff --git a/app/models/project.js b/app/models/project.js index 9c16f6d..9e1da03 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -14,5 +14,6 @@ import { hasMany, belongsTo } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), owner: belongsTo('user', { async: true }), - visualizations: hasMany('visualization', { async: true }) + visualizations: hasMany('visualization', { async: true }), + simulation: belongsTo('simulation', { async: true }) }); diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index b5cffe8..f4825db 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -25,7 +25,7 @@ export default Model.extend({ _updateHistory: function() { this._history.unshift(this.get('values')); - while (this._history.length > 500) { + while (this._history.length > 5) { this._history.shift(); } }.observes('values') diff --git a/app/models/simulation-model.js b/app/models/simulation-model.js index f970b7e..4a4b445 100644 --- a/app/models/simulation-model.js +++ b/app/models/simulation-model.js @@ -13,7 +13,8 @@ import { belongsTo, hasMany } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - running: attr('boolean'), - owner: belongsTo('user', { async: true }), - projects: hasMany('project', { async: true }) + simulator: attr('number'), + length: attr('number'), + mapping: attr('array'), + simulation: belongsTo('simulation', { async: true }) }); diff --git a/app/models/simulation.js b/app/models/simulation.js new file mode 100644 index 0000000..e705768 --- /dev/null +++ b/app/models/simulation.js @@ -0,0 +1,20 @@ +/** + * File: simulation.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Model from 'ember-data/model'; +import attr from 'ember-data/attr'; +import { belongsTo, hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + name: attr('string'), + running: attr('boolean'), + owner: belongsTo('user', { async: true }), + models: hasMany('simulation-model', { aync: true }), + projects: hasMany('project', { async: true }) +}); diff --git a/app/models/user.js b/app/models/user.js index 9acf731..cded992 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -16,6 +16,6 @@ export default Model.extend({ password: attr('string'), adminLevel: attr('number'), projects: hasMany('project', { async: true }), - simulationModels: hasMany('simulation-model', { async: true }), + simulations: hasMany('simulation', { async: true }), mail: attr('string') }); diff --git a/app/router.js b/app/router.js index b0d9b40..ffdfa56 100644 --- a/app/router.js +++ b/app/router.js @@ -45,11 +45,19 @@ Router.map(function() { this.route('simulation-model', function() { this.route('index', { path: '/:modelid' }); - this.route('new'); + this.route('new', { path: '/new/:simulationid' }); this.route('delete', { path: '/delete/:modelid' }); this.route('edit', { path: '/edit/:modelid' }); }); this.route('simulation-models'); + + this.route('simulations'); + this.route('simulation', function() { + this.route('index', { path: '/:simulationid' }); + this.route('delete', { path: '/delete/:simulationid' }); + this.route('new'); + this.route('edit', { path: '/edit/:simulationid' }); + }); }); export default Router; diff --git a/app/routes/simulation-model/new.js b/app/routes/simulation-model/new.js index 79bcf5f..7ff8a7a 100644 --- a/app/routes/simulation-model/new.js +++ b/app/routes/simulation-model/new.js @@ -11,4 +11,7 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('simulation', params.simulationid); + } }); diff --git a/app/routes/simulation-models.js b/app/routes/simulation-models.js index f026c22..e80ebbb 100644 --- a/app/routes/simulation-models.js +++ b/app/routes/simulation-models.js @@ -11,11 +11,4 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { - sessionUser: Ember.inject.service('session-user'), - - model() { - // get models for current user - var user = this.get('sessionUser.user'); - return user.get('simulationModels'); - } }); diff --git a/app/routes/simulation/delete.js b/app/routes/simulation/delete.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/simulation/delete.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/simulation/edit.js b/app/routes/simulation/edit.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/simulation/edit.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/routes/simulation/index.js b/app/routes/simulation/index.js new file mode 100644 index 0000000..05b1b84 --- /dev/null +++ b/app/routes/simulation/index.js @@ -0,0 +1,17 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('simulation', params.simulationid); + } +}); diff --git a/app/routes/simulation/new.js b/app/routes/simulation/new.js new file mode 100644 index 0000000..8f8de75 --- /dev/null +++ b/app/routes/simulation/new.js @@ -0,0 +1,14 @@ +/** + * File: new.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { +}); diff --git a/app/routes/simulations.js b/app/routes/simulations.js new file mode 100644 index 0000000..ce9f752 --- /dev/null +++ b/app/routes/simulations.js @@ -0,0 +1,21 @@ +/** + * File: simulations.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + sessionUser: Ember.inject.service('session-user'), + + model() { + // get simulations for current user + var user = this.get('sessionUser.user'); + return user.get('simulations'); + } +}); diff --git a/app/serializers/simulation-model.js b/app/serializers/simulation-model.js index ee69978..cb91820 100644 --- a/app/serializers/simulation-model.js +++ b/app/serializers/simulation-model.js @@ -11,7 +11,6 @@ import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ attrs: { - owner: { serialize: 'ids' }, - projects: { serialize: 'ids' } + simulation: { serialize: 'ids' } } }); diff --git a/app/serializers/simulation.js b/app/serializers/simulation.js new file mode 100644 index 0000000..6fe4c66 --- /dev/null +++ b/app/serializers/simulation.js @@ -0,0 +1,18 @@ +/** + * File: simulation.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + owner: { serialize: 'ids' }, + models: { serialize: 'ids' }, + projects: { serialize: 'ids' } + } +}); diff --git a/app/styles/app.css b/app/styles/app.css index 730f10e..9aa9008 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -9,6 +9,8 @@ @import 'plots.css'; @import 'models.css'; +@import 'simulations.css'; +@import 'projects.css'; * { margin: 0; @@ -150,3 +152,83 @@ footer { background-color: #aaa; } } + +/** + * Table + */ +.column-center { + text-align: center; +} + +/** + * Table full width + */ +.table-full-width { + width: 100%; + + border: 0; + border-collapse: collapse; +} + +.table-full-width th, td { + padding: 5px; + + text-align: left; + + border: none; +} + +.table-full-width th { + background-color: #151; + color: #fff; +} + +.table-full-width tr:nth-child(even) { + background-color: #ddd; +} + +/** + * Form create record + */ +.form-create-record { + padding: 0; + + width: 400px; +} + +.form-create-record table { + border: none; +} + +.form-create-record td { + padding: 5px 10px 5px 0; +} + +.form-create-record input { + padding: 2px 4px; + + width: 100%; +} + +.form-create-record input[type=number] { + width: 60px; + + padding: 0; +} + +.form-create-record button { + background-color: #151; + color: #fff; + + font-size: 14px; + + padding: 4px 8px; + + border: none; + + cursor: pointer; +} + +.form-create-record button:hover { + background: #373; +} diff --git a/app/styles/projects.css b/app/styles/projects.css new file mode 100644 index 0000000..5bc1e13 --- /dev/null +++ b/app/styles/projects.css @@ -0,0 +1,27 @@ +/** + * File: projects.css + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +/** + * Route: projects + */ +.projects-container { + margin-top: 20px; +} + +.projects-row-controls { + float: right; +} + +.projects-row-controls a { + margin-left: 10px; +} + +.projects-new-container { + margin-top: 20px; +} diff --git a/app/styles/simulations.css b/app/styles/simulations.css new file mode 100644 index 0000000..9c6a94f --- /dev/null +++ b/app/styles/simulations.css @@ -0,0 +1,47 @@ +/** + * File: simulations.css + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +/** + * Route: simulations + */ +.simulations-container { + margin-top: 20px; +} + +.simulations-row-controls { + float: right; +} + +.simulations-row-controls a { + margin-left: 10px; +} + +.simulations-new-container { + margin-top: 20px; +} + +/** + * Route: simulation/index + */ + +.simulation-index-models-container { + margin-top: 20px; +} + +.simulation-index-row-controls { + float: right; +} + +.simulation-index-row-controls a { + margin-left: 10px; +} + +.simulation-index-new-model { + margin-top: 20px; +} diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 0309741..ab79005 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -9,7 +9,7 @@
    • {{#link-to 'index'}}Home{{/link-to}}
    • {{#link-to 'projects'}}Projects{{/link-to}}
    • -
    • {{#link-to 'simulation-models'}}Models{{/link-to}}
    • +
    • {{#link-to 'simulations'}}Simulations{{/link-to}}
    • {{#link-to 'me'}}Account{{/link-to}}
    • {{#link-to 'logout'}}Logout{{/link-to}}
    diff --git a/app/templates/project/new.hbs b/app/templates/project/new.hbs index e4989cb..a2d56d2 100644 --- a/app/templates/project/new.hbs +++ b/app/templates/project/new.hbs @@ -1,17 +1,24 @@

    New project

    -
    -
    -

    - - {{input id='name' placeholder='Enter project name' value=name}} -

    + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter project name' value=name}} +
    + + +
    - - - - {{#if errorMessage}} -

    {{errorMessage.message}}

    - {{/if}} -
    -
    + {{#if errorMessage}} +

    {{errorMessage.message}}

    + {{/if}} + diff --git a/app/templates/projects.hbs b/app/templates/projects.hbs index 70aae57..c99113a 100644 --- a/app/templates/projects.hbs +++ b/app/templates/projects.hbs @@ -1,9 +1,27 @@

    Projects

    -
      - {{#each model as |project|}} -
    • {{#link-to "project.index" project.id}}{{project.name}}{{/link-to}}
    • - {{/each}} -
    +
    + + + + + + {{#each model as |project|}} + + + + + {{/each}} +
    Name
    + {{#link-to "project.index" project.id}}{{project.name}}{{/link-to}} + +
    + {{#link-to "project.edit" project.id}}Edit{{/link-to}} + {{#link-to "project.delete" project.id}}Delete{{/link-to}} +
    +
    +
    -{{#link-to "project.new"}}New project{{/link-to}} +
    + {{#link-to "project.new"}}New project{{/link-to}} +
    diff --git a/app/templates/simulation-model/new.hbs b/app/templates/simulation-model/new.hbs index 8056de7..7cb6197 100644 --- a/app/templates/simulation-model/new.hbs +++ b/app/templates/simulation-model/new.hbs @@ -1,11 +1,28 @@

    New model

    -
    -

    - - {{input id='name' placeholder='Enter model name' value=name}} -

    - - - + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter model name' value=name}} +
    + + + {{input id='simulator' value=simulator type='number' min=1 max=255 step=1}} +
    + + +
    diff --git a/app/templates/simulation/delete.hbs b/app/templates/simulation/delete.hbs new file mode 100644 index 0000000..c24cd68 --- /dev/null +++ b/app/templates/simulation/delete.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/app/templates/simulation/edit.hbs b/app/templates/simulation/edit.hbs new file mode 100644 index 0000000..c24cd68 --- /dev/null +++ b/app/templates/simulation/edit.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/app/templates/simulation/index.hbs b/app/templates/simulation/index.hbs new file mode 100644 index 0000000..738ae2c --- /dev/null +++ b/app/templates/simulation/index.hbs @@ -0,0 +1,31 @@ +

    {{model.name}}

    + +
    + + + + + + + {{#each model.models as |simulationModel|}} + + + + + + {{/each}} +
    NameSimulator
    + {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}} + + {{simulationModel.simulator}} + +
    + {{#link-to "simulation-model.edit" simulationModel.id}}Edit{{/link-to}} + {{#link-to "simulation-model.delete" simulationModel.id}}Delete{{/link-to}} +
    +
    +
    + +
    + {{#link-to "simulation-model.new" model.id}}New model{{/link-to}} +
    diff --git a/app/templates/simulation/new.hbs b/app/templates/simulation/new.hbs new file mode 100644 index 0000000..211149f --- /dev/null +++ b/app/templates/simulation/new.hbs @@ -0,0 +1,20 @@ +

    New simulation

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulation name' value=name}} +
    + + +
    +
    diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs new file mode 100644 index 0000000..cac2d48 --- /dev/null +++ b/app/templates/simulations.hbs @@ -0,0 +1,27 @@ +

    Simulations

    + +
    + + + + + + {{#each model as |simulation|}} + + + + + {{/each}} +
    Name
    + {{#link-to "simulation.index" simulation.id}}{{simulation.name}}{{/link-to}} + +
    + {{#link-to "simulation.edit" simulation.id}}Edit{{/link-to}} + {{#link-to "simulation.delete" simulation.id}}Delete{{/link-to}} +
    +
    +
    + +
    + {{#link-to "simulation.new"}}New simulation{{/link-to}} +
    diff --git a/tests/unit/controllers/simulation/delete-test.js b/tests/unit/controllers/simulation/delete-test.js new file mode 100644 index 0000000..97437e5 --- /dev/null +++ b/tests/unit/controllers/simulation/delete-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation/delete', 'Unit | Controller | simulation/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/simulation/edit-test.js b/tests/unit/controllers/simulation/edit-test.js new file mode 100644 index 0000000..814e36a --- /dev/null +++ b/tests/unit/controllers/simulation/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation/edit', 'Unit | Controller | simulation/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/simulation/index-test.js b/tests/unit/controllers/simulation/index-test.js new file mode 100644 index 0000000..c060398 --- /dev/null +++ b/tests/unit/controllers/simulation/index-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation/index', 'Unit | Controller | simulation/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/simulation/new-test.js b/tests/unit/controllers/simulation/new-test.js new file mode 100644 index 0000000..1f75ab8 --- /dev/null +++ b/tests/unit/controllers/simulation/new-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulation/new', 'Unit | Controller | simulation/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/models/simulation-test.js b/tests/unit/models/simulation-test.js new file mode 100644 index 0000000..fa6a585 --- /dev/null +++ b/tests/unit/models/simulation-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulation', 'Unit | Model | simulation', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/routes/simulation/delete-test.js b/tests/unit/routes/simulation/delete-test.js new file mode 100644 index 0000000..582dca0 --- /dev/null +++ b/tests/unit/routes/simulation/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation/delete', 'Unit | Route | simulation/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation/edit-test.js b/tests/unit/routes/simulation/edit-test.js new file mode 100644 index 0000000..9cb2ae5 --- /dev/null +++ b/tests/unit/routes/simulation/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation/edit', 'Unit | Route | simulation/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation/index-test.js b/tests/unit/routes/simulation/index-test.js new file mode 100644 index 0000000..ba31a78 --- /dev/null +++ b/tests/unit/routes/simulation/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation/index', 'Unit | Route | simulation/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulation/new-test.js b/tests/unit/routes/simulation/new-test.js new file mode 100644 index 0000000..340a6bd --- /dev/null +++ b/tests/unit/routes/simulation/new-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulation/new', 'Unit | Route | simulation/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulations-test.js b/tests/unit/routes/simulations-test.js new file mode 100644 index 0000000..b72a094 --- /dev/null +++ b/tests/unit/routes/simulations-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulations', 'Unit | Route | simulations', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/serializers/simulation-test.js b/tests/unit/serializers/simulation-test.js new file mode 100644 index 0000000..40a61cd --- /dev/null +++ b/tests/unit/serializers/simulation-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulation', 'Unit | Serializer | simulation', { + // Specify the other units that are required for this test. + needs: ['serializer:simulation'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + let record = this.subject(); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); From b9d40a861e314ee0104a4af73fa0472886556169 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 26 Jul 2016 20:40:33 +0200 Subject: [PATCH 022/556] Add running-simulation service Simulation-model index now shows correct simulator data if the selected simulation is running. running-simulation service can be used to get the running simulation anywhere in the app. --- app/controllers/simulation-model/index.js | 43 ++++++++++++++++ app/mixins/websocket-live-stream-mixin.js | 51 +++++++++++++++---- app/services/running-simulation.js | 41 +++++++++++++++ app/templates/simulation-model/index.hbs | 19 +++++-- app/templates/simulations.hbs | 4 ++ .../unit/services/running-simulation-test.js | 12 +++++ 6 files changed, 155 insertions(+), 15 deletions(-) create mode 100644 app/services/running-simulation.js create mode 100644 tests/unit/services/running-simulation-test.js diff --git a/app/controllers/simulation-model/index.js b/app/controllers/simulation-model/index.js index 55ff9aa..74b0a77 100644 --- a/app/controllers/simulation-model/index.js +++ b/app/controllers/simulation-model/index.js @@ -1,4 +1,47 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 20.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ + values: function() { + return this.get('simulationData.values'); + }.property('simulationData.values.@each'), + + _getData: function() { + if (this.get('model.simulation.running') == true) { + var simulator = this.get('model.simulator'); + if (simulator == null) { + return; + } + + var data = this.store.peekRecord('simulation-data', simulator); + this.set('simulationData', data); + + // load model again if simulation data is null + // this prevents from simulation data not being loaded when the controller + // is loaded before the websocket connects + if (data === null) { + Ember.run.later(this, function() { + // trigger _getData + this.notifyPropertyChange('model'); + }, 1000); + } + } else { + // clear simulation data + this.set('simulationData', null); + + // check again if simulation is running now + Ember.run.later(this, function() { + // trigger _getData + this.notifyPropertyChange('model'); + }, 1000); + } + }.observes('model').on('init') }); diff --git a/app/mixins/websocket-live-stream-mixin.js b/app/mixins/websocket-live-stream-mixin.js index eaaf392..bbf6ecf 100644 --- a/app/mixins/websocket-live-stream-mixin.js +++ b/app/mixins/websocket-live-stream-mixin.js @@ -1,25 +1,56 @@ +/** + * File: websocket-live-stream-mixin.js + * Author: Markus Grigull + * Date: 21.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; import ENV from '../config/environment'; +const { service } = Ember.inject; + export default Ember.Mixin.create({ host: 'ws://' + ENV.APP.LIVE_HOST, namespace: '', + runningSimulation: service('running-simulation'), + + socket: null, init() { this._super(...arguments); - // create socket - var socket = new WebSocket(this.host + this.namespace); - socket.binaryType = 'arraybuffer'; - - // register event callbacks - var self = this; - socket.onopen = function(event) { self.onopen.apply(self, [event]); }; - socket.onclose = function(event) { self.onclose.apply(self, [event]); }; - socket.onmessage = function(event) { self.onmessage.apply(self, [event]); }; - socket.onerror = function(event) { self.onerror.apply(self, [event]); }; + // start simulation service + this.get('runningSimulation').loadRunningSimulation(); }, + _runningSimulationChanged: function() { + // called each time running simulation did change + var simulation = this.get('runningSimulation.simulation'); + if (simulation !== null) { + if (this.socket === null) { + // create new socket connection + this.socket = new WebSocket(this.host + this.namespace); + this.socket.binaryType = 'arraybuffer'; + + // register callbacks + var self = this; + this.socket.onopen = function(event) { self.onopen.apply(self, [event]); }; + this.socket.onclose = function(event) { self.onclose.apply(self, [event]); }; + this.socket.onmessage = function(event) { self.onmessage.apply(self, [event]); }; + this.socket.onerror = function(event) { self.onerror.apply(self, [event]); }; + } + } else { + // stop stream if still opened + if (this.socket !== null) { + this.socket.close(); + this.socket = null; + } + } + }.observes('runningSimulation.simulation'), + onopen(event) { Ember.debug('websocket opened'); }, diff --git a/app/services/running-simulation.js b/app/services/running-simulation.js new file mode 100644 index 0000000..ca8ff7b --- /dev/null +++ b/app/services/running-simulation.js @@ -0,0 +1,41 @@ +/** + * File: running-simulation.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +const { + inject: { service } +} = Ember; + +export default Ember.Service.extend({ + session: service('session'), + store: service(), + + loadRunningSimulation: function() { + var self = this; + + // check every second for running simulation + setInterval(function() { + // check if running simulation did changed + self.get('store').findAll('simulation').then(function(simulations) { + var newSimulation = null; + + simulations.forEach(function(simulation) { + if (simulation.get('running') == true) { + newSimulation = simulation; + } + }); + + if (newSimulation != self.get('simulation')) { + self.set('simulation', newSimulation); + } + }); + }, 1000); + } +}); diff --git a/app/templates/simulation-model/index.hbs b/app/templates/simulation-model/index.hbs index 2c69e6f..d993484 100644 --- a/app/templates/simulation-model/index.hbs +++ b/app/templates/simulation-model/index.hbs @@ -1,9 +1,18 @@

    {{model.name}}

    - Running: {{#if model.running}} - true - {{else}} - false - {{/if}} + Running: {{model.simulation.running}}

    + +

    + Simulator: {{model.simulator}} +

    + +

    + Data: +

    + +{{#each values as |value|}} + {{value}} +
    +{{/each}} diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs index cac2d48..40fa4a6 100644 --- a/app/templates/simulations.hbs +++ b/app/templates/simulations.hbs @@ -4,6 +4,7 @@ + {{#each model as |simulation|}} @@ -11,6 +12,9 @@ + diff --git a/app/templates/simulators.hbs b/app/templates/simulators.hbs new file mode 100644 index 0000000..e860e7b --- /dev/null +++ b/app/templates/simulators.hbs @@ -0,0 +1,143 @@ +

    Simulators

    + +
    +
    NameRunning
    {{#link-to "simulation.index" simulation.id}}{{simulation.name}}{{/link-to}} + {{simulation.running}} +
    {{#link-to "simulation.edit" simulation.id}}Edit{{/link-to}} diff --git a/tests/unit/services/running-simulation-test.js b/tests/unit/services/running-simulation-test.js new file mode 100644 index 0000000..f74cde8 --- /dev/null +++ b/tests/unit/services/running-simulation-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('service:running-simulation', 'Unit | Service | running simulation', { + // Specify the other units that are required for this test. + // needs: ['service:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let service = this.subject(); + assert.ok(service); +}); From dc421c43057b350b99326125ff9e3d143facdb9f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 27 Jul 2016 13:43:10 +0200 Subject: [PATCH 023/556] Add bootstrap popover to plots --- app/components/plot-abstract.js | 55 ++++++++++++++++++++++- app/components/plot-container.js | 7 ++- app/controllers/simulation-model/index.js | 2 +- app/mixins/websocket-live-stream-mixin.js | 4 +- app/models/plot.js | 1 + app/models/simulation-model.js | 2 +- app/services/running-simulation.js | 4 +- app/styles/app.css | 20 +++++++++ app/styles/plots.css | 12 +++++ app/styles/projects.css | 19 ++++++++ app/styles/simulations.css | 1 - app/templates/components/plot-value.hbs | 30 +++++++++++++ app/templates/project/index.hbs | 39 ++++++++-------- bower.json | 6 ++- ember-cli-build.js | 2 + package.json | 3 +- 16 files changed, 178 insertions(+), 29 deletions(-) diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 47f1dd7..f8a7b51 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -20,6 +20,8 @@ export default Ember.Component.extend(Resizable, Draggable, { editing: false, grid: false, + simulator: 0, + disabled_resize: false, autoHide_resize: false, grid_resize: [ 10, 10 ], @@ -29,6 +31,39 @@ export default Ember.Component.extend(Resizable, Draggable, { grid_drag: [ 10, 10 ], scroll_drag: true, + _popoverDisplayed: false, + + didInsertElement() { + this._super(); + + if (this.get('editing') === true) { + // create popover + var self = this; + + this.$().popover({ + html: true, + placement: 'auto right', + content: function () { + return self.$('.popover-content').html(); + }, + viewport: { selector: '.plots', padding: 10 } + }); + + // register popover events + this.$().on('show.bs.popover', function() { + + }); + + this.$().on('shown.bs.popover', function() { + self._popoverDisplayed = true; + }); + + this.$().on('hide.bs.popover', function() { + self._popoverDisplayed = false; + }); + } + }, + style: function() { return Ember.String.htmlSafe('width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; left: ' + this.get('plot.x') + 'px; top: ' + this.get('plot.y') + 'px;'); }.property('plot'), @@ -41,11 +76,23 @@ export default Ember.Component.extend(Resizable, Draggable, { this.set('plot.height', height); }, + resize_resize(event, ui) { + if (this._popoverDisplayed === true) { + this.$().popover('show'); + } + }, + stop_drag(event, ui) { this.set('plot.x', ui.position.left); this.set('plot.y', ui.position.top); }, + drag_drag(event, ui) { + if (this._popoverDisplayed === true) { + this.$().popover('show'); + } + }, + _updateUI: function() { if (this.get('editing') === true) { this.set('disabled_resize', false); @@ -64,5 +111,11 @@ export default Ember.Component.extend(Resizable, Draggable, { this.set('grid_resize', false); this.set('grid_drag', false); } - }.observes('editing', 'grid').on('init') + }.observes('editing', 'grid').on('init'), + + actions: { + savePlot() { + this.$().popover('hide'); + } + } }); diff --git a/app/components/plot-container.js b/app/components/plot-container.js index de61a77..9556975 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -19,7 +19,12 @@ export default Ember.Component.extend({ grid: true, style: function() { - return Ember.String.htmlSafe('height: ' + this._calculateHeight() + 'px;'); + var height = this._calculateHeight(); + if (this.get('editing') === true && height < 400) { + height = 400; + } + + return Ember.String.htmlSafe('height: ' + height + 'px;'); }.property('plots.@each.height', 'plots.@each.y'), _calculateHeight() { diff --git a/app/controllers/simulation-model/index.js b/app/controllers/simulation-model/index.js index 74b0a77..3481e21 100644 --- a/app/controllers/simulation-model/index.js +++ b/app/controllers/simulation-model/index.js @@ -15,7 +15,7 @@ export default Ember.Controller.extend({ }.property('simulationData.values.@each'), _getData: function() { - if (this.get('model.simulation.running') == true) { + if (this.get('model.simulation.running') === true) { var simulator = this.get('model.simulator'); if (simulator == null) { return; diff --git a/app/mixins/websocket-live-stream-mixin.js b/app/mixins/websocket-live-stream-mixin.js index bbf6ecf..c225d6a 100644 --- a/app/mixins/websocket-live-stream-mixin.js +++ b/app/mixins/websocket-live-stream-mixin.js @@ -51,7 +51,7 @@ export default Ember.Mixin.create({ } }.observes('runningSimulation.simulation'), - onopen(event) { + onopen(/*event*/) { Ember.debug('websocket opened'); }, @@ -76,7 +76,7 @@ export default Ember.Mixin.create({ } }, - onerror(event) { + onerror(/*event*/) { Ember.debug('websocket error'); }, diff --git a/app/models/plot.js b/app/models/plot.js index e7dd0ba..17ab769 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -14,6 +14,7 @@ import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), signal: attr('string'), + simulator: attr('number', { defaultValue: 1 }), width: attr('number', { defaultValue: 100 }), height: attr('number', { defaultValue: 100 }), title: attr('string'), diff --git a/app/models/simulation-model.js b/app/models/simulation-model.js index 4a4b445..9493dd9 100644 --- a/app/models/simulation-model.js +++ b/app/models/simulation-model.js @@ -9,7 +9,7 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import { belongsTo, hasMany } from 'ember-data/relationships'; +import { belongsTo/*, hasMany*/ } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), diff --git a/app/services/running-simulation.js b/app/services/running-simulation.js index ca8ff7b..40aa46b 100644 --- a/app/services/running-simulation.js +++ b/app/services/running-simulation.js @@ -27,12 +27,12 @@ export default Ember.Service.extend({ var newSimulation = null; simulations.forEach(function(simulation) { - if (simulation.get('running') == true) { + if (simulation.get('running') === true) { newSimulation = simulation; } }); - if (newSimulation != self.get('simulation')) { + if (newSimulation !== self.get('simulation')) { self.set('simulation', newSimulation); } }); diff --git a/app/styles/app.css b/app/styles/app.css index 9aa9008..575e542 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -168,6 +168,8 @@ footer { border: 0; border-collapse: collapse; + + background-color: #f6f6f6; } .table-full-width th, td { @@ -232,3 +234,21 @@ footer { .form-create-record button:hover { background: #373; } + +/** + * + */ +.popover { + z-index: 1010; + + width: 120px; + height: 100px; +} + +.arrow { + border-right-color: red !important; +} + +.hidden { + visibility: hidden; +} diff --git a/app/styles/plots.css b/app/styles/plots.css index 34ee417..a3807eb 100644 --- a/app/styles/plots.css +++ b/app/styles/plots.css @@ -42,6 +42,18 @@ } +.plot-edit-container { + width: 200px !important; + + background-color: #ddd; + + border: 1px dotted black; +} + +.plot-edit-form { + +} + /** * Component: plot-table */ diff --git a/app/styles/projects.css b/app/styles/projects.css index 5bc1e13..43f0f1b 100644 --- a/app/styles/projects.css +++ b/app/styles/projects.css @@ -25,3 +25,22 @@ .projects-new-container { margin-top: 20px; } + +/** + * Route: project.index + */ +.project-index-container { + margin-top: 20px; +} + +.project-index-row-controls { + float: right; +} + +.project-index-row-controls a { + margin:left: 10px; +} + +.project-index-new-visualization { + margin-top: 20px; +} diff --git a/app/styles/simulations.css b/app/styles/simulations.css index 9c6a94f..0580e36 100644 --- a/app/styles/simulations.css +++ b/app/styles/simulations.css @@ -29,7 +29,6 @@ /** * Route: simulation/index */ - .simulation-index-models-container { margin-top: 20px; } diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/plot-value.hbs index af53c9c..74d6f2a 100644 --- a/app/templates/components/plot-value.hbs +++ b/app/templates/components/plot-value.hbs @@ -1 +1,31 @@ Value + + diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index d35cd7f..93dcedb 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -1,24 +1,27 @@

    {{model.name}}

    -
    - -

    -

    Visualizations

    - -
      +
      + + + + + {{#each model.visualizations as |visualization|}} -
    • {{#link-to 'visualization.index' visualization.id}}{{visualization.name}}{{/link-to}}
    • + + + + {{/each}} - - -
      +
      Name
      + {{#link-to 'visualization.index' visualization.id}}{{visualization.name}}{{/link-to}} + +
      + {{#link-to "visualization.edit" visualization.id}}Edit{{/link-to}} + {{#link-to "visualization.delete" visualization.id}}Delete{{/link-to}} +
      +
      +
      +
      New visualization -

      - -
      - -

      - {{#link-to "project.edit" model.id}}Edit project{{/link-to}} - {{#link-to "project.delete" model.id}}Delete project{{/link-to}} -

      +
      diff --git a/bower.json b/bower.json index d2c82e9..070c570 100644 --- a/bower.json +++ b/bower.json @@ -5,6 +5,10 @@ "ember-cli-shims": "0.1.1", "ember-cli-test-loader": "0.2.2", "ember-qunit-notifications": "0.1.0", - "jquery-ui": "1.11.4" + "jquery-ui": "1.11.4", + "bootstrap": "~3.3.5" + }, + "resolutions": { + "ember": "~2.5.0" } } diff --git a/ember-cli-build.js b/ember-cli-build.js index 2537ce2..87da6af 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -20,5 +20,7 @@ module.exports = function(defaults) { // please specify an object with the list of modules as keys // along with the exports of each module as its value. + app.import('bower_components/bootstrap/dist/js/bootstrap.js'); + return app.toTree(); }; diff --git a/package.json b/package.json index 39de3e5..0eb3da4 100644 --- a/package.json +++ b/package.json @@ -40,5 +40,6 @@ "ember-resolver": "^2.0.3", "ember-simple-auth": "^1.1.0", "loader.js": "^4.0.1" - } + }, + "dependencies": {} } From ab5bf2ed165b32e19d58fc478fe1868431df507b Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 30 Sep 2016 18:57:19 +0200 Subject: [PATCH 024/556] Add simulators and modal dialogs --- app/controllers/simulation-model/new.js | 25 +++- app/controllers/simulators.js | 119 ++++++++++++++++ app/models/simulator.js | 18 +++ app/router.js | 3 + app/routes/simulation-model/new.js | 5 +- app/routes/simulators.js | 18 +++ app/styles/{app.css => app.scss} | 22 +++ app/styles/simulators.css | 27 ++++ app/templates/application.hbs | 1 + app/templates/simulation-model/new.hbs | 6 +- app/templates/simulators.hbs | 143 ++++++++++++++++++++ package.json | 3 + tests/unit/controllers/simulators-test.js | 12 ++ tests/unit/models/simulator-test.js | 12 ++ tests/unit/routes/simulators-test.js | 11 ++ tests/unit/routes/simulators/delete-test.js | 11 ++ tests/unit/routes/simulators/edit-test.js | 11 ++ tests/unit/routes/simulators/index-test.js | 11 ++ 18 files changed, 449 insertions(+), 9 deletions(-) create mode 100644 app/controllers/simulators.js create mode 100644 app/models/simulator.js create mode 100644 app/routes/simulators.js rename app/styles/{app.css => app.scss} (91%) create mode 100644 app/styles/simulators.css create mode 100644 app/templates/simulators.hbs create mode 100644 tests/unit/controllers/simulators-test.js create mode 100644 tests/unit/models/simulator-test.js create mode 100644 tests/unit/routes/simulators-test.js create mode 100644 tests/unit/routes/simulators/delete-test.js create mode 100644 tests/unit/routes/simulators/edit-test.js create mode 100644 tests/unit/routes/simulators/index-test.js diff --git a/app/controllers/simulation-model/new.js b/app/controllers/simulation-model/new.js index bb24e26..b72bc7f 100644 --- a/app/controllers/simulation-model/new.js +++ b/app/controllers/simulation-model/new.js @@ -10,19 +10,26 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - simulator: 1, + simulator: null, actions: { newModel() { // get the simulation - var simulation = this.get('model'); - var simulationId = this.get('model.id'); + var simulation = this.get('model.simulation'); + var simulationId = this.get('model.simulation.id'); // create new model from properties - var properties = this.getProperties('name', 'simulator'); + var properties = this.getProperties('name'); properties['simulation'] = simulationId; - var simulationModel = this.store.createRecord('simulation-model', properties); + // get the simulator id by simulator name + if (this.get('simulator') == null) { + this.set('simulator', this.get('model.simulators')[0]); + } + + console.log(this.get('model.simulators')[0]); + + /*var simulationModel = this.store.createRecord('simulation-model', properties); // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request simulation.get('models').pushObject(simulationModel); @@ -33,12 +40,16 @@ export default Ember.Controller.extend({ controller.transitionToRoute('/simulation/' + simulationId); }, function() { Ember.debug('Error saving new model'); - }); + });*/ }, cancelNewModel() { - var simulationId = this.get('model.id'); + var simulationId = this.get('model.simulation.id'); this.transitionToRoute('/simulation/' + simulationId); + }, + + selectSimulator(simulator) { + this.set('simulator', simulator); } } }); diff --git a/app/controllers/simulators.js b/app/controllers/simulators.js new file mode 100644 index 0000000..af9cb28 --- /dev/null +++ b/app/controllers/simulators.js @@ -0,0 +1,119 @@ +/** + * File: simulators.js + * Author: Markus Grigull + * Date: 30.09.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +export default Ember.Controller.extend({ + isShowingNewModal: false, + isShowingDeleteModal: false, + isShowingEditModal: false, + + simulatorid: 1, + errorMessage: null, + simulator: null, + simulatorName: null, + simulatorEdit: null, + + actions: { + showNewModal() { + // reset the properties + this.set('errorMessage', null); + this.set('simulatorid', 1); + this.set('name', null); + this.set('endpoint', null); + + // show the modal dialog + this.set('isShowingNewModal', true); + }, + + showDeleteModal(simulator) { + this.set('isShowingDeleteModal', true); + this.set('simulator', simulator); + }, + + showEditModal(simulator) { + // set properties + this.set('errorMessage', null); + this.set('simulator', simulator); + this.set('simulatorid', simulator.get('simulatorid')); + this.set('simulatorName', simulator.get('name')); + this.set('simulatorEndpoint', simulator.get('endpoint')); + + // show the modal dialog + this.set('isShowingEditModal', true); + }, + + newSimulator() { + // verify properties + var properties = this.getProperties('name', 'simulatorid', 'endpoint'); + if (properties['name'] == null) { + this.set('errorMessage', 'Simulator name is missing'); + return; + } else if (properties['endpoint'] == null) { + this.set('errorMessage', 'Simulator endpoint is missing'); + return; + } + + // create new simulator from properties + var simulator = this.store.createRecord('simulator', properties); + var controller = this; + + simulator.save().then(function() { + controller.set('isShowingNewModal', false); + }, function() { + Ember.debug('Error saving new simulator'); + }); + }, + + cancelNewSimulator() { + this.set('isShowingNewModal', false); + }, + + cancelDeleteSimulator() { + this.set('isShowingDeleteModal', false); + }, + + confirmDeleteSimulator() { + // delete the simulator + var simulator = this.get('simulator'); + simulator.destroyRecord(); + + // hide the modal dialog + this.set('isShowingDeleteModal', false); + }, + + editSimulator() { + // verify new properties + if (this.get('simulatorName') == null) { + this.set('errorMessage', 'Simulator name is missing'); + return; + } else if (this.get('simulatorEndpoint') == null) { + this.set('errorMessage', 'Simulator endpoint is missing'); + return; + } + + // save property changes + this.get('simulator').set('name', this.get('simulatorName')); + this.get('simulator').set('simulatorid', this.get('simulatorid')); + this.get('simulator').set('endpoint', this.get('simulatorEndpoint')); + + var controller = this; + + this.get('simulator').save().then(function() { + controller.set('isShowingEditModal', false); + }, function() { + Ember.debug('Error saving edit simulator'); + }); + }, + + cancelEditSimulator() { + this.set('isShowingEditModal', false); + } + } +}); diff --git a/app/models/simulator.js b/app/models/simulator.js new file mode 100644 index 0000000..5e45673 --- /dev/null +++ b/app/models/simulator.js @@ -0,0 +1,18 @@ +/** + * File: simulator.js + * Author: Markus Grigull + * Date: 28.09.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import DS from 'ember-data'; +import attr from 'ember-data/attr'; + +export default DS.Model.extend({ + name: attr('string'), + running: attr('boolean'), + simulatorid: attr('number'), + endpoint: attr('string') +}); diff --git a/app/router.js b/app/router.js index ffdfa56..513436f 100644 --- a/app/router.js +++ b/app/router.js @@ -58,6 +58,9 @@ Router.map(function() { this.route('new'); this.route('edit', { path: '/edit/:simulationid' }); }); + + this.route('simulators'); + this.route('simulator'); }); export default Router; diff --git a/app/routes/simulation-model/new.js b/app/routes/simulation-model/new.js index 7ff8a7a..fc60ffc 100644 --- a/app/routes/simulation-model/new.js +++ b/app/routes/simulation-model/new.js @@ -12,6 +12,9 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { model(params) { - return this.store.findRecord('simulation', params.simulationid); + return Ember.RSVP.hash({ + simulation: this.store.findRecord('simulation', params.simulationid), + simulators: this.store.findAll('simulator') + }); } }); diff --git a/app/routes/simulators.js b/app/routes/simulators.js new file mode 100644 index 0000000..8c32bcc --- /dev/null +++ b/app/routes/simulators.js @@ -0,0 +1,18 @@ +/** + * File: simulators.js + * Author: Markus Grigull + * Date: 28.09.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model() { + // get simulators + return this.store.findAll('simulator'); + } +}); diff --git a/app/styles/app.css b/app/styles/app.scss similarity index 91% rename from app/styles/app.css rename to app/styles/app.scss index 575e542..c740665 100644 --- a/app/styles/app.css +++ b/app/styles/app.scss @@ -11,6 +11,10 @@ @import 'models.css'; @import 'simulations.css'; @import 'projects.css'; +@import 'simulators.css'; + +@import "ember-modal-dialog/ember-modal-structure"; +@import "ember-modal-dialog/ember-modal-appearance"; * { margin: 0; @@ -235,6 +239,24 @@ footer { background: #373; } +button { + background-color: #151; + color: #fff; + + font-size: 14px; + + margin-top: 10px; + padding: 4px 8px; + + border: none; + + cursor: pointer; +} + +button:hover { + background: #373; +} + /** * */ diff --git a/app/styles/simulators.css b/app/styles/simulators.css new file mode 100644 index 0000000..2943dc2 --- /dev/null +++ b/app/styles/simulators.css @@ -0,0 +1,27 @@ +/** + * File: simulators.css + * Author: Markus Grigull + * Date: 30.09.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +/** + * Route: simulators + */ +.simulators-container { + margin-top: 20px; +} + +.simulators-row-controls { + float: right; +} + +.simulators-row-controls a { + margin-left: 10px; +} + +.simulators-new-container { + margin-top: 50px; +} diff --git a/app/templates/application.hbs b/app/templates/application.hbs index ab79005..4e8c036 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -10,6 +10,7 @@
    • {{#link-to 'index'}}Home{{/link-to}}
    • {{#link-to 'projects'}}Projects{{/link-to}}
    • {{#link-to 'simulations'}}Simulations{{/link-to}}
    • +
    • {{#link-to 'simulators'}}Simulators{{/link-to}}
    • {{#link-to 'me'}}Account{{/link-to}}
    • {{#link-to 'logout'}}Logout{{/link-to}}
    diff --git a/app/templates/simulation-model/new.hbs b/app/templates/simulation-model/new.hbs index 7cb6197..5fa523d 100644 --- a/app/templates/simulation-model/new.hbs +++ b/app/templates/simulation-model/new.hbs @@ -15,7 +15,11 @@
    - {{input id='simulator' value=simulator type='number' min=1 max=255 step=1}} +
    + + + + + + + + {{#each model as |simulator|}} + + + + + + + + {{/each}} +
    NameIDRunningEndpoint
    + + {{simulator.name}} + + {{simulator.simulatorid}} + + {{simulator.running}} + + {{simulator.endpoint}} + +
    + + + Edit + Delete +
    +
    + + +
    + +
    + +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New simulator

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulator name' value=name}} +
    + + + {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} +
    + + + {{input id='endpoint' placeholder='Enter endpoint' value=endpoint}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete simulator

    + +

    Are you sure you want to delete the simulator {{simulator.name}}?

    + + + + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New simulator

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulator name' value=simulatorName}} +
    + + + {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} +
    + + + {{input id='endpoint' placeholder='Enter endpoint' value=simulatorEndpoint}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} diff --git a/package.json b/package.json index 0eb3da4..bea92e8 100644 --- a/package.json +++ b/package.json @@ -32,13 +32,16 @@ "ember-cli-jshint": "^1.0.0", "ember-cli-qunit": "^1.4.0", "ember-cli-release": "0.2.8", + "ember-cli-sass": "5.5.2", "ember-cli-sri": "^2.1.0", "ember-cli-uglify": "^1.2.0", "ember-data": "^2.5.0", "ember-export-application-global": "^1.0.5", "ember-load-initializers": "^0.5.1", + "ember-modal-dialog": "^0.9.0", "ember-resolver": "^2.0.3", "ember-simple-auth": "^1.1.0", + "ember-tether": "0.3.1", "loader.js": "^4.0.1" }, "dependencies": {} diff --git a/tests/unit/controllers/simulators-test.js b/tests/unit/controllers/simulators-test.js new file mode 100644 index 0000000..285361d --- /dev/null +++ b/tests/unit/controllers/simulators-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:simulators', 'Unit | Controller | simulators', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/models/simulator-test.js b/tests/unit/models/simulator-test.js new file mode 100644 index 0000000..8a6206a --- /dev/null +++ b/tests/unit/models/simulator-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulator', 'Unit | Model | simulator', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/tests/unit/routes/simulators-test.js b/tests/unit/routes/simulators-test.js new file mode 100644 index 0000000..8dbfe46 --- /dev/null +++ b/tests/unit/routes/simulators-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulators', 'Unit | Route | simulators', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulators/delete-test.js b/tests/unit/routes/simulators/delete-test.js new file mode 100644 index 0000000..98ca109 --- /dev/null +++ b/tests/unit/routes/simulators/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulators/delete', 'Unit | Route | simulators/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulators/edit-test.js b/tests/unit/routes/simulators/edit-test.js new file mode 100644 index 0000000..be49ba0 --- /dev/null +++ b/tests/unit/routes/simulators/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulators/edit', 'Unit | Route | simulators/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/simulators/index-test.js b/tests/unit/routes/simulators/index-test.js new file mode 100644 index 0000000..dfccfba --- /dev/null +++ b/tests/unit/routes/simulators/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:simulators/index', 'Unit | Route | simulators/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); From 35b885f19b48f25f38201d50ac056ac79148cfb4 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 1 Oct 2016 11:11:35 +0200 Subject: [PATCH 025/556] Add modal dialogs to projects and simulation-models --- app/controllers/project/delete.js | 30 --- app/controllers/project/edit.js | 37 ---- app/controllers/project/index.js | 104 +++++++++- app/controllers/project/new.js | 36 ---- app/controllers/projects.js | 115 ++++++++++++ app/controllers/simulation-model/delete.js | 4 - app/controllers/simulation-model/edit.js | 21 --- app/controllers/simulation-model/new.js | 55 ------ app/controllers/simulation/delete.js | 4 - app/controllers/simulation/edit.js | 4 - app/controllers/simulation/index.js | 177 ++++++++++++++++++ app/controllers/simulation/new.js | 38 ---- app/controllers/simulations.js | 115 ++++++++++++ app/router.js | 10 - app/routes/project/delete.js | 17 -- app/routes/project/edit.js | 17 -- app/routes/project/new.js | 14 -- app/routes/projects.js | 6 +- app/routes/simulation-model/delete.js | 4 - app/routes/simulation-model/edit.js | 7 - app/routes/simulation-model/new.js | 20 -- app/routes/simulation-models.js | 14 -- app/routes/simulation/delete.js | 4 - app/routes/simulation/edit.js | 4 - app/routes/simulation/index.js | 5 +- app/routes/simulation/new.js | 14 -- app/services/running-simulation.js | 3 +- app/templates/project/delete.hbs | 6 - app/templates/project/edit.hbs | 15 -- app/templates/project/index.hbs | 77 +++++++- app/templates/project/new.hbs | 24 --- app/templates/projects.hbs | 75 +++++++- app/templates/simulation-model/delete.hbs | 1 - app/templates/simulation-model/edit.hbs | 8 - app/templates/simulation-model/new.hbs | 32 ---- app/templates/simulation-models.hbs | 24 --- app/templates/simulation/delete.hbs | 1 - app/templates/simulation/edit.hbs | 1 - app/templates/simulation/index.hbs | 105 ++++++++++- app/templates/simulation/new.hbs | 20 -- app/templates/simulations.hbs | 77 +++++++- app/templates/simulators.hbs | 2 +- package.json | 1 + tests/unit/controllers/project/delete-test.js | 12 -- .../edit-test.js => projects-test.js} | 2 +- .../simulation-model/delete-test.js | 12 -- .../controllers/simulation-model/edit-test.js | 12 -- .../controllers/simulation-model/new-test.js | 12 -- .../controllers/simulation/delete-test.js | 12 -- .../unit/controllers/simulation/edit-test.js | 12 -- .../new-test.js => simulations-test.js} | 2 +- .../routes/simulation-model/delete-test.js | 11 -- .../unit/routes/simulation-model/edit-test.js | 11 -- .../unit/routes/simulation-model/new-test.js | 11 -- tests/unit/routes/simulation/delete-test.js | 11 -- tests/unit/routes/simulation/edit-test.js | 11 -- tests/unit/routes/simulation/new-test.js | 11 -- 57 files changed, 835 insertions(+), 655 deletions(-) delete mode 100644 app/controllers/project/delete.js delete mode 100644 app/controllers/project/edit.js delete mode 100644 app/controllers/project/new.js create mode 100644 app/controllers/projects.js delete mode 100644 app/controllers/simulation-model/delete.js delete mode 100644 app/controllers/simulation-model/edit.js delete mode 100644 app/controllers/simulation-model/new.js delete mode 100644 app/controllers/simulation/delete.js delete mode 100644 app/controllers/simulation/edit.js delete mode 100644 app/controllers/simulation/new.js create mode 100644 app/controllers/simulations.js delete mode 100644 app/routes/project/delete.js delete mode 100644 app/routes/project/edit.js delete mode 100644 app/routes/project/new.js delete mode 100644 app/routes/simulation-model/delete.js delete mode 100644 app/routes/simulation-model/edit.js delete mode 100644 app/routes/simulation-model/new.js delete mode 100644 app/routes/simulation-models.js delete mode 100644 app/routes/simulation/delete.js delete mode 100644 app/routes/simulation/edit.js delete mode 100644 app/routes/simulation/new.js delete mode 100644 app/templates/project/delete.hbs delete mode 100644 app/templates/project/edit.hbs delete mode 100644 app/templates/project/new.hbs delete mode 100644 app/templates/simulation-model/delete.hbs delete mode 100644 app/templates/simulation-model/edit.hbs delete mode 100644 app/templates/simulation-model/new.hbs delete mode 100644 app/templates/simulation-models.hbs delete mode 100644 app/templates/simulation/delete.hbs delete mode 100644 app/templates/simulation/edit.hbs delete mode 100644 app/templates/simulation/new.hbs delete mode 100644 tests/unit/controllers/project/delete-test.js rename tests/unit/controllers/{project/edit-test.js => projects-test.js} (79%) delete mode 100644 tests/unit/controllers/simulation-model/delete-test.js delete mode 100644 tests/unit/controllers/simulation-model/edit-test.js delete mode 100644 tests/unit/controllers/simulation-model/new-test.js delete mode 100644 tests/unit/controllers/simulation/delete-test.js delete mode 100644 tests/unit/controllers/simulation/edit-test.js rename tests/unit/controllers/{simulation/new-test.js => simulations-test.js} (78%) delete mode 100644 tests/unit/routes/simulation-model/delete-test.js delete mode 100644 tests/unit/routes/simulation-model/edit-test.js delete mode 100644 tests/unit/routes/simulation-model/new-test.js delete mode 100644 tests/unit/routes/simulation/delete-test.js delete mode 100644 tests/unit/routes/simulation/edit-test.js delete mode 100644 tests/unit/routes/simulation/new-test.js diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js deleted file mode 100644 index b9b6c96..0000000 --- a/app/controllers/project/delete.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * File: delete.js - * Author: Markus Grigull - * Date: 26.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ - sessionUser: Ember.inject.service('session-user'), - - actions: { - cancelDelete() { - // go back to project view - let projectId = this.get('model.id'); - this.transitionToRoute('/project/' + projectId); - }, - - confirmDelete() { - // delete the project - var project = this.get('model'); - project.destroyRecord(); - - this.transitionToRoute('/projects'); - } - } -}); diff --git a/app/controllers/project/edit.js b/app/controllers/project/edit.js deleted file mode 100644 index 574a5ff..0000000 --- a/app/controllers/project/edit.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * File: edit.js - * Author: Markus Grigull - * Date: 11.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ - name: function() { - return this.get('model.name'); - }.property('model.name'), - - actions: { - saveEdit() { - // apply the changes - var project = this.get('model'); - project.set('name', this.get('name')); - - // save the changes - let projectId = project.get('id'); - var controller = this; - - project.save().then(function() { - controller.transitionToRoute('/project/' + projectId); - }); - }, - - cancelEdit() { - let projectId = this.get('model.id'); - this.transitionToRoute('/project/' + projectId); - } - } -}); diff --git a/app/controllers/project/index.js b/app/controllers/project/index.js index 1437734..4f457cd 100644 --- a/app/controllers/project/index.js +++ b/app/controllers/project/index.js @@ -10,19 +10,107 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - actions: { - newVisualization() { - // get the project - var project = this.get('model'); - var projectId = this.get('model.id'); + isShowingNewModal: false, + isShowingEditModal: false, + isShowingDeleteModal: false, - // create the visualization - var visualization = this.store.createRecord('visualization', { name: 'Visualization', project: projectId }); + errorMessage: null, + + visualization: null, + + actions: { + showNewModal() { + // reset properties + this.set('errorMessage', null); + this.set('name', null); + + // show the dialog + this.set('isShowingNewModal', true); + }, + + showEditModal(visualization) { + // set properties + this.set('errorMessage', null); + this.set('visualization', visualization); + this.set('name', visualization.get('name')); + + // show the dialog + this.set('isShowingEditModal', true); + }, + + showDeleteModal(visualization) { + // set properties + this.set('visualization', visualization); + + // show the dialog + this.set('isShowingDeleteModal', true); + }, + + submitNew() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Visualization name is missing'); + return; + } + + // set project property + properties['project'] = this.get('model.id'); + + // create new project + var visualization = this.store.createRecord('visualization', properties); + var controller = this; // this change will not be saved, but it is nessecary otherwise ember will omit the project's id in the post request + var project = this.get('model'); project.get('visualizations').pushObject(visualization); - visualization.save(); + visualization.save().then(function() { + controller.set('isShowingNewModal', false); + }, function() { + Ember.debug('Error saving new visualization'); + }); + }, + + cancelNew() { + this.set('isShowingNewModal', false); + }, + + submitEdit() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Visualization name is missing'); + return; + } + + // save properties + this.get('visualization').setProperties(properties); + + var controller = this; + + this.get('visualization').save().then(function() { + controller.set('isShowingEditModal', false); + }, function() { + Ember.debug('Error saving edit visualization'); + }); + }, + + cancelEdit() { + this.set('isShowingEditModal', false); + }, + + confirmDelete() { + // delete the visualization + var visualization = this.get('visualization'); + visualization.destroyRecord(); + + // hide the dialog + this.set('isShowingDeleteModal', false); + }, + + cancelDelete() { + this.set('isShowingDeleteModal', false); } } }); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js deleted file mode 100644 index 500e75e..0000000 --- a/app/controllers/project/new.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * File: new.js - * Author: Markus Grigull - * Date: 26.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ - sessionUser: Ember.inject.service('session-user'), - - actions: { - newProject() { - // get current user - var user = this.get('sessionUser.user'); - - // create new project from properties - var properties = this.getProperties('name'); - properties['owner'] = user; - - var project = this.store.createRecord('project', properties); - var controller = this; - - project.save().then(function() { - controller.transitionToRoute('/projects'); - }); - }, - - cancelNewProject() { - this.transitionToRoute('/projects'); - } - } -}); diff --git a/app/controllers/projects.js b/app/controllers/projects.js new file mode 100644 index 0000000..1a5dcfd --- /dev/null +++ b/app/controllers/projects.js @@ -0,0 +1,115 @@ +/** + * File: projects.js + * Author: Markus Grigull + * Date: 01.10.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + isShowingNewModal: false, + isShowingEditModal: false, + isShowingDeleteModal: false, + + errorMessage: null, + + project: null, + + actions: { + showNewModal() { + // reset properties + this.set('errorMessage', null); + this.set('name', null); + + // show the dialog + this.set('isShowingNewModal', true); + }, + + showEditModal(project) { + // set properties + this.set('errorMessage', null); + this.set('project', project); + this.set('name', project.get('name')); + + // show the dialog + this.set('isShowingEditModal', true); + }, + + showDeleteModal(project) { + // set properties + this.set('project', project); + + // show the dialog + this.set('isShowingDeleteModal', true); + }, + + submitNew() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Project name is missing'); + return; + } + + // set owner properties + var user = this.get('sessionUser.user'); + properties['owner'] = user; + + // create new project + var project = this.store.createRecord('project', properties); + var controller = this; + + project.save().then(function() { + controller.set('isShowingNewModal', false); + }, function() { + Ember.debug('Error saving new project'); + }); + }, + + cancelNew() { + this.set('isShowingNewModal', false); + }, + + submitEdit() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Project name is missing'); + return; + } + + // save properties + this.get('project').setProperties(properties); + + var controller = this; + + this.get('project').save().then(function() { + controller.set('isShowingEditModal', false); + }, function() { + Ember.debug('Error saving edit project'); + }); + }, + + cancelEdit() { + this.set('isShowingEditModal', false); + }, + + confirmDelete() { + // delete the project + var project = this.get('project'); + project.destroyRecord(); + + // hide the dialog + this.set('isShowingDeleteModal', false); + }, + + cancelDelete() { + this.set('isShowingDeleteModal', false); + } + } +}); diff --git a/app/controllers/simulation-model/delete.js b/app/controllers/simulation-model/delete.js deleted file mode 100644 index 55ff9aa..0000000 --- a/app/controllers/simulation-model/delete.js +++ /dev/null @@ -1,4 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Controller.extend({ -}); diff --git a/app/controllers/simulation-model/edit.js b/app/controllers/simulation-model/edit.js deleted file mode 100644 index e38e81d..0000000 --- a/app/controllers/simulation-model/edit.js +++ /dev/null @@ -1,21 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Controller.extend({ - sequence: function() { - return this.get('model.sequence'); - }.property('model.sequence'), - - values: function() { - return this.get('model.values'); - }.property('model.values.@each'), - - _updateModel: function() { - if (this.get('model') === null) { - Ember.run.later(this, function() { - var simulationData = this.store.peekRecord('simulation-data', 1); - this.set('model', simulationData); - this.notifyPropertyChange('model'); - }, 500); - } - }.observes('model').on('init') -}); diff --git a/app/controllers/simulation-model/new.js b/app/controllers/simulation-model/new.js deleted file mode 100644 index b72bc7f..0000000 --- a/app/controllers/simulation-model/new.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * File: new.js - * Author: Markus Grigull - * Date: 20.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ - simulator: null, - - actions: { - newModel() { - // get the simulation - var simulation = this.get('model.simulation'); - var simulationId = this.get('model.simulation.id'); - - // create new model from properties - var properties = this.getProperties('name'); - properties['simulation'] = simulationId; - - // get the simulator id by simulator name - if (this.get('simulator') == null) { - this.set('simulator', this.get('model.simulators')[0]); - } - - console.log(this.get('model.simulators')[0]); - - /*var simulationModel = this.store.createRecord('simulation-model', properties); - - // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request - simulation.get('models').pushObject(simulationModel); - - var controller = this; - - simulationModel.save().then(function() { - controller.transitionToRoute('/simulation/' + simulationId); - }, function() { - Ember.debug('Error saving new model'); - });*/ - }, - - cancelNewModel() { - var simulationId = this.get('model.simulation.id'); - this.transitionToRoute('/simulation/' + simulationId); - }, - - selectSimulator(simulator) { - this.set('simulator', simulator); - } - } -}); diff --git a/app/controllers/simulation/delete.js b/app/controllers/simulation/delete.js deleted file mode 100644 index 55ff9aa..0000000 --- a/app/controllers/simulation/delete.js +++ /dev/null @@ -1,4 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Controller.extend({ -}); diff --git a/app/controllers/simulation/edit.js b/app/controllers/simulation/edit.js deleted file mode 100644 index 55ff9aa..0000000 --- a/app/controllers/simulation/edit.js +++ /dev/null @@ -1,4 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Controller.extend({ -}); diff --git a/app/controllers/simulation/index.js b/app/controllers/simulation/index.js index 55ff9aa..2208780 100644 --- a/app/controllers/simulation/index.js +++ b/app/controllers/simulation/index.js @@ -1,4 +1,181 @@ +/** + * File: index.js + * Author: Markus Grigull + * Date: 30.09.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + import Ember from 'ember'; export default Ember.Controller.extend({ + isShowingNewModal: false, + isShowingEditModal: false, + isShowingDeleteModal: false, + + errorMessage: null, + + simulationModel: null, + simulatorName: null, + + _updateSimulators: function() { + if (this.get('model.simulators') != null && this.get('model.simulators.length') > 0) { + var simulators = this.get('model.simulators'); + this.set('simulatorName', simulators.toArray()[0].get('name')); + } + }.observes('model'), + + actions: { + showNewModal() { + // reset properties + this.set('errorMessage', null); + this.set('name', null); + + // show the dialog + this.set('isShowingNewModal', true); + }, + + showEditModal(simulationModel) { + // set properties + this.set('errorMessage', null); + this.set('simulationModel', simulationModel); + this.set('name', simulationModel.get('name')); + + var simulators = this.get('model.simulators'); + var simulatorId = simulationModel.get('simulator'); + var simulatorName = null; + + simulators.forEach(function(simulator) { + if (simulator.get('simulatorid') == simulatorId) { + simulatorName = simulator.get('name'); + } + }); + + this.set('simulatorName', simulatorName); + + // show the dialog + this.set('isShowingEditModal', true); + }, + + showDeleteModal(simulationModel) { + // set properties + this.set('simulationModel', simulationModel); + + // show the dialog + this.set('isShowingDeleteModal', true); + }, + + submitNew() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Simulation model name is missing'); + return; + } + + // set simuatlion properties + var simulation = this.get('model.simulation'); + properties['simulation'] = simulation.get('id');; + + // get the simulator id by simulator name + var simulators = this.get('model.simulators'); + var simulatorId = null; + var simulatorName = this.get('simulatorName'); + + simulators.forEach(function(simulator) { + if (simulator.get('name') === simulatorName) { + simulatorId = simulator.get('simulatorid'); + } + }); + + if (simulatorId == null) { + Ember.debug('Unable to find simulator by name'); + return; + } + + properties['simulator'] = simulatorId; + + // create new model + var simulationModel = this.store.createRecord('simulation-model', properties); + + // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request + simulation.get('models').pushObject(simulationModel); + + var controller = this; + + simulationModel.save().then(function() { + controller.set('isShowingNewModal', false); + }, function() { + Ember.debug('Error saving new model'); + }); + }, + + cancelNew() { + this.set('isShowingNewModal', false); + }, + + submitEdit() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Simulation model name is missing'); + return; + } + + // set simuatlion properties + var simulation = this.get('model.simulation'); + properties['simulation'] = simulation.get('id');; + + // get the simulator id by simulator name + var simulators = this.get('model.simulators'); + var simulatorId = null; + var simulatorName = this.get('simulatorName'); + + simulators.forEach(function(simulator) { + if (simulator.get('name') === simulatorName) { + simulatorId = simulator.get('simulatorid'); + } + }); + + if (simulatorId == null) { + Ember.debug('Unable to find simulator by name'); + return; + } + + properties['simulator'] = simulatorId; + + // save properties + var controller = this; + + this.get('simulationModel').setProperties(properties); + + this.get('simulationModel').save().then(function() { + controller.set('isShowingEditModal', false); + }, function() { + Ember.debug('Error saving edit simulation model'); + }); + }, + + cancelEdit() { + this.set('isShowingEditModal', false); + }, + + confirmDelete() { + // delete the model + var simulationModel = this.get('simulationModel'); + simulationModel.destroyRecord(); + + // hide the dialog + this.set('isShowingDeleteModal', false); + }, + + cancelDelete() { + this.set('isShowingDeleteModal', false); + }, + + selectSimulator(simulator) { + this.set('simulatorName', simulator); + } + } }); diff --git a/app/controllers/simulation/new.js b/app/controllers/simulation/new.js deleted file mode 100644 index bf6255d..0000000 --- a/app/controllers/simulation/new.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * File: new.js - * Author: Markus Grigull - * Date: 26.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ - sessionUser: Ember.inject.service('session-user'), - - actions: { - newSimulation() { - // get current user - var user = this.get('sessionUser.user'); - - // create new simulation from properties - var properties = this.getProperties('name'); - properties['owner'] = user; - - var simulation = this.store.createRecord('simulation', properties); - var controller = this; - - simulation.save().then(function() { - controller.transitionToRoute('/simulations'); - }, function() { - Ember.debug('Error saving new simulation'); - }); - }, - - cancelNewSimulation() { - this.transitionToRoute('/simulations'); - } - } -}); diff --git a/app/controllers/simulations.js b/app/controllers/simulations.js new file mode 100644 index 0000000..9eaea92 --- /dev/null +++ b/app/controllers/simulations.js @@ -0,0 +1,115 @@ +/** + * File: simulation.js + * Author: Markus Grigull + * Date: 30.09.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + isShowingNewModal: false, + isShowingEditModal: false, + isShowingEditModal: false, + + errorMessage: null, + + simulation: null, + + actions: { + showNewModal() { + // reset properties + this.set('errorMessage', null); + this.set('name', null); + + // show the dialog + this.set('isShowingNewModal', true); + }, + + showEditModal(simulation) { + // set properties + this.set('errorMessage', null); + this.set('simulation', simulation); + this.set('name', simulation.get('name')); + + // show the dialog + this.set('isShowingEditModal', true); + }, + + showDeleteModal(simulation) { + // set properties + this.set('simulation', simulation); + + // show the dialog + this.set('isShowingDeleteModal', true); + }, + + submitNew() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Simulation name is missing'); + return; + } + + // set owner properties + var user = this.get('sessionUser.user'); + properties['owner'] = user; + + // create new simulation + var simulation = this.store.createRecord('simulation', properties); + var controller = this; + + simulation.save().then(function() { + controller.set('isShowingNewModal', false); + }, function() { + Ember.debug('Error saving new simulation'); + }); + }, + + cancelNew() { + this.set('isShowingNewModal', false); + }, + + submitEdit() { + // verify properties + var properties = this.getProperties('name'); + if (properties['name'] == null || properties['name'] == "") { + this.set('errorMessage', 'Simulation name is missing'); + return; + } + + // save properties + this.get('simulation').set('name', properties['name']); + + var controller = this; + + this.get('simulation').save().then(function() { + controller.set('isShowingEditModal', false); + }, function() { + Ember.debug('Error saving edit simulation'); + }); + }, + + cancelEdit() { + this.set('isShowingEditModal', false); + }, + + confirmDelete() { + // delete the simulation + var simulation = this.get('simulation'); + simulation.destroyRecord(); + + // hide the dialog + this.set('isShowingDeleteModal', false); + }, + + cancelDelete() { + this.set('isShowingDeleteModal', false); + } + } +}); diff --git a/app/router.js b/app/router.js index 513436f..4f52379 100644 --- a/app/router.js +++ b/app/router.js @@ -21,9 +21,6 @@ Router.map(function() { this.route('projects'); this.route('project', function() { this.route('index', { path: '/:projectid' }); - this.route('new'); - this.route('edit', { path: '/edit/:projectid' }); - this.route('delete', { path: '/delete/:projectid' }); }); this.route('me'); @@ -45,18 +42,11 @@ Router.map(function() { this.route('simulation-model', function() { this.route('index', { path: '/:modelid' }); - this.route('new', { path: '/new/:simulationid' }); - this.route('delete', { path: '/delete/:modelid' }); - this.route('edit', { path: '/edit/:modelid' }); }); - this.route('simulation-models'); this.route('simulations'); this.route('simulation', function() { this.route('index', { path: '/:simulationid' }); - this.route('delete', { path: '/delete/:simulationid' }); - this.route('new'); - this.route('edit', { path: '/edit/:simulationid' }); }); this.route('simulators'); diff --git a/app/routes/project/delete.js b/app/routes/project/delete.js deleted file mode 100644 index ec3a964..0000000 --- a/app/routes/project/delete.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * File: delete.js - * Author: Markus Grigull - * Date: 26.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Ember.Route.extend(AuthenticatedRouteMixin, { - model(params) { - return this.store.findRecord('project', params.projectid); - } -}); diff --git a/app/routes/project/edit.js b/app/routes/project/edit.js deleted file mode 100644 index 6e52fe9..0000000 --- a/app/routes/project/edit.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * File: edit.js - * Author: Markus Grigull - * Date: 05.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Ember.Route.extend(AuthenticatedRouteMixin, { - model(params) { - return this.store.findRecord('project', params.projectid); - } -}); diff --git a/app/routes/project/new.js b/app/routes/project/new.js deleted file mode 100644 index 38e760a..0000000 --- a/app/routes/project/new.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * File: new.js - * Author: Markus Grigull - * Date: 26.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Ember.Route.extend(AuthenticatedRouteMixin, { -}); diff --git a/app/routes/projects.js b/app/routes/projects.js index 2908aa4..cf7f030 100644 --- a/app/routes/projects.js +++ b/app/routes/projects.js @@ -14,10 +14,8 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { sessionUser: Ember.inject.service('session-user'), model() { - // get session user - var userId = this.get('sessionUser.user.id'); - let user = this.store.peekRecord('user', userId); - + // get projects for current user + var user = this.get('sessionUser.user'); return user.get('projects'); } }); diff --git a/app/routes/simulation-model/delete.js b/app/routes/simulation-model/delete.js deleted file mode 100644 index 26d9f31..0000000 --- a/app/routes/simulation-model/delete.js +++ /dev/null @@ -1,4 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Route.extend({ -}); diff --git a/app/routes/simulation-model/edit.js b/app/routes/simulation-model/edit.js deleted file mode 100644 index 992b1b1..0000000 --- a/app/routes/simulation-model/edit.js +++ /dev/null @@ -1,7 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Route.extend({ - model() { - return this.store.peekRecord('simulation-data', 1); - } -}); diff --git a/app/routes/simulation-model/new.js b/app/routes/simulation-model/new.js deleted file mode 100644 index fc60ffc..0000000 --- a/app/routes/simulation-model/new.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * File: new.js - * Author: Markus Grigull - * Date: 20.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Ember.Route.extend(AuthenticatedRouteMixin, { - model(params) { - return Ember.RSVP.hash({ - simulation: this.store.findRecord('simulation', params.simulationid), - simulators: this.store.findAll('simulator') - }); - } -}); diff --git a/app/routes/simulation-models.js b/app/routes/simulation-models.js deleted file mode 100644 index e80ebbb..0000000 --- a/app/routes/simulation-models.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * File: simulation-models.js - * Author: Markus Grigull - * Date: 20.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Ember.Route.extend(AuthenticatedRouteMixin, { -}); diff --git a/app/routes/simulation/delete.js b/app/routes/simulation/delete.js deleted file mode 100644 index 26d9f31..0000000 --- a/app/routes/simulation/delete.js +++ /dev/null @@ -1,4 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Route.extend({ -}); diff --git a/app/routes/simulation/edit.js b/app/routes/simulation/edit.js deleted file mode 100644 index 26d9f31..0000000 --- a/app/routes/simulation/edit.js +++ /dev/null @@ -1,4 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Route.extend({ -}); diff --git a/app/routes/simulation/index.js b/app/routes/simulation/index.js index 05b1b84..567b7e3 100644 --- a/app/routes/simulation/index.js +++ b/app/routes/simulation/index.js @@ -12,6 +12,9 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { model(params) { - return this.store.findRecord('simulation', params.simulationid); + return Ember.RSVP.hash({ + simulation: this.store.findRecord('simulation', params.simulationid), + simulators: this.store.findAll('simulator') + }); } }); diff --git a/app/routes/simulation/new.js b/app/routes/simulation/new.js deleted file mode 100644 index 8f8de75..0000000 --- a/app/routes/simulation/new.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * File: new.js - * Author: Markus Grigull - * Date: 26.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; - -export default Ember.Route.extend(AuthenticatedRouteMixin, { -}); diff --git a/app/services/running-simulation.js b/app/services/running-simulation.js index 40aa46b..2d97597 100644 --- a/app/services/running-simulation.js +++ b/app/services/running-simulation.js @@ -21,6 +21,7 @@ export default Ember.Service.extend({ var self = this; // check every second for running simulation + /* setInterval(function() { // check if running simulation did changed self.get('store').findAll('simulation').then(function(simulations) { @@ -36,6 +37,6 @@ export default Ember.Service.extend({ self.set('simulation', newSimulation); } }); - }, 1000); + }, 1000);*/ } }); diff --git a/app/templates/project/delete.hbs b/app/templates/project/delete.hbs deleted file mode 100644 index 2aa92ae..0000000 --- a/app/templates/project/delete.hbs +++ /dev/null @@ -1,6 +0,0 @@ -

    Delete Project

    - -

    Are you sure you want to delete the project?

    - - - diff --git a/app/templates/project/edit.hbs b/app/templates/project/edit.hbs deleted file mode 100644 index 1c42a97..0000000 --- a/app/templates/project/edit.hbs +++ /dev/null @@ -1,15 +0,0 @@ -

    Edit project

    - -
    -

    - - {{input id='name' placeholder='Enter project name' value=name}} -

    - - - - - {{#if errorMessage}} -

    {{errorMessage.message}}

    - {{/if}} -
    diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index 93dcedb..b94ec9d 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -1,3 +1,5 @@ +{{#link-to 'projects'}}Back to projects{{/link-to}} +

    {{model.name}}

    @@ -13,8 +15,8 @@
    - {{#link-to "visualization.edit" visualization.id}}Edit{{/link-to}} - {{#link-to "visualization.delete" visualization.id}}Delete{{/link-to}} + Edit + Delete
    @@ -23,5 +25,74 @@
    - New visualization +
    + +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New visualization

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter visualization name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit visualization

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter visualization name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete visualization

    + +

    Are you sure you want to delete the visualization {{visualization.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/project/new.hbs b/app/templates/project/new.hbs deleted file mode 100644 index a2d56d2..0000000 --- a/app/templates/project/new.hbs +++ /dev/null @@ -1,24 +0,0 @@ -

    New project

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter project name' value=name}} -
    - - -
    - - {{#if errorMessage}} -

    {{errorMessage.message}}

    - {{/if}} -
    diff --git a/app/templates/projects.hbs b/app/templates/projects.hbs index c99113a..b4346fd 100644 --- a/app/templates/projects.hbs +++ b/app/templates/projects.hbs @@ -13,8 +13,8 @@
    - {{#link-to "project.edit" project.id}}Edit{{/link-to}} - {{#link-to "project.delete" project.id}}Delete{{/link-to}} + Edit + Delete
    @@ -23,5 +23,74 @@
    - {{#link-to "project.new"}}New project{{/link-to}} +
    + +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New project

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter project name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit project

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter project name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete project

    + +

    Are you sure you want to delete the project {{project.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/simulation-model/delete.hbs b/app/templates/simulation-model/delete.hbs deleted file mode 100644 index c24cd68..0000000 --- a/app/templates/simulation-model/delete.hbs +++ /dev/null @@ -1 +0,0 @@ -{{outlet}} diff --git a/app/templates/simulation-model/edit.hbs b/app/templates/simulation-model/edit.hbs deleted file mode 100644 index 5db3453..0000000 --- a/app/templates/simulation-model/edit.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{{sequence}} - -
    - -{{#each values as |value|}} - {{value}} -
    -{{/each}} diff --git a/app/templates/simulation-model/new.hbs b/app/templates/simulation-model/new.hbs deleted file mode 100644 index 5fa523d..0000000 --- a/app/templates/simulation-model/new.hbs +++ /dev/null @@ -1,32 +0,0 @@ -

    New model

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter model name' value=name}} -
    - - - -
    - - -
    -
    diff --git a/app/templates/simulation-models.hbs b/app/templates/simulation-models.hbs deleted file mode 100644 index ca7dd24..0000000 --- a/app/templates/simulation-models.hbs +++ /dev/null @@ -1,24 +0,0 @@ -

    Models

    - -
    - - - - - {{#each model as |simulationModel|}} - - - - {{/each}} -
    Name
    - {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}} -
    - {{#link-to "simulation-model.edit" simulationModel.id}}Edit{{/link-to}} - {{#link-to "simulation-model.delete" simulationModel.id}}Delete{{/link-to}} -
    -
    -
    - -
    - {{#link-to "simulation-model.new"}}New model{{/link-to}} -
    diff --git a/app/templates/simulation/delete.hbs b/app/templates/simulation/delete.hbs deleted file mode 100644 index c24cd68..0000000 --- a/app/templates/simulation/delete.hbs +++ /dev/null @@ -1 +0,0 @@ -{{outlet}} diff --git a/app/templates/simulation/edit.hbs b/app/templates/simulation/edit.hbs deleted file mode 100644 index c24cd68..0000000 --- a/app/templates/simulation/edit.hbs +++ /dev/null @@ -1 +0,0 @@ -{{outlet}} diff --git a/app/templates/simulation/index.hbs b/app/templates/simulation/index.hbs index 738ae2c..6a2efd5 100644 --- a/app/templates/simulation/index.hbs +++ b/app/templates/simulation/index.hbs @@ -1,4 +1,6 @@ -

    {{model.name}}

    +{{#link-to 'simulations'}}Back to simulations{{/link-to}} + +

    {{model.simulation.name}}

    @@ -7,7 +9,7 @@ - {{#each model.models as |simulationModel|}} + {{#each model.simulation.models as |simulationModel|}} @@ -27,5 +29,98 @@
    - {{#link-to "simulation-model.new" model.id}}New model{{/link-to}} +
    + +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New model

    + + +
    Simulator
    {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}} @@ -17,8 +19,8 @@
    - {{#link-to "simulation-model.edit" simulationModel.id}}Edit{{/link-to}} - {{#link-to "simulation-model.delete" simulationModel.id}}Delete{{/link-to}} + Edit + Delete
    + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter model name' value=name}} +
    + + + +
    + + +
    + + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit model

    + +
    + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter model name' value=name}} +
    + + + +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete simulation-model

    + +

    Are you sure you want to delete the simulation-model {{simulationModel.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/simulation/new.hbs b/app/templates/simulation/new.hbs deleted file mode 100644 index 211149f..0000000 --- a/app/templates/simulation/new.hbs +++ /dev/null @@ -1,20 +0,0 @@ -

    New simulation

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulation name' value=name}} -
    - - -
    -
    diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs index 40fa4a6..d94b085 100644 --- a/app/templates/simulations.hbs +++ b/app/templates/simulations.hbs @@ -17,8 +17,10 @@
    - {{#link-to "simulation.edit" simulation.id}}Edit{{/link-to}} - {{#link-to "simulation.delete" simulation.id}}Delete{{/link-to}} + + + Edit + Delete
    @@ -27,5 +29,74 @@
    - {{#link-to "simulation.new"}}New simulation{{/link-to}} +
    + +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New simulation

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulation name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit simulator

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulation name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete simulation

    + +

    Are you sure you want to delete the simulation {{simulation.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/simulators.hbs b/app/templates/simulators.hbs index e860e7b..ed099fd 100644 --- a/app/templates/simulators.hbs +++ b/app/templates/simulators.hbs @@ -130,7 +130,7 @@ - + diff --git a/package.json b/package.json index bea92e8..45b186e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "ember-resolver": "^2.0.3", "ember-simple-auth": "^1.1.0", "ember-tether": "0.3.1", + "ember-truth-helpers": "1.2.0", "loader.js": "^4.0.1" }, "dependencies": {} diff --git a/tests/unit/controllers/project/delete-test.js b/tests/unit/controllers/project/delete-test.js deleted file mode 100644 index 8b10820..0000000 --- a/tests/unit/controllers/project/delete-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:project/delete', 'Unit | Controller | project/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/project/edit-test.js b/tests/unit/controllers/projects-test.js similarity index 79% rename from tests/unit/controllers/project/edit-test.js rename to tests/unit/controllers/projects-test.js index 9100007..174083b 100644 --- a/tests/unit/controllers/project/edit-test.js +++ b/tests/unit/controllers/projects-test.js @@ -1,6 +1,6 @@ import { moduleFor, test } from 'ember-qunit'; -moduleFor('controller:project/edit', 'Unit | Controller | project/edit', { +moduleFor('controller:projects', 'Unit | Controller | projects', { // Specify the other units that are required for this test. // needs: ['controller:foo'] }); diff --git a/tests/unit/controllers/simulation-model/delete-test.js b/tests/unit/controllers/simulation-model/delete-test.js deleted file mode 100644 index b8ccc6b..0000000 --- a/tests/unit/controllers/simulation-model/delete-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation-model/delete', 'Unit | Controller | simulation-model/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation-model/edit-test.js b/tests/unit/controllers/simulation-model/edit-test.js deleted file mode 100644 index 252b107..0000000 --- a/tests/unit/controllers/simulation-model/edit-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation-model/edit', 'Unit | Controller | simulation-model/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation-model/new-test.js b/tests/unit/controllers/simulation-model/new-test.js deleted file mode 100644 index ae144f9..0000000 --- a/tests/unit/controllers/simulation-model/new-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation-model/new', 'Unit | Controller | simulation-model/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation/delete-test.js b/tests/unit/controllers/simulation/delete-test.js deleted file mode 100644 index 97437e5..0000000 --- a/tests/unit/controllers/simulation/delete-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation/delete', 'Unit | Controller | simulation/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation/edit-test.js b/tests/unit/controllers/simulation/edit-test.js deleted file mode 100644 index 814e36a..0000000 --- a/tests/unit/controllers/simulation/edit-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation/edit', 'Unit | Controller | simulation/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation/new-test.js b/tests/unit/controllers/simulations-test.js similarity index 78% rename from tests/unit/controllers/simulation/new-test.js rename to tests/unit/controllers/simulations-test.js index 1f75ab8..9b64642 100644 --- a/tests/unit/controllers/simulation/new-test.js +++ b/tests/unit/controllers/simulations-test.js @@ -1,6 +1,6 @@ import { moduleFor, test } from 'ember-qunit'; -moduleFor('controller:simulation/new', 'Unit | Controller | simulation/new', { +moduleFor('controller:simulations', 'Unit | Controller | simulations', { // Specify the other units that are required for this test. // needs: ['controller:foo'] }); diff --git a/tests/unit/routes/simulation-model/delete-test.js b/tests/unit/routes/simulation-model/delete-test.js deleted file mode 100644 index b333a4a..0000000 --- a/tests/unit/routes/simulation-model/delete-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation-model/delete', 'Unit | Route | simulation-model/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation-model/edit-test.js b/tests/unit/routes/simulation-model/edit-test.js deleted file mode 100644 index 8da4968..0000000 --- a/tests/unit/routes/simulation-model/edit-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation-model/edit', 'Unit | Route | simulation-model/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation-model/new-test.js b/tests/unit/routes/simulation-model/new-test.js deleted file mode 100644 index 67f77f4..0000000 --- a/tests/unit/routes/simulation-model/new-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation-model/new', 'Unit | Route | simulation-model/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation/delete-test.js b/tests/unit/routes/simulation/delete-test.js deleted file mode 100644 index 582dca0..0000000 --- a/tests/unit/routes/simulation/delete-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation/delete', 'Unit | Route | simulation/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation/edit-test.js b/tests/unit/routes/simulation/edit-test.js deleted file mode 100644 index 9cb2ae5..0000000 --- a/tests/unit/routes/simulation/edit-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation/edit', 'Unit | Route | simulation/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation/new-test.js b/tests/unit/routes/simulation/new-test.js deleted file mode 100644 index 340a6bd..0000000 --- a/tests/unit/routes/simulation/new-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation/new', 'Unit | Route | simulation/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); From f3d10d83407c03b807a54a011fda172f7c1a31d5 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 6 Oct 2016 16:56:08 +0200 Subject: [PATCH 026/556] Add simulation-model to simulator relationship Add simulation to projects Add running dialog to simulations Remove running dialog from simulators (simulator should be auto-detected) Change running-simulation to simulation-models based --- app/controllers/project/index.js | 4 +- app/controllers/projects.js | 42 ++++++++- app/controllers/simulation/index.js | 22 ++--- app/controllers/simulations.js | 44 ++++++++- app/controllers/simulators.js | 39 ++++++++ app/mixins/websocket-live-stream-mixin.js | 104 ++++++++++++++++------ app/models/simulation-model.js | 2 +- app/routes/projects.js | 8 +- app/routes/visualization/index.js | 5 +- app/services/running-simulation.js | 42 --------- app/services/running-simulations.js | 64 +++++++++++++ app/templates/projects.hbs | 30 ++++++- app/templates/simulation/index.hbs | 6 +- app/templates/simulations.hbs | 23 ++++- app/templates/simulators.hbs | 23 ++++- app/templates/visualization/index.hbs | 9 +- todo.md | 6 +- 17 files changed, 361 insertions(+), 112 deletions(-) delete mode 100644 app/services/running-simulation.js create mode 100644 app/services/running-simulations.js diff --git a/app/controllers/project/index.js b/app/controllers/project/index.js index 4f457cd..80f931b 100644 --- a/app/controllers/project/index.js +++ b/app/controllers/project/index.js @@ -49,7 +49,7 @@ export default Ember.Controller.extend({ submitNew() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Visualization name is missing'); return; } @@ -79,7 +79,7 @@ export default Ember.Controller.extend({ submitEdit() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Visualization name is missing'); return; } diff --git a/app/controllers/projects.js b/app/controllers/projects.js index 1a5dcfd..c77ae2e 100644 --- a/app/controllers/projects.js +++ b/app/controllers/projects.js @@ -19,6 +19,14 @@ export default Ember.Controller.extend({ errorMessage: null, project: null, + projectSimulation: null, + + _updateSimulations: function() { + if (this.get('model.simulations') != null && this.get('model.simulations.length') > 0) { + var simulations = this.get('model.simulations'); + this.set('projectSimulation', simulations.toArray()[0]); + } + }.observes('model'), actions: { showNewModal() { @@ -35,6 +43,7 @@ export default Ember.Controller.extend({ this.set('errorMessage', null); this.set('project', project); this.set('name', project.get('name')); + this.set('projectSimulation', project.get('simulation')); // show the dialog this.set('isShowingEditModal', true); @@ -51,17 +60,24 @@ export default Ember.Controller.extend({ submitNew() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Project name is missing'); return; } - // set owner properties + // set owner property var user = this.get('sessionUser.user'); properties['owner'] = user; + // set simulation property + properties['simulation'] = this.get('projectSimulation.id'); + // create new project var project = this.store.createRecord('project', properties); + + // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request + this.get('projectSimulation.projects').pushObject(project); + var controller = this; project.save().then(function() { @@ -78,14 +94,22 @@ export default Ember.Controller.extend({ submitEdit() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Project name is missing'); return; } + // remove from old simulation + + // save properties + properties['simulation'] = this.get('projectSimulation.id'); + this.get('project').setProperties(properties); + // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request + this.get('projectSimulation.projects').pushObject(this.get('project')); + var controller = this; this.get('project').save().then(function() { @@ -110,6 +134,18 @@ export default Ember.Controller.extend({ cancelDelete() { this.set('isShowingDeleteModal', false); + }, + + selectSimulation(simulationName) { + // get simulation by name + var simulations = this.get('model.simulations'); + var controller = this; + + simulations.forEach(function(simulation) { + if (simulation.get('name') === simulationName) { + controller.set('projectSimulation', simulation); + } + }); } } }); diff --git a/app/controllers/simulation/index.js b/app/controllers/simulation/index.js index 2208780..d201f3a 100644 --- a/app/controllers/simulation/index.js +++ b/app/controllers/simulation/index.js @@ -43,11 +43,11 @@ export default Ember.Controller.extend({ this.set('name', simulationModel.get('name')); var simulators = this.get('model.simulators'); - var simulatorId = simulationModel.get('simulator'); + var simulatorId = simulationModel.get('simulator.id'); var simulatorName = null; simulators.forEach(function(simulator) { - if (simulator.get('simulatorid') == simulatorId) { + if (simulator.get('id') === simulatorId) { simulatorName = simulator.get('name'); } }); @@ -69,33 +69,25 @@ export default Ember.Controller.extend({ submitNew() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Simulation model name is missing'); return; } // set simuatlion properties var simulation = this.get('model.simulation'); - properties['simulation'] = simulation.get('id');; + properties['simulation'] = simulation; // get the simulator id by simulator name var simulators = this.get('model.simulators'); - var simulatorId = null; var simulatorName = this.get('simulatorName'); simulators.forEach(function(simulator) { if (simulator.get('name') === simulatorName) { - simulatorId = simulator.get('simulatorid'); + properties['simulator'] = simulator; } }); - if (simulatorId == null) { - Ember.debug('Unable to find simulator by name'); - return; - } - - properties['simulator'] = simulatorId; - // create new model var simulationModel = this.store.createRecord('simulation-model', properties); @@ -118,14 +110,14 @@ export default Ember.Controller.extend({ submitEdit() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Simulation model name is missing'); return; } // set simuatlion properties var simulation = this.get('model.simulation'); - properties['simulation'] = simulation.get('id');; + properties['simulation'] = simulation.get('id'); // get the simulator id by simulator name var simulators = this.get('model.simulators'); diff --git a/app/controllers/simulations.js b/app/controllers/simulations.js index 9eaea92..0be9ecf 100644 --- a/app/controllers/simulations.js +++ b/app/controllers/simulations.js @@ -14,11 +14,12 @@ export default Ember.Controller.extend({ isShowingNewModal: false, isShowingEditModal: false, - isShowingEditModal: false, + isShowingDeleteModal: false, errorMessage: null, simulation: null, + simulationRunning: true, actions: { showNewModal() { @@ -48,10 +49,19 @@ export default Ember.Controller.extend({ this.set('isShowingDeleteModal', true); }, + showRunningModal(simulation) { + // set properties + this.set('simulation', simulation); + this.set('simulationRunning', simulation.get('running')); + + // show the dialog + this.set('isShowingRunningModal', true); + }, + submitNew() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Simulation name is missing'); return; } @@ -78,7 +88,7 @@ export default Ember.Controller.extend({ submitEdit() { // verify properties var properties = this.getProperties('name'); - if (properties['name'] == null || properties['name'] == "") { + if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Simulation name is missing'); return; } @@ -110,6 +120,34 @@ export default Ember.Controller.extend({ cancelDelete() { this.set('isShowingDeleteModal', false); + }, + + confirmRunningSimulation() { + // set the property + var simulation = this.get('simulation'); + simulation.set('running', this.get('simulationRunning')); + + // save property + var controller = this; + + simulation.save().then(function() { + controller.set('isShowingRunningModal', false); + }, function() { + Ember.debug('Error saving running simulation'); + }); + }, + + cancelRunningSimulation() { + this.set('isShowingRunningModal', false); + }, + + selectRunning(running) { + // NOTE: running is a string and not a boolean value + if (running === 'true') { + this.set('simulationRunning', true); + } else { + this.set('simulationRunning', false); + } } } }); diff --git a/app/controllers/simulators.js b/app/controllers/simulators.js index af9cb28..2163e3c 100644 --- a/app/controllers/simulators.js +++ b/app/controllers/simulators.js @@ -13,12 +13,14 @@ export default Ember.Controller.extend({ isShowingNewModal: false, isShowingDeleteModal: false, isShowingEditModal: false, + isShowingRunningModal: false, simulatorid: 1, errorMessage: null, simulator: null, simulatorName: null, simulatorEdit: null, + simulatorRunning: true, actions: { showNewModal() { @@ -49,6 +51,15 @@ export default Ember.Controller.extend({ this.set('isShowingEditModal', true); }, + showRunningModal(simulator) { + // set properties + this.set('simulator', simulator); + this.set('simulatorRunning', simulator.get('running')); + + // show the dialog + this.set('isShowingRunningModal', true); + }, + newSimulator() { // verify properties var properties = this.getProperties('name', 'simulatorid', 'endpoint'); @@ -114,6 +125,34 @@ export default Ember.Controller.extend({ cancelEditSimulator() { this.set('isShowingEditModal', false); + }, + + confirmRunningSimulation() { + // set the property + var simulator = this.get('simulator'); + simulator.set('running', this.get('simulatorRunning')); + + // save property + var controller = this; + + simulator.save().then(function() { + controller.set('isShowingRunningModal', false); + }, function() { + Ember.debug('Error saving running simulator'); + }); + }, + + cancelRunningSimulation() { + this.set('isShowingRunningModal', false); + }, + + selectRunning(running) { + // NOTE: running is a string and not a boolean value + if (running === 'true') { + this.set('simulatorRunning', true); + } else { + this.set('simulatorRunning', false); + } } } }); diff --git a/app/mixins/websocket-live-stream-mixin.js b/app/mixins/websocket-live-stream-mixin.js index c225d6a..72d2200 100644 --- a/app/mixins/websocket-live-stream-mixin.js +++ b/app/mixins/websocket-live-stream-mixin.js @@ -13,43 +13,95 @@ import ENV from '../config/environment'; const { service } = Ember.inject; export default Ember.Mixin.create({ - host: 'ws://' + ENV.APP.LIVE_HOST, - namespace: '', - runningSimulation: service('running-simulation'), + runningSimulations: service('running-simulations'), + store: service(), - socket: null, + sockets: [], init() { this._super(...arguments); - // start simulation service - this.get('runningSimulation').loadRunningSimulation(); + // load simulators + var self = this; + + this.store.findAll('simulator').then(function() { + // start simulators service + self.get('runningSimulations').loadRunningSimulations(); + }); }, - _runningSimulationChanged: function() { - // called each time running simulation did change - var simulation = this.get('runningSimulation.simulation'); - if (simulation !== null) { - if (this.socket === null) { - // create new socket connection - this.socket = new WebSocket(this.host + this.namespace); - this.socket.binaryType = 'arraybuffer'; + _runningSimulationsChanged: function() { + // called each time running simulations did change + var self = this; - // register callbacks - var self = this; - this.socket.onopen = function(event) { self.onopen.apply(self, [event]); }; - this.socket.onclose = function(event) { self.onclose.apply(self, [event]); }; - this.socket.onmessage = function(event) { self.onmessage.apply(self, [event]); }; - this.socket.onerror = function(event) { self.onerror.apply(self, [event]); }; + this.get('runningSimulations.simulationModels').forEach(function(simulationModel) { + //console.log('Model: ' + simulationModel.get('name') + ' (' + simulationModel.get('simulator.name') + ')'); + + // get socket for simulation model + let modelid = simulationModel.get('id'); + var socket = self._socketForSimulationModel(modelid); + + // create new socket for simulation model if not running yet + if (socket == null) { + // try to create new socket + socket = new WebSocket('ws://' + simulationModel.get('simulator.endpoint')); + console.log('opened ' + simulationModel.get('simulator.endpoint')); + + if (socket != null) { + socket.binaryType = 'arraybuffer'; + + // register callbacks + socket.onopen = function(event) { self.onopen.apply(self, [event]); }; + socket.onclose = function(event) { self.onclose.apply(self, [event]); }; + socket.onmessage = function(event) { self.onmessage.apply(self, [event]); }; + socket.onerror = function(event) { self.onerror.apply(self, [event]); }; + + // save socket + self._addSocketForSimulationModel(socket, modelid); + + console.log('simulation model \'' + simulationModel.get('name') + '\' started'); + } } - } else { - // stop stream if still opened - if (this.socket !== null) { - this.socket.close(); - this.socket = null; + }); + }.observes('runningSimulations.simulationModels.@each.mod'), + + _socketForSimulationModel(modelid) { + this.get('sockets').forEach(function(s) { + if (s.id === modelid) { + return s.socket; + } + }); + + return null; + }, + + _addSocketForSimulationModel(socket, modelid) { + // search for existing socket to replace + this.get('sockets').forEach(function(s) { + if (s.id === modelid) { + s.socket = socket; + return; + } + }); + + // add new socket + this.get('sockets').pushObject({ id: modelid, socket: socket }); + }, + + _removeSocketForSimulationModel(modelid) { + var sockets = this.get('sockets'); + var i = 0; + + while (i < sockets.get('length')) { + if (sockets[i].id === modelid) { + // remove object from array + sockets.slice(i, 1); + } else { + // only increase index if no object was removed + i++; } } - }.observes('runningSimulation.simulation'), + }, onopen(/*event*/) { Ember.debug('websocket opened'); diff --git a/app/models/simulation-model.js b/app/models/simulation-model.js index 9493dd9..199991a 100644 --- a/app/models/simulation-model.js +++ b/app/models/simulation-model.js @@ -13,7 +13,7 @@ import { belongsTo/*, hasMany*/ } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - simulator: attr('number'), + simulator: belongsTo('simulator', { async: true }), length: attr('number'), mapping: attr('array'), simulation: belongsTo('simulation', { async: true }) diff --git a/app/routes/projects.js b/app/routes/projects.js index cf7f030..9c31feb 100644 --- a/app/routes/projects.js +++ b/app/routes/projects.js @@ -14,8 +14,12 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { sessionUser: Ember.inject.service('session-user'), model() { - // get projects for current user + // get projects for current user, simulations are needed for the simulation picker var user = this.get('sessionUser.user'); - return user.get('projects'); + + return Ember.RSVP.hash({ + projects: user.get('projects'), + simulations: this.store.findAll('simulation') + }); } }); diff --git a/app/routes/visualization/index.js b/app/routes/visualization/index.js index 35a7beb..346c076 100644 --- a/app/routes/visualization/index.js +++ b/app/routes/visualization/index.js @@ -12,6 +12,9 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { model(params) { - return this.store.findRecord('visualization', params.visualizationid); + return Ember.RSVP.hash({ + /*simulation: this.store.findRecord('simulation', params.simulationid),*/ + visualization: this.store.findRecord('visualization', params.visualizationid) + }); } }); diff --git a/app/services/running-simulation.js b/app/services/running-simulation.js deleted file mode 100644 index 2d97597..0000000 --- a/app/services/running-simulation.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * File: running-simulation.js - * Author: Markus Grigull - * Date: 26.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -const { - inject: { service } -} = Ember; - -export default Ember.Service.extend({ - session: service('session'), - store: service(), - - loadRunningSimulation: function() { - var self = this; - - // check every second for running simulation - /* - setInterval(function() { - // check if running simulation did changed - self.get('store').findAll('simulation').then(function(simulations) { - var newSimulation = null; - - simulations.forEach(function(simulation) { - if (simulation.get('running') === true) { - newSimulation = simulation; - } - }); - - if (newSimulation !== self.get('simulation')) { - self.set('simulation', newSimulation); - } - }); - }, 1000);*/ - } -}); diff --git a/app/services/running-simulations.js b/app/services/running-simulations.js new file mode 100644 index 0000000..8aef65c --- /dev/null +++ b/app/services/running-simulations.js @@ -0,0 +1,64 @@ +/** + * File: running-simulations.js + * Author: Markus Grigull + * Date: 26.07.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +const { + inject: { service } +} = Ember; + +export default Ember.Service.extend({ + session: service('session'), + sessionUser: Ember.inject.service('session-user'), + store: service(), + + simulationModels: [], + + loadRunningSimulations: function() { + var self = this; + + // check for running simulations + setInterval(function() { + if (self.get('sessionUser.user') != null) { + // check if running simulations did changed + self.get('store').findAll('simulation').then(function(simulations) { + // search for running simulations + simulations.forEach(function(simulation) { + if (simulation.get('running') === true) { + // get all models of the simulation + simulation.get('models').forEach(function(model) { + self.get('store').findRecord('simulation-model', model.get('id')).then(function(m) { + // add to array + self._addSimulationModel(m); + }); + }); + } else { + // clear all models of the simulation + } + }); + }); + } + }, 3000); + }, + + _addSimulationModel(simulationModel) { + // check if the model is already in the array + var models = this.get('simulationModels'); + var length = models.get('length'); + + for (var i = 0; i < length; i++) { + if (models[i].get('id') === simulationModel.get('id')) { + return; + } + } + + // not found, so add to the array + this.get('simulationModels').pushObject(simulationModel); + } +}); diff --git a/app/templates/projects.hbs b/app/templates/projects.hbs index b4346fd..f544a78 100644 --- a/app/templates/projects.hbs +++ b/app/templates/projects.hbs @@ -4,13 +4,17 @@ + - {{#each model as |project|}} + {{#each model.projects as |project|}} + + + + + + + + + + + + + {{/each-in}} +
    NameSimulation
    {{#link-to "project.index" project.id}}{{project.name}}{{/link-to}} + {{project.simulation.name}} +
    Edit @@ -40,6 +44,18 @@ {{input id='name' placeholder='Enter project name' value=name}}
    + + + +
    @@ -69,6 +85,18 @@ {{input id='name' placeholder='Enter project name' value=name}}
    + + + +
    diff --git a/app/templates/simulation/index.hbs b/app/templates/simulation/index.hbs index 6a2efd5..3804575 100644 --- a/app/templates/simulation/index.hbs +++ b/app/templates/simulation/index.hbs @@ -6,7 +6,7 @@ - + {{#each model.simulation.models as |simulationModel|}} @@ -14,8 +14,8 @@ - - + {{#each model as |simulation|}} @@ -17,8 +17,7 @@ + {{#each model as |simulator|}} + + + + + + + + - + {{#each model as |simulation|}} diff --git a/app/templates/visualization/delete.hbs b/app/templates/visualization/delete.hbs deleted file mode 100644 index 0be5279..0000000 --- a/app/templates/visualization/delete.hbs +++ /dev/null @@ -1,6 +0,0 @@ -

    Delete

    - -

    Are you sure you want to delete the visualization?

    - - - diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index 46c89e7..a6872ac 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -1,14 +1,14 @@ -

    {{model.name}}

    +

    {{model.ame}}

    Toolbox

    - {{#draggable-item content='chart'}} + - {{#draggable-item content='table'}} + {{#draggable-item content='value'}} Value @@ -23,5 +23,3 @@

    - -{{partial "dialog/plot/value"}} diff --git a/app/templates/visualization/new.hbs b/app/templates/visualization/new.hbs deleted file mode 100644 index c9904d4..0000000 --- a/app/templates/visualization/new.hbs +++ /dev/null @@ -1 +0,0 @@ -

    New visualization

    diff --git a/tests/unit/controllers/visualization/delete-test.js b/tests/unit/controllers/dialog/plot/value-test.js similarity index 75% rename from tests/unit/controllers/visualization/delete-test.js rename to tests/unit/controllers/dialog/plot/value-test.js index dc98464..7b1555b 100644 --- a/tests/unit/controllers/visualization/delete-test.js +++ b/tests/unit/controllers/dialog/plot/value-test.js @@ -1,6 +1,6 @@ import { moduleFor, test } from 'ember-qunit'; -moduleFor('controller:visualization/delete', 'Unit | Controller | visualization/delete', { +moduleFor('controller:dialog/plot/value', 'Unit | Controller | dialog/plot/value', { // Specify the other units that are required for this test. // needs: ['controller:foo'] }); diff --git a/tests/unit/routes/visualization/new-test.js b/tests/unit/routes/dialog/plot/value-test.js similarity index 75% rename from tests/unit/routes/visualization/new-test.js rename to tests/unit/routes/dialog/plot/value-test.js index 0f09f4a..259de45 100644 --- a/tests/unit/routes/visualization/new-test.js +++ b/tests/unit/routes/dialog/plot/value-test.js @@ -1,6 +1,6 @@ import { moduleFor, test } from 'ember-qunit'; -moduleFor('route:visualization/new', 'Unit | Route | visualization/new', { +moduleFor('route:dialog/plot/value', 'Unit | Route | dialog/plot/value', { // Specify the other units that are required for this test. // needs: ['controller:foo'] }); diff --git a/tests/unit/routes/visualization/delete-test.js b/tests/unit/routes/visualization/delete-test.js deleted file mode 100644 index 635f4ac..0000000 --- a/tests/unit/routes/visualization/delete-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:visualization/delete', 'Unit | Route | visualization/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); From 846a0a73ee46504370aa3f7739a92d00e9c9a1ad Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 18 Oct 2016 13:01:55 +0200 Subject: [PATCH 032/556] Fix bugs and disable ember extend prototypes --- app/components/plot-abstract.js | 12 ++++++------ app/components/plot-container.js | 8 ++++---- app/components/plot-value.js | 25 ++++++++++++++++++++++--- app/controllers/me.js | 4 ++-- app/controllers/projects.js | 4 ++-- app/controllers/visualization/edit.js | 4 ++-- app/mixins/fetch-live-data.js | 4 ++-- app/models/simulation-data.js | 4 ++-- config/environment.js | 3 +++ 9 files changed, 45 insertions(+), 23 deletions(-) diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 5df157f..2ec8964 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -30,13 +30,13 @@ export default Ember.Component.extend(Resizable, Draggable, { grid_drag: [ 10, 10 ], scroll_drag: true, - style: function() { + style: Ember.computed('plot', function() { return Ember.String.htmlSafe('width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; left: ' + this.get('plot.x') + 'px; top: ' + this.get('plot.y') + 'px;'); - }.property('plot'), + }), - name: function() { + name: Ember.computed('plot', function() { return this.get('plot.name'); - }.property('plot'), + }), stop_resize(event, ui) { var width = ui.size.width; @@ -59,7 +59,7 @@ export default Ember.Component.extend(Resizable, Draggable, { }, - _updateUI: function() { + _updateUI: Ember.on('init', Ember.observer('editing', 'grid', function() { if (this.get('editing') === true) { this.set('disabled_resize', false); this.set('autoHide_resize', false); @@ -77,7 +77,7 @@ export default Ember.Component.extend(Resizable, Draggable, { this.set('grid_resize', false); this.set('grid_drag', false); } - }.observes('editing', 'grid').on('init'), + })), /*doubleClick() { if (this.get('editing')) { diff --git a/app/components/plot-container.js b/app/components/plot-container.js index 5f758c3..d2fdc0c 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -19,18 +19,18 @@ export default Ember.Component.extend({ grid: true, data: null, - style: function() { + style: Ember.computed('plots.@each.height', 'plots.@each.y', function() { var height = this._calculateHeight(); if (this.get('editing') === true && height < 400) { height = 400; } return Ember.String.htmlSafe('height: ' + height + 'px;'); - }.property('plots.@each.height', 'plots.@each.y'), + }), - _value: function() { + _value: Ember.computed('data.2.values.@each', function() { console.log(this.get('data')); - }.property('data.2.values.@each'), + }), _calculateHeight() { var maxHeight = 0; diff --git a/app/components/plot-value.js b/app/components/plot-value.js index b526080..d5f0ac2 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -8,6 +8,7 @@ **********************************************************************************/ import PlotAbstract from './plot-abstract'; +import Ember from 'ember'; export default PlotAbstract.extend({ classNames: [ 'plotValue' ], @@ -15,7 +16,7 @@ export default PlotAbstract.extend({ minWidth_resize: 50, minHeight_resize: 20, - value: function() { + value: Ember.computed('data.2.values', 'plot.simulator', 'plot.signal', function() { // get all values for the choosen simulator let values = this.get('data.' + this.get('plot.simulator') + '.values'); if (values) { @@ -26,7 +27,26 @@ export default PlotAbstract.extend({ Ember.run.later(this, function() { this.notifyPropertyChange('data.' + this.get('plot.simulator') + '.values'); }, 1000); - }.property('data.2.values', 'plot.simulator', 'plot.signal'), + }), + + /*_updateValue() { + let values = this.get('data.' + this.get('plot.simulator') + '.values'); + if (values) { + console.log('update value'); + return; + } + + // values is null, try to reload later + Ember.run.later(this, this._updateValue, 1000); + + console.log('update later'); + }, + + _updateDataObserver: function() { + let query = 'data.' + this.get('plot.simulator') + '.values'; + this.addObserver(query, this, this._updateValue); + console.log('Add observer: ' + query); + }.observes('plot.simulator', 'plot.signal').on('init'),*/ doubleClick() { if (this.get('editing') === true) { @@ -124,7 +144,6 @@ export default PlotAbstract.extend({ // get signal mapping for simulation model let self = this; - let simulatorid = this.get('plot.simulator'); this.get('plot.visualization').then((visualization) => { visualization.get('project').then((project) => { diff --git a/app/controllers/me.js b/app/controllers/me.js index 0374c40..8897e12 100644 --- a/app/controllers/me.js +++ b/app/controllers/me.js @@ -10,10 +10,10 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - isAdmin: function() { + isAdmin: Ember.computed('model', function() { var level = this.get('model.adminLevel'); return level >= 1; - }.property('model'), + }), actions: { changeUser() { diff --git a/app/controllers/projects.js b/app/controllers/projects.js index c77ae2e..337bc46 100644 --- a/app/controllers/projects.js +++ b/app/controllers/projects.js @@ -21,12 +21,12 @@ export default Ember.Controller.extend({ project: null, projectSimulation: null, - _updateSimulations: function() { + _updateSimulations: Ember.observer('model', function() { if (this.get('model.simulations') != null && this.get('model.simulations.length') > 0) { var simulations = this.get('model.simulations'); this.set('projectSimulation', simulations.toArray()[0]); } - }.observes('model'), + }), actions: { showNewModal() { diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index a7c1845..8062829 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -21,12 +21,12 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { simulatorName: null, signal: null, - _updateSimulators: function() { + _updateSimulators: Ember.observer('model', function() { if (this.get('model.simulators') !== null && this.get('model.simulators.length') > 0) { let simulators = this.get('model.simulators'); this.set('simulatorName', simulators.toArray()[0].get('name')); } - }.observes('model'), + }), actions: { addPlot(name) { diff --git a/app/mixins/fetch-live-data.js b/app/mixins/fetch-live-data.js index 811f104..0398f6d 100644 --- a/app/mixins/fetch-live-data.js +++ b/app/mixins/fetch-live-data.js @@ -12,7 +12,7 @@ import Ember from 'ember'; export default Ember.Mixin.create({ data: {}, - _getData: function() { + _getData: Ember.observer('model', function() { // check if simulation is running let self = this; @@ -48,7 +48,7 @@ export default Ember.Mixin.create({ } }); }); - }.observes('model'), + }), _loadDataForSimulator(simulatorID) { // get data by simulator id diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index f4825db..6764464 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -23,10 +23,10 @@ export default Model.extend({ _history: [], - _updateHistory: function() { + _updateHistory: Ember.observer('values', function() { this._history.unshift(this.get('values')); while (this._history.length > 5) { this._history.shift(); } - }.observes('values') + }) }); diff --git a/config/environment.js b/config/environment.js index f359e20..a6feb08 100644 --- a/config/environment.js +++ b/config/environment.js @@ -10,6 +10,9 @@ module.exports = function(environment) { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. 'with-controller': true + }, + EXTEND_PROTOTYPES: { + Date: false, } }, From 68d33e0b1814cc12bc37f7590b2a28add5bb4dfd Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 18 Oct 2016 19:45:14 +0200 Subject: [PATCH 033/556] Change live data observer Fix last extend prototype changes --- app/components/plot-value.js | 43 ++++++++------------------- app/controllers/simulation/index.js | 4 +-- app/controllers/user/index.js | 4 +-- app/controllers/visualization/edit.js | 2 +- app/mixins/fetch-live-data.js | 12 ++------ app/models/simulation-data.js | 4 +-- 6 files changed, 21 insertions(+), 48 deletions(-) diff --git a/app/components/plot-value.js b/app/components/plot-value.js index d5f0ac2..6cdfab3 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -16,37 +16,18 @@ export default PlotAbstract.extend({ minWidth_resize: 50, minHeight_resize: 20, - value: Ember.computed('data.2.values', 'plot.simulator', 'plot.signal', function() { - // get all values for the choosen simulator - let values = this.get('data.' + this.get('plot.simulator') + '.values'); - if (values) { - return values[this.get('plot.signal')]; - } - - // values is null, try to reload later - Ember.run.later(this, function() { - this.notifyPropertyChange('data.' + this.get('plot.simulator') + '.values'); - }, 1000); - }), - - /*_updateValue() { - let values = this.get('data.' + this.get('plot.simulator') + '.values'); - if (values) { - console.log('update value'); - return; - } - - // values is null, try to reload later - Ember.run.later(this, this._updateValue, 1000); - - console.log('update later'); - }, - - _updateDataObserver: function() { - let query = 'data.' + this.get('plot.simulator') + '.values'; - this.addObserver(query, this, this._updateValue); - console.log('Add observer: ' + query); - }.observes('plot.simulator', 'plot.signal').on('init'),*/ + _updateDataObserver: Ember.on('init', Ember.observer('plot.simulator', 'plot.signal', function() { + let query = 'data.' + this.get('plot.simulator') + '.sequence'; + this.addObserver(query, function() { + // get value from array + let values = this.get('data.' + this.get('plot.simulator') + '.values'); + if (values) { + this.set('value', values[this.get('plot.signal')]); + } else { + this.set('value', null); + } + }); + })), doubleClick() { if (this.get('editing') === true) { diff --git a/app/controllers/simulation/index.js b/app/controllers/simulation/index.js index 8db5c58..ffc0051 100644 --- a/app/controllers/simulation/index.js +++ b/app/controllers/simulation/index.js @@ -19,12 +19,12 @@ export default Ember.Controller.extend({ simulationModel: null, simulatorName: null, - _updateSimulators: function() { + _updateSimulators: Ember.observer('model', function() { if (this.get('model.simulators') != null && this.get('model.simulators.length') > 0) { let simulators = this.get('model.simulators'); this.set('simulatorName', simulators.toArray()[0].get('name')); } - }.observes('model'), + }), actions: { showNewModal() { diff --git a/app/controllers/user/index.js b/app/controllers/user/index.js index 6a44737..021b80b 100644 --- a/app/controllers/user/index.js +++ b/app/controllers/user/index.js @@ -10,7 +10,7 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - users: function() { + users: Ember.computed('model.@each', function() { var filteredUsers = this.get('model'); filteredUsers.forEach(function(user) { // catch undefined user @@ -22,5 +22,5 @@ export default Ember.Controller.extend({ }); return filteredUsers; - }.property('model.@each') + }) }); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 8062829..3e068b9 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -27,7 +27,7 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { this.set('simulatorName', simulators.toArray()[0].get('name')); } }), - + actions: { addPlot(name) { var plot = null; diff --git a/app/mixins/fetch-live-data.js b/app/mixins/fetch-live-data.js index 0398f6d..a3d2b06 100644 --- a/app/mixins/fetch-live-data.js +++ b/app/mixins/fetch-live-data.js @@ -10,7 +10,7 @@ import Ember from 'ember'; export default Ember.Mixin.create({ - data: {}, + data: Ember.Object.create(), _getData: Ember.observer('model', function() { // check if simulation is running @@ -35,11 +35,6 @@ export default Ember.Mixin.create({ }); }); } else { - // clear simulation data - this.set('data', {}); - - //Ember.debug('Simulation not running'); - // check again if simulation is running Ember.run.later(this, function() { // trigger _getData observer @@ -55,10 +50,7 @@ export default Ember.Mixin.create({ let simulationData = this.store.peekRecord('simulation-data', simulatorID); if (simulationData) { // add data to list - this.get('data')[simulatorID] = simulationData; - - // notify object for property changes - this.notifyPropertyChange('data.' + simulatorID + '.values'); + this.set('data.' + simulatorID, simulationData); } else { // try to load data later Ember.run.later(this, function() { diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index 6764464..b145faf 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -17,7 +17,7 @@ export default Model.extend({ sequence: attr('number'), values: attr('array'), - historyValues() { + /*historyValues() { return this._history; }, @@ -28,5 +28,5 @@ export default Model.extend({ while (this._history.length > 5) { this._history.shift(); } - }) + })*/ }); From 0423d7f3dc158b595da90358733b313603966552 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 20 Oct 2016 12:38:48 +0200 Subject: [PATCH 034/556] Add signal naming Simulation model length changes adopt to the mapping size. --- app/controllers/simulation-model/index.js | 35 ++++++++++++++++++ app/controllers/simulation/index.js | 19 +++++++++- app/templates/simulation-model/index.hbs | 44 ++++++++++++----------- 3 files changed, 76 insertions(+), 22 deletions(-) diff --git a/app/controllers/simulation-model/index.js b/app/controllers/simulation-model/index.js index e8ba731..88463c1 100644 --- a/app/controllers/simulation-model/index.js +++ b/app/controllers/simulation-model/index.js @@ -10,4 +10,39 @@ import Ember from 'ember'; export default Ember.Controller.extend({ + _setSignalNames: Ember.observer('model', 'model.length', function() { + // loop through signals + let length = this.get('model.length'); + let mapping = this.get('model.mapping'); + + for (let i = 0; i < length; i++) { + this.set('name' + i, mapping[i]); + } + }), + + actions: { + saveMapping() { + // save all signal names + let length = this.get('model.length'); + let mapping = this.get('model.mapping'); + + for (let i = 0; i < length; i++) { + mapping[i] = this.get('name' + i); + } + + this.set('model.mapping', mapping); + + // save the changed model + let self = this; + + this.get('model').save().then(function() { + // go back to simulation + self.get('model.simulation').then((simulation) => { + self.transitionToRoute('/simulation/' + simulation.get('id')); + }); + }, function() { + Ember.debug('Unable to save simulation model'); + }); + } + } }); diff --git a/app/controllers/simulation/index.js b/app/controllers/simulation/index.js index ffc0051..86d063a 100644 --- a/app/controllers/simulation/index.js +++ b/app/controllers/simulation/index.js @@ -94,7 +94,7 @@ export default Ember.Controller.extend({ let mapping = []; for (let i = 0; i < properties['length']; i++) { - mapping.pushObject("Signal " + (i + 1)); + mapping.push('Signal ' + (i + 1)); } properties['mapping'] = mapping; @@ -140,6 +140,23 @@ export default Ember.Controller.extend({ } }); + // change mapping + let mapping = this.get('simulationModel.mapping'); + + if (mapping.length < properties['length']) { + // add more signals + for (let i = mapping.length; i < properties['length']; i++) { + mapping.push('Signal ' + (i + 1)); + } + } else if (mapping.length > properties['length']) { + // remove signals + mapping = mapping.slice(0, Number(properties['length'])); + } + + console.log(mapping); + + properties['mapping'] = mapping; + // save properties let controller = this; diff --git a/app/templates/simulation-model/index.hbs b/app/templates/simulation-model/index.hbs index b1d2c6c..91872be 100644 --- a/app/templates/simulation-model/index.hbs +++ b/app/templates/simulation-model/index.hbs @@ -2,28 +2,30 @@

    {{model.name}}

    -

    Mapping

    +
    +

    Mapping

    -
    -
    NameSimulatorSimulator
    {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}} - {{simulationModel.simulator}} + + {{simulationModel.simulator.name}}
    diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs index d94b085..fee2ede 100644 --- a/app/templates/simulations.hbs +++ b/app/templates/simulations.hbs @@ -5,7 +5,7 @@
    Name Running
    @@ -100,3 +99,21 @@ {{/modal-dialog}} {{/if}} + +{{#if isShowingRunningModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Simulation running

    + + {{simulation.name}}: + + + +
    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/simulators.hbs b/app/templates/simulators.hbs index ed099fd..d610d92 100644 --- a/app/templates/simulators.hbs +++ b/app/templates/simulators.hbs @@ -7,12 +7,12 @@
    ID Running Endpoint
    - {{simulator.name}} @@ -26,8 +26,7 @@
    - - + Edit Delete
    @@ -141,3 +140,21 @@ {{/if}} {{/modal-dialog}} {{/if}} + +{{#if isShowingRunningModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Simulator running

    + + {{simulator.name}}: + + + +
    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs index b85b398..e7ff8f8 100644 --- a/app/templates/visualization/index.hbs +++ b/app/templates/visualization/index.hbs @@ -1,8 +1,9 @@ -

    {{model.name}}

    +{{#link-to 'project.index' project.id}}Back to {{model.project.name}}{{/link-to}} -{{plot-container plots=model.plots}} +

    {{model.visualization.name}}

    + +{{plot-container plots=model.visualization.plots}}

    - {{#link-to "visualization.edit" model.id}}Edit visualization{{/link-to}} - {{#link-to "visualization.delete" model.id}}Delete visualization{{/link-to}} + {{#link-to "visualization.edit" model.visualization.id}}Edit layout{{/link-to}}

    diff --git a/todo.md b/todo.md index b0982cf..f730b0e 100644 --- a/todo.md +++ b/todo.md @@ -3,10 +3,10 @@ - Don't log out on unauthorized access (admin level lower than required) - Move plot attributes/styling from plot-container into actual plots - Move drag-n-drop to mixins - - Websocket node is working in develop branch - - Add API host to config/environment.js - - Empty visualization after delete - Go into edit mode if visualization is empty + - Auto-detect if simulators are running + - Remove running socket if it's not in the updated list + - Real relationship between simulation-model and simulator websocketserverip/config.json websocketserverip/nodes.json From f2d494a1b0fbe2e529758540bffb6972cea31345 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 7 Oct 2016 10:21:32 +0200 Subject: [PATCH 027/556] Merge running-simulations and websocket mixin into live-data mixin --- app/mixins/live-data.js | 166 ++++++++++++++++++ app/mixins/websocket-live-stream-mixin.js | 160 ----------------- app/routes/index.js | 4 +- app/services/running-simulations.js | 64 ------- tests/unit/mixins/live-data-test.js | 12 ++ .../websocket-live-stream-mixin-test.js | 12 -- .../unit/services/running-simulation-test.js | 12 -- 7 files changed, 180 insertions(+), 250 deletions(-) create mode 100644 app/mixins/live-data.js delete mode 100644 app/mixins/websocket-live-stream-mixin.js delete mode 100644 app/services/running-simulations.js create mode 100644 tests/unit/mixins/live-data-test.js delete mode 100644 tests/unit/mixins/websocket-live-stream-mixin-test.js delete mode 100644 tests/unit/services/running-simulation-test.js diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js new file mode 100644 index 0000000..4f28247 --- /dev/null +++ b/app/mixins/live-data.js @@ -0,0 +1,166 @@ +/** + * File: live-data.js + * Author: Markus Grigull + * Date: 06.10.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +const { service } = Ember.inject; + +export default Ember.Mixin.create({ + store: service(), + sessionUser: service('session-user'), + + INTERVAL: 5000, + + _sockets: [], + + init: function() { + this._super(); + + // fetch the simulations for the first time + this._fetchRunningSimulations(); + + // start the polling loop + setInterval((function(self) { + return function() { + self._fetchRunningSimulations(); + } + })(this), this.INTERVAL); + }, + + _fetchRunningSimulations: function() { + // check if the user is logged in + if (this.get('sessionUser.user') != null) { + // load simulators + var self = this; + + this.get('store').findAll('simulator').then(function() { + // get all simulations to find all running ones + self.get('store').findAll('simulation').then(function(simulations) { + simulations.forEach(function(simulation) { + // check if the simulation is running + if (simulation.get('running')) { + // get all models + simulation.get('models').forEach(function(model) { + self.get('store').findRecord('simulation-model', model.get('id')).then(function(m) { + self._addSocket(m); + }); + }); + } + }); + }); + }); + } + }, + + _addSocket(simulationModel) { + // search for existing socket + var length = this.get('_sockets').length; + + for (var i = 0; i < length; i++) { + if (this.get('_sockets')[i].id === simulationModel.get('id')) { + // dont do anything + return; + } + } + + // add new socket + var socket = new WebSocket('ws://' + simulationModel.get('simulator.endpoint')); + socket.binaryType = 'arraybuffer'; + + // register callbacks + var self = this; + + socket.onopen = function(event) { self._onSocketOpen.apply(self, [event]); }; + socket.onclose = function(event) { self._onSocketClose.apply(self, [event]); }; + socket.onmessage = function(event) { self._onSocketMessage.apply(self, [event]); }; + socket.onerror = function(event) { self._onSocketError.apply(self, [event]); }; + + this.get('_sockets').pushObject({ id: simulationModel.get('id'), socket: socket }); + + console.log('Socket created for ' + simulationModel.get('name') + ': ws://' + simulationModel.get('simulator.endpoint')); + }, + + _removeSocket(socket) { + var length = this.get('_sockets').length; + var i = 0; + + while (i < length) { + if (this.get('_sockets')[i].socket === socket) { + // remove object from array + this.get('_sockets').slice(i, 1); + console.log('socket removed'); + } else { + // increase index if no object was removed + i++; + } + } + }, + + _onSocketOpen(/* event */) { + Ember.debug('websocket opened'); + }, + + _onSocketClose(event) { + if (event.wasClean) { + + } else { + Ember.debug('websocket closed: ' + event.code); + } + + // remove socket from array + this._removeSocket(event.target); + }, + + _onSocketMessage(event) { + // read the message into JSON + var message = this._messageToJSON(event.data); + + var simulationData = this.store.peekRecord('simulation-data', message.simulator); + if (simulationData != null) { + simulationData.set('sequence', message.sequence); + simulationData.set('values', message.values); + } else { + this.store.createRecord('simulation-data', { + sequence: message.sequence, + values: message.values, + id: message.simulator + }); + } + }, + + _onSocketError(/* event */) { + Ember.debug('websocket error'); + }, + + _messageToJSON(blob) { + var data = new DataView(blob); + + let OFFSET_ENDIAN = 1; + let OFFSET_TYPE = 2; + let OFFSET_VERSION = 4; + + var bits = data.getUint8(0); + var simulator = data.getUint8(0x01); + var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; + var length = data.getUint16(0x02, endian); + + var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); + + return { + endian: endian, + version: (bits >> OFFSET_VERSION) & 0xF, + type: (bits >> OFFSET_TYPE) & 0x3, + length: length, + sequence: data.getUint32(0x04, endian), + timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, + values: values, + simulator: simulator + }; + } +}); diff --git a/app/mixins/websocket-live-stream-mixin.js b/app/mixins/websocket-live-stream-mixin.js deleted file mode 100644 index 72d2200..0000000 --- a/app/mixins/websocket-live-stream-mixin.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * File: websocket-live-stream-mixin.js - * Author: Markus Grigull - * Date: 21.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; -import ENV from '../config/environment'; - -const { service } = Ember.inject; - -export default Ember.Mixin.create({ - runningSimulations: service('running-simulations'), - store: service(), - - sockets: [], - - init() { - this._super(...arguments); - - // load simulators - var self = this; - - this.store.findAll('simulator').then(function() { - // start simulators service - self.get('runningSimulations').loadRunningSimulations(); - }); - }, - - _runningSimulationsChanged: function() { - // called each time running simulations did change - var self = this; - - this.get('runningSimulations.simulationModels').forEach(function(simulationModel) { - //console.log('Model: ' + simulationModel.get('name') + ' (' + simulationModel.get('simulator.name') + ')'); - - // get socket for simulation model - let modelid = simulationModel.get('id'); - var socket = self._socketForSimulationModel(modelid); - - // create new socket for simulation model if not running yet - if (socket == null) { - // try to create new socket - socket = new WebSocket('ws://' + simulationModel.get('simulator.endpoint')); - console.log('opened ' + simulationModel.get('simulator.endpoint')); - - if (socket != null) { - socket.binaryType = 'arraybuffer'; - - // register callbacks - socket.onopen = function(event) { self.onopen.apply(self, [event]); }; - socket.onclose = function(event) { self.onclose.apply(self, [event]); }; - socket.onmessage = function(event) { self.onmessage.apply(self, [event]); }; - socket.onerror = function(event) { self.onerror.apply(self, [event]); }; - - // save socket - self._addSocketForSimulationModel(socket, modelid); - - console.log('simulation model \'' + simulationModel.get('name') + '\' started'); - } - } - }); - }.observes('runningSimulations.simulationModels.@each.mod'), - - _socketForSimulationModel(modelid) { - this.get('sockets').forEach(function(s) { - if (s.id === modelid) { - return s.socket; - } - }); - - return null; - }, - - _addSocketForSimulationModel(socket, modelid) { - // search for existing socket to replace - this.get('sockets').forEach(function(s) { - if (s.id === modelid) { - s.socket = socket; - return; - } - }); - - // add new socket - this.get('sockets').pushObject({ id: modelid, socket: socket }); - }, - - _removeSocketForSimulationModel(modelid) { - var sockets = this.get('sockets'); - var i = 0; - - while (i < sockets.get('length')) { - if (sockets[i].id === modelid) { - // remove object from array - sockets.slice(i, 1); - } else { - // only increase index if no object was removed - i++; - } - } - }, - - onopen(/*event*/) { - Ember.debug('websocket opened'); - }, - - onclose(event) { - Ember.debug('websocket closed: ' + event.code); - }, - - onmessage(event) { - // read the message into JSON - var message = this._messageToJSON(event.data); - - var simulationData = this.store.peekRecord('simulation-data', message.simulator); - if (simulationData != null) { - simulationData.set('sequence', message.sequence); - simulationData.set('values', message.values); - } else { - this.store.createRecord('simulation-data', { - sequence: message.sequence, - values: message.values, - id: message.simulator - }); - } - }, - - onerror(/*event*/) { - Ember.debug('websocket error'); - }, - - _messageToJSON(blob) { - var data = new DataView(blob); - - let OFFSET_ENDIAN = 1; - let OFFSET_TYPE = 2; - let OFFSET_VERSION = 4; - - var bits = data.getUint8(0); - var simulator = data.getUint8(0x01); - var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; - var length = data.getUint16(0x02, endian); - - var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); - - return { - endian: endian, - version: (bits >> OFFSET_VERSION) & 0xF, - type: (bits >> OFFSET_TYPE) & 0x3, - length: length, - sequence: data.getUint32(0x04, endian), - timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, - values: values, - simulator: simulator - }; - } -}); diff --git a/app/routes/index.js b/app/routes/index.js index ab4ab0a..ca13931 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -9,7 +9,7 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -import WebsocketLiveStreamMixin from '../mixins/websocket-live-stream-mixin'; +import LiveDataMixin from '../mixins/live-data'; -export default Ember.Route.extend(AuthenticatedRouteMixin, WebsocketLiveStreamMixin, { +export default Ember.Route.extend(AuthenticatedRouteMixin, LiveDataMixin, { }); diff --git a/app/services/running-simulations.js b/app/services/running-simulations.js deleted file mode 100644 index 8aef65c..0000000 --- a/app/services/running-simulations.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * File: running-simulations.js - * Author: Markus Grigull - * Date: 26.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -const { - inject: { service } -} = Ember; - -export default Ember.Service.extend({ - session: service('session'), - sessionUser: Ember.inject.service('session-user'), - store: service(), - - simulationModels: [], - - loadRunningSimulations: function() { - var self = this; - - // check for running simulations - setInterval(function() { - if (self.get('sessionUser.user') != null) { - // check if running simulations did changed - self.get('store').findAll('simulation').then(function(simulations) { - // search for running simulations - simulations.forEach(function(simulation) { - if (simulation.get('running') === true) { - // get all models of the simulation - simulation.get('models').forEach(function(model) { - self.get('store').findRecord('simulation-model', model.get('id')).then(function(m) { - // add to array - self._addSimulationModel(m); - }); - }); - } else { - // clear all models of the simulation - } - }); - }); - } - }, 3000); - }, - - _addSimulationModel(simulationModel) { - // check if the model is already in the array - var models = this.get('simulationModels'); - var length = models.get('length'); - - for (var i = 0; i < length; i++) { - if (models[i].get('id') === simulationModel.get('id')) { - return; - } - } - - // not found, so add to the array - this.get('simulationModels').pushObject(simulationModel); - } -}); diff --git a/tests/unit/mixins/live-data-test.js b/tests/unit/mixins/live-data-test.js new file mode 100644 index 0000000..804897f --- /dev/null +++ b/tests/unit/mixins/live-data-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import LiveDataMixin from 'villasweb-frontend/mixins/live-data'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | live data'); + +// Replace this with your real tests. +test('it works', function(assert) { + let LiveDataObject = Ember.Object.extend(LiveDataMixin); + let subject = LiveDataObject.create(); + assert.ok(subject); +}); diff --git a/tests/unit/mixins/websocket-live-stream-mixin-test.js b/tests/unit/mixins/websocket-live-stream-mixin-test.js deleted file mode 100644 index 7cc9580..0000000 --- a/tests/unit/mixins/websocket-live-stream-mixin-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import WebsocketLiveStreamMixinMixin from 'villasweb-frontend/mixins/websocket-live-stream-mixin'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | websocket live stream mixin'); - -// Replace this with your real tests. -test('it works', function(assert) { - let WebsocketLiveStreamMixinObject = Ember.Object.extend(WebsocketLiveStreamMixinMixin); - let subject = WebsocketLiveStreamMixinObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/services/running-simulation-test.js b/tests/unit/services/running-simulation-test.js deleted file mode 100644 index f74cde8..0000000 --- a/tests/unit/services/running-simulation-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('service:running-simulation', 'Unit | Service | running simulation', { - // Specify the other units that are required for this test. - // needs: ['service:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let service = this.subject(); - assert.ok(service); -}); From 59c9438ce13e6f83b37826ddb16d37a54676b03d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Oct 2016 08:30:15 +0200 Subject: [PATCH 028/556] Add live data flow from visualization to plots Fix live-data mixin --- app/components/plot-abstract.js | 3 +- app/components/plot-container.js | 5 ++ app/components/plot-value.js | 18 +++- app/controllers/visualization/index.js | 61 ++++++++++++++ app/mixins/live-data.js | 93 +++++++++++---------- app/routes/visualization/index.js | 5 +- app/templates/components/plot-container.hbs | 2 +- app/templates/components/plot-value.hbs | 32 +------ app/templates/visualization/index.hbs | 8 +- config/environment.js | 3 +- 10 files changed, 140 insertions(+), 90 deletions(-) diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index f8a7b51..9192ef8 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -19,8 +19,9 @@ export default Ember.Component.extend(Resizable, Draggable, { plot: null, editing: false, grid: false, + data: null, - simulator: 0, + simulator: 0 disabled_resize: false, autoHide_resize: false, diff --git a/app/components/plot-container.js b/app/components/plot-container.js index 9556975..df4d908 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -17,6 +17,7 @@ export default Ember.Component.extend({ plots: null, editing: false, grid: true, + data: null, style: function() { var height = this._calculateHeight(); @@ -27,6 +28,10 @@ export default Ember.Component.extend({ return Ember.String.htmlSafe('height: ' + height + 'px;'); }.property('plots.@each.height', 'plots.@each.y'), + _value: function() { + console.log(this.get('data')); + }.property('data.2.values.@each'), + _calculateHeight() { var maxHeight = 0; var plots = this.get('plots'); diff --git a/app/components/plot-value.js b/app/components/plot-value.js index 2c91b59..09bb9d1 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -13,5 +13,21 @@ export default PlotAbstract.extend({ classNames: [ 'plotValue' ], minWidth_resize: 50, - minHeight_resize: 20 + minHeight_resize: 20, + + simulator: 2, + signal: 1, + + value: function() { + // get all values for the choosen simulator + let values = this.get('data.' + this.get('simulator') + '.values'); + if (values) { + return values[this.get('signal')]; + } + + // values is null, try to reload later + Ember.run.later(this, function() { + this.notifyPropertyChange('data.' + this.get('simulator') + '.values'); + }, 1000); + }.property('data.2.values') }); diff --git a/app/controllers/visualization/index.js b/app/controllers/visualization/index.js index bfe1beb..9da9763 100644 --- a/app/controllers/visualization/index.js +++ b/app/controllers/visualization/index.js @@ -10,4 +10,65 @@ import Ember from 'ember'; export default Ember.Controller.extend({ + data: {}, + + /*values: function() { + console.log('update'); + return this.get('data'); + }.property('data.2.values'),*/ + + _getData: function() { + // check if simulation is running + let self = this; + + this.get('model.project').then((project) => { + project.get('simulation').then((simulation) => { + if (simulation.get('running')) { + // get all models to access data + simulation.get('models').then((simulationModels) => { + simulationModels.forEach(function(simulationModel) { + // get simulator + simulationModel.get('simulator').then((simulator) => { + let simulatorID = simulator.get('simulatorid'); + if (simulatorID) { + // add simulation data to list + self._loadDataForSimulator(simulatorID); + } else { + Ember.debug('undefined simulator id'); + } + }); + }); + }); + } else { + // clear simulation data + this.set('data', {}); + + //Ember.debug('Simulation not running'); + + // check again if simulation is running + Ember.run.later(this, function() { + // trigger _getData observer + this.notifyPropertyChange('model'); + }, 1000); + } + }); + }); + }.observes('model'), + + _loadDataForSimulator(simulatorID) { + // get data by simulator id + let simulationData = this.store.peekRecord('simulation-data', simulatorID); + if (simulationData) { + // add data to list + this.get('data')[simulatorID] = simulationData; + + // notify object for property changes + this.notifyPropertyChange('data.' + simulatorID + '.values'); + } else { + // try to load data later + Ember.run.later(this, function() { + this._loadDataForSimulator(simulatorID); + }, 1000); + } + } }); diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js index 4f28247..54d9323 100644 --- a/app/mixins/live-data.js +++ b/app/mixins/live-data.js @@ -17,7 +17,7 @@ export default Ember.Mixin.create({ INTERVAL: 5000, - _sockets: [], + _sockets: {}, init: function() { this._super(); @@ -36,79 +36,79 @@ export default Ember.Mixin.create({ _fetchRunningSimulations: function() { // check if the user is logged in if (this.get('sessionUser.user') != null) { - // load simulators + // get all simulations to find all running ones var self = this; - this.get('store').findAll('simulator').then(function() { - // get all simulations to find all running ones - self.get('store').findAll('simulation').then(function(simulations) { - simulations.forEach(function(simulation) { - // check if the simulation is running - if (simulation.get('running')) { - // get all models - simulation.get('models').forEach(function(model) { - self.get('store').findRecord('simulation-model', model.get('id')).then(function(m) { - self._addSocket(m); - }); + this.get('store').findAll('simulation').then(function(simulations) { + simulations.forEach(function(simulation) { + // check if the simulation is running + if (simulation.get('running')) { + // get all models for this simulation + simulation.get('models').then((models) => { + models.forEach(function(simulationModel) { + self._addSocket(simulationModel); }); - } - }); + }); + } }); }); } }, _addSocket(simulationModel) { - // search for existing socket - var length = this.get('_sockets').length; - - for (var i = 0; i < length; i++) { - if (this.get('_sockets')[i].id === simulationModel.get('id')) { - // dont do anything - return; - } + // check if socket is already open + let id = simulationModel.get('id'); + if (this.get('_sockets')[id] !== undefined) { + //Ember.debug('skip ' + simulationModel.get('name')); + return; } - // add new socket - var socket = new WebSocket('ws://' + simulationModel.get('simulator.endpoint')); - socket.binaryType = 'arraybuffer'; + // get simulator endpoint + simulationModel.get('simulator').then((simulator) => { + // get simulator endpoint + let endpoint = simulator.get('endpoint'); + if (endpoint) { + // add new socket + let socket = new WebSocket('ws://' + endpoint); + socket.binaryType = 'arraybuffer'; - // register callbacks - var self = this; + // register callbacks + let self = this; - socket.onopen = function(event) { self._onSocketOpen.apply(self, [event]); }; - socket.onclose = function(event) { self._onSocketClose.apply(self, [event]); }; - socket.onmessage = function(event) { self._onSocketMessage.apply(self, [event]); }; - socket.onerror = function(event) { self._onSocketError.apply(self, [event]); }; + socket.onopen = function(event) { self._onSocketOpen.apply(self, [event]); }; + socket.onclose = function(event) { self._onSocketClose.apply(self, [event]); }; + socket.onmessage = function(event) { self._onSocketMessage.apply(self, [event]); }; + socket.onerror = function(event) { self._onSocketError.apply(self, [event]); }; - this.get('_sockets').pushObject({ id: simulationModel.get('id'), socket: socket }); + // add socket to list of known sockets + this.get('_sockets')[id] = socket; - console.log('Socket created for ' + simulationModel.get('name') + ': ws://' + simulationModel.get('simulator.endpoint')); + //Ember.debug('Socket created for ' + simulationModel.get('name') + ': ws://' + endpoint); + } else { + Ember.debug('Undefined endpoint for ' + simulationModel.get('name')); + } + }); }, _removeSocket(socket) { - var length = this.get('_sockets').length; - var i = 0; + // search through all sockets + let sockets = this.get('_sockets'); - while (i < length) { - if (this.get('_sockets')[i].socket === socket) { - // remove object from array - this.get('_sockets').slice(i, 1); - console.log('socket removed'); - } else { - // increase index if no object was removed - i++; + for (let id in sockets) { + if (sockets[id] === socket) { + // remove socket from list + delete sockets[id]; } } }, _onSocketOpen(/* event */) { - Ember.debug('websocket opened'); + //Ember.debug('websocket opened'); }, _onSocketClose(event) { if (event.wasClean) { - + Ember.debug('websocket closed'); } else { Ember.debug('websocket closed: ' + event.code); } @@ -139,6 +139,7 @@ export default Ember.Mixin.create({ }, _messageToJSON(blob) { + // parse incoming message into usable data var data = new DataView(blob); let OFFSET_ENDIAN = 1; diff --git a/app/routes/visualization/index.js b/app/routes/visualization/index.js index 346c076..35a7beb 100644 --- a/app/routes/visualization/index.js +++ b/app/routes/visualization/index.js @@ -12,9 +12,6 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { model(params) { - return Ember.RSVP.hash({ - /*simulation: this.store.findRecord('simulation', params.simulationid),*/ - visualization: this.store.findRecord('visualization', params.visualizationid) - }); + return this.store.findRecord('visualization', params.visualizationid); } }); diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs index 2c29da4..110a95e 100644 --- a/app/templates/components/plot-container.hbs +++ b/app/templates/components/plot-container.hbs @@ -1,3 +1,3 @@ {{#each plots as |plot|}} - {{component plot.type plot=plot editing=editing grid=grid}} + {{component plot.type plot=plot editing=editing grid=grid data=data}} {{/each}} diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/plot-value.hbs index 74d6f2a..9ad31d4 100644 --- a/app/templates/components/plot-value.hbs +++ b/app/templates/components/plot-value.hbs @@ -1,31 +1 @@ -Value - - +Value: {{value}} diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs index e7ff8f8..64334da 100644 --- a/app/templates/visualization/index.hbs +++ b/app/templates/visualization/index.hbs @@ -1,9 +1,9 @@ -{{#link-to 'project.index' project.id}}Back to {{model.project.name}}{{/link-to}} +{{#link-to 'project.index' model.project.id}}Back to {{model.project.name}}{{/link-to}} -

    {{model.visualization.name}}

    +

    {{model.name}}

    -{{plot-container plots=model.visualization.plots}} +{{plot-container plots=model.plots data=data}}

    - {{#link-to "visualization.edit" model.visualization.id}}Edit layout{{/link-to}} + {{#link-to "visualization.edit" model.id}}Edit layout{{/link-to}}

    diff --git a/config/environment.js b/config/environment.js index b440274..f359e20 100644 --- a/config/environment.js +++ b/config/environment.js @@ -14,8 +14,7 @@ module.exports = function(environment) { }, APP: { - API_HOST: 'localhost:3000', - LIVE_HOST: 'localhost:4000' + API_HOST: 'localhost:3000' } }; From f8028d88b7d787e192feb3e22aeab22da4153b6e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Oct 2016 09:10:41 +0200 Subject: [PATCH 029/556] Move visualization data to mixin Add live data to edit visualization Fix stylesheet files --- app/components/plot-abstract.js | 2 +- app/controllers/visualization/edit.js | 3 +- app/controllers/visualization/index.js | 63 +---------------- app/mixins/fetch-live-data.js | 69 +++++++++++++++++++ app/mixins/live-data.js | 2 +- app/styles/app.scss | 10 +-- app/styles/{models.css => models.scss} | 0 app/styles/{plots.css => plots.scss} | 0 app/styles/{projects.css => projects.scss} | 2 +- .../{simulations.css => simulations.scss} | 0 .../{simulators.css => simulators.scss} | 0 app/templates/visualization/edit.hbs | 2 +- tests/unit/mixins/fetch-live-data-test.js | 12 ++++ 13 files changed, 94 insertions(+), 71 deletions(-) create mode 100644 app/mixins/fetch-live-data.js rename app/styles/{models.css => models.scss} (100%) rename app/styles/{plots.css => plots.scss} (100%) rename app/styles/{projects.css => projects.scss} (97%) rename app/styles/{simulations.css => simulations.scss} (100%) rename app/styles/{simulators.css => simulators.scss} (100%) create mode 100644 tests/unit/mixins/fetch-live-data-test.js diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 9192ef8..9b6377d 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -21,7 +21,7 @@ export default Ember.Component.extend(Resizable, Draggable, { grid: false, data: null, - simulator: 0 + simulator: 0, disabled_resize: false, autoHide_resize: false, diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 063bd58..f9eaae7 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -8,8 +8,9 @@ **********************************************************************************/ import Ember from 'ember'; +import FetchLiveDataMixin from '../../mixins/fetch-live-data'; -export default Ember.Controller.extend({ +export default Ember.Controller.extend(FetchLiveDataMixin, { actions: { addPlot(name) { var plot = null; diff --git a/app/controllers/visualization/index.js b/app/controllers/visualization/index.js index 9da9763..bf51cbe 100644 --- a/app/controllers/visualization/index.js +++ b/app/controllers/visualization/index.js @@ -8,67 +8,8 @@ **********************************************************************************/ import Ember from 'ember'; +import FetchLiveDataMixin from '../../mixins/fetch-live-data'; -export default Ember.Controller.extend({ - data: {}, +export default Ember.Controller.extend(FetchLiveDataMixin, { - /*values: function() { - console.log('update'); - return this.get('data'); - }.property('data.2.values'),*/ - - _getData: function() { - // check if simulation is running - let self = this; - - this.get('model.project').then((project) => { - project.get('simulation').then((simulation) => { - if (simulation.get('running')) { - // get all models to access data - simulation.get('models').then((simulationModels) => { - simulationModels.forEach(function(simulationModel) { - // get simulator - simulationModel.get('simulator').then((simulator) => { - let simulatorID = simulator.get('simulatorid'); - if (simulatorID) { - // add simulation data to list - self._loadDataForSimulator(simulatorID); - } else { - Ember.debug('undefined simulator id'); - } - }); - }); - }); - } else { - // clear simulation data - this.set('data', {}); - - //Ember.debug('Simulation not running'); - - // check again if simulation is running - Ember.run.later(this, function() { - // trigger _getData observer - this.notifyPropertyChange('model'); - }, 1000); - } - }); - }); - }.observes('model'), - - _loadDataForSimulator(simulatorID) { - // get data by simulator id - let simulationData = this.store.peekRecord('simulation-data', simulatorID); - if (simulationData) { - // add data to list - this.get('data')[simulatorID] = simulationData; - - // notify object for property changes - this.notifyPropertyChange('data.' + simulatorID + '.values'); - } else { - // try to load data later - Ember.run.later(this, function() { - this._loadDataForSimulator(simulatorID); - }, 1000); - } - } }); diff --git a/app/mixins/fetch-live-data.js b/app/mixins/fetch-live-data.js new file mode 100644 index 0000000..811f104 --- /dev/null +++ b/app/mixins/fetch-live-data.js @@ -0,0 +1,69 @@ +/** + * File: fetch-live-data.js + * Author: Markus Grigull + * Date: 12.10.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; + +export default Ember.Mixin.create({ + data: {}, + + _getData: function() { + // check if simulation is running + let self = this; + + this.get('model.project').then((project) => { + project.get('simulation').then((simulation) => { + if (simulation.get('running')) { + // get all models to access data + simulation.get('models').then((simulationModels) => { + simulationModels.forEach(function(simulationModel) { + // get simulator + simulationModel.get('simulator').then((simulator) => { + let simulatorID = simulator.get('simulatorid'); + if (simulatorID) { + // add simulation data to list + self._loadDataForSimulator(simulatorID); + } else { + Ember.debug('undefined simulator id'); + } + }); + }); + }); + } else { + // clear simulation data + this.set('data', {}); + + //Ember.debug('Simulation not running'); + + // check again if simulation is running + Ember.run.later(this, function() { + // trigger _getData observer + this.notifyPropertyChange('model'); + }, 1000); + } + }); + }); + }.observes('model'), + + _loadDataForSimulator(simulatorID) { + // get data by simulator id + let simulationData = this.store.peekRecord('simulation-data', simulatorID); + if (simulationData) { + // add data to list + this.get('data')[simulatorID] = simulationData; + + // notify object for property changes + this.notifyPropertyChange('data.' + simulatorID + '.values'); + } else { + // try to load data later + Ember.run.later(this, function() { + this._loadDataForSimulator(simulatorID); + }, 1000); + } + } +}); diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js index 54d9323..139b77d 100644 --- a/app/mixins/live-data.js +++ b/app/mixins/live-data.js @@ -29,7 +29,7 @@ export default Ember.Mixin.create({ setInterval((function(self) { return function() { self._fetchRunningSimulations(); - } + }; })(this), this.INTERVAL); }, diff --git a/app/styles/app.scss b/app/styles/app.scss index c740665..3c17c3b 100644 --- a/app/styles/app.scss +++ b/app/styles/app.scss @@ -7,11 +7,11 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -@import 'plots.css'; -@import 'models.css'; -@import 'simulations.css'; -@import 'projects.css'; -@import 'simulators.css'; +@import 'plots'; +@import 'models'; +@import 'simulations'; +@import 'projects'; +@import 'simulators'; @import "ember-modal-dialog/ember-modal-structure"; @import "ember-modal-dialog/ember-modal-appearance"; diff --git a/app/styles/models.css b/app/styles/models.scss similarity index 100% rename from app/styles/models.css rename to app/styles/models.scss diff --git a/app/styles/plots.css b/app/styles/plots.scss similarity index 100% rename from app/styles/plots.css rename to app/styles/plots.scss diff --git a/app/styles/projects.css b/app/styles/projects.scss similarity index 97% rename from app/styles/projects.css rename to app/styles/projects.scss index 43f0f1b..5f4e5ec 100644 --- a/app/styles/projects.css +++ b/app/styles/projects.scss @@ -38,7 +38,7 @@ } .project-index-row-controls a { - margin:left: 10px; + margin-left: 10px; } .project-index-new-visualization { diff --git a/app/styles/simulations.css b/app/styles/simulations.scss similarity index 100% rename from app/styles/simulations.css rename to app/styles/simulations.scss diff --git a/app/styles/simulators.css b/app/styles/simulators.scss similarity index 100% rename from app/styles/simulators.css rename to app/styles/simulators.scss diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index ea00cf5..80e78f3 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -16,7 +16,7 @@ {{#draggable-dropzone dropped='addPlot'}} - {{plot-container plots=model.plots editing=true}} + {{plot-container plots=model.plots editing=true data=data}} {{/draggable-dropzone}}

    diff --git a/tests/unit/mixins/fetch-live-data-test.js b/tests/unit/mixins/fetch-live-data-test.js new file mode 100644 index 0000000..de5b41e --- /dev/null +++ b/tests/unit/mixins/fetch-live-data-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import FetchLiveDataMixin from 'villasweb-frontend/mixins/fetch-live-data'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | fetch live data'); + +// Replace this with your real tests. +test('it works', function(assert) { + let FetchLiveDataObject = Ember.Object.extend(FetchLiveDataMixin); + let subject = FetchLiveDataObject.create(); + assert.ok(subject); +}); From ddea7e5e326e83b6a361cac7e787216b17f9056a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Oct 2016 11:29:09 +0200 Subject: [PATCH 030/556] Add plot value dialog --- app/components/plot-abstract.js | 57 ++-------- app/components/plot-container.js | 6 + app/components/plot-value.js | 11 +- app/controllers/visualization/edit.js | 56 ++++++++- app/models/plot.js | 2 +- app/router.js | 4 + app/templates/components/plot-container.hbs | 2 +- app/templates/components/plot-value.hbs | 2 +- app/templates/dialog/plot/value.hbs | 44 ++++++++ app/templates/dialog/project.hbs | 68 +++++++++++ app/templates/dialog/projects.hbs | 92 +++++++++++++++ app/templates/dialog/simulation.hbs | 92 +++++++++++++++ app/templates/dialog/simulations.hbs | 86 ++++++++++++++ app/templates/dialog/simulators.hbs | 118 +++++++++++++++++++ app/templates/project/index.hbs | 69 +----------- app/templates/projects.hbs | 93 +-------------- app/templates/simulation/index.hbs | 93 +-------------- app/templates/simulations.hbs | 87 +------------- app/templates/simulators.hbs | 119 +------------------- app/templates/visualization/edit.hbs | 4 +- 20 files changed, 589 insertions(+), 516 deletions(-) create mode 100644 app/templates/dialog/plot/value.hbs create mode 100644 app/templates/dialog/project.hbs create mode 100644 app/templates/dialog/projects.hbs create mode 100644 app/templates/dialog/simulation.hbs create mode 100644 app/templates/dialog/simulations.hbs create mode 100644 app/templates/dialog/simulators.hbs diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index 9b6377d..eded6a2 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -21,8 +21,6 @@ export default Ember.Component.extend(Resizable, Draggable, { grid: false, data: null, - simulator: 0, - disabled_resize: false, autoHide_resize: false, grid_resize: [ 10, 10 ], @@ -32,43 +30,14 @@ export default Ember.Component.extend(Resizable, Draggable, { grid_drag: [ 10, 10 ], scroll_drag: true, - _popoverDisplayed: false, - - didInsertElement() { - this._super(); - - if (this.get('editing') === true) { - // create popover - var self = this; - - this.$().popover({ - html: true, - placement: 'auto right', - content: function () { - return self.$('.popover-content').html(); - }, - viewport: { selector: '.plots', padding: 10 } - }); - - // register popover events - this.$().on('show.bs.popover', function() { - - }); - - this.$().on('shown.bs.popover', function() { - self._popoverDisplayed = true; - }); - - this.$().on('hide.bs.popover', function() { - self._popoverDisplayed = false; - }); - } - }, - style: function() { return Ember.String.htmlSafe('width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; left: ' + this.get('plot.x') + 'px; top: ' + this.get('plot.y') + 'px;'); }.property('plot'), + name: function() { + return this.get('plot.name'); + }.property('plot'), + stop_resize(event, ui) { var width = ui.size.width; var height = ui.size.height; @@ -77,10 +46,8 @@ export default Ember.Component.extend(Resizable, Draggable, { this.set('plot.height', height); }, - resize_resize(event, ui) { - if (this._popoverDisplayed === true) { - this.$().popover('show'); - } + resize_resize(/* event, ui */) { + }, stop_drag(event, ui) { @@ -88,10 +55,8 @@ export default Ember.Component.extend(Resizable, Draggable, { this.set('plot.y', ui.position.top); }, - drag_drag(event, ui) { - if (this._popoverDisplayed === true) { - this.$().popover('show'); - } + drag_drag(/* event, ui */) { + }, _updateUI: function() { @@ -114,9 +79,9 @@ export default Ember.Component.extend(Resizable, Draggable, { } }.observes('editing', 'grid').on('init'), - actions: { - savePlot() { - this.$().popover('hide'); + doubleClick() { + if (this.get('editing')) { + this.sendAction('showPlotDialog', this.get('plot')); } } }); diff --git a/app/components/plot-container.js b/app/components/plot-container.js index df4d908..5f758c3 100644 --- a/app/components/plot-container.js +++ b/app/components/plot-container.js @@ -47,5 +47,11 @@ export default Ember.Component.extend({ maxHeight += 40; return maxHeight; + }, + + actions: { + showPlotDialog(plot) { + this.sendAction('showPlotDialog', plot); + } } }); diff --git a/app/components/plot-value.js b/app/components/plot-value.js index 09bb9d1..338d900 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -15,19 +15,16 @@ export default PlotAbstract.extend({ minWidth_resize: 50, minHeight_resize: 20, - simulator: 2, - signal: 1, - value: function() { // get all values for the choosen simulator - let values = this.get('data.' + this.get('simulator') + '.values'); + let values = this.get('data.' + this.get('plot.simulator') + '.values'); if (values) { - return values[this.get('signal')]; + return values[this.get('plot.signal')]; } // values is null, try to reload later Ember.run.later(this, function() { - this.notifyPropertyChange('data.' + this.get('simulator') + '.values'); + this.notifyPropertyChange('data.' + this.get('plot.simulator') + '.values'); }, 1000); - }.property('data.2.values') + }.property('data.2.values', 'plot.simulator', 'plot.signal') }); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index f9eaae7..c864a5a 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -11,17 +11,26 @@ import Ember from 'ember'; import FetchLiveDataMixin from '../../mixins/fetch-live-data'; export default Ember.Controller.extend(FetchLiveDataMixin, { + isShowingPlotValueModal: false, + + errorMessage: null, + + plot: null, + name: null, + simulator: null, + signal: null, + actions: { addPlot(name) { var plot = null; if (name === 'chart') { // create new chart plot - plot = this.store.createRecord('plot', { name: 'Chart 1', signal: 'Signal 1', type: 'plot-chart' }); + plot = this.store.createRecord('plot', { name: 'Chart 1', type: 'plot-chart' }); } else if (name === 'table') { - plot = this.store.createRecord('plot', { name: 'Table 1', signal: 'Signal 1', type: 'plot-table', width: 500, height: 200, title: 'Table 1' }); + plot = this.store.createRecord('plot', { name: 'Table 1', type: 'plot-table', width: 500, height: 200, title: 'Table 1' }); } else if (name === 'value') { - plot = this.store.createRecord('plot', { name: 'Value 1', signal: 'Signal 1', type: 'plot-value' }); + plot = this.store.createRecord('plot', { name: 'Value 1', type: 'plot-value' }); } else { // DEBUG console.log('Add plot: ' + name); @@ -62,6 +71,47 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { let id = this.get('model.id'); this.transitionToRoute('/visualization/' + id); + }, + + showPlotDialog(plot) { + // show dialog by plot type + let plotType = plot.get('type'); + if (plotType === 'plot-value') { + // set properties + this.set('plot', plot); + this.set('name', plot.get('name')); + this.set('simulator', plot.get('simulator')); + this.set('signal', plot.get('signal')); + + this.set('isShowingPlotValueModal', true); + } + }, + + submitValuePlot() { + // verify properties + let properties = this.getProperties('name', 'simulator', 'signal'); + if (properties['name'] === null || properties['name'] === "") { + this.set('errorMessage', 'Plot name is missing'); + return; + } + + properties['simulator'] = Number(properties['simulator']); + properties['signal'] = Number(properties['signal']); + + // save properties + this.get('plot').setProperties(properties); + + let self = this; + + this.get('plot').save().then(function() { + self.set('isShowingPlotValueModal', false); + }, function() { + Ember.debug('Error saving value plot'); + }); + }, + + cancelValuePlot() { + this.set('isShowingPlotValueModal', false); } } }); diff --git a/app/models/plot.js b/app/models/plot.js index 17ab769..ab6cf46 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -13,7 +13,7 @@ import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - signal: attr('string'), + signal: attr('number', { defaultValue: 1 }), simulator: attr('number', { defaultValue: 1 }), width: attr('number', { defaultValue: 100 }), height: attr('number', { defaultValue: 100 }), diff --git a/app/router.js b/app/router.js index 4f52379..5e95c68 100644 --- a/app/router.js +++ b/app/router.js @@ -51,6 +51,10 @@ Router.map(function() { this.route('simulators'); this.route('simulator'); + + this.route('dialog', function() { + this.route('plot', function() {}); + }); }); export default Router; diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs index 110a95e..008dfad 100644 --- a/app/templates/components/plot-container.hbs +++ b/app/templates/components/plot-container.hbs @@ -1,3 +1,3 @@ {{#each plots as |plot|}} - {{component plot.type plot=plot editing=editing grid=grid data=data}} + {{component plot.type plot=plot editing=editing grid=grid data=data showPlotDialog=showPlotDialog}} {{/each}} diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/plot-value.hbs index 9ad31d4..b824785 100644 --- a/app/templates/components/plot-value.hbs +++ b/app/templates/components/plot-value.hbs @@ -1 +1 @@ -Value: {{value}} +{{name}}: {{value}} diff --git a/app/templates/dialog/plot/value.hbs b/app/templates/dialog/plot/value.hbs new file mode 100644 index 0000000..971e9ec --- /dev/null +++ b/app/templates/dialog/plot/value.hbs @@ -0,0 +1,44 @@ +{{#if isShowingPlotValueModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Value

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter plot name' value=name}} +
    + + + {{input id='simulator' type='number' value=simulator min='1' max='255'}} +
    + + + {{input id='signal' type='number' value=signal min='1'}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/dialog/project.hbs b/app/templates/dialog/project.hbs new file mode 100644 index 0000000..5d45882 --- /dev/null +++ b/app/templates/dialog/project.hbs @@ -0,0 +1,68 @@ +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New visualization

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter visualization name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit visualization

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter visualization name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete visualization

    + +

    Are you sure you want to delete the visualization {{visualization.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/dialog/projects.hbs b/app/templates/dialog/projects.hbs new file mode 100644 index 0000000..83dae43 --- /dev/null +++ b/app/templates/dialog/projects.hbs @@ -0,0 +1,92 @@ +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New project

    + +
    + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter project name' value=name}} +
    + + + +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit project

    + +
    + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter project name' value=name}} +
    + + + +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete project

    + +

    Are you sure you want to delete the project {{project.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/dialog/simulation.hbs b/app/templates/dialog/simulation.hbs new file mode 100644 index 0000000..aaa09a0 --- /dev/null +++ b/app/templates/dialog/simulation.hbs @@ -0,0 +1,92 @@ +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New model

    + +
    + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter model name' value=name}} +
    + + + +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit model

    + +
    + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter model name' value=name}} +
    + + + +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete simulation-model

    + +

    Are you sure you want to delete the simulation-model {{simulationModel.name}}?

    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/dialog/simulations.hbs b/app/templates/dialog/simulations.hbs new file mode 100644 index 0000000..96f847d --- /dev/null +++ b/app/templates/dialog/simulations.hbs @@ -0,0 +1,86 @@ +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New simulation

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulation name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Edit simulator

    + +
    + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulation name' value=name}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete simulation

    + +

    Are you sure you want to delete the simulation {{simulation.name}}?

    + + + + {{/modal-dialog}} +{{/if}} + +{{#if isShowingRunningModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Simulation running

    + + {{simulation.name}}: + + + +
    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/dialog/simulators.hbs b/app/templates/dialog/simulators.hbs new file mode 100644 index 0000000..ff43682 --- /dev/null +++ b/app/templates/dialog/simulators.hbs @@ -0,0 +1,118 @@ +{{#if isShowingNewModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New simulator

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulator name' value=name}} +
    + + + {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} +
    + + + {{input id='endpoint' placeholder='Enter endpoint' value=endpoint}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingDeleteModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Delete simulator

    + +

    Are you sure you want to delete the simulator {{simulator.name}}?

    + + + + {{/modal-dialog}} +{{/if}} + +{{#if isShowingEditModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    New simulator

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter simulator name' value=simulatorName}} +
    + + + {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} +
    + + + {{input id='endpoint' placeholder='Enter endpoint' value=simulatorEndpoint}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} + +{{#if isShowingRunningModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Simulator running

    + + {{simulator.name}}: + + + +
    + + + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index b94ec9d..ce4c826 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -28,71 +28,4 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New visualization

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter visualization name' value=name}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit visualization

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter visualization name' value=name}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete visualization

    - -

    Are you sure you want to delete the visualization {{visualization.name}}?

    - - - - {{/modal-dialog}} -{{/if}} +{{partial "dialog/project"}} diff --git a/app/templates/projects.hbs b/app/templates/projects.hbs index f544a78..ff264cd 100644 --- a/app/templates/projects.hbs +++ b/app/templates/projects.hbs @@ -30,95 +30,4 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New project

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter project name' value=name}} -
    - - - -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit project

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter project name' value=name}} -
    - - - -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete project

    - -

    Are you sure you want to delete the project {{project.name}}?

    - - - - {{/modal-dialog}} -{{/if}} +{{partial "dialog/projects"}} diff --git a/app/templates/simulation/index.hbs b/app/templates/simulation/index.hbs index 3804575..a938a9b 100644 --- a/app/templates/simulation/index.hbs +++ b/app/templates/simulation/index.hbs @@ -32,95 +32,4 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New model

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter model name' value=name}} -
    - - - -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit model

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter model name' value=name}} -
    - - - -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete simulation-model

    - -

    Are you sure you want to delete the simulation-model {{simulationModel.name}}?

    - - - - {{/modal-dialog}} -{{/if}} +{{partial "dialog/simulation"}} diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs index fee2ede..70b16d1 100644 --- a/app/templates/simulations.hbs +++ b/app/templates/simulations.hbs @@ -31,89 +31,4 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New simulation

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulation name' value=name}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit simulator

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulation name' value=name}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete simulation

    - -

    Are you sure you want to delete the simulation {{simulation.name}}?

    - - - - {{/modal-dialog}} -{{/if}} - -{{#if isShowingRunningModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Simulation running

    - - {{simulation.name}}: - - - -
    - - - - {{/modal-dialog}} -{{/if}} +{{partial "dialog/simulations"}} diff --git a/app/templates/simulators.hbs b/app/templates/simulators.hbs index d610d92..d70e298 100644 --- a/app/templates/simulators.hbs +++ b/app/templates/simulators.hbs @@ -40,121 +40,4 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New simulator

    - -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulator name' value=name}} -
    - - - {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} -
    - - - {{input id='endpoint' placeholder='Enter endpoint' value=endpoint}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete simulator

    - -

    Are you sure you want to delete the simulator {{simulator.name}}?

    - - - - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New simulator

    - -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulator name' value=simulatorName}} -
    - - - {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} -
    - - - {{input id='endpoint' placeholder='Enter endpoint' value=simulatorEndpoint}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingRunningModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Simulator running

    - - {{simulator.name}}: - - - -
    - - - - {{/modal-dialog}} -{{/if}} +{{partial "dialog/simulators"}} diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index 80e78f3..46c89e7 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -16,10 +16,12 @@ {{#draggable-dropzone dropped='addPlot'}} - {{plot-container plots=model.plots editing=true data=data}} + {{plot-container plots=model.plots editing=true data=data showPlotDialog='showPlotDialog'}} {{/draggable-dropzone}}

    + +{{partial "dialog/plot/value"}} From 22780b9d7a44a7cb18532a07140bfad1c8986ad4 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Oct 2016 22:06:24 +0200 Subject: [PATCH 031/556] Move value plot modal to component Change simulator and signal from numbers to combo boxes --- app/components/plot-abstract.js | 4 +- app/components/plot-value.js | 121 +++++++++++++++++- .../dialog/plot/value.js} | 7 +- app/controllers/simulation-model/index.js | 34 ----- app/controllers/simulation/index.js | 59 +++++---- app/controllers/visualization/delete.js | 30 ----- app/controllers/visualization/edit.js | 21 ++- app/models/plot.js | 1 - app/router.js | 6 +- app/routes/dialog/plot/value.js | 4 + app/styles/app.scss | 1 + .../simulation-models.scss} | 20 +-- app/templates/components/plot-value.hbs | 53 ++++++++ app/templates/dialog/plot/value.hbs | 47 +------ app/templates/dialog/simulation.hbs | 16 +++ app/templates/simulation-model/index.hbs | 39 ++++-- app/templates/simulations.hbs | 2 +- app/templates/visualization/delete.hbs | 6 - app/templates/visualization/edit.hbs | 12 +- app/templates/visualization/new.hbs | 1 - .../plot/value-test.js} | 2 +- .../new-test.js => dialog/plot/value-test.js} | 2 +- .../unit/routes/visualization/delete-test.js | 11 -- 23 files changed, 298 insertions(+), 201 deletions(-) rename app/{routes/visualization/new.js => controllers/dialog/plot/value.js} (69%) delete mode 100644 app/controllers/visualization/delete.js create mode 100644 app/routes/dialog/plot/value.js rename app/{routes/visualization/delete.js => styles/simulation-models.scss} (55%) delete mode 100644 app/templates/visualization/delete.hbs delete mode 100644 app/templates/visualization/new.hbs rename tests/unit/controllers/{visualization/delete-test.js => dialog/plot/value-test.js} (75%) rename tests/unit/routes/{visualization/new-test.js => dialog/plot/value-test.js} (75%) delete mode 100644 tests/unit/routes/visualization/delete-test.js diff --git a/app/components/plot-abstract.js b/app/components/plot-abstract.js index eded6a2..5df157f 100644 --- a/app/components/plot-abstract.js +++ b/app/components/plot-abstract.js @@ -79,9 +79,9 @@ export default Ember.Component.extend(Resizable, Draggable, { } }.observes('editing', 'grid').on('init'), - doubleClick() { + /*doubleClick() { if (this.get('editing')) { this.sendAction('showPlotDialog', this.get('plot')); } - } + }*/ }); diff --git a/app/components/plot-value.js b/app/components/plot-value.js index 338d900..b526080 100644 --- a/app/components/plot-value.js +++ b/app/components/plot-value.js @@ -26,5 +26,124 @@ export default PlotAbstract.extend({ Ember.run.later(this, function() { this.notifyPropertyChange('data.' + this.get('plot.simulator') + '.values'); }, 1000); - }.property('data.2.values', 'plot.simulator', 'plot.signal') + }.property('data.2.values', 'plot.simulator', 'plot.signal'), + + doubleClick() { + if (this.get('editing') === true) { + // prepare modal + this.set('name', this.get('plot.name')); + + // get signal mapping for simulation model + let self = this; + let simulatorid = this.get('plot.simulator'); + + this.get('plot.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by simulatorid + simulationModels.forEach(function(simulationModel) { + simulationModel.get('simulator').then((simulator) => { + if (simulator.get('simulatorid') === simulatorid) { + // set simulation model + self.set('simulationModel', simulationModel); + self.set('simulationModelName', simulationModel.get('name')); + + // set signal + let mapping = simulationModel.get('mapping'); + self.set('signalName', mapping[self.get('plot.signal')]); + } + }); + }); + }); + }); + }); + }); + + // shot modal + this.set('isShowingModal', true); + } + }, + + actions: { + submitModal() { + // verify properties + let properties = this.getProperties('name'); + if (properties['name'] === null || properties['name'] === "") { + this.set('errorMessage', 'Plot name is missing'); + return; + } + + // set simulator by simulation model name + let simulationModelName = this.get('simulationModelName'); + let self = this; + + this.get('plot.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by name + simulationModels.forEach(function(simulationModel) { + if (simulationModel.get('name') === simulationModelName) { + simulationModel.get('simulator').then((simulator) => { + // set simulator + properties['simulator'] = simulator.get('simulatorid'); + + // set signal by name + let mapping = simulationModel.get('mapping'); + let signalName = self.get('signalName'); + + for (let i = 0; i < mapping.length; i++) { + if (mapping[i] === signalName) { + properties['signal'] = i; + } + } + + // save properties + self.get('plot').setProperties(properties); + + self.get('plot').save().then(function() { + self.set('isShowingModal', false); + }); + }); + } + }); + }); + }); + }); + }); + }, + + cancelModal() { + this.set('isShowingModal', false); + }, + + selectSimulationModel(simulationModelName) { + // save simulation model + this.set('simulationModelName', simulationModelName); + + // get signal mapping for simulation model + let self = this; + let simulatorid = this.get('plot.simulator'); + + this.get('plot.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by name + simulationModels.forEach(function(simulationModel) { + if (simulationModel.get('name') === simulationModelName) { + self.set('simulationModel', simulationModel); + } + }); + }); + }); + }); + }); + }, + + selectSignal(signalName) { + this.set('signalName', signalName); + } + } }); diff --git a/app/routes/visualization/new.js b/app/controllers/dialog/plot/value.js similarity index 69% rename from app/routes/visualization/new.js rename to app/controllers/dialog/plot/value.js index 12d85c7..427431e 100644 --- a/app/routes/visualization/new.js +++ b/app/controllers/dialog/plot/value.js @@ -1,14 +1,13 @@ /** - * File: new.js + * File: value.js * Author: Markus Grigull - * Date: 28.06.2016 + * Date: 12.07.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend(AuthenticatedRouteMixin, { +export default Ember.Controller.extend({ }); diff --git a/app/controllers/simulation-model/index.js b/app/controllers/simulation-model/index.js index 3481e21..e8ba731 100644 --- a/app/controllers/simulation-model/index.js +++ b/app/controllers/simulation-model/index.js @@ -10,38 +10,4 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - values: function() { - return this.get('simulationData.values'); - }.property('simulationData.values.@each'), - - _getData: function() { - if (this.get('model.simulation.running') === true) { - var simulator = this.get('model.simulator'); - if (simulator == null) { - return; - } - - var data = this.store.peekRecord('simulation-data', simulator); - this.set('simulationData', data); - - // load model again if simulation data is null - // this prevents from simulation data not being loaded when the controller - // is loaded before the websocket connects - if (data === null) { - Ember.run.later(this, function() { - // trigger _getData - this.notifyPropertyChange('model'); - }, 1000); - } - } else { - // clear simulation data - this.set('simulationData', null); - - // check again if simulation is running now - Ember.run.later(this, function() { - // trigger _getData - this.notifyPropertyChange('model'); - }, 1000); - } - }.observes('model').on('init') }); diff --git a/app/controllers/simulation/index.js b/app/controllers/simulation/index.js index d201f3a..8db5c58 100644 --- a/app/controllers/simulation/index.js +++ b/app/controllers/simulation/index.js @@ -21,7 +21,7 @@ export default Ember.Controller.extend({ _updateSimulators: function() { if (this.get('model.simulators') != null && this.get('model.simulators.length') > 0) { - var simulators = this.get('model.simulators'); + let simulators = this.get('model.simulators'); this.set('simulatorName', simulators.toArray()[0].get('name')); } }.observes('model'), @@ -31,6 +31,7 @@ export default Ember.Controller.extend({ // reset properties this.set('errorMessage', null); this.set('name', null); + this.set('length', 1); // show the dialog this.set('isShowingNewModal', true); @@ -41,10 +42,11 @@ export default Ember.Controller.extend({ this.set('errorMessage', null); this.set('simulationModel', simulationModel); this.set('name', simulationModel.get('name')); + this.set('length', simulationModel.get('length')); - var simulators = this.get('model.simulators'); - var simulatorId = simulationModel.get('simulator.id'); - var simulatorName = null; + let simulators = this.get('model.simulators'); + let simulatorId = simulationModel.get('simulator.id'); + let simulatorName = null; simulators.forEach(function(simulator) { if (simulator.get('id') === simulatorId) { @@ -68,19 +70,19 @@ export default Ember.Controller.extend({ submitNew() { // verify properties - var properties = this.getProperties('name'); + let properties = this.getProperties('name', 'length'); if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Simulation model name is missing'); return; } // set simuatlion properties - var simulation = this.get('model.simulation'); + let simulation = this.get('model.simulation'); properties['simulation'] = simulation; - // get the simulator id by simulator name - var simulators = this.get('model.simulators'); - var simulatorName = this.get('simulatorName'); + // get the simulator by simulator name + let simulators = this.get('model.simulators'); + let simulatorName = this.get('simulatorName'); simulators.forEach(function(simulator) { if (simulator.get('name') === simulatorName) { @@ -88,13 +90,22 @@ export default Ember.Controller.extend({ } }); + // create mapping + let mapping = []; + + for (let i = 0; i < properties['length']; i++) { + mapping.pushObject("Signal " + (i + 1)); + } + + properties['mapping'] = mapping; + // create new model - var simulationModel = this.store.createRecord('simulation-model', properties); + let simulationModel = this.store.createRecord('simulation-model', properties); // this change will not be saved, but it is nessecary otherwise ember will omit the simulation's id in the post request simulation.get('models').pushObject(simulationModel); - var controller = this; + let controller = this; simulationModel.save().then(function() { controller.set('isShowingNewModal', false); @@ -109,36 +120,28 @@ export default Ember.Controller.extend({ submitEdit() { // verify properties - var properties = this.getProperties('name'); + let properties = this.getProperties('name', 'length'); if (properties['name'] == null || properties['name'] === "") { this.set('errorMessage', 'Simulation model name is missing'); return; } // set simuatlion properties - var simulation = this.get('model.simulation'); - properties['simulation'] = simulation.get('id'); + let simulation = this.get('model.simulation'); + properties['simulation'] = simulation; - // get the simulator id by simulator name - var simulators = this.get('model.simulators'); - var simulatorId = null; - var simulatorName = this.get('simulatorName'); + // get the simulator by simulator name + let simulators = this.get('model.simulators'); + let simulatorName = this.get('simulatorName'); simulators.forEach(function(simulator) { if (simulator.get('name') === simulatorName) { - simulatorId = simulator.get('simulatorid'); + properties['simulator'] = simulator; } }); - if (simulatorId == null) { - Ember.debug('Unable to find simulator by name'); - return; - } - - properties['simulator'] = simulatorId; - // save properties - var controller = this; + let controller = this; this.get('simulationModel').setProperties(properties); @@ -155,7 +158,7 @@ export default Ember.Controller.extend({ confirmDelete() { // delete the model - var simulationModel = this.get('simulationModel'); + let simulationModel = this.get('simulationModel'); simulationModel.destroyRecord(); // hide the dialog diff --git a/app/controllers/visualization/delete.js b/app/controllers/visualization/delete.js deleted file mode 100644 index 99bb874..0000000 --- a/app/controllers/visualization/delete.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * File: delete.js - * Author: Markus Grigull - * Date: 28.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ - actions: { - cancelDelete() { - // go back to visualization edit view - let visualizationId = this.get('model.id'); - this.transitionToRoute('/visualization/' + visualizationId); - }, - - confirmDelete() { - // get the objects - var projectId = this.get('model.project.id'); - - var visualization = this.get('model'); - visualization.destroyRecord(); - - this.transitionToRoute('/project/' + projectId); - } - } -}); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index c864a5a..a7c1845 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -18,8 +18,16 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { plot: null, name: null, simulator: null, + simulatorName: null, signal: null, + _updateSimulators: function() { + if (this.get('model.simulators') !== null && this.get('model.simulators.length') > 0) { + let simulators = this.get('model.simulators'); + this.set('simulatorName', simulators.toArray()[0].get('name')); + } + }.observes('model'), + actions: { addPlot(name) { var plot = null; @@ -30,7 +38,7 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { } else if (name === 'table') { plot = this.store.createRecord('plot', { name: 'Table 1', type: 'plot-table', width: 500, height: 200, title: 'Table 1' }); } else if (name === 'value') { - plot = this.store.createRecord('plot', { name: 'Value 1', type: 'plot-value' }); + plot = this.store.createRecord('plot', { name: 'Value 1', type: 'plot-value', simulator: 2 }); } else { // DEBUG console.log('Add plot: ' + name); @@ -79,9 +87,10 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { if (plotType === 'plot-value') { // set properties this.set('plot', plot); - this.set('name', plot.get('name')); - this.set('simulator', plot.get('simulator')); - this.set('signal', plot.get('signal')); + /*this.set('name', plot.get('name')); + this.set('signal', plot.get('signal'));*/ + + //this.set('simulatorName', simulatorName); this.set('isShowingPlotValueModal', true); } @@ -112,6 +121,10 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { cancelValuePlot() { this.set('isShowingPlotValueModal', false); + }, + + selectSimulator(simulator) { + this.set('simulatorName', simulator); } } }); diff --git a/app/models/plot.js b/app/models/plot.js index ab6cf46..6349409 100644 --- a/app/models/plot.js +++ b/app/models/plot.js @@ -17,7 +17,6 @@ export default Model.extend({ simulator: attr('number', { defaultValue: 1 }), width: attr('number', { defaultValue: 100 }), height: attr('number', { defaultValue: 100 }), - title: attr('string'), type: attr('string'), x: attr('number', { defaultValue: 0 }), y: attr('number', { defaultValue: 0 }), diff --git a/app/router.js b/app/router.js index 5e95c68..924f60b 100644 --- a/app/router.js +++ b/app/router.js @@ -27,9 +27,7 @@ Router.map(function() { this.route('visualization', function() { this.route('index', { path: '/:visualizationid' }); - this.route('new'); this.route('edit', { path: '/edit/:visualizationid' }); - this.route('delete', { path: '/delete/:visualizationid' }); }); this.route('user', function() { @@ -53,7 +51,9 @@ Router.map(function() { this.route('simulator'); this.route('dialog', function() { - this.route('plot', function() {}); + this.route('plot', function() { + this.route('value'); + }); }); }); diff --git a/app/routes/dialog/plot/value.js b/app/routes/dialog/plot/value.js new file mode 100644 index 0000000..26d9f31 --- /dev/null +++ b/app/routes/dialog/plot/value.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/app/styles/app.scss b/app/styles/app.scss index 3c17c3b..f650627 100644 --- a/app/styles/app.scss +++ b/app/styles/app.scss @@ -12,6 +12,7 @@ @import 'simulations'; @import 'projects'; @import 'simulators'; +@import 'simulation-models'; @import "ember-modal-dialog/ember-modal-structure"; @import "ember-modal-dialog/ember-modal-appearance"; diff --git a/app/routes/visualization/delete.js b/app/styles/simulation-models.scss similarity index 55% rename from app/routes/visualization/delete.js rename to app/styles/simulation-models.scss index a6f5f3e..04aea01 100644 --- a/app/routes/visualization/delete.js +++ b/app/styles/simulation-models.scss @@ -1,17 +1,19 @@ /** - * File: delete.js + * File: simulation-models.css * Author: Markus Grigull - * Date: 28.06.2016 + * Date: 12.10.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import Ember from 'ember'; -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; +/** + * Route: simulation-model/index + */ +.simulation-model-index-mapping { + margin-top: 20px; +} -export default Ember.Route.extend(AuthenticatedRouteMixin, { - model(params) { - return this.store.findRecord('visualization', params.visualizationid); - } -}); +.simulation-model-index-buttons { + margin-top: 20px; +} diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/plot-value.hbs index b824785..0e68e9a 100644 --- a/app/templates/components/plot-value.hbs +++ b/app/templates/components/plot-value.hbs @@ -1 +1,54 @@ {{name}}: {{value}} + +{{#if isShowingModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Value

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter plot name' value=name}} +
    + + + +
    + + + +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/dialog/plot/value.hbs b/app/templates/dialog/plot/value.hbs index 971e9ec..8f11e5f 100644 --- a/app/templates/dialog/plot/value.hbs +++ b/app/templates/dialog/plot/value.hbs @@ -1,44 +1,5 @@ -{{#if isShowingPlotValueModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Value

    +

    Test

    -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter plot name' value=name}} -
    - - - {{input id='simulator' type='number' value=simulator min='1' max='255'}} -
    - - - {{input id='signal' type='number' value=signal min='1'}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} + + + diff --git a/app/templates/dialog/simulation.hbs b/app/templates/dialog/simulation.hbs index aaa09a0..9e2bfb6 100644 --- a/app/templates/dialog/simulation.hbs +++ b/app/templates/dialog/simulation.hbs @@ -24,6 +24,14 @@
    + + + {{input id='length' type='number' value=length min='1'}} +
    @@ -65,6 +73,14 @@
    + + + {{input id='length' type='number' value=length min='1'}} +
    diff --git a/app/templates/simulation-model/index.hbs b/app/templates/simulation-model/index.hbs index d993484..b1d2c6c 100644 --- a/app/templates/simulation-model/index.hbs +++ b/app/templates/simulation-model/index.hbs @@ -1,18 +1,29 @@ +{{#link-to 'simulation.index' model.simulation.id}}Back to {{model.simulation.name}}{{/link-to}} +

    {{model.name}}

    -

    - Running: {{model.simulation.running}} -

    +

    Mapping

    -

    - Simulator: {{model.simulator}} -

    +
    + + + + + + {{#each-in model.mapping as |signal name|}} + + + + + {{/each-in}} +
    SignalName
    + {{signal}} + + {{name}} +
    +
    -

    - Data: -

    - -{{#each values as |value|}} - {{value}} -
    -{{/each}} +
    + + +
    diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs index 70b16d1..698d9a7 100644 --- a/app/templates/simulations.hbs +++ b/app/templates/simulations.hbs @@ -5,7 +5,7 @@
    Name Running
    - - - - - {{#each-in model.mapping as |signal name|}} +
    +
    SignalName
    - - + + - {{/each-in}} -
    - {{signal}} - - {{name}} - SignalName
    - + {{#each-in model.mapping as |signal name|}} +
    + {{signal}} + + {{input value=(mut (get this (concat 'name' signal)))}} +
    + -
    - - -
    +
    + + +
    + From c41c7a568e70f12a5c5c6afc7e7b2bfa8d3dd34a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 2 Nov 2016 11:58:54 +0100 Subject: [PATCH 035/556] Adapt to websockets to work with villasnode --- app/mixins/live-data.js | 73 +++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js index 139b77d..0aedb5e 100644 --- a/app/mixins/live-data.js +++ b/app/mixins/live-data.js @@ -57,36 +57,38 @@ export default Ember.Mixin.create({ _addSocket(simulationModel) { // check if socket is already open - let id = simulationModel.get('id'); - if (this.get('_sockets')[id] !== undefined) { - //Ember.debug('skip ' + simulationModel.get('name')); - return; - } - - // get simulator endpoint simulationModel.get('simulator').then((simulator) => { - // get simulator endpoint - let endpoint = simulator.get('endpoint'); - if (endpoint) { - // add new socket - let socket = new WebSocket('ws://' + endpoint); - socket.binaryType = 'arraybuffer'; - - // register callbacks - let self = this; - - socket.onopen = function(event) { self._onSocketOpen.apply(self, [event]); }; - socket.onclose = function(event) { self._onSocketClose.apply(self, [event]); }; - socket.onmessage = function(event) { self._onSocketMessage.apply(self, [event]); }; - socket.onerror = function(event) { self._onSocketError.apply(self, [event]); }; - - // add socket to list of known sockets - this.get('_sockets')[id] = socket; - - //Ember.debug('Socket created for ' + simulationModel.get('name') + ': ws://' + endpoint); - } else { - Ember.debug('Undefined endpoint for ' + simulationModel.get('name')); + let id = simulator.get('simulatorid'); + if (this.get('_sockets')[id] !== undefined) { + //Ember.debug('skip ' + simulationModel.get('name')); + return; } + + // get simulator endpoint + simulationModel.get('simulator').then((simulator) => { + // get simulator endpoint + let endpoint = simulator.get('endpoint'); + if (endpoint) { + // add new socket + let socket = new WebSocket('ws://' + endpoint, 'live'); + socket.binaryType = 'arraybuffer'; + + // register callbacks + let self = this; + + socket.onopen = function(event) { self._onSocketOpen.apply(self, [event]); }; + socket.onclose = function(event) { self._onSocketClose.apply(self, [event]); }; + socket.onmessage = function(event) { self._onSocketMessage.apply(self, [event]); }; + socket.onerror = function(event) { self._onSocketError.apply(self, [event]); }; + + // add socket to list of known sockets + this.get('_sockets')[id] = socket; + + //Ember.debug('Socket created for ' + simulationModel.get('name') + ': ws://' + endpoint); + } else { + Ember.debug('Undefined endpoint for ' + simulationModel.get('name')); + } + }); }); }, @@ -121,6 +123,21 @@ export default Ember.Mixin.create({ // read the message into JSON var message = this._messageToJSON(event.data); + // set simulator by socket + if (message.simulator === 0) { + // search for socket in list + let sockets = this.get('_sockets'); + + for (let id in sockets) { + if (sockets[id] === event.target) { + // set id as simulator + message.simulator = id; + break; + } + } + } + + // create or update simulation data object var simulationData = this.store.peekRecord('simulation-data', message.simulator); if (simulationData != null) { simulationData.set('sequence', message.sequence); From 170f00c40a9be5845e9bfbdadadc623cf5a229b1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 2 Nov 2016 18:32:24 +0100 Subject: [PATCH 036/556] Rename plots to widgets Add widgetData to prepare for future widgets --- .../{plot-abstract.js => widget-abstract.js} | 22 ++--- .../{plot-chart.js => widget-chart.js} | 2 +- ...{plot-container.js => widget-container.js} | 26 +++--- .../{plot-table.js => widget-table.js} | 17 ++-- .../{plot-value.js => widget-value.js} | 42 +++++---- .../dialog/{plot => widget}/value.js | 0 app/controllers/visualization/edit.js | 84 ++++++------------ app/models/simulator-status.js | 5 ++ app/models/visualization.js | 2 +- app/models/{plot.js => widget.js} | 5 +- app/router.js | 6 -- app/serializers/visualization.js | 2 +- app/styles/app.scss | 2 +- app/styles/{plots.scss => widgets.scss} | 30 +++---- app/templates/components/plot-container.hbs | 3 - ...{plot-abstract.hbs => widget-abstract.hbs} | 0 .../{plot-chart.hbs => widget-chart.hbs} | 0 app/templates/components/widget-container.hbs | 3 + .../{plot-table.hbs => widget-table.hbs} | 6 +- .../{plot-value.hbs => widget-value.hbs} | 6 +- .../dialog/{plot => widget}/value.hbs | 0 app/templates/visualization/edit.hbs | 12 +-- app/templates/visualization/index.hbs | 2 +- tests/unit/models/simulator-status-test.js | 12 +++ todo.md | 88 ++++++++++++++++++- 25 files changed, 222 insertions(+), 155 deletions(-) rename app/components/{plot-abstract.js => widget-abstract.js} (76%) rename app/components/{plot-chart.js => widget-chart.js} (95%) rename app/components/{plot-container.js => widget-container.js} (64%) rename app/components/{plot-table.js => widget-table.js} (50%) rename app/components/{plot-value.js => widget-value.js} (75%) rename app/controllers/dialog/{plot => widget}/value.js (100%) create mode 100644 app/models/simulator-status.js rename app/models/{plot.js => widget.js} (88%) rename app/styles/{plots.scss => widgets.scss} (72%) delete mode 100644 app/templates/components/plot-container.hbs rename app/templates/components/{plot-abstract.hbs => widget-abstract.hbs} (100%) rename app/templates/components/{plot-chart.hbs => widget-chart.hbs} (100%) create mode 100644 app/templates/components/widget-container.hbs rename app/templates/components/{plot-table.hbs => widget-table.hbs} (57%) rename app/templates/components/{plot-value.hbs => widget-value.hbs} (85%) rename app/templates/dialog/{plot => widget}/value.hbs (100%) create mode 100644 tests/unit/models/simulator-status-test.js diff --git a/app/components/plot-abstract.js b/app/components/widget-abstract.js similarity index 76% rename from app/components/plot-abstract.js rename to app/components/widget-abstract.js index 2ec8964..2b674cc 100644 --- a/app/components/plot-abstract.js +++ b/app/components/widget-abstract.js @@ -1,5 +1,5 @@ /** - * File: plot-abstract.js + * File: widget-abstract.js * Author: Markus Grigull * Date: 15.07.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC @@ -13,10 +13,10 @@ import Draggable from '../mixins/draggable'; export default Ember.Component.extend(Resizable, Draggable, { tagName: 'div', - classNames: [ 'plotAbstract' ], + classNames: [ 'widgetAbstract' ], attributeBindings: [ 'style' ], - plot: null, + widget: null, editing: false, grid: false, data: null, @@ -30,20 +30,20 @@ export default Ember.Component.extend(Resizable, Draggable, { grid_drag: [ 10, 10 ], scroll_drag: true, - style: Ember.computed('plot', function() { - return Ember.String.htmlSafe('width: ' + this.get('plot.width') + 'px; height: ' + this.get('plot.height') + 'px; left: ' + this.get('plot.x') + 'px; top: ' + this.get('plot.y') + 'px;'); + style: Ember.computed('widget', function() { + return Ember.String.htmlSafe('width: ' + this.get('widget.width') + 'px; height: ' + this.get('widget.height') + 'px; left: ' + this.get('widget.x') + 'px; top: ' + this.get('widget.y') + 'px;'); }), - name: Ember.computed('plot', function() { - return this.get('plot.name'); + name: Ember.computed('widget', function() { + return this.get('widget.name'); }), stop_resize(event, ui) { var width = ui.size.width; var height = ui.size.height; - this.set('plot.width', width); - this.set('plot.height', height); + this.set('widget.width', width); + this.set('widget.height', height); }, resize_resize(/* event, ui */) { @@ -51,8 +51,8 @@ export default Ember.Component.extend(Resizable, Draggable, { }, stop_drag(event, ui) { - this.set('plot.x', ui.position.left); - this.set('plot.y', ui.position.top); + this.set('widget.x', ui.position.left); + this.set('widget.y', ui.position.top); }, drag_drag(/* event, ui */) { diff --git a/app/components/plot-chart.js b/app/components/widget-chart.js similarity index 95% rename from app/components/plot-chart.js rename to app/components/widget-chart.js index 354418b..0e61a7e 100644 --- a/app/components/plot-chart.js +++ b/app/components/widget-chart.js @@ -1,5 +1,5 @@ /** - * File: plot-chart.js + * File: widget-chart.js * Author: Markus Grigull * Date: 28.06.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC diff --git a/app/components/plot-container.js b/app/components/widget-container.js similarity index 64% rename from app/components/plot-container.js rename to app/components/widget-container.js index d2fdc0c..fd1e992 100644 --- a/app/components/plot-container.js +++ b/app/components/widget-container.js @@ -1,5 +1,5 @@ /** - * File: plot-container.js + * File: widget-container.js * Author: Markus Grigull * Date: 05.07.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC @@ -11,15 +11,15 @@ import Ember from 'ember'; export default Ember.Component.extend({ tagName: 'div', - classNames: [ 'plots' ], + classNames: [ 'widgets' ], attributeBindings: [ 'style' ], - plots: null, + widgets: null, editing: false, grid: true, data: null, - style: Ember.computed('plots.@each.height', 'plots.@each.y', function() { + style: Ember.computed('widgets.@each.height', 'widgets.@each.y', function() { var height = this._calculateHeight(); if (this.get('editing') === true && height < 400) { height = 400; @@ -28,18 +28,14 @@ export default Ember.Component.extend({ return Ember.String.htmlSafe('height: ' + height + 'px;'); }), - _value: Ember.computed('data.2.values.@each', function() { - console.log(this.get('data')); - }), - _calculateHeight() { var maxHeight = 0; - var plots = this.get('plots'); + var widgets = this.get('widgets'); - plots.forEach(function(plot) { - var plotHeight = plot.get('y') + plot.get('height'); - if (plotHeight > maxHeight) { - maxHeight = plotHeight; + widgets.forEach(function(widget) { + var widgetHeight = widget.get('y') + widget.get('height'); + if (widgetHeight > maxHeight) { + maxHeight = widgetHeight; } }); @@ -50,8 +46,8 @@ export default Ember.Component.extend({ }, actions: { - showPlotDialog(plot) { - this.sendAction('showPlotDialog', plot); + showWidgetDialog(widget) { + this.sendAction('showWidgetDialog', widget); } } }); diff --git a/app/components/plot-table.js b/app/components/widget-table.js similarity index 50% rename from app/components/plot-table.js rename to app/components/widget-table.js index 07758c4..da6223b 100644 --- a/app/components/plot-table.js +++ b/app/components/widget-table.js @@ -1,5 +1,5 @@ /** - * File: plot-table.js + * File: widget-table.js * Author: Markus Grigull * Date: 05.07.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC @@ -7,11 +7,18 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import PlotAbstract from './plot-abstract'; +import WidgetAbstract from './widget-abstract'; -export default PlotAbstract.extend({ - classNames: [ 'plotTable' ], +export default WidgetAbstract.extend({ + classNames: [ 'widgetTable' ], minWidth_resize: 200, - minHeight_resize: 60 + minHeight_resize: 60, + + _updateDataObserver: Ember.on('init', Ember.observer('widget.simulator', 'widget.signal', function() { + let query = 'data.' + this.get('widget.simulator') + '.sequence'; + this.addObserver(query, function() { + // get values from array + }); + })) }); diff --git a/app/components/plot-value.js b/app/components/widget-value.js similarity index 75% rename from app/components/plot-value.js rename to app/components/widget-value.js index 6cdfab3..367b467 100644 --- a/app/components/plot-value.js +++ b/app/components/widget-value.js @@ -1,5 +1,5 @@ /** - * File: plot-value.js + * File: widget-value.js * Author: Markus Grigull * Date: 04.07.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC @@ -7,22 +7,22 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import PlotAbstract from './plot-abstract'; +import WidgetAbstract from './widget-abstract'; import Ember from 'ember'; -export default PlotAbstract.extend({ - classNames: [ 'plotValue' ], +export default WidgetAbstract.extend({ + classNames: [ 'widgetValue' ], minWidth_resize: 50, minHeight_resize: 20, - _updateDataObserver: Ember.on('init', Ember.observer('plot.simulator', 'plot.signal', function() { - let query = 'data.' + this.get('plot.simulator') + '.sequence'; + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', 'widget.widgetData.signal', function() { + let query = 'data.' + this.get('widget.widgetData.simulator') + '.sequence'; this.addObserver(query, function() { // get value from array - let values = this.get('data.' + this.get('plot.simulator') + '.values'); + let values = this.get('data.' + this.get('widget.widgetData.simulator') + '.values'); if (values) { - this.set('value', values[this.get('plot.signal')]); + this.set('value', values[this.get('widget.widgetData.signal')]); } else { this.set('value', null); } @@ -32,13 +32,13 @@ export default PlotAbstract.extend({ doubleClick() { if (this.get('editing') === true) { // prepare modal - this.set('name', this.get('plot.name')); + this.set('name', this.get('widget.name')); // get signal mapping for simulation model let self = this; - let simulatorid = this.get('plot.simulator'); + let simulatorid = this.get('widget.widgetData.simulator'); - this.get('plot.visualization').then((visualization) => { + this.get('widget.visualization').then((visualization) => { visualization.get('project').then((project) => { project.get('simulation').then((simulation) => { simulation.get('models').then((simulationModels) => { @@ -52,7 +52,7 @@ export default PlotAbstract.extend({ // set signal let mapping = simulationModel.get('mapping'); - self.set('signalName', mapping[self.get('plot.signal')]); + self.set('signalName', mapping[self.get('widget.widgetData.signal')]); } }); }); @@ -70,8 +70,9 @@ export default PlotAbstract.extend({ submitModal() { // verify properties let properties = this.getProperties('name'); + if (properties['name'] === null || properties['name'] === "") { - this.set('errorMessage', 'Plot name is missing'); + this.set('errorMessage', 'Widget name is missing'); return; } @@ -79,7 +80,7 @@ export default PlotAbstract.extend({ let simulationModelName = this.get('simulationModelName'); let self = this; - this.get('plot.visualization').then((visualization) => { + this.get('widget.visualization').then((visualization) => { visualization.get('project').then((project) => { project.get('simulation').then((simulation) => { simulation.get('models').then((simulationModels) => { @@ -88,7 +89,8 @@ export default PlotAbstract.extend({ if (simulationModel.get('name') === simulationModelName) { simulationModel.get('simulator').then((simulator) => { // set simulator - properties['simulator'] = simulator.get('simulatorid'); + let widgetData = {}; + widgetData.simulator = simulator.get('simulatorid'); // set signal by name let mapping = simulationModel.get('mapping'); @@ -96,14 +98,16 @@ export default PlotAbstract.extend({ for (let i = 0; i < mapping.length; i++) { if (mapping[i] === signalName) { - properties['signal'] = i; + widgetData.signal = i; } } // save properties - self.get('plot').setProperties(properties); + properties['widgetData'] = widgetData; - self.get('plot').save().then(function() { + self.get('widget').setProperties(properties); + + self.get('widget').save().then(function() { self.set('isShowingModal', false); }); }); @@ -126,7 +130,7 @@ export default PlotAbstract.extend({ // get signal mapping for simulation model let self = this; - this.get('plot.visualization').then((visualization) => { + this.get('widget.visualization').then((visualization) => { visualization.get('project').then((project) => { project.get('simulation').then((simulation) => { simulation.get('models').then((simulationModels) => { diff --git a/app/controllers/dialog/plot/value.js b/app/controllers/dialog/widget/value.js similarity index 100% rename from app/controllers/dialog/plot/value.js rename to app/controllers/dialog/widget/value.js diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 3e068b9..621d816 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -11,11 +11,11 @@ import Ember from 'ember'; import FetchLiveDataMixin from '../../mixins/fetch-live-data'; export default Ember.Controller.extend(FetchLiveDataMixin, { - isShowingPlotValueModal: false, + isShowingWidgetValueModal: false, errorMessage: null, - plot: null, + widget: null, name: null, simulator: null, simulatorName: null, @@ -27,46 +27,45 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { this.set('simulatorName', simulators.toArray()[0].get('name')); } }), - + actions: { - addPlot(name) { - var plot = null; + addWidget(name) { + var widget = null; if (name === 'chart') { - // create new chart plot - plot = this.store.createRecord('plot', { name: 'Chart 1', type: 'plot-chart' }); + widget = this.store.createRecord('widget', { name: 'Chart 1', type: 'widget-chart' }); } else if (name === 'table') { - plot = this.store.createRecord('plot', { name: 'Table 1', type: 'plot-table', width: 500, height: 200, title: 'Table 1' }); + widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200 }); } else if (name === 'value') { - plot = this.store.createRecord('plot', { name: 'Value 1', type: 'plot-value', simulator: 2 }); + widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, widgetData: { signal: 0, simulator: 2 } }); } else { // DEBUG - console.log('Add plot: ' + name); + console.log('Add widget ' + name); return; } - if (plot != null) { - // add plot to visualization - this.get('model.plots').pushObject(plot); + if (widget != null) { + // add widget to visualization + this.get('model.widgets').pushObject(widget); - // save new plot + // save new widget var visualization = this.get('model'); - plot.save().then(function() { - // save the plot in the visualization - visualization.get('plots').pushObject(plot); + widget.save().then(function() { + // save the widget in the visualization + visualization.get('widgets').pushObject(widget); visualization.save(); }); } else { - console.error('Unknown plot type: ' + name); + console.error('Unknown widget type: ' + name); } }, saveEdit() { // save changes to store - var plots = this.get('model.plots'); - plots.forEach(function(plot) { - plot.save(); + var widgets = this.get('model.widgets'); + widgets.forEach(function(widget) { + widget.save(); }); // go back to index @@ -81,50 +80,19 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { this.transitionToRoute('/visualization/' + id); }, - showPlotDialog(plot) { - // show dialog by plot type - let plotType = plot.get('type'); - if (plotType === 'plot-value') { + showWidgetDialog(widget) { + // show dialog by widget type + let widgetType = widget.get('type'); + if (widgetType === 'value') { // set properties - this.set('plot', plot); + this.set('widget', widget); /*this.set('name', plot.get('name')); this.set('signal', plot.get('signal'));*/ //this.set('simulatorName', simulatorName); - this.set('isShowingPlotValueModal', true); + this.set('isShowingWidgetValueModal', true); } - }, - - submitValuePlot() { - // verify properties - let properties = this.getProperties('name', 'simulator', 'signal'); - if (properties['name'] === null || properties['name'] === "") { - this.set('errorMessage', 'Plot name is missing'); - return; - } - - properties['simulator'] = Number(properties['simulator']); - properties['signal'] = Number(properties['signal']); - - // save properties - this.get('plot').setProperties(properties); - - let self = this; - - this.get('plot').save().then(function() { - self.set('isShowingPlotValueModal', false); - }, function() { - Ember.debug('Error saving value plot'); - }); - }, - - cancelValuePlot() { - this.set('isShowingPlotValueModal', false); - }, - - selectSimulator(simulator) { - this.set('simulatorName', simulator); } } }); diff --git a/app/models/simulator-status.js b/app/models/simulator-status.js new file mode 100644 index 0000000..ca6bd1b --- /dev/null +++ b/app/models/simulator-status.js @@ -0,0 +1,5 @@ +import DS from 'ember-data'; + +export default DS.Model.extend({ + +}); diff --git a/app/models/visualization.js b/app/models/visualization.js index 659ecb0..cb5253a 100644 --- a/app/models/visualization.js +++ b/app/models/visualization.js @@ -13,7 +13,7 @@ import { belongsTo, hasMany } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - plots: hasMany('plot', { async: true }), + widgets: hasMany('widget', { async: true }), project: belongsTo('project', { async: true }), rows: attr('number', { defaultValue: 1 }) }); diff --git a/app/models/plot.js b/app/models/widget.js similarity index 88% rename from app/models/plot.js rename to app/models/widget.js index 6349409..32846f6 100644 --- a/app/models/plot.js +++ b/app/models/widget.js @@ -1,5 +1,5 @@ /** - * File: plot.js + * File: widget.js * Author: Markus Grigull * Date: 28.06.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC @@ -13,8 +13,7 @@ import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), - signal: attr('number', { defaultValue: 1 }), - simulator: attr('number', { defaultValue: 1 }), + widgetData: attr(), width: attr('number', { defaultValue: 100 }), height: attr('number', { defaultValue: 100 }), type: attr('string'), diff --git a/app/router.js b/app/router.js index 924f60b..47f4580 100644 --- a/app/router.js +++ b/app/router.js @@ -49,12 +49,6 @@ Router.map(function() { this.route('simulators'); this.route('simulator'); - - this.route('dialog', function() { - this.route('plot', function() { - this.route('value'); - }); - }); }); export default Router; diff --git a/app/serializers/visualization.js b/app/serializers/visualization.js index d5e10b5..950c341 100644 --- a/app/serializers/visualization.js +++ b/app/serializers/visualization.js @@ -12,6 +12,6 @@ import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ attrs: { project: { serialize: 'ids' }, - plots: { serialize: 'ids' } + widgets: { serialize: 'ids' } } }); diff --git a/app/styles/app.scss b/app/styles/app.scss index f650627..e1309ef 100644 --- a/app/styles/app.scss +++ b/app/styles/app.scss @@ -7,7 +7,7 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -@import 'plots'; +@import 'widgets'; @import 'models'; @import 'simulations'; @import 'projects'; diff --git a/app/styles/plots.scss b/app/styles/widgets.scss similarity index 72% rename from app/styles/plots.scss rename to app/styles/widgets.scss index a3807eb..77f96f7 100644 --- a/app/styles/plots.scss +++ b/app/styles/widgets.scss @@ -1,5 +1,5 @@ /** - * File: plots.css + * File: widgets.css * Author: Markus Grigull * Date: 19.07.2016 * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC @@ -8,25 +8,25 @@ **********************************************************************************/ /** - * Component: plot-container + * Component: widget-container */ -.plots { +.widgets { overflow: scroll; position: relative; } /** - * Component: plot-toolbox + * Component: widget-toolbox */ -.plot-toolbox { +.widget-toolbox { margin: 20px 0; } /** - * Component: plot-abstract + * Component: widget-abstract */ -.plotAbstract { +.widgetAbstract { border: 1px solid lightgray; margin: 10px; @@ -36,13 +36,13 @@ } /** - * Component: plot-value + * Component: widget-value */ -.plotValue { +.widgetValue { } -.plot-edit-container { +.widget-edit-container { width: 200px !important; background-color: #ddd; @@ -50,18 +50,18 @@ border: 1px dotted black; } -.plot-edit-form { +.widget-edit-form { } /** - * Component: plot-table + * Component: widget-table */ -.plotTable { +.widgetTable { } -.plotTable table { +.widgetTable table { width: 100%; /*height: 100%;*/ @@ -69,7 +69,7 @@ border-collapse: collapse; } -.plotTable td, th { +.widgetTable td, th { border: 1px solid gray; padding: 2px 5px; diff --git a/app/templates/components/plot-container.hbs b/app/templates/components/plot-container.hbs deleted file mode 100644 index 008dfad..0000000 --- a/app/templates/components/plot-container.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#each plots as |plot|}} - {{component plot.type plot=plot editing=editing grid=grid data=data showPlotDialog=showPlotDialog}} -{{/each}} diff --git a/app/templates/components/plot-abstract.hbs b/app/templates/components/widget-abstract.hbs similarity index 100% rename from app/templates/components/plot-abstract.hbs rename to app/templates/components/widget-abstract.hbs diff --git a/app/templates/components/plot-chart.hbs b/app/templates/components/widget-chart.hbs similarity index 100% rename from app/templates/components/plot-chart.hbs rename to app/templates/components/widget-chart.hbs diff --git a/app/templates/components/widget-container.hbs b/app/templates/components/widget-container.hbs new file mode 100644 index 0000000..818abe5 --- /dev/null +++ b/app/templates/components/widget-container.hbs @@ -0,0 +1,3 @@ +{{#each widgets as |widget|}} + {{component widget.type widget=widget editing=editing grid=grid data=data showWidgetDialog=showWidgetDialog}} +{{/each}} diff --git a/app/templates/components/plot-table.hbs b/app/templates/components/widget-table.hbs similarity index 57% rename from app/templates/components/plot-table.hbs rename to app/templates/components/widget-table.hbs index 6b2091a..bc832ba 100644 --- a/app/templates/components/plot-table.hbs +++ b/app/templates/components/widget-table.hbs @@ -1,10 +1,10 @@ {{#if editing}} - {{input value=plot.title placeholder='Enter title'}} + {{input value=widget.title placeholder='Enter title'}} {{else}} -

    {{plot.title}}

    +

    {{widget.title}}

    {{/if}} - +
    diff --git a/app/templates/components/plot-value.hbs b/app/templates/components/widget-value.hbs similarity index 85% rename from app/templates/components/plot-value.hbs rename to app/templates/components/widget-value.hbs index 0e68e9a..c38f79a 100644 --- a/app/templates/components/plot-value.hbs +++ b/app/templates/components/widget-value.hbs @@ -4,14 +4,14 @@ {{#modal-dialog attachment="middle center" translucentOverlay=true}}

    Value

    - +
    Name Value
    @@ -20,7 +20,7 @@
    - {{input id='name' placeholder='Enter plot name' value=name}} + {{input id='name' placeholder='Enter widget name' value=name}}
    diff --git a/app/templates/dialog/plot/value.hbs b/app/templates/dialog/widget/value.hbs similarity index 100% rename from app/templates/dialog/plot/value.hbs rename to app/templates/dialog/widget/value.hbs diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index a6872ac..e2d26f2 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -1,22 +1,22 @@ -

    {{model.ame}}

    +

    {{model.name}}

    -
    +

    Toolbox

    - + {{/draggable-item}} {{#draggable-item content='value'}} Value {{/draggable-item}}
    -{{#draggable-dropzone dropped='addPlot'}} - {{plot-container plots=model.plots editing=true data=data showPlotDialog='showPlotDialog'}} +{{#draggable-dropzone dropped='addWidget'}} + {{widget-container widgets=model.widgets editing=true data=data showWidgetDialog='showWidgetDialog'}} {{/draggable-dropzone}}

    diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs index 64334da..c728663 100644 --- a/app/templates/visualization/index.hbs +++ b/app/templates/visualization/index.hbs @@ -2,7 +2,7 @@

    {{model.name}}

    -{{plot-container plots=model.plots data=data}} +{{widget-container widgets=model.widgets data=data}}

    {{#link-to "visualization.edit" model.id}}Edit layout{{/link-to}} diff --git a/tests/unit/models/simulator-status-test.js b/tests/unit/models/simulator-status-test.js new file mode 100644 index 0000000..48c8a99 --- /dev/null +++ b/tests/unit/models/simulator-status-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('simulator-status', 'Unit | Model | simulator status', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); diff --git a/todo.md b/todo.md index f730b0e..f0e8443 100644 --- a/todo.md +++ b/todo.md @@ -1,12 +1,94 @@ # To-Do - Change password - - Don't log out on unauthorized access (admin level lower than required) - Move plot attributes/styling from plot-container into actual plots - Move drag-n-drop to mixins - Go into edit mode if visualization is empty - Auto-detect if simulators are running - Remove running socket if it's not in the updated list - - Real relationship between simulation-model and simulator + - Rebrand plots into widgets + - Change widget model (plot) to custom data to provide mechanism for all widgets + - Add widgets where dropped websocketserverip/config.json -websocketserverip/nodes.json +{ + "affinity": 1, + "debug": 5, + "stats": 3, + "name": "villas-acs", + "http": { + "htdocs": "/villas/web/socket", + "port": 80 + }, + "plugins": [ + "simple_circuit.so", + "example_hook.so" + ], + "nodes": { + "ws": { + "type": "websocket", + "unit": "MVa", + "units": [ + "V", + "A", + "Var" + ], + "description": "Demo Channel", + "source": { + "simulator": "OP5600", + "location": "ACS lab" + }, + "series": [ + { + "label": "Random walk" + }, + { + "label": "Sine" + }, + { + "label": "Rect" + } + ] + } + }, + "paths": [ + { + "in": "ws", + "out": "ws" + } + ] +} + + +websocketserverip/nodes.json: +[ + { + "name": "ws", + "connections": 1, + "state": 3, + "vectorize": 1, + "affinity": 1, + "type": "websocket", + "unit": "MVa", + "units": [ + "V", + "A", + "Var" + ], + "description": "Demo Channel", + "source": { + "simulator": "OP5600", + "location": "ACS lab" + }, + "series": [ + { + "label": "Random walk" + }, + { + "label": "Sine" + }, + { + "label": "Rect" + } + ] + } +] From 7099651272aadbe4ff0de08929220864393bb994 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 3 Nov 2016 09:42:16 +0100 Subject: [PATCH 037/556] Add widget-table and widget-label Remove console output in UI mixins --- app/components/widget-abstract.js | 14 +- app/components/widget-label.js | 52 +++++++ app/components/widget-table.js | 139 +++++++++++++++++- app/components/widget-value.js | 2 +- app/controllers/visualization/edit.js | 15 +- app/mixins/resizable.js | 2 +- app/mixins/sortable.js | 2 +- app/styles/widgets.scss | 8 +- app/templates/components/widget-label.hbs | 26 ++++ app/templates/components/widget-table.hbs | 57 +++++-- app/templates/visualization/edit.hbs | 8 +- .../components/widget-label-test.js | 24 +++ 12 files changed, 312 insertions(+), 37 deletions(-) create mode 100644 app/components/widget-label.js create mode 100644 app/templates/components/widget-label.hbs create mode 100644 tests/integration/components/widget-label-test.js diff --git a/app/components/widget-abstract.js b/app/components/widget-abstract.js index 2b674cc..61af405 100644 --- a/app/components/widget-abstract.js +++ b/app/components/widget-abstract.js @@ -14,15 +14,17 @@ import Draggable from '../mixins/draggable'; export default Ember.Component.extend(Resizable, Draggable, { tagName: 'div', classNames: [ 'widgetAbstract' ], + classNameBindings: [ 'widgetEditing' ], attributeBindings: [ 'style' ], widget: null, + widgetEditing: true, editing: false, grid: false, data: null, disabled_resize: false, - autoHide_resize: false, + autoHide_resize: true, grid_resize: [ 10, 10 ], disabled_drag: false, @@ -59,15 +61,19 @@ export default Ember.Component.extend(Resizable, Draggable, { }, - _updateUI: Ember.on('init', Ember.observer('editing', 'grid', function() { + _updateUI: Ember.on('init', Ember.observer('editing', 'grid', 'isShowingModal', function() { if (this.get('editing') === true) { this.set('disabled_resize', false); - this.set('autoHide_resize', false); + //this.set('autoHide_resize', false); this.set('disabled_drag', false); + + this.set('widgetEditing', true); } else { this.set('disabled_resize', true); - this.set('autoHide_resize', true); + //this.set('autoHide_resize', true); this.set('disabled_drag', true); + + this.set('widgetEditing', false); } if (this.get('grid') === true) { diff --git a/app/components/widget-label.js b/app/components/widget-label.js new file mode 100644 index 0000000..c94115c --- /dev/null +++ b/app/components/widget-label.js @@ -0,0 +1,52 @@ +/** + * File: widget-label.js + * Author: Markus Grigull + * Date: 03.11.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import WidgetAbstract from './widget-abstract'; + +export default WidgetAbstract.extend({ + classNames: [ 'widgetLabel' ], + + minWidth_resize: 50, + minHeight_resize: 20, + + doubleClick() { + if (this.get('editing') === true) { + // prepare modal + this.set('name', this.get('widget.name')); + + // show modal + this.set('isShowingModal', true); + } + }, + + actions: { + submitModal() { + // verify properties + let properties = this.getProperties('name'); + + if (properties['name'] === null || properties['name'] === "") { + this.set('errorMessage', 'Widget name is missing'); + return; + } + + // save properties + this.get('widget').setProperties(properties); + + let self = this; + + this.get('widget').save().then(function() { + self.set('isShowingModal', false); + }); + }, + + cancelModal() { + this.set('isShowingModal', false); + } + } +}); diff --git a/app/components/widget-table.js b/app/components/widget-table.js index da6223b..7640406 100644 --- a/app/components/widget-table.js +++ b/app/components/widget-table.js @@ -15,10 +15,143 @@ export default WidgetAbstract.extend({ minWidth_resize: 200, minHeight_resize: 60, - _updateDataObserver: Ember.on('init', Ember.observer('widget.simulator', 'widget.signal', function() { - let query = 'data.' + this.get('widget.simulator') + '.sequence'; + signals: [], + + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', function() { + // get query for observer + let simulatorId = this.get('widget.widgetData.simulator'); + let query = 'data.' + simulatorId + '.sequence'; + this.addObserver(query, function() { + // get signal names to fill data in + let signals = this.get('signals'); + if (!signals) { + // wait till names are loaded + return; + } + // get values from array + let values = this.get('data.' + simulatorId + '.values'); + for (let i = 0; i < values.length; i++) { + if (!signals[i]) { + break; + } + + Ember.set(signals[i], 'value', values[i]); + } }); - })) + + // get signal names + let self = this; + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // get simulation model by simulatorId + simulationModels.forEach((simulationModel) => { + simulationModel.get('simulator').then((simulator) => { + if (simulator.get('simulatorid') === simulatorId) { + // set signal names + let signals = []; + + simulationModel.get('mapping').forEach((signalName) => { + signals.push({ name: signalName, value: null }); + }); + + self.set('signals', signals); + } + }); + }); + }); + }); + }); + }); + })), + + doubleClick() { + if (this.get('editing') === true) { + // prepare modal + this.set('name', this.get('widget.name')); + + // get simlator name from id + let self = this; + let simulatorid = this.get('widget.widgetData.simulator'); + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by simulatorid + simulationModels.forEach((simulationModel) => { + simulationModel.get('simulator').then((simulator) => { + if (simulator.get('simulatorid') === simulatorid) { + // set simulation model + self.set('simulationModel', simulationModel); + self.set('simulationModelName', simulationModel.get('name')); + } + }); + }); + }); + }); + }); + }); + + // show modal + this.set('isShowingModal', true); + } + }, + + actions: { + submitModal() { + // verify properties + let properties = this.getProperties('name'); + + if (properties['name'] === null || properties['name'] === "") { + this.set('errorMessage', 'Widget name is missing'); + return; + } + + // set simulator by simulation model name + let simulationModelName = this.get('simulationModelName'); + let self = this; + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by name + simulationModels.forEach(function(simulationModel) { + if (simulationModel.get('name') === simulationModelName) { + simulationModel.get('simulator').then((simulator) => { + // set simulator + let widgetData = {}; + widgetData.simulator = simulator.get('simulatorid'); + + // save properties + properties['widgetData'] = widgetData; + + self.get('widget').setProperties(properties); + + self.get('widget').save().then(function() { + self.set('isShowingModal', false); + }); + }); + } + }); + }); + }); + }); + }); + }, + + cancelModal() { + this.set('isShowingModal', false); + }, + + selectSimulationModel(simulationModelName) { + // save simulation model + this.set('simulationModelName', simulationModelName); + } + } }); diff --git a/app/components/widget-value.js b/app/components/widget-value.js index 367b467..1381705 100644 --- a/app/components/widget-value.js +++ b/app/components/widget-value.js @@ -61,7 +61,7 @@ export default WidgetAbstract.extend({ }); }); - // shot modal + // show modal this.set('isShowingModal', true); } }, diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 621d816..ee269df 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -21,21 +21,14 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { simulatorName: null, signal: null, - _updateSimulators: Ember.observer('model', function() { - if (this.get('model.simulators') !== null && this.get('model.simulators.length') > 0) { - let simulators = this.get('model.simulators'); - this.set('simulatorName', simulators.toArray()[0].get('name')); - } - }), - actions: { addWidget(name) { - var widget = null; + let widget = null; - if (name === 'chart') { - widget = this.store.createRecord('widget', { name: 'Chart 1', type: 'widget-chart' }); + if (name === 'label') { + widget = this.store.createRecord('widget', { name: 'Label', type: 'widget-label', width: 100, height: 20 }); } else if (name === 'table') { - widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200 }); + widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200, widgetData: { simulator: 2 } }); } else if (name === 'value') { widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, widgetData: { signal: 0, simulator: 2 } }); } else { diff --git a/app/mixins/resizable.js b/app/mixins/resizable.js index 2c67704..28a1073 100644 --- a/app/mixins/resizable.js +++ b/app/mixins/resizable.js @@ -57,7 +57,7 @@ export default Ember.Mixin.create({ // create an observer for this option var observer = function() { var value = this.get(key); - console.log(key + ': ' + value); + //console.log(key + ': ' + value); this.get('ui').option(key.split('_')[0], value); }; diff --git a/app/mixins/sortable.js b/app/mixins/sortable.js index f7633a1..737367f 100644 --- a/app/mixins/sortable.js +++ b/app/mixins/sortable.js @@ -60,7 +60,7 @@ export default Ember.Mixin.create({ // create an observer for this option var observer = function() { var value = this.get(key); - console.log(key + ': ' + value); + //console.log(key + ': ' + value); this.get('ui').option(key.split('_')[0], value); }; diff --git a/app/styles/widgets.scss b/app/styles/widgets.scss index 77f96f7..39e0eb8 100644 --- a/app/styles/widgets.scss +++ b/app/styles/widgets.scss @@ -27,12 +27,14 @@ * Component: widget-abstract */ .widgetAbstract { + position: absolute; +} + +.widget-editing { border: 1px solid lightgray; - margin: 10px; padding: 5px 10px; - - position: absolute; + margin: 10px; } /** diff --git a/app/templates/components/widget-label.hbs b/app/templates/components/widget-label.hbs new file mode 100644 index 0000000..fa0b636 --- /dev/null +++ b/app/templates/components/widget-label.hbs @@ -0,0 +1,26 @@ +

    {{widget.name}}

    + +{{#if isShowingModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Label

    + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter widget name' value=name}} +
    + + +
    + + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/components/widget-table.hbs b/app/templates/components/widget-table.hbs index bc832ba..082c40a 100644 --- a/app/templates/components/widget-table.hbs +++ b/app/templates/components/widget-table.hbs @@ -1,16 +1,55 @@ -{{#if editing}} - {{input value=widget.title placeholder='Enter title'}} -{{else}} -

    {{widget.title}}

    -{{/if}} +

    {{widget.name}}

    - - - - + {{#each signals as |signal|}} + + + + + {{/each}}
    Name Value
    Signal X1.234
    + {{signal.name}} + + {{signal.value}} +
    + +{{#if isShowingModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Table

    + +
    + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter widget name' value=name}} +
    + + + +
    + + +
    +
    + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index e2d26f2..ebc1358 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -2,10 +2,6 @@

    Toolbox

    - - {{#draggable-item content='table'}} Table {{/draggable-item}} @@ -13,6 +9,10 @@ {{#draggable-item content='value'}} Value {{/draggable-item}} + + {{#draggable-item content='label'}} + Label + {{/draggable-item}}
    {{#draggable-dropzone dropped='addWidget'}} diff --git a/tests/integration/components/widget-label-test.js b/tests/integration/components/widget-label-test.js new file mode 100644 index 0000000..7312395 --- /dev/null +++ b/tests/integration/components/widget-label-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('widget-label', 'Integration | Component | widget label', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{widget-label}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#widget-label}} + template block text + {{/widget-label}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); From 021457a1411bc0159f58f91e352b8f8cd2699f96 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 24 Nov 2016 12:19:34 +0100 Subject: [PATCH 038/556] Fix default simulator on creating widgets --- app/components/widget-table.js | 1 + app/controllers/visualization/edit.js | 62 ++++++++++++++++----------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/app/components/widget-table.js b/app/components/widget-table.js index 7640406..e3117ef 100644 --- a/app/components/widget-table.js +++ b/app/components/widget-table.js @@ -8,6 +8,7 @@ **********************************************************************************/ import WidgetAbstract from './widget-abstract'; +import Ember from 'ember'; export default WidgetAbstract.extend({ classNames: [ 'widgetTable' ], diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index ee269df..c79f261 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -23,35 +23,49 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { actions: { addWidget(name) { - let widget = null; + // get first simulator id + let defaultSimulatorid = 0; - if (name === 'label') { - widget = this.store.createRecord('widget', { name: 'Label', type: 'widget-label', width: 100, height: 20 }); - } else if (name === 'table') { - widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200, widgetData: { simulator: 2 } }); - } else if (name === 'value') { - widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, widgetData: { signal: 0, simulator: 2 } }); - } else { - // DEBUG - console.log('Add widget ' + name); - return; - } + this.get('model.project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + simulationModels.toArray()[0].get('simulator').then((simulator) => { + defaultSimulatorid = simulator.get('simulatorid'); - if (widget != null) { - // add widget to visualization - this.get('model.widgets').pushObject(widget); + // create widget + let widget = null; - // save new widget - var visualization = this.get('model'); + if (name === 'label') { + widget = this.store.createRecord('widget', { name: 'Label', type: 'widget-label', width: 100, height: 20 }); + } else if (name === 'table') { + widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200, widgetData: { simulator: defaultSimulatorid } }); + } else if (name === 'value') { + widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, widgetData: { signal: 0, simulator: defaultSimulatorid } }); + } else { + // DEBUG + console.log('Add widget ' + name); + return; + } - widget.save().then(function() { - // save the widget in the visualization - visualization.get('widgets').pushObject(widget); - visualization.save(); + if (widget != null) { + // add widget to visualization + this.get('model.widgets').pushObject(widget); + + // save new widget + var visualization = this.get('model'); + + widget.save().then(function() { + // save the widget in the visualization + visualization.get('widgets').pushObject(widget); + visualization.save(); + }); + } else { + console.error('Unknown widget type: ' + name); + } + }); + }); }); - } else { - console.error('Unknown widget type: ' + name); - } + }); }, saveEdit() { From 77eb19a44a50a0e9866fba006ad1a735a9f7df99 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 12 Jan 2017 16:24:46 +0100 Subject: [PATCH 039/556] Drop widgets at cursor position. Add widget delete Add widget delete button in modal widget dialogs Add widget edit hint in edit layout --- app/components/draggable-dropzone.js | 9 ++++++++- app/components/draggable-item.js | 3 +++ app/components/widget-label.js | 9 ++++++++- app/components/widget-table.js | 7 +++++++ app/components/widget-value.js | 7 +++++++ app/controllers/visualization/edit.js | 8 ++++---- app/templates/components/widget-label.hbs | 1 + app/templates/components/widget-table.hbs | 1 + app/templates/components/widget-value.hbs | 1 + app/templates/dialog/widget/value.hbs | 5 ----- app/templates/visualization/edit.hbs | 4 ++++ 11 files changed, 44 insertions(+), 11 deletions(-) delete mode 100644 app/templates/dialog/widget/value.hbs diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index d0497dc..6fd48a7 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -29,7 +29,14 @@ export default Ember.Component.extend({ drop(event) { var data = event.dataTransfer.getData('text/data'); - this.sendAction('dropped', data); + var position = { + x: event.originalEvent.pageX - $(event.target).offset().left - parseFloat(event.dataTransfer.getData('offset/x')), + y: event.originalEvent.pageY - $(event.target).offset().top - parseFloat(event.dataTransfer.getData('offset/y')) + } + + console.log(position); + + this.sendAction('dropped', data, position); set(this, 'dragClass', 'deactivated'); } diff --git a/app/components/draggable-item.js b/app/components/draggable-item.js index 087c843..71d5dee 100644 --- a/app/components/draggable-item.js +++ b/app/components/draggable-item.js @@ -17,6 +17,9 @@ export default Ember.Component.extend({ draggable: 'true', dragStart(event) { + event.dataTransfer.setData('offset/x', event.originalEvent.pageX - $(event.target).offset().left); + event.dataTransfer.setData('offset/y', event.originalEvent.pageY - $(event.target).offset().top); + return event.dataTransfer.setData('text/data', get(this, 'content')); } }); diff --git a/app/components/widget-label.js b/app/components/widget-label.js index c94115c..732430e 100644 --- a/app/components/widget-label.js +++ b/app/components/widget-label.js @@ -47,6 +47,13 @@ export default WidgetAbstract.extend({ cancelModal() { this.set('isShowingModal', false); - } + }, + + deleteModal() { + // delete widget + this.get('widget').destroyRecord(); + + this.set('isShowingModal', false); + }, } }); diff --git a/app/components/widget-table.js b/app/components/widget-table.js index e3117ef..2bd1f77 100644 --- a/app/components/widget-table.js +++ b/app/components/widget-table.js @@ -150,6 +150,13 @@ export default WidgetAbstract.extend({ this.set('isShowingModal', false); }, + deleteModal() { + // delete widget + this.get('widget').destroyRecord(); + + this.set('isShowingModal', false); + }, + selectSimulationModel(simulationModelName) { // save simulation model this.set('simulationModelName', simulationModelName); diff --git a/app/components/widget-value.js b/app/components/widget-value.js index 1381705..485e0af 100644 --- a/app/components/widget-value.js +++ b/app/components/widget-value.js @@ -123,6 +123,13 @@ export default WidgetAbstract.extend({ this.set('isShowingModal', false); }, + deleteModal() { + // delete widget + this.get('widget').destroyRecord(); + + this.set('isShowingModal', false); + }, + selectSimulationModel(simulationModelName) { // save simulation model this.set('simulationModelName', simulationModelName); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index c79f261..930629d 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -22,7 +22,7 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { signal: null, actions: { - addWidget(name) { + addWidget(name, position) { // get first simulator id let defaultSimulatorid = 0; @@ -36,11 +36,11 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { let widget = null; if (name === 'label') { - widget = this.store.createRecord('widget', { name: 'Label', type: 'widget-label', width: 100, height: 20 }); + widget = this.store.createRecord('widget', { name: 'Label', type: 'widget-label', width: 100, height: 20, x: position.x, y: position.y }); } else if (name === 'table') { - widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200, widgetData: { simulator: defaultSimulatorid } }); + widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200, x: position.x, y: position.y, widgetData: { simulator: defaultSimulatorid } }); } else if (name === 'value') { - widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, widgetData: { signal: 0, simulator: defaultSimulatorid } }); + widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, x: position.x, y: position.y, widgetData: { signal: 0, simulator: defaultSimulatorid } }); } else { // DEBUG console.log('Add widget ' + name); diff --git a/app/templates/components/widget-label.hbs b/app/templates/components/widget-label.hbs index fa0b636..1c0aefe 100644 --- a/app/templates/components/widget-label.hbs +++ b/app/templates/components/widget-label.hbs @@ -18,6 +18,7 @@
    +
    diff --git a/app/templates/components/widget-table.hbs b/app/templates/components/widget-table.hbs index 082c40a..bb84841 100644 --- a/app/templates/components/widget-table.hbs +++ b/app/templates/components/widget-table.hbs @@ -47,6 +47,7 @@ + diff --git a/app/templates/components/widget-value.hbs b/app/templates/components/widget-value.hbs index c38f79a..6bfb445 100644 --- a/app/templates/components/widget-value.hbs +++ b/app/templates/components/widget-value.hbs @@ -42,6 +42,7 @@ + diff --git a/app/templates/dialog/widget/value.hbs b/app/templates/dialog/widget/value.hbs deleted file mode 100644 index 8f11e5f..0000000 --- a/app/templates/dialog/widget/value.hbs +++ /dev/null @@ -1,5 +0,0 @@ -

    Test

    - - - - diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index ebc1358..9d68285 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -13,6 +13,10 @@ {{#draggable-item content='label'}} Label {{/draggable-item}} + +

    + Hint: Double click widgets to edit or delete them. +

    {{#draggable-dropzone dropped='addWidget'}} From c40974acf54e2efbac6c4394ec455214f178eb8e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 13 Jan 2017 17:11:48 +0100 Subject: [PATCH 040/556] Add plot widget Fixed to first simuator, first signal Add flot to project --- app/components/draggable-dropzone.js | 2 -- app/components/widget-container.js | 2 +- app/controllers/visualization/edit.js | 36 +++++++++++++++++++++++---- app/mixins/live-data.js | 2 ++ app/models/simulation-data.js | 24 ++++++++++++------ app/models/visualization.js | 3 +-- app/templates/visualization/edit.hbs | 4 +++ bower.json | 3 ++- ember-cli-build.js | 1 + package.json | 1 + todo.md | 5 ---- 11 files changed, 60 insertions(+), 23 deletions(-) diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index 6fd48a7..c8d7956 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -34,8 +34,6 @@ export default Ember.Component.extend({ y: event.originalEvent.pageY - $(event.target).offset().top - parseFloat(event.dataTransfer.getData('offset/y')) } - console.log(position); - this.sendAction('dropped', data, position); set(this, 'dragClass', 'deactivated'); diff --git a/app/components/widget-container.js b/app/components/widget-container.js index fd1e992..c1dcdc1 100644 --- a/app/components/widget-container.js +++ b/app/components/widget-container.js @@ -16,7 +16,7 @@ export default Ember.Component.extend({ widgets: null, editing: false, - grid: true, + grid: false, data: null, style: Ember.computed('widgets.@each.height', 'widgets.@each.y', function() { diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 930629d..c6033a1 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -34,20 +34,46 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { // create widget let widget = null; + let properties = { + x: position.x, + y: position.y, + name: 'widget', + type: null + }; if (name === 'label') { - widget = this.store.createRecord('widget', { name: 'Label', type: 'widget-label', width: 100, height: 20, x: position.x, y: position.y }); + properties.type = 'widget-label'; + properties.width = 100; + properties.height = 20; + properties.name = 'Label'; } else if (name === 'table') { - widget = this.store.createRecord('widget', { name: 'Table 1', type: 'widget-table', width: 500, height: 200, x: position.x, y: position.y, widgetData: { simulator: defaultSimulatorid } }); + properties.type = 'widget-table'; + properties.name = "Table"; + properties.width = 500; + proeprties.height = 200; + properties.widgetData = { simulator: defaultSimulatorid }; } else if (name === 'value') { - widget = this.store.createRecord('widget', { name: 'Value 1', type: 'widget-value', width: 250, height: 20, x: position.x, y: position.y, widgetData: { signal: 0, simulator: defaultSimulatorid } }); + properties.type = 'widget-value'; + properties.name = 'Value'; + properties.width = 250; + properties.height = 20; + properties.widgetData = { signal: 0, simulator: defaultSimulatorid }; + } else if (name === 'plot') { + properties.type = 'widget-plot'; + properties.name = 'Plot'; + properties.width = 500; + properties.height = 200; + properties.widgetData = { signal: 0, simulator: defaultSimulatorid }; } else { // DEBUG - console.log('Add widget ' + name); + console.log('Add unknown widget ' + name); return; } - if (widget != null) { + if (properties.type != null) { + // create widget + widget = this.store.createRecord('widget', properties); + // add widget to visualization this.get('model.widgets').pushObject(widget); diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js index 0aedb5e..059c2a4 100644 --- a/app/mixins/live-data.js +++ b/app/mixins/live-data.js @@ -141,10 +141,12 @@ export default Ember.Mixin.create({ var simulationData = this.store.peekRecord('simulation-data', message.simulator); if (simulationData != null) { simulationData.set('sequence', message.sequence); + simulationData.set('timestamp', new Date(message.timestamp).getTime()); simulationData.set('values', message.values); } else { this.store.createRecord('simulation-data', { sequence: message.sequence, + timestamp: new Date(message.timestamp).getTime(), values: message.values, id: message.simulator }); diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index b145faf..44eb110 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -15,18 +15,28 @@ import attr from 'ember-data/attr'; export default Model.extend({ simulator: Ember.computed.alias('id'), sequence: attr('number'), + timestamp: attr('number'), values: attr('array'), - /*historyValues() { + flotValues: Ember.computed('_flotValues', function() { + return this._flotValues; + }), + + _flotValues: [], + + historyValues: Ember.computed('_history', function() { return this._history; - }, + }), _history: [], - _updateHistory: Ember.observer('values', function() { - this._history.unshift(this.get('values')); - while (this._history.length > 5) { - this._history.shift(); + _updateHistories: Ember.observer('values', function() { + // save set of values with timestamp + this._flotValues.push([this.get('timestamp'), this.get('values')[0]]); + + // discard old values + while (this._flotValues.length > 100) { + this._flotValues.shift(); } - })*/ + }) }); diff --git a/app/models/visualization.js b/app/models/visualization.js index cb5253a..439d526 100644 --- a/app/models/visualization.js +++ b/app/models/visualization.js @@ -14,6 +14,5 @@ import { belongsTo, hasMany } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), widgets: hasMany('widget', { async: true }), - project: belongsTo('project', { async: true }), - rows: attr('number', { defaultValue: 1 }) + project: belongsTo('project', { async: true }) }); diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index 9d68285..4d9d36d 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -14,6 +14,10 @@ Label {{/draggable-item}} + {{#draggable-item content='plot'}} + Plot + {{/draggable-item}} +

    Hint: Double click widgets to edit or delete them.

    diff --git a/bower.json b/bower.json index 070c570..9020a79 100644 --- a/bower.json +++ b/bower.json @@ -6,7 +6,8 @@ "ember-cli-test-loader": "0.2.2", "ember-qunit-notifications": "0.1.0", "jquery-ui": "1.11.4", - "bootstrap": "~3.3.5" + "bootstrap": "~3.3.5", + "flot": "~0.8.3" }, "resolutions": { "ember": "~2.5.0" diff --git a/ember-cli-build.js b/ember-cli-build.js index 87da6af..ab8a0ed 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -21,6 +21,7 @@ module.exports = function(defaults) { // along with the exports of each module as its value. app.import('bower_components/bootstrap/dist/js/bootstrap.js'); + app.import('bower_components/flot/jquery.flot.time.js'); return app.toTree(); }; diff --git a/package.json b/package.json index 45b186e..7cdb0e3 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "ember-cli-app-version": "^1.0.0", "ember-cli-babel": "^5.1.6", "ember-cli-dependency-checker": "^1.2.0", + "ember-cli-flot": "0.0.3", "ember-cli-htmlbars": "^1.0.3", "ember-cli-htmlbars-inline-precompile": "^0.3.1", "ember-cli-inject-live-reload": "^1.4.0", diff --git a/todo.md b/todo.md index f0e8443..aca9507 100644 --- a/todo.md +++ b/todo.md @@ -1,13 +1,8 @@ # To-Do - Change password - - Move plot attributes/styling from plot-container into actual plots - - Move drag-n-drop to mixins - Go into edit mode if visualization is empty - Auto-detect if simulators are running - Remove running socket if it's not in the updated list - - Rebrand plots into widgets - - Change widget model (plot) to custom data to provide mechanism for all widgets - - Add widgets where dropped websocketserverip/config.json { From 3ec9cc3497e0df458c259c25493caa74a5e7d649 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 25 Jan 2017 12:54:34 +0100 Subject: [PATCH 041/556] Add missing files --- app/components/flow-plot.js | 27 +++ app/components/widget-plot.js | 205 ++++++++++++++++++ app/controllers/visualization/edit.js | 4 +- app/models/simulation-data.js | 25 ++- app/templates/components/flow-plot.hbs | 1 + app/templates/components/widget-plot.hbs | 56 +++++ .../integration/components/flow-plot-test.js | 24 ++ .../components/widget-plot-test.js | 24 ++ 8 files changed, 353 insertions(+), 13 deletions(-) create mode 100644 app/components/flow-plot.js create mode 100644 app/components/widget-plot.js create mode 100644 app/templates/components/flow-plot.hbs create mode 100644 app/templates/components/widget-plot.hbs create mode 100644 tests/integration/components/flow-plot-test.js create mode 100644 tests/integration/components/widget-plot-test.js diff --git a/app/components/flow-plot.js b/app/components/flow-plot.js new file mode 100644 index 0000000..01700ab --- /dev/null +++ b/app/components/flow-plot.js @@ -0,0 +1,27 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + tagName: 'div', + classNames: [ 'flow-plot' ], + attributeBindings: [ 'style' ], + + plot: null, + data: [], + options: {}, + height: '85%', + + setupPlot: Ember.on('didInsertElement', function() { + var plot = Ember.$.plot('#' + this.get('element').id, this.get('data'), this.get('options')); + this.set('plot', plot); + }), + + updateData: Ember.observer('data.@each', function() { + // update plot + var plot = Ember.$.plot('#' + this.get('element').id, this.get('data'), this.get('options')); + this.set('plot', plot); + }), + + style: Ember.computed('height', function() { + return Ember.String.htmlSafe("height: " + this.get('height') + ";"); + }) +}); diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js new file mode 100644 index 0000000..733c0da --- /dev/null +++ b/app/components/widget-plot.js @@ -0,0 +1,205 @@ +/** + * File: widget-value.js + * Author: Markus Grigull + * Date: 08.12.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import WidgetAbstract from './widget-abstract'; + +export default WidgetAbstract.extend({ + classNames: [ 'widgetPlot' ], + + plotData: Ember.A([]), + + plotOptions: { + series: { + lines: { + show: true, + lineWidth: 2 + }, + shadowSize: 0 + }, + xaxis: { + mode: 'time', + timeformat: '%M:%S', + /*min: firstTimestamp, + max: lastTimestamp,*/ + axisLabel: 'time [min]', + axisLabelUseCanvas: true + }/*, + yaxis: { + tickDecimals: 1, + axisLabel: this.data.get('type'), + axisLabelUseCanvas: true + }*/ + }, + + signals: Ember.A([]), + + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', function() { + // get query for observer + let simulatorId = this.get('widget.widgetData.simulator'); + let query = 'data.' + simulatorId + '.sequence'; + + // get plot settings + let signals = this.get('widget.widgetData.signals'); + this.set('signals', signals); + + this.addObserver(query, function() { + // get values from array + let values = this.get('data.' + simulatorId + '.flotValues'); + var updatedValues = this.get('plotData'); + + // update values + var index = 0; + + this.get('signals').forEach(function(signal) { + updatedValues.replace(index, 1, Ember.A([ values[signal] ])); + index += 1; + }); + + this.set('plotData', updatedValues); + }); + })), + + doubleClick() { + if (this.get('editing') === true) { + // prepare modal + this.set('name', this.get('widget.name')); + this.set('errorMessage', null); + + // get signal mapping for simulation model + let self = this; + let simulatorid = this.get('widget.widgetData.simulator'); + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by simulatorid + simulationModels.forEach(function(simulationModel) { + simulationModel.get('simulator').then((simulator) => { + if (simulator.get('simulatorid') === simulatorid) { + // set simulation model + self.set('simulationModel', simulationModel); + self.set('simulationModelName', simulationModel.get('name')); + + // set signals + let mapping = simulationModel.get('mapping'); + + // uncheck all signals + mapping.forEach(function(key) { + self.set(key + 'Checked', false); + }); + + self.get('signals').forEach(function(signal) { + self.set(mapping[signal] + 'Checked', true); + }); + } + }); + }); + }); + }); + }); + }); + + // show modal + this.set('isShowingModal', true); + } + }, + + actions: { + submitModal() { + // verify properties + let properties = this.getProperties('name'); + + if (properties['name'] === null || properties['name'] === "") { + this.set('errorMessage', 'Widget name is missing'); + return; + } + + // set simulator by simulation model name + let simulationModelName = this.get('simulationModelName'); + let self = this; + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by name + simulationModels.forEach(function(simulationModel) { + if (simulationModel.get('name') === simulationModelName) { + simulationModel.get('simulator').then((simulator) => { + // set simulator + let widgetData = {}; + widgetData.simulator = simulator.get('simulatorid'); + + // set signals + let mapping = simulationModel.get('mapping'); + widgetData.signals = []; + + // uncheck all signals + for (var i = 0; i < mapping.length; i++) { + if (self.get(mapping[i] + 'Checked')) { + widgetData.signals.push(i); + } + } + + // save properties + properties['widgetData'] = widgetData; + + console.log(properties); + + self.get('widget').setProperties(properties); + + self.get('widget').save().then(function() { + self.set('isShowingModal', false); + }); + }); + } + }); + }); + }); + }); + }); + }, + + cancelModal() { + this.set('isShowingModal', false); + }, + + deleteModal() { + // delete widget + this.get('widget').destroyRecord(); + + this.set('isShowingModal', false); + }, + + selectSimulationModel(simulationModelName) { + // save simulation model + this.set('simulationModelName', simulationModelName); + + // get signal mapping for simulation model + let self = this; + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by name + simulationModels.forEach(function(simulationModel) { + if (simulationModel.get('name') === simulationModelName) { + self.set('simulationModel', simulationModel); + } + }); + }); + }); + }); + }); + } + } +}); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index c6033a1..5d7556d 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -62,8 +62,8 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { properties.type = 'widget-plot'; properties.name = 'Plot'; properties.width = 500; - properties.height = 200; - properties.widgetData = { signal: 0, simulator: defaultSimulatorid }; + properties.height = 400; + properties.widgetData = { signals: [0], simulator: defaultSimulatorid, type: 'multiple' }; } else { // DEBUG console.log('Add unknown widget ' + name); diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index 44eb110..b978222 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -24,19 +24,22 @@ export default Model.extend({ _flotValues: [], - historyValues: Ember.computed('_history', function() { - return this._history; - }), - - _history: [], - _updateHistories: Ember.observer('values', function() { - // save set of values with timestamp - this._flotValues.push([this.get('timestamp'), this.get('values')[0]]); + // update flot values + let values = this.get('values'); - // discard old values - while (this._flotValues.length > 100) { - this._flotValues.shift(); + // add empty arrays for each value + while (this._flotValues.length < values.length) { + this._flotValues.push([]); + } + + for (var i = 0; i < values.length; i++) { + this._flotValues[i].push([this.get('timestamp'), values[i]]); + + // discard old values + while (this._flotValues[i].length > 100) { + this._flotValues[i].shift(); + } } }) }); diff --git a/app/templates/components/flow-plot.hbs b/app/templates/components/flow-plot.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/flow-plot.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/components/widget-plot.hbs b/app/templates/components/widget-plot.hbs new file mode 100644 index 0000000..3f04c8f --- /dev/null +++ b/app/templates/components/widget-plot.hbs @@ -0,0 +1,56 @@ +

    {{widget.name}}

    + +{{flow-plot data=plotData options=plotOptions}} + +{{#if isShowingModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Plot

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter widget name' value=name}} +
    + + + +
    + + + {{#each simulationModel.mapping as |signal|}} + +
    + {{/each}} +
    + + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} diff --git a/tests/integration/components/flow-plot-test.js b/tests/integration/components/flow-plot-test.js new file mode 100644 index 0000000..949b9a7 --- /dev/null +++ b/tests/integration/components/flow-plot-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('flow-plot', 'Integration | Component | flow plot', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{flow-plot}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#flow-plot}} + template block text + {{/flow-plot}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/widget-plot-test.js b/tests/integration/components/widget-plot-test.js new file mode 100644 index 0000000..1b38f7a --- /dev/null +++ b/tests/integration/components/widget-plot-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('widget-plot', 'Integration | Component | widget plot', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{widget-plot}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#widget-plot}} + template block text + {{/widget-plot}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); From 7c4d67c16388431de653a7b8bf56e68cf17da51d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 25 Jan 2017 19:36:23 +0100 Subject: [PATCH 042/556] Add image widget and file upload File upload is in image widget edit dialog Add ember-uploader package --- app/components/file-upload.js | 19 ++++ app/components/widget-image.js | 106 ++++++++++++++++++ app/controllers/visualization/edit.js | 8 +- app/models/file.js | 18 +++ app/models/user.js | 3 +- app/templates/components/file-upload.hbs | 1 + app/templates/components/widget-image.hbs | 51 +++++++++ app/templates/visualization/edit.hbs | 4 + package.json | 1 + .../components/file-upload-test.js | 24 ++++ .../components/widget-image-test.js | 24 ++++ tests/unit/models/file-test.js | 12 ++ 12 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 app/components/file-upload.js create mode 100644 app/components/widget-image.js create mode 100644 app/models/file.js create mode 100644 app/templates/components/file-upload.hbs create mode 100644 app/templates/components/widget-image.hbs create mode 100644 tests/integration/components/file-upload-test.js create mode 100644 tests/integration/components/widget-image-test.js create mode 100644 tests/unit/models/file-test.js diff --git a/app/components/file-upload.js b/app/components/file-upload.js new file mode 100644 index 0000000..461df9b --- /dev/null +++ b/app/components/file-upload.js @@ -0,0 +1,19 @@ +/** + * File: file-upload.js + * Author: Markus Grigull + * Date: 05.12.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import Ember from 'ember'; +import EmberUploader from 'ember-uploader'; + +export default EmberUploader.FileField.extend({ + files: null, + + filesDidChange: function(files) { + this.set('files', files); + } +}); diff --git a/app/components/widget-image.js b/app/components/widget-image.js new file mode 100644 index 0000000..22a3dc1 --- /dev/null +++ b/app/components/widget-image.js @@ -0,0 +1,106 @@ +/** + * File: widget-image.js + * Author: Markus Grigull + * Date: 05.12.2016 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import WidgetAbstract from './widget-abstract'; +import Ember from 'ember'; +import ENV from '../config/environment'; +import EmberUploader from 'ember-uploader'; + +const { + inject: { service }, + RSVP +} = Ember; + +export default WidgetAbstract.extend({ + classNames: [ 'widgetImage' ], + + session: service('session'), + sessionUser: Ember.inject.service('session-user'), + store: service(), + + url: 'http://' + ENV.APP.API_HOST, + namespace: 'api/v1', + + doubleClick() { + if (this.get('editing') === true) { + // prepare modal + this.set('name', this.get('widget.name')); + + // show modal + this.set('isShowingModal', true); + } + }, + + actions: { + submitModal() { + // verify properties + let properties = this.getProperties('name'); + properties.widgetData = { path: this.get('image.path') }; + + this.get('widget').setProperties(properties); + + let self = this; + + this.get('widget').save().then(function() { + self.set('isShowingModal', false); + }); + }, + + cancelModal() { + this.set('isShowingModal', false); + }, + + selectImage(image) { + // get image by path + var self = this; + + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('owner').then((user) => { + user.get('files').then((files) => { + files.forEach(function(file) { + if (file.get('name') === image) { + // set image + self.set('image', file); + } + }); + }); + }); + }); + }); + }, + + upload() { + // check if any files to upload + let files = this.get('uploadFiles'); + + if (!Ember.isEmpty(files)) { + var uploadURL = this.get('url') + '/' + this.get('namespace') + '/upload'; + + const uploader = EmberUploader.Uploader.create({ + multiple: true, + url: uploadURL, + ajaxSettings: { + headers: { + 'x-access-token': this.get('session.data.authenticated.token') + } + } + }); + + var self = this; + + uploader.upload(files).then(event => { + // reload user + var user = self.get('sessionUser.user'); + self.get('store').findRecord('user', user.get('id')); + }); + } + } + } +}); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index 5d7556d..ad31ff4 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -50,7 +50,7 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { properties.type = 'widget-table'; properties.name = "Table"; properties.width = 500; - proeprties.height = 200; + properties.height = 200; properties.widgetData = { simulator: defaultSimulatorid }; } else if (name === 'value') { properties.type = 'widget-value'; @@ -64,6 +64,12 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { properties.width = 500; properties.height = 400; properties.widgetData = { signals: [0], simulator: defaultSimulatorid, type: 'multiple' }; + } else if (name === 'image') { + properties.type = 'widget-image'; + properties.name = 'Image'; + properties.width = 300; + properties.height = 300; + properties.widgetData = { path: null }; } else { // DEBUG console.log('Add unknown widget ' + name); diff --git a/app/models/file.js b/app/models/file.js new file mode 100644 index 0000000..fc7e63a --- /dev/null +++ b/app/models/file.js @@ -0,0 +1,18 @@ +/** + * File: file.js + * Author: Markus Grigull + * Date: 25.01.2017 + * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import DS from 'ember-data'; + +export default DS.Model.extend({ + name: DS.attr('string'), + path: DS.attr('string'), + type: DS.attr('string'), + user: DS.belongsTo('user', { async: true }), + date: DS.attr('date') +}); diff --git a/app/models/user.js b/app/models/user.js index cded992..b2bf6d4 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -17,5 +17,6 @@ export default Model.extend({ adminLevel: attr('number'), projects: hasMany('project', { async: true }), simulations: hasMany('simulation', { async: true }), - mail: attr('string') + mail: attr('string'), + files: hasMany('file', { async: true }) }); diff --git a/app/templates/components/file-upload.hbs b/app/templates/components/file-upload.hbs new file mode 100644 index 0000000..889d9ee --- /dev/null +++ b/app/templates/components/file-upload.hbs @@ -0,0 +1 @@ +{{yield}} diff --git a/app/templates/components/widget-image.hbs b/app/templates/components/widget-image.hbs new file mode 100644 index 0000000..b9b4f0c --- /dev/null +++ b/app/templates/components/widget-image.hbs @@ -0,0 +1,51 @@ +{{#if widget.widgetData.path}} + +{{/if}} + +{{#if isShowingModal}} + {{#modal-dialog attachment="middle center" translucentOverlay=true}} +

    Image

    + +
    + + + + + + + + + + + + + + + + +
    + + + {{input id='name' placeholder='Enter widget name' value=name}} +
    + + + +
    + + {{file-upload files=uploadFiles}} +
    + + +
    +
    + + {{#if errorMessage}} +

    Error: {{errorMessage}}

    + {{/if}} + {{/modal-dialog}} +{{/if}} diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs index 4d9d36d..c15d593 100644 --- a/app/templates/visualization/edit.hbs +++ b/app/templates/visualization/edit.hbs @@ -18,6 +18,10 @@ Plot {{/draggable-item}} + {{#draggable-item content='image'}} + Image + {{/draggable-item}} +

    Hint: Double click widgets to edit or delete them.

    diff --git a/package.json b/package.json index 7cdb0e3..30d5a65 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "ember-simple-auth": "^1.1.0", "ember-tether": "0.3.1", "ember-truth-helpers": "1.2.0", + "ember-uploader": "1.2.3", "loader.js": "^4.0.1" }, "dependencies": {} diff --git a/tests/integration/components/file-upload-test.js b/tests/integration/components/file-upload-test.js new file mode 100644 index 0000000..3c7b795 --- /dev/null +++ b/tests/integration/components/file-upload-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('file-upload', 'Integration | Component | file upload', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{file-upload}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#file-upload}} + template block text + {{/file-upload}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/integration/components/widget-image-test.js b/tests/integration/components/widget-image-test.js new file mode 100644 index 0000000..8eace27 --- /dev/null +++ b/tests/integration/components/widget-image-test.js @@ -0,0 +1,24 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('widget-image', 'Integration | Component | widget image', { + integration: true +}); + +test('it renders', function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... }); + + this.render(hbs`{{widget-image}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage: + this.render(hbs` + {{#widget-image}} + template block text + {{/widget-image}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/tests/unit/models/file-test.js b/tests/unit/models/file-test.js new file mode 100644 index 0000000..225d072 --- /dev/null +++ b/tests/unit/models/file-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('file', 'Unit | Model | file', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + let model = this.subject(); + // let store = this.store(); + assert.ok(!!model); +}); From 64397eebff345196db1050233bdde58bc1adc19a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 25 Jan 2017 19:51:33 +0100 Subject: [PATCH 043/556] Fix plot signal selection checkboxes --- app/components/widget-image.js | 2 +- app/components/widget-plot.js | 13 ++++++++++--- app/templates/components/widget-plot.hbs | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/components/widget-image.js b/app/components/widget-image.js index 22a3dc1..e7c062a 100644 --- a/app/components/widget-image.js +++ b/app/components/widget-image.js @@ -46,7 +46,7 @@ export default WidgetAbstract.extend({ this.get('widget').setProperties(properties); let self = this; - + this.get('widget').save().then(function() { self.set('isShowingModal', false); }); diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js index 733c0da..106165c 100644 --- a/app/components/widget-plot.js +++ b/app/components/widget-plot.js @@ -40,6 +40,8 @@ export default WidgetAbstract.extend({ signals: Ember.A([]), + checkedSignals: {}, + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', function() { // get query for observer let simulatorId = this.get('widget.widgetData.simulator'); @@ -90,15 +92,18 @@ export default WidgetAbstract.extend({ // set signals let mapping = simulationModel.get('mapping'); + let checkedSignals = {}; // uncheck all signals mapping.forEach(function(key) { - self.set(key + 'Checked', false); + checkedSignals[key] = false; }); self.get('signals').forEach(function(signal) { - self.set(mapping[signal] + 'Checked', true); + checkedSignals[mapping[signal]] = true; }); + + self.set('checkedSignals', checkedSignals); } }); }); @@ -143,8 +148,10 @@ export default WidgetAbstract.extend({ widgetData.signals = []; // uncheck all signals + let checkedSignals = self.get('checkedSignals'); + for (var i = 0; i < mapping.length; i++) { - if (self.get(mapping[i] + 'Checked')) { + if (checkedSignals[mapping[i]]) { widgetData.signals.push(i); } } diff --git a/app/templates/components/widget-plot.hbs b/app/templates/components/widget-plot.hbs index 3f04c8f..11f0101 100644 --- a/app/templates/components/widget-plot.hbs +++ b/app/templates/components/widget-plot.hbs @@ -34,7 +34,7 @@ {{#each simulationModel.mapping as |signal|}} - + {{input type='checkbox' name=signal checked=(mut (get checkedSignals signal))}}
    {{/each}} From 0e83bbd6863a4a5f5bf7838d16cf0c1e17de7848 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 31 Jan 2017 22:12:24 +0100 Subject: [PATCH 044/556] Add table plot widget type In the plot widget the plot type can be selected Fix plot widget selecting signals Fix widgets data observers --- app/components/widget-plot.js | 90 ++++++++++++++++++++---- app/components/widget-table.js | 45 +++++++----- app/components/widget-value.js | 29 +++++--- app/styles/widgets.scss | 13 ++++ app/templates/components/widget-plot.hbs | 52 ++++++++++++-- 5 files changed, 181 insertions(+), 48 deletions(-) diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js index 106165c..4cc045e 100644 --- a/app/components/widget-plot.js +++ b/app/components/widget-plot.js @@ -42,7 +42,11 @@ export default WidgetAbstract.extend({ checkedSignals: {}, - _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', function() { + plotType: "multiple", + + observeQuery: null, + + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', 'widget.widgetData.type', 'widget.widgetData.signals', function() { // get query for observer let simulatorId = this.get('widget.widgetData.simulator'); let query = 'data.' + simulatorId + '.sequence'; @@ -51,27 +55,67 @@ export default WidgetAbstract.extend({ let signals = this.get('widget.widgetData.signals'); this.set('signals', signals); - this.addObserver(query, function() { - // get values from array - let values = this.get('data.' + simulatorId + '.flotValues'); - var updatedValues = this.get('plotData'); + let plotType = this.get('widget.widgetData.type'); + this.set('plotType', plotType); - // update values - var index = 0; + if (plotType === 'table') { + // set simulation model for table with signals + var self = this; + let simulatorid = this.get('widget.widgetData.simulator'); - this.get('signals').forEach(function(signal) { - updatedValues.replace(index, 1, Ember.A([ values[signal] ])); - index += 1; + this.get('widget.visualization').then((visualization) => { + visualization.get('project').then((project) => { + project.get('simulation').then((simulation) => { + simulation.get('models').then((simulationModels) => { + // find simulation model by simulatorid + simulationModels.forEach(function(simulationModel) { + simulationModel.get('simulator').then((simulator) => { + if (simulator.get('simulatorid') === simulatorid) { + // set simulation model + self.set('simulationModel', simulationModel); + } + }); + }); + }); + }); + }); }); + } - this.set('plotData', updatedValues); - }); + // update observer TODO: Only update when (query) changed + let observeQuery = this.get('observeQuery'); + if (query != observeQuery) { + if (observeQuery != null) { + this.removeObserver(observeQuery, this._updateData); + } + + this.addObserver(query, this._updateData); + this.set('observeQuery', query); + } })), + _updateData() { + // get values from array + let simulatorId = this.get('widget.widgetData.simulator'); + let values = this.get('data.' + simulatorId + '.flotValues'); + var updatedValues = Ember.A([]); + + // update values + var index = 0; + + this.get('signals').forEach(function(signal) { + updatedValues.replace(index, 1, Ember.A([ values[signal] ])); + index += 1; + }); + + this.set('plotData', updatedValues); + }, + doubleClick() { if (this.get('editing') === true) { // prepare modal this.set('name', this.get('widget.name')); + this.set('plotType', this.get('widget.widgetData.type')); this.set('errorMessage', null); // get signal mapping for simulation model @@ -140,7 +184,10 @@ export default WidgetAbstract.extend({ if (simulationModel.get('name') === simulationModelName) { simulationModel.get('simulator').then((simulator) => { // set simulator - let widgetData = {}; + let widgetData = { + type: self.get('plotType') + }; + widgetData.simulator = simulator.get('simulatorid'); // set signals @@ -159,8 +206,6 @@ export default WidgetAbstract.extend({ // save properties properties['widgetData'] = widgetData; - console.log(properties); - self.get('widget').setProperties(properties); self.get('widget').save().then(function() { @@ -207,6 +252,21 @@ export default WidgetAbstract.extend({ }); }); }); + }, + + selectType(type) { + this.set('plotType', type); + }, + + selectTableSignal(signal) { + // display signal + let mapping = this.get('simulationModel.mapping'); + + for (var i = 0; i < mapping.length; i++) { + if (mapping[i] === signal) { + this.set('widget.widgetData.signals', [ i ]); + } + } } } }); diff --git a/app/components/widget-table.js b/app/components/widget-table.js index 2bd1f77..6e9f401 100644 --- a/app/components/widget-table.js +++ b/app/components/widget-table.js @@ -18,29 +18,19 @@ export default WidgetAbstract.extend({ signals: [], + observeQuery: null, + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', function() { // get query for observer let simulatorId = this.get('widget.widgetData.simulator'); let query = 'data.' + simulatorId + '.sequence'; + let observeQuery = this.get('observeQuery'); + if (observeQuery != null) { + this.removeObserver(observeQuery, this._updateData); + } - this.addObserver(query, function() { - // get signal names to fill data in - let signals = this.get('signals'); - if (!signals) { - // wait till names are loaded - return; - } - - // get values from array - let values = this.get('data.' + simulatorId + '.values'); - for (let i = 0; i < values.length; i++) { - if (!signals[i]) { - break; - } - - Ember.set(signals[i], 'value', values[i]); - } - }); + this.addObserver(query, this._updateData); + this.set('observeQuery', query); // get signal names let self = this; @@ -70,6 +60,25 @@ export default WidgetAbstract.extend({ }); })), + _updateData() { + // get signal names to fill data in + let signals = this.get('signals'); + if (!signals) { + // wait till names are loaded + return; + } + + // get values from array + let values = this.get('data.' + simulatorId + '.values'); + for (let i = 0; i < values.length; i++) { + if (!signals[i]) { + break; + } + + Ember.set(signals[i], 'value', values[i]); + } + }, + doubleClick() { if (this.get('editing') === true) { // prepare modal diff --git a/app/components/widget-value.js b/app/components/widget-value.js index 485e0af..ed42fb8 100644 --- a/app/components/widget-value.js +++ b/app/components/widget-value.js @@ -16,19 +16,30 @@ export default WidgetAbstract.extend({ minWidth_resize: 50, minHeight_resize: 20, + observeQuery: null, + _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', 'widget.widgetData.signal', function() { + // update observer let query = 'data.' + this.get('widget.widgetData.simulator') + '.sequence'; - this.addObserver(query, function() { - // get value from array - let values = this.get('data.' + this.get('widget.widgetData.simulator') + '.values'); - if (values) { - this.set('value', values[this.get('widget.widgetData.signal')]); - } else { - this.set('value', null); - } - }); + let observeQuery = this.get('observeQuery'); + if (observeQuery != null) { + this.removeObserver(observeQuery, this._updateData); + } + + this.addObserver(query, this._updateData); + this.set('observeQuery', query); })), + _updateData() { + // get value from array + let values = this.get('data.' + this.get('widget.widgetData.simulator') + '.values'); + if (values) { + this.set('value', values[this.get('widget.widgetData.signal')]); + } else { + this.set('value', null); + } + }, + doubleClick() { if (this.get('editing') === true) { // prepare modal diff --git a/app/styles/widgets.scss b/app/styles/widgets.scss index 39e0eb8..3d49d68 100644 --- a/app/styles/widgets.scss +++ b/app/styles/widgets.scss @@ -76,3 +76,16 @@ padding: 2px 5px; } + +/** + * Component: widget-plot + */ +.widgetPlot-signal-table { + border: 1px solid gray; + + padding: 2px 5px; +} + +.widgetPlot-signal-table th { + border: 0; +} diff --git a/app/templates/components/widget-plot.hbs b/app/templates/components/widget-plot.hbs index 11f0101..6768416 100644 --- a/app/templates/components/widget-plot.hbs +++ b/app/templates/components/widget-plot.hbs @@ -1,6 +1,29 @@

    {{widget.name}}

    -{{flow-plot data=plotData options=plotOptions}} +{{#if (eq plotType "table")}} + + + + + {{#each simulationModel.mapping as |signal|}} + + + + {{/each}} +
    + Signal +
    + {{signal}} +
    + +
    + {{flow-plot data=plotData options=plotOptions}} +
    +{{/if}} + +{{#if (eq plotType "multiple")}} + {{flow-plot data=plotData options=plotOptions}} +{{/if}} {{#if isShowingModal}} {{#modal-dialog attachment="middle center" translucentOverlay=true}} @@ -30,15 +53,32 @@ - + - {{#each simulationModel.mapping as |signal|}} - {{input type='checkbox' name=signal checked=(mut (get checkedSignals signal))}} -
    - {{/each}} + + {{#if (eq plotType "multiple")}} + + + + + + {{#each simulationModel.mapping as |signal|}} + {{input type='checkbox' name=signal checked=(mut (get checkedSignals signal))}} +
    + {{/each}} + + + {{/if}} + + {{#if (eq plotType "table")}} + + {{/if}} From ec034a57bfa35063cf122807b4cd40526ad66093 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 1 Feb 2017 12:26:41 +0100 Subject: [PATCH 045/556] Fix minor errors and warnings --- app/components/draggable-dropzone.js | 6 +++--- app/components/draggable-item.js | 4 ++-- app/components/file-upload.js | 1 - app/components/widget-image.js | 5 ++--- app/components/widget-plot.js | 2 +- app/components/widget-table.js | 2 +- 6 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/components/draggable-dropzone.js b/app/components/draggable-dropzone.js index c8d7956..18cdbff 100644 --- a/app/components/draggable-dropzone.js +++ b/app/components/draggable-dropzone.js @@ -30,9 +30,9 @@ export default Ember.Component.extend({ drop(event) { var data = event.dataTransfer.getData('text/data'); var position = { - x: event.originalEvent.pageX - $(event.target).offset().left - parseFloat(event.dataTransfer.getData('offset/x')), - y: event.originalEvent.pageY - $(event.target).offset().top - parseFloat(event.dataTransfer.getData('offset/y')) - } + x: event.originalEvent.pageX - Ember.$(event.target).offset().left - parseFloat(event.dataTransfer.getData('offset/x')), + y: event.originalEvent.pageY - Ember.$(event.target).offset().top - parseFloat(event.dataTransfer.getData('offset/y')) + }; this.sendAction('dropped', data, position); diff --git a/app/components/draggable-item.js b/app/components/draggable-item.js index 71d5dee..c390d26 100644 --- a/app/components/draggable-item.js +++ b/app/components/draggable-item.js @@ -17,8 +17,8 @@ export default Ember.Component.extend({ draggable: 'true', dragStart(event) { - event.dataTransfer.setData('offset/x', event.originalEvent.pageX - $(event.target).offset().left); - event.dataTransfer.setData('offset/y', event.originalEvent.pageY - $(event.target).offset().top); + event.dataTransfer.setData('offset/x', event.originalEvent.pageX - Ember.$(event.target).offset().left); + event.dataTransfer.setData('offset/y', event.originalEvent.pageY - Ember.$(event.target).offset().top); return event.dataTransfer.setData('text/data', get(this, 'content')); } diff --git a/app/components/file-upload.js b/app/components/file-upload.js index 461df9b..12c0dd0 100644 --- a/app/components/file-upload.js +++ b/app/components/file-upload.js @@ -7,7 +7,6 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import Ember from 'ember'; import EmberUploader from 'ember-uploader'; export default EmberUploader.FileField.extend({ diff --git a/app/components/widget-image.js b/app/components/widget-image.js index e7c062a..b4f15f0 100644 --- a/app/components/widget-image.js +++ b/app/components/widget-image.js @@ -13,8 +13,7 @@ import ENV from '../config/environment'; import EmberUploader from 'ember-uploader'; const { - inject: { service }, - RSVP + inject: { service } } = Ember; export default WidgetAbstract.extend({ @@ -95,7 +94,7 @@ export default WidgetAbstract.extend({ var self = this; - uploader.upload(files).then(event => { + uploader.upload(files).then(function() { // reload user var user = self.get('sessionUser.user'); self.get('store').findRecord('user', user.get('id')); diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js index 4cc045e..707f9fd 100644 --- a/app/components/widget-plot.js +++ b/app/components/widget-plot.js @@ -84,7 +84,7 @@ export default WidgetAbstract.extend({ // update observer TODO: Only update when (query) changed let observeQuery = this.get('observeQuery'); - if (query != observeQuery) { + if (query !== observeQuery) { if (observeQuery != null) { this.removeObserver(observeQuery, this._updateData); } diff --git a/app/components/widget-table.js b/app/components/widget-table.js index 6e9f401..8272310 100644 --- a/app/components/widget-table.js +++ b/app/components/widget-table.js @@ -69,7 +69,7 @@ export default WidgetAbstract.extend({ } // get values from array - let values = this.get('data.' + simulatorId + '.values'); + let values = this.get('data.' + this.get('widget.widgetData.simulator') + '.values'); for (let i = 0; i < values.length; i++) { if (!signals[i]) { break; From 42bc6bb47337a0535ab9a652d2138984b6d9be6f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 1 Feb 2017 12:54:33 +0100 Subject: [PATCH 046/556] Update to latest ember version Version 2.11.0 --- .editorconfig | 14 -------- .gitignore | 6 ++-- .jshintrc | 2 +- .travis.yml | 8 +++-- README.md | 17 +++++---- app/app.js | 4 --- app/index.html | 10 +++--- app/resolver.js | 9 ----- app/router.js | 3 +- bower.json | 7 ---- config/environment.js | 6 ++-- package.json | 49 ++++++++++++++------------ tests/.jshintrc | 2 +- tests/helpers/module-for-acceptance.js | 12 +++---- tests/index.html | 19 +++++----- 15 files changed, 68 insertions(+), 100 deletions(-) diff --git a/.editorconfig b/.editorconfig index 47c5438..219985c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,22 +13,8 @@ insert_final_newline = true indent_style = space indent_size = 2 -[*.js] -indent_style = space -indent_size = 2 - [*.hbs] insert_final_newline = false -indent_style = space -indent_size = 2 - -[*.css] -indent_style = space -indent_size = 2 - -[*.html] -indent_style = space -indent_size = 2 [*.{diff,md}] trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index b876c89..5ad14dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. +# See https://help.github.com/ignore-files/ for more about ignoring files. # compiled output /dist @@ -13,7 +13,5 @@ /connect.lock /coverage/* /libpeerconnection.log -npm-debug.log +npm-debug.log* testem.log - -.DS_Store diff --git a/.jshintrc b/.jshintrc index 08096ef..d421faa 100644 --- a/.jshintrc +++ b/.jshintrc @@ -27,6 +27,6 @@ "strict": false, "white": false, "eqnull": true, - "esnext": true, + "esversion": 6, "unused": true } diff --git a/.travis.yml b/.travis.yml index 64533be..a75f20e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,12 +7,14 @@ sudo: false cache: directories: - - node_modules + - $HOME/.npm + - $HOME/.cache # includes bowers cache before_install: - npm config set spin false - - npm install -g bower - - npm install phantomjs-prebuilt + - npm install -g bower phantomjs-prebuilt + - bower --version + - phantomjs --version install: - npm install diff --git a/README.md b/README.md index 4dff7cf..8081f80 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Villasweb-frontend +# villasweb-frontend This README outlines the details of collaborating on this Ember application. A short introduction of this app could easily go here. @@ -7,22 +7,22 @@ A short introduction of this app could easily go here. You will need the following things properly installed on your computer. -* [Git](http://git-scm.com/) -* [Node.js](http://nodejs.org/) (with NPM) -* [Bower](http://bower.io/) -* [Ember CLI](http://ember-cli.com/) +* [Git](https://git-scm.com/) +* [Node.js](https://nodejs.org/) (with NPM) +* [Bower](https://bower.io/) +* [Ember CLI](https://ember-cli.com/) * [PhantomJS](http://phantomjs.org/) ## Installation * `git clone ` this repository -* change into the new directory +* `cd villasweb-frontend` * `npm install` * `bower install` ## Running / Development -* `ember server` +* `ember serve` * Visit your app at [http://localhost:4200](http://localhost:4200). ### Code Generators @@ -46,8 +46,7 @@ Specify what it takes to deploy your app. ## Further Reading / Useful Links * [ember.js](http://emberjs.com/) -* [ember-cli](http://ember-cli.com/) +* [ember-cli](https://ember-cli.com/) * Development Browser Extensions * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) - diff --git a/app/app.js b/app/app.js index 01d4b13..6921924 100644 --- a/app/app.js +++ b/app/app.js @@ -22,10 +22,6 @@ App = Ember.Application.extend({ Resolver }); -Ember.RSVP.on('error', function(error) { - console.error(error.message); -}); - loadInitializers(App, config.modulePrefix); export default App; diff --git a/app/index.html b/app/index.html index fd514c9..f0991a2 100644 --- a/app/index.html +++ b/app/index.html @@ -3,22 +3,22 @@ - VILLASwebFrontend + VillaswebFrontend {{content-for "head"}} - - + + {{content-for "head-footer"}} {{content-for "body"}} - - + + {{content-for "body-footer"}} diff --git a/app/resolver.js b/app/resolver.js index 50a19ab..2fb563d 100644 --- a/app/resolver.js +++ b/app/resolver.js @@ -1,12 +1,3 @@ -/** - * File: resolver.js - * Author: Markus Grigull - * Date: 26.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - import Resolver from 'ember-resolver'; export default Resolver; diff --git a/app/router.js b/app/router.js index 47f4580..8fbc33a 100644 --- a/app/router.js +++ b/app/router.js @@ -11,7 +11,8 @@ import Ember from 'ember'; import config from './config/environment'; const Router = Ember.Router.extend({ - location: config.locationType + location: config.locationType, + rootURL: config.rootURL }); Router.map(function() { diff --git a/bower.json b/bower.json index 9020a79..adf3c54 100644 --- a/bower.json +++ b/bower.json @@ -1,15 +1,8 @@ { "name": "villasweb-frontend", "dependencies": { - "ember": "~2.5.0", - "ember-cli-shims": "0.1.1", - "ember-cli-test-loader": "0.2.2", - "ember-qunit-notifications": "0.1.0", "jquery-ui": "1.11.4", "bootstrap": "~3.3.5", "flot": "~0.8.3" - }, - "resolutions": { - "ember": "~2.5.0" } } diff --git a/config/environment.js b/config/environment.js index a6feb08..0783652 100644 --- a/config/environment.js +++ b/config/environment.js @@ -4,7 +4,7 @@ module.exports = function(environment) { var ENV = { modulePrefix: 'villasweb-frontend', environment: environment, - baseURL: '/', + rootURL: '/', locationType: 'auto', EmberENV: { FEATURES: { @@ -12,7 +12,8 @@ module.exports = function(environment) { // e.g. 'with-controller': true }, EXTEND_PROTOTYPES: { - Date: false, + // Prevent Ember Data from overriding Date.parse. + Date: false } }, @@ -31,7 +32,6 @@ module.exports = function(environment) { if (environment === 'test') { // Testem prefers this... - ENV.baseURL = '/'; ENV.locationType = 'none'; // keep test console output quieter diff --git a/package.json b/package.json index 30d5a65..4640180 100644 --- a/package.json +++ b/package.json @@ -2,50 +2,53 @@ "name": "villasweb-frontend", "version": "0.0.0", "description": "Small description for villasweb-frontend goes here", - "private": true, + "license": "MIT", + "author": "", "directories": { "doc": "doc", "test": "tests" }, + "repository": "", "scripts": { "build": "ember build", "start": "ember server", "test": "ember test" }, - "repository": "", - "engines": { - "node": ">= 0.10.0" - }, - "author": "", - "license": "MIT", "devDependencies": { - "broccoli-asset-rev": "^2.4.2", - "ember-ajax": "0.7.1", - "ember-cli": "2.5.1", - "ember-cli-app-version": "^1.0.0", - "ember-cli-babel": "^5.1.6", - "ember-cli-dependency-checker": "^1.2.0", + "broccoli-asset-rev": "^2.4.5", + "ember-ajax": "^2.4.1", + "ember-cli": "2.11.0", + "ember-cli-app-version": "^2.0.0", + "ember-cli-babel": "^5.1.7", + "ember-cli-dependency-checker": "^1.3.0", "ember-cli-flot": "0.0.3", - "ember-cli-htmlbars": "^1.0.3", - "ember-cli-htmlbars-inline-precompile": "^0.3.1", - "ember-cli-inject-live-reload": "^1.4.0", + "ember-cli-htmlbars": "^1.1.1", + "ember-cli-htmlbars-inline-precompile": "^0.3.3", + "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-jquery-ui": "0.0.20", - "ember-cli-jshint": "^1.0.0", - "ember-cli-qunit": "^1.4.0", - "ember-cli-release": "0.2.8", + "ember-cli-jshint": "^2.0.1", + "ember-cli-qunit": "^3.0.1", + "ember-cli-release": "^0.2.9", "ember-cli-sass": "5.5.2", + "ember-cli-shims": "^1.0.2", "ember-cli-sri": "^2.1.0", + "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", - "ember-data": "^2.5.0", + "ember-data": "^2.11.0", "ember-export-application-global": "^1.0.5", - "ember-load-initializers": "^0.5.1", + "ember-load-initializers": "^0.6.0", "ember-modal-dialog": "^0.9.0", "ember-resolver": "^2.0.3", "ember-simple-auth": "^1.1.0", "ember-tether": "0.3.1", "ember-truth-helpers": "1.2.0", "ember-uploader": "1.2.3", - "loader.js": "^4.0.1" + "ember-source": "^2.11.0", + "ember-welcome-page": "^2.0.2", + "loader.js": "^4.0.10" }, - "dependencies": {} + "engines": { + "node": ">= 0.12.0" + }, + "private": true } diff --git a/tests/.jshintrc b/tests/.jshintrc index 6ec0b7c..d2bd113 100644 --- a/tests/.jshintrc +++ b/tests/.jshintrc @@ -47,6 +47,6 @@ "strict": false, "white": false, "eqnull": true, - "esnext": true, + "esversion": 6, "unused": true } diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 8c8b74e..76996fd 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -1,23 +1,23 @@ import { module } from 'qunit'; +import Ember from 'ember'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; +const { RSVP: { Promise } } = Ember; + export default function(name, options = {}) { module(name, { beforeEach() { this.application = startApp(); if (options.beforeEach) { - options.beforeEach.apply(this, arguments); + return options.beforeEach.apply(this, arguments); } }, afterEach() { - if (options.afterEach) { - options.afterEach.apply(this, arguments); - } - - destroyApp(this.application); + let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + return Promise.resolve(afterEach).then(() => destroyApp(this.application)); } }); } diff --git a/tests/index.html b/tests/index.html index 9cffb74..4def306 100644 --- a/tests/index.html +++ b/tests/index.html @@ -3,16 +3,16 @@ - VILLASwebFrontend Tests + VillaswebFrontend Tests {{content-for "head"}} {{content-for "test-head"}} - - - + + + {{content-for "head-footer"}} {{content-for "test-head-footer"}} @@ -21,12 +21,11 @@ {{content-for "body"}} {{content-for "test-body"}} - - - - - - + + + + + {{content-for "body-footer"}} {{content-for "test-body-footer"}} From ed6ea99d14ff99f8b570d5b4f7e3fe843178f58c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 1 Feb 2017 13:33:55 +0100 Subject: [PATCH 047/556] Add time length option to plot widget Increase simulation-data storage to 1200 entries --- app/components/widget-plot.js | 35 ++++++++++++++++++++---- app/controllers/visualization/edit.js | 2 +- app/models/simulation-data.js | 2 +- app/templates/components/widget-plot.hbs | 16 ++++++++++- 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js index 707f9fd..6bc681d 100644 --- a/app/components/widget-plot.js +++ b/app/components/widget-plot.js @@ -26,8 +26,6 @@ export default WidgetAbstract.extend({ xaxis: { mode: 'time', timeformat: '%M:%S', - /*min: firstTimestamp, - max: lastTimestamp,*/ axisLabel: 'time [min]', axisLabelUseCanvas: true }/*, @@ -39,12 +37,11 @@ export default WidgetAbstract.extend({ }, signals: Ember.A([]), - checkedSignals: {}, - plotType: "multiple", - + time: null, observeQuery: null, + selectedSignal: null, _updateDataObserver: Ember.on('init', Ember.observer('widget.widgetData.simulator', 'widget.widgetData.type', 'widget.widgetData.signals', function() { // get query for observer @@ -73,6 +70,10 @@ export default WidgetAbstract.extend({ if (simulator.get('simulatorid') === simulatorid) { // set simulation model self.set('simulationModel', simulationModel); + + if (self.get('selectedSignal') === null) { + self.set('selectedSignal', simulationModel.get('mapping')[0]); + } } }); }); @@ -100,6 +101,26 @@ export default WidgetAbstract.extend({ let values = this.get('data.' + simulatorId + '.flotValues'); var updatedValues = Ember.A([]); + // update plot options + var plotOptions = this.get('plotOptions'); + + // calculate diff for first and last timestamp + var firstTimestamp = values[0][0][0]; + var lastTimestamp = values[0][values[0].length - 1][0]; + + var diff = lastTimestamp - firstTimestamp; + var diffValue = this.get('widget.widgetData.time') * 1000; // javascript timestamps are in milliseconds + + if (diff > diffValue) { + firstTimestamp = lastTimestamp - diffValue; + } else { + lastTimestamp = +firstTimestamp + +diffValue; + } + + plotOptions.xaxis.min = firstTimestamp; + plotOptions.xaxis.max = lastTimestamp; + this.set('plotOptions', plotOptions); + // update values var index = 0; @@ -116,6 +137,7 @@ export default WidgetAbstract.extend({ // prepare modal this.set('name', this.get('widget.name')); this.set('plotType', this.get('widget.widgetData.type')); + this.set('time', this.get('widget.widgetData.time')); this.set('errorMessage', null); // get signal mapping for simulation model @@ -189,6 +211,7 @@ export default WidgetAbstract.extend({ }; widgetData.simulator = simulator.get('simulatorid'); + widgetData.time = self.get('time'); // set signals let mapping = simulationModel.get('mapping'); @@ -267,6 +290,8 @@ export default WidgetAbstract.extend({ this.set('widget.widgetData.signals', [ i ]); } } + + this.set('selectedSignal', signal); } } }); diff --git a/app/controllers/visualization/edit.js b/app/controllers/visualization/edit.js index ad31ff4..3478d7e 100644 --- a/app/controllers/visualization/edit.js +++ b/app/controllers/visualization/edit.js @@ -63,7 +63,7 @@ export default Ember.Controller.extend(FetchLiveDataMixin, { properties.name = 'Plot'; properties.width = 500; properties.height = 400; - properties.widgetData = { signals: [0], simulator: defaultSimulatorid, type: 'multiple' }; + properties.widgetData = { signals: [0], simulator: defaultSimulatorid, type: 'multiple', time: 300 }; } else if (name === 'image') { properties.type = 'widget-image'; properties.name = 'Image'; diff --git a/app/models/simulation-data.js b/app/models/simulation-data.js index b978222..37744dc 100644 --- a/app/models/simulation-data.js +++ b/app/models/simulation-data.js @@ -37,7 +37,7 @@ export default Model.extend({ this._flotValues[i].push([this.get('timestamp'), values[i]]); // discard old values - while (this._flotValues[i].length > 100) { + while (this._flotValues[i].length > 1200) { this._flotValues[i].shift(); } } diff --git a/app/templates/components/widget-plot.hbs b/app/templates/components/widget-plot.hbs index 6768416..7fd4040 100644 --- a/app/templates/components/widget-plot.hbs +++ b/app/templates/components/widget-plot.hbs @@ -10,7 +10,13 @@ {{#each simulationModel.mapping as |signal|}} - {{signal}} + {{#if (eq signal selectedSignal)}} + + {{signal}} + + {{else}} + {{signal}} + {{/if}} {{/each}} @@ -51,6 +57,14 @@ + + + + + + {{input type='number' id='time' placeholder='Enter time length' value=time}} + + From 31c3c9bf3356eff636dfaf34e652220983eb6f69 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 3 Feb 2017 15:02:35 +0100 Subject: [PATCH 048/556] Minor fixes --- app/adapters/application.js | 8 +++++++- app/components/widget-plot.js | 2 +- app/mixins/draggable.js | 2 +- app/mixins/droppable.js | 2 +- app/mixins/live-data.js | 2 +- app/mixins/resizable.js | 2 +- app/mixins/sortable.js | 2 +- app/services/session-user.js | 2 +- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/adapters/application.js b/app/adapters/application.js index 961ded9..c87b180 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -15,5 +15,11 @@ export default RESTAdapter.extend(DataAdapterMixin, { host: 'http://' + ENV.APP.API_HOST, namespace: 'api/v1', authorizer: 'authorizer:custom', - headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } + headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, + + urlForQueryRecord(query /*, modelName */) { + // Fix for /users/me query + let baseUrl = this.buildURL(); + return baseUrl + '/users/' + query; + } }); diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js index 6bc681d..9b553d7 100644 --- a/app/components/widget-plot.js +++ b/app/components/widget-plot.js @@ -114,7 +114,7 @@ export default WidgetAbstract.extend({ if (diff > diffValue) { firstTimestamp = lastTimestamp - diffValue; } else { - lastTimestamp = +firstTimestamp + +diffValue; + lastTimestamp = firstTimestamp + diffValue; } plotOptions.xaxis.min = firstTimestamp; diff --git a/app/mixins/draggable.js b/app/mixins/draggable.js index 811b31e..1edf9f4 100644 --- a/app/mixins/draggable.js +++ b/app/mixins/draggable.js @@ -17,7 +17,7 @@ export default Ember.Mixin.create({ uiDragEvents: [ 'create_drag', 'start_drag', 'drag_drag', 'stop_drag' ], didInsertElement() { - this._super(); + this._super.init(); // get available options and events var options = this._gatherDragOptions(); diff --git a/app/mixins/droppable.js b/app/mixins/droppable.js index 7e557e8..203ab21 100644 --- a/app/mixins/droppable.js +++ b/app/mixins/droppable.js @@ -16,7 +16,7 @@ export default Ember.Mixin.create({ 'out_drop', 'drop_drop' ], didInsertElement() { - this._super(); + this._super.init(); // get available options and events var options = this._gatherDropOptions(); diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js index 059c2a4..2ba081e 100644 --- a/app/mixins/live-data.js +++ b/app/mixins/live-data.js @@ -20,7 +20,7 @@ export default Ember.Mixin.create({ _sockets: {}, init: function() { - this._super(); + this._super.init(); // fetch the simulations for the first time this._fetchRunningSimulations(); diff --git a/app/mixins/resizable.js b/app/mixins/resizable.js index 28a1073..50c1383 100644 --- a/app/mixins/resizable.js +++ b/app/mixins/resizable.js @@ -18,7 +18,7 @@ export default Ember.Mixin.create({ uiResizeEvents: [ 'create_resize', 'start_resize', 'resize_resize', 'stop_resize' ], didInsertElement() { - this._super(); + this._super.init(); // get available options and events var options = this._gatherResizeOptions(); diff --git a/app/mixins/sortable.js b/app/mixins/sortable.js index 737367f..a69d4e8 100644 --- a/app/mixins/sortable.js +++ b/app/mixins/sortable.js @@ -21,7 +21,7 @@ export default Ember.Mixin.create({ 'sort_sort', 'start_sort', 'stop_sort', 'update_sort' ], didInsertElement() { - this._super(); + this._super.init(); // get available options and events var options = this._gatherSortOptions(); diff --git a/app/services/session-user.js b/app/services/session-user.js index ed736ac..06b94b9 100644 --- a/app/services/session-user.js +++ b/app/services/session-user.js @@ -24,7 +24,7 @@ export default Ember.Service.extend({ return new RSVP.Promise((resolve, reject) => { const token = this.get('session.data.authenticated.token'); if (!Ember.isEmpty(token)) { - return this.get('store').findRecord('user', 'me').then(function(user) { + return this.get('store').queryRecord('user', 'me').then(function(user) { _this.set('user', user); resolve(); }, function() { From 1104bcfec54e2c1088b79cb3cd14bc3fbd30d319 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 4 Feb 2017 15:11:41 +0100 Subject: [PATCH 049/556] Fix jquery-ui dependency Fix super class init --- app/mixins/draggable.js | 2 +- app/mixins/droppable.js | 2 +- app/mixins/live-data.js | 2 +- app/mixins/resizable.js | 2 +- app/mixins/sortable.js | 2 +- ember-cli-build.js | 5 +++++ package.json | 3 +-- 7 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/mixins/draggable.js b/app/mixins/draggable.js index 1edf9f4..811b31e 100644 --- a/app/mixins/draggable.js +++ b/app/mixins/draggable.js @@ -17,7 +17,7 @@ export default Ember.Mixin.create({ uiDragEvents: [ 'create_drag', 'start_drag', 'drag_drag', 'stop_drag' ], didInsertElement() { - this._super.init(); + this._super(); // get available options and events var options = this._gatherDragOptions(); diff --git a/app/mixins/droppable.js b/app/mixins/droppable.js index 203ab21..7e557e8 100644 --- a/app/mixins/droppable.js +++ b/app/mixins/droppable.js @@ -16,7 +16,7 @@ export default Ember.Mixin.create({ 'out_drop', 'drop_drop' ], didInsertElement() { - this._super.init(); + this._super(); // get available options and events var options = this._gatherDropOptions(); diff --git a/app/mixins/live-data.js b/app/mixins/live-data.js index 2ba081e..059c2a4 100644 --- a/app/mixins/live-data.js +++ b/app/mixins/live-data.js @@ -20,7 +20,7 @@ export default Ember.Mixin.create({ _sockets: {}, init: function() { - this._super.init(); + this._super(); // fetch the simulations for the first time this._fetchRunningSimulations(); diff --git a/app/mixins/resizable.js b/app/mixins/resizable.js index 50c1383..28a1073 100644 --- a/app/mixins/resizable.js +++ b/app/mixins/resizable.js @@ -18,7 +18,7 @@ export default Ember.Mixin.create({ uiResizeEvents: [ 'create_resize', 'start_resize', 'resize_resize', 'stop_resize' ], didInsertElement() { - this._super.init(); + this._super(); // get available options and events var options = this._gatherResizeOptions(); diff --git a/app/mixins/sortable.js b/app/mixins/sortable.js index a69d4e8..737367f 100644 --- a/app/mixins/sortable.js +++ b/app/mixins/sortable.js @@ -21,7 +21,7 @@ export default Ember.Mixin.create({ 'sort_sort', 'start_sort', 'stop_sort', 'update_sort' ], didInsertElement() { - this._super.init(); + this._super(); // get available options and events var options = this._gatherSortOptions(); diff --git a/ember-cli-build.js b/ember-cli-build.js index ab8a0ed..3418f9e 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -22,6 +22,11 @@ module.exports = function(defaults) { app.import('bower_components/bootstrap/dist/js/bootstrap.js'); app.import('bower_components/flot/jquery.flot.time.js'); + app.import('bower_components/jquery-ui/jquery-ui.js'); + + app.import('bower_components/jquery-ui/themes/smoothness/jquery-ui.css'); + + app.import('bower_components/jquery-ui/themes/smoothness/images/ui-icons_222222_256x240.png', { destDir: 'assets/images' }); return app.toTree(); }; diff --git a/package.json b/package.json index 4640180..1a3bcb0 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "ember-cli-htmlbars": "^1.1.1", "ember-cli-htmlbars-inline-precompile": "^0.3.3", "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-jquery-ui": "0.0.20", "ember-cli-jshint": "^2.0.1", "ember-cli-qunit": "^3.0.1", "ember-cli-release": "^0.2.9", @@ -40,10 +39,10 @@ "ember-modal-dialog": "^0.9.0", "ember-resolver": "^2.0.3", "ember-simple-auth": "^1.1.0", + "ember-source": "^2.11.0", "ember-tether": "0.3.1", "ember-truth-helpers": "1.2.0", "ember-uploader": "1.2.3", - "ember-source": "^2.11.0", "ember-welcome-page": "^2.0.2", "loader.js": "^4.0.10" }, From bc50ec11a6734f82096fed203276d3a7323f5539 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 4 Feb 2017 15:31:57 +0100 Subject: [PATCH 050/556] Allow empty widget names Fix resetting widget dialog error message --- app/components/widget-label.js | 1 + app/components/widget-plot.js | 5 ----- app/components/widget-table.js | 6 +----- app/components/widget-value.js | 6 +----- app/templates/components/widget-plot.hbs | 10 ++++++---- app/templates/components/widget-value.hbs | 2 +- 6 files changed, 10 insertions(+), 20 deletions(-) diff --git a/app/components/widget-label.js b/app/components/widget-label.js index 732430e..5fd22fe 100644 --- a/app/components/widget-label.js +++ b/app/components/widget-label.js @@ -19,6 +19,7 @@ export default WidgetAbstract.extend({ if (this.get('editing') === true) { // prepare modal this.set('name', this.get('widget.name')); + this.set('errorMessage', null); // show modal this.set('isShowingModal', true); diff --git a/app/components/widget-plot.js b/app/components/widget-plot.js index 9b553d7..7574de0 100644 --- a/app/components/widget-plot.js +++ b/app/components/widget-plot.js @@ -188,11 +188,6 @@ export default WidgetAbstract.extend({ // verify properties let properties = this.getProperties('name'); - if (properties['name'] === null || properties['name'] === "") { - this.set('errorMessage', 'Widget name is missing'); - return; - } - // set simulator by simulation model name let simulationModelName = this.get('simulationModelName'); let self = this; diff --git a/app/components/widget-table.js b/app/components/widget-table.js index 8272310..74c14bd 100644 --- a/app/components/widget-table.js +++ b/app/components/widget-table.js @@ -83,6 +83,7 @@ export default WidgetAbstract.extend({ if (this.get('editing') === true) { // prepare modal this.set('name', this.get('widget.name')); + this.set('errorMessage', null); // get simlator name from id let self = this; @@ -117,11 +118,6 @@ export default WidgetAbstract.extend({ // verify properties let properties = this.getProperties('name'); - if (properties['name'] === null || properties['name'] === "") { - this.set('errorMessage', 'Widget name is missing'); - return; - } - // set simulator by simulation model name let simulationModelName = this.get('simulationModelName'); let self = this; diff --git a/app/components/widget-value.js b/app/components/widget-value.js index ed42fb8..efcbfbe 100644 --- a/app/components/widget-value.js +++ b/app/components/widget-value.js @@ -44,6 +44,7 @@ export default WidgetAbstract.extend({ if (this.get('editing') === true) { // prepare modal this.set('name', this.get('widget.name')); + this.set('errorMessage', null); // get signal mapping for simulation model let self = this; @@ -82,11 +83,6 @@ export default WidgetAbstract.extend({ // verify properties let properties = this.getProperties('name'); - if (properties['name'] === null || properties['name'] === "") { - this.set('errorMessage', 'Widget name is missing'); - return; - } - // set simulator by simulation model name let simulationModelName = this.get('simulationModelName'); let self = this; diff --git a/app/templates/components/widget-plot.hbs b/app/templates/components/widget-plot.hbs index 7fd4040..8e95dda 100644 --- a/app/templates/components/widget-plot.hbs +++ b/app/templates/components/widget-plot.hbs @@ -35,6 +35,12 @@ {{#modal-dialog attachment="middle center" translucentOverlay=true}}

    Plot

    + {{#if errorMessage}} +

    + Error: {{errorMessage}} +

    + {{/if}} +
    @@ -102,9 +108,5 @@
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} {{/modal-dialog}} {{/if}} diff --git a/app/templates/components/widget-value.hbs b/app/templates/components/widget-value.hbs index 6bfb445..00c246b 100644 --- a/app/templates/components/widget-value.hbs +++ b/app/templates/components/widget-value.hbs @@ -1,4 +1,4 @@ -{{name}}: {{value}} +{{name}}{{#if name}}:{{/if}} {{value}} {{#if isShowingModal}} {{#modal-dialog attachment="middle center" translucentOverlay=true}} From 0cf1884192dac7652b6fdb8e8272414cdc789b07 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 2 Mar 2017 12:47:52 +0100 Subject: [PATCH 051/556] !!! Move complete project to ReactJS !!! ATTENTION: The complete project is ported to ReactJS. Motivation: React (with flux) is much more flexible and performant in the use case of VILLASweb. Ember is a good framework, but it has many tradeoffs to its easy handling and feature completeness. Many work arounds had to be done to get ember to work the way needed. Because ReactJS gives the developer much more flexibility and feature choice, VILLASweb can be build much better. The aim is to only depends on needed packages and be as performance as possible. This new version still works with the current backend! For library usage see package.json. This first version contains the same base website as the old version but changed back to legacy color scheme. Simulators are loaded from and can be added to the backend as a proof-of-concept. --- .bowerrc | 4 - .editorconfig | 20 - .ember-cli | 9 - .gitignore | 21 +- .jshintrc | 32 - .travis.yml | 24 - .watchmanconfig | 3 - README.md | 1588 ++++++++++++++++- app/adapters/application.js | 25 - app/app.js | 27 - app/authenticators/custom.js | 57 - app/authorizers/custom.js | 21 - app/components/.gitkeep | 0 app/components/draggable-dropzone.js | 41 - app/components/draggable-item.js | 25 - app/components/flow-plot.js | 27 - app/components/widget-abstract.js | 93 - app/components/widget-container.js | 53 - app/components/widget-image.js | 105 -- app/components/widget-label.js | 60 - app/components/widget-plot.js | 292 --- app/components/widget-table.js | 170 -- app/components/widget-value.js | 167 -- app/controllers/.gitkeep | 0 app/controllers/login.js | 23 - app/controllers/me.js | 25 - app/controllers/project/index.js | 116 -- app/controllers/projects.js | 151 -- app/controllers/simulation-model/index.js | 48 - app/controllers/simulation/index.js | 193 -- app/controllers/simulations.js | 153 -- app/controllers/simulators.js | 158 -- app/controllers/user/delete.js | 28 - app/controllers/user/edit.js | 28 - app/controllers/user/index.js | 26 - app/controllers/user/new.js | 30 - app/controllers/visualization/edit.js | 137 -- app/helpers/.gitkeep | 0 app/index.html | 25 - app/mixins/draggable.js | 84 - app/mixins/droppable.js | 83 - app/mixins/fetch-live-data.js | 61 - app/mixins/live-data.js | 186 -- app/mixins/resizable.js | 88 - app/mixins/sortable.js | 91 - app/models/.gitkeep | 0 app/models/file.js | 18 - app/models/project.js | 19 - app/models/simulation-data.js | 45 - app/models/simulation-model.js | 20 - app/models/simulation.js | 20 - app/models/simulator-status.js | 5 - app/models/simulator.js | 18 - app/models/user.js | 22 - app/models/visualization.js | 18 - app/models/widget.js | 23 - app/resolver.js | 3 - app/router.js | 55 - app/routes/.gitkeep | 0 app/routes/application.js | 34 - app/routes/dialog/plot/value.js | 4 - app/routes/index.js | 15 - app/routes/login.js | 14 - app/routes/logout.js | 17 - app/routes/me.js | 18 - app/routes/project/index.js | 17 - app/routes/projects.js | 25 - app/routes/simulation-model/index.js | 17 - app/routes/simulation/index.js | 20 - app/routes/simulations.js | 21 - app/routes/simulators.js | 18 - app/routes/user/delete.js | 17 - app/routes/user/edit.js | 17 - app/routes/user/index.js | 17 - app/routes/user/new.js | 14 - app/routes/visualization/edit.js | 17 - app/routes/visualization/index.js | 17 - app/serializers/application.js | 15 - app/serializers/project.js | 17 - app/serializers/simulation-model.js | 16 - app/serializers/simulation.js | 18 - app/serializers/user.js | 16 - app/serializers/visualization.js | 17 - app/services/session-user.js | 39 - app/styles/app.scss | 277 --- app/styles/models.scss | 51 - app/styles/projects.scss | 46 - app/styles/simulation-models.scss | 19 - app/styles/simulations.scss | 46 - app/styles/simulators.scss | 27 - app/styles/widgets.scss | 91 - app/templates/404.hbs | 1 - app/templates/application.hbs | 28 - app/templates/components/.gitkeep | 0 .../components/draggable-dropzone.hbs | 1 - app/templates/components/draggable-item.hbs | 1 - app/templates/components/file-upload.hbs | 1 - app/templates/components/flow-plot.hbs | 1 - app/templates/components/widget-abstract.hbs | 1 - app/templates/components/widget-chart.hbs | 1 - app/templates/components/widget-container.hbs | 3 - app/templates/components/widget-image.hbs | 51 - app/templates/components/widget-label.hbs | 27 - app/templates/components/widget-plot.hbs | 112 -- app/templates/components/widget-table.hbs | 56 - app/templates/components/widget-value.hbs | 55 - app/templates/dialog/project.hbs | 68 - app/templates/dialog/projects.hbs | 92 - app/templates/dialog/simulation.hbs | 108 -- app/templates/dialog/simulations.hbs | 86 - app/templates/dialog/simulators.hbs | 118 -- app/templates/index.hbs | 1 - app/templates/login.hbs | 19 - app/templates/logout.hbs | 1 - app/templates/me.hbs | 20 - app/templates/project/index.hbs | 31 - app/templates/projects.hbs | 33 - app/templates/simulation-model/index.hbs | 31 - app/templates/simulation/index.hbs | 35 - app/templates/simulations.hbs | 34 - app/templates/simulators.hbs | 43 - app/templates/user/delete.hbs | 10 - app/templates/user/edit.hbs | 14 - app/templates/user/index.hbs | 11 - app/templates/user/new.hbs | 21 - app/templates/visualization/edit.hbs | 37 - app/templates/visualization/index.hbs | 9 - app/transforms/array.js | 20 - bower.json | 8 - config/environment.js | 49 - ember-cli-build.js | 32 - package.json | 70 +- public/crossdomain.xml | 15 - public/favicon.ico | Bin 0 -> 24838 bytes public/index.html | 31 + public/robots.txt | 3 - src/App.test.js | 8 + src/api/rest-api.js | 46 + .../application.js => src/app-dispatcher.js | 14 +- .../components/footer.js | 24 +- src/components/header.js | 24 + src/components/menu-sidebar.js | 30 + src/components/table.js | 53 + src/containers/app.js | 55 + src/containers/home.js | 36 + src/containers/projects.js | 39 + src/containers/simulators.js | 72 + src/data-managers/simulators-data-manager.js | 43 + .../visualization => src}/index.js | 16 +- src/router.js | 32 + src/stores/simulator-store.js | 60 + src/stores/villas-store.js | 31 + src/styles/app.css | 138 ++ app/routes/404.js => src/styles/home.css | 11 +- src/styles/index.css | 4 + .../value.js => src/styles/projects.css | 11 +- .../styles/simulators.css | 11 +- testem.js | 13 - tests/.jshintrc | 52 - tests/helpers/destroy-app.js | 5 - tests/helpers/module-for-acceptance.js | 23 - tests/helpers/resolver.js | 11 - tests/helpers/start-app.js | 18 - tests/index.html | 33 - tests/integration/.gitkeep | 0 .../components/draggable-dropzone-test.js | 24 - .../components/draggable-item-test.js | 24 - .../components/file-upload-test.js | 24 - .../integration/components/flow-plot-test.js | 24 - .../components/plot-abstract-test.js | 24 - .../integration/components/plot-chart-test.js | 24 - .../components/plot-container-test.js | 24 - .../integration/components/plot-table-test.js | 24 - .../integration/components/plot-value-test.js | 24 - .../components/widget-image-test.js | 24 - .../components/widget-label-test.js | 24 - .../components/widget-plot-test.js | 24 - tests/test-helper.js | 6 - tests/unit/.gitkeep | 0 tests/unit/adapters/application-test.js | 12 - tests/unit/controllers/application-test.js | 12 - .../controllers/dialog/plot/value-test.js | 12 - tests/unit/controllers/login-test.js | 12 - tests/unit/controllers/project/index-test.js | 12 - tests/unit/controllers/projects-test.js | 12 - tests/unit/controllers/projects/new-test.js | 12 - .../simulation-model/index-test.js | 12 - .../unit/controllers/simulation/index-test.js | 12 - tests/unit/controllers/simulations-test.js | 12 - tests/unit/controllers/simulators-test.js | 12 - tests/unit/controllers/user/edit-test.js | 12 - tests/unit/controllers/users/delete-test.js | 12 - tests/unit/controllers/users/edit-test.js | 12 - tests/unit/controllers/users/index-test.js | 12 - tests/unit/controllers/users/new-test.js | 12 - .../controllers/visualization/edit-test.js | 12 - .../controllers/visualization/index-test.js | 12 - tests/unit/mixins/draggable-test.js | 12 - tests/unit/mixins/droppable-test.js | 12 - tests/unit/mixins/fetch-live-data-test.js | 12 - tests/unit/mixins/live-data-test.js | 12 - tests/unit/mixins/resizable-test.js | 12 - tests/unit/mixins/sortable-test.js | 12 - tests/unit/models/file-test.js | 12 - tests/unit/models/plot-test.js | 12 - tests/unit/models/project-test.js | 12 - tests/unit/models/simulation-data-test.js | 12 - tests/unit/models/simulation-model-test.js | 12 - tests/unit/models/simulation-test.js | 12 - tests/unit/models/simulator-status-test.js | 12 - tests/unit/models/simulator-test.js | 12 - tests/unit/models/user-test.js | 12 - tests/unit/models/visualization-test.js | 12 - tests/unit/routes/404-test.js | 11 - tests/unit/routes/application-test.js | 11 - tests/unit/routes/dialog/plot/value-test.js | 11 - tests/unit/routes/index-test.js | 11 - tests/unit/routes/login-test.js | 11 - tests/unit/routes/logout-test.js | 11 - tests/unit/routes/me-test.js | 11 - tests/unit/routes/models-test.js | 11 - tests/unit/routes/projects-test.js | 11 - tests/unit/routes/projects/delete-test.js | 11 - tests/unit/routes/projects/edit-test.js | 11 - tests/unit/routes/projects/index-test.js | 11 - tests/unit/routes/projects/new-test.js | 11 - tests/unit/routes/projects/project-test.js | 11 - .../routes/simulation-model/index-test.js | 11 - tests/unit/routes/simulation/index-test.js | 11 - tests/unit/routes/simulations-test.js | 11 - tests/unit/routes/simulators-test.js | 11 - tests/unit/routes/simulators/delete-test.js | 11 - tests/unit/routes/simulators/edit-test.js | 11 - tests/unit/routes/simulators/index-test.js | 11 - tests/unit/routes/user/delete-test.js | 11 - tests/unit/routes/user/edit-test.js | 11 - tests/unit/routes/user/index-test.js | 11 - tests/unit/routes/user/new-test.js | 11 - tests/unit/routes/visualization/edit-test.js | 11 - tests/unit/routes/visualization/index-test.js | 11 - tests/unit/serializers/application-test.js | 15 - tests/unit/serializers/project-test.js | 15 - .../unit/serializers/simulation-model-test.js | 15 - tests/unit/serializers/simulation-test.js | 15 - tests/unit/serializers/user-test.js | 15 - tests/unit/serializers/visualization-test.js | 15 - tests/unit/services/session-user-test.js | 12 - tests/unit/transforms/array-test.js | 12 - todo.md | 89 - vendor/.gitkeep | 0 250 files changed, 2330 insertions(+), 7052 deletions(-) delete mode 100644 .bowerrc delete mode 100644 .editorconfig delete mode 100644 .ember-cli delete mode 100644 .jshintrc delete mode 100644 .travis.yml delete mode 100644 .watchmanconfig delete mode 100644 app/adapters/application.js delete mode 100644 app/app.js delete mode 100644 app/authenticators/custom.js delete mode 100644 app/authorizers/custom.js delete mode 100644 app/components/.gitkeep delete mode 100644 app/components/draggable-dropzone.js delete mode 100644 app/components/draggable-item.js delete mode 100644 app/components/flow-plot.js delete mode 100644 app/components/widget-abstract.js delete mode 100644 app/components/widget-container.js delete mode 100644 app/components/widget-image.js delete mode 100644 app/components/widget-label.js delete mode 100644 app/components/widget-plot.js delete mode 100644 app/components/widget-table.js delete mode 100644 app/components/widget-value.js delete mode 100644 app/controllers/.gitkeep delete mode 100644 app/controllers/login.js delete mode 100644 app/controllers/me.js delete mode 100644 app/controllers/project/index.js delete mode 100644 app/controllers/projects.js delete mode 100644 app/controllers/simulation-model/index.js delete mode 100644 app/controllers/simulation/index.js delete mode 100644 app/controllers/simulations.js delete mode 100644 app/controllers/simulators.js delete mode 100644 app/controllers/user/delete.js delete mode 100644 app/controllers/user/edit.js delete mode 100644 app/controllers/user/index.js delete mode 100644 app/controllers/user/new.js delete mode 100644 app/controllers/visualization/edit.js delete mode 100644 app/helpers/.gitkeep delete mode 100644 app/index.html delete mode 100644 app/mixins/draggable.js delete mode 100644 app/mixins/droppable.js delete mode 100644 app/mixins/fetch-live-data.js delete mode 100644 app/mixins/live-data.js delete mode 100644 app/mixins/resizable.js delete mode 100644 app/mixins/sortable.js delete mode 100644 app/models/.gitkeep delete mode 100644 app/models/file.js delete mode 100644 app/models/project.js delete mode 100644 app/models/simulation-data.js delete mode 100644 app/models/simulation-model.js delete mode 100644 app/models/simulation.js delete mode 100644 app/models/simulator-status.js delete mode 100644 app/models/simulator.js delete mode 100644 app/models/user.js delete mode 100644 app/models/visualization.js delete mode 100644 app/models/widget.js delete mode 100644 app/resolver.js delete mode 100644 app/router.js delete mode 100644 app/routes/.gitkeep delete mode 100644 app/routes/application.js delete mode 100644 app/routes/dialog/plot/value.js delete mode 100644 app/routes/index.js delete mode 100644 app/routes/login.js delete mode 100644 app/routes/logout.js delete mode 100644 app/routes/me.js delete mode 100644 app/routes/project/index.js delete mode 100644 app/routes/projects.js delete mode 100644 app/routes/simulation-model/index.js delete mode 100644 app/routes/simulation/index.js delete mode 100644 app/routes/simulations.js delete mode 100644 app/routes/simulators.js delete mode 100644 app/routes/user/delete.js delete mode 100644 app/routes/user/edit.js delete mode 100644 app/routes/user/index.js delete mode 100644 app/routes/user/new.js delete mode 100644 app/routes/visualization/edit.js delete mode 100644 app/routes/visualization/index.js delete mode 100644 app/serializers/application.js delete mode 100644 app/serializers/project.js delete mode 100644 app/serializers/simulation-model.js delete mode 100644 app/serializers/simulation.js delete mode 100644 app/serializers/user.js delete mode 100644 app/serializers/visualization.js delete mode 100644 app/services/session-user.js delete mode 100644 app/styles/app.scss delete mode 100644 app/styles/models.scss delete mode 100644 app/styles/projects.scss delete mode 100644 app/styles/simulation-models.scss delete mode 100644 app/styles/simulations.scss delete mode 100644 app/styles/simulators.scss delete mode 100644 app/styles/widgets.scss delete mode 100644 app/templates/404.hbs delete mode 100644 app/templates/application.hbs delete mode 100644 app/templates/components/.gitkeep delete mode 100644 app/templates/components/draggable-dropzone.hbs delete mode 100644 app/templates/components/draggable-item.hbs delete mode 100644 app/templates/components/file-upload.hbs delete mode 100644 app/templates/components/flow-plot.hbs delete mode 100644 app/templates/components/widget-abstract.hbs delete mode 100644 app/templates/components/widget-chart.hbs delete mode 100644 app/templates/components/widget-container.hbs delete mode 100644 app/templates/components/widget-image.hbs delete mode 100644 app/templates/components/widget-label.hbs delete mode 100644 app/templates/components/widget-plot.hbs delete mode 100644 app/templates/components/widget-table.hbs delete mode 100644 app/templates/components/widget-value.hbs delete mode 100644 app/templates/dialog/project.hbs delete mode 100644 app/templates/dialog/projects.hbs delete mode 100644 app/templates/dialog/simulation.hbs delete mode 100644 app/templates/dialog/simulations.hbs delete mode 100644 app/templates/dialog/simulators.hbs delete mode 100644 app/templates/index.hbs delete mode 100644 app/templates/login.hbs delete mode 100644 app/templates/logout.hbs delete mode 100644 app/templates/me.hbs delete mode 100644 app/templates/project/index.hbs delete mode 100644 app/templates/projects.hbs delete mode 100644 app/templates/simulation-model/index.hbs delete mode 100644 app/templates/simulation/index.hbs delete mode 100644 app/templates/simulations.hbs delete mode 100644 app/templates/simulators.hbs delete mode 100644 app/templates/user/delete.hbs delete mode 100644 app/templates/user/edit.hbs delete mode 100644 app/templates/user/index.hbs delete mode 100644 app/templates/user/new.hbs delete mode 100644 app/templates/visualization/edit.hbs delete mode 100644 app/templates/visualization/index.hbs delete mode 100644 app/transforms/array.js delete mode 100644 bower.json delete mode 100644 config/environment.js delete mode 100644 ember-cli-build.js delete mode 100644 public/crossdomain.xml create mode 100644 public/favicon.ico create mode 100644 public/index.html delete mode 100644 public/robots.txt create mode 100644 src/App.test.js create mode 100644 src/api/rest-api.js rename app/controllers/application.js => src/app-dispatcher.js (59%) rename app/components/file-upload.js => src/components/footer.js (51%) create mode 100644 src/components/header.js create mode 100644 src/components/menu-sidebar.js create mode 100644 src/components/table.js create mode 100644 src/containers/app.js create mode 100644 src/containers/home.js create mode 100644 src/containers/projects.js create mode 100644 src/containers/simulators.js create mode 100644 src/data-managers/simulators-data-manager.js rename {app/controllers/visualization => src}/index.js (56%) create mode 100644 src/router.js create mode 100644 src/stores/simulator-store.js create mode 100644 src/stores/villas-store.js create mode 100644 src/styles/app.css rename app/routes/404.js => src/styles/home.css (66%) create mode 100644 src/styles/index.css rename app/controllers/dialog/widget/value.js => src/styles/projects.css (65%) rename app/components/widget-chart.js => src/styles/simulators.css (64%) delete mode 100644 testem.js delete mode 100644 tests/.jshintrc delete mode 100644 tests/helpers/destroy-app.js delete mode 100644 tests/helpers/module-for-acceptance.js delete mode 100644 tests/helpers/resolver.js delete mode 100644 tests/helpers/start-app.js delete mode 100644 tests/index.html delete mode 100644 tests/integration/.gitkeep delete mode 100644 tests/integration/components/draggable-dropzone-test.js delete mode 100644 tests/integration/components/draggable-item-test.js delete mode 100644 tests/integration/components/file-upload-test.js delete mode 100644 tests/integration/components/flow-plot-test.js delete mode 100644 tests/integration/components/plot-abstract-test.js delete mode 100644 tests/integration/components/plot-chart-test.js delete mode 100644 tests/integration/components/plot-container-test.js delete mode 100644 tests/integration/components/plot-table-test.js delete mode 100644 tests/integration/components/plot-value-test.js delete mode 100644 tests/integration/components/widget-image-test.js delete mode 100644 tests/integration/components/widget-label-test.js delete mode 100644 tests/integration/components/widget-plot-test.js delete mode 100644 tests/test-helper.js delete mode 100644 tests/unit/.gitkeep delete mode 100644 tests/unit/adapters/application-test.js delete mode 100644 tests/unit/controllers/application-test.js delete mode 100644 tests/unit/controllers/dialog/plot/value-test.js delete mode 100644 tests/unit/controllers/login-test.js delete mode 100644 tests/unit/controllers/project/index-test.js delete mode 100644 tests/unit/controllers/projects-test.js delete mode 100644 tests/unit/controllers/projects/new-test.js delete mode 100644 tests/unit/controllers/simulation-model/index-test.js delete mode 100644 tests/unit/controllers/simulation/index-test.js delete mode 100644 tests/unit/controllers/simulations-test.js delete mode 100644 tests/unit/controllers/simulators-test.js delete mode 100644 tests/unit/controllers/user/edit-test.js delete mode 100644 tests/unit/controllers/users/delete-test.js delete mode 100644 tests/unit/controllers/users/edit-test.js delete mode 100644 tests/unit/controllers/users/index-test.js delete mode 100644 tests/unit/controllers/users/new-test.js delete mode 100644 tests/unit/controllers/visualization/edit-test.js delete mode 100644 tests/unit/controllers/visualization/index-test.js delete mode 100644 tests/unit/mixins/draggable-test.js delete mode 100644 tests/unit/mixins/droppable-test.js delete mode 100644 tests/unit/mixins/fetch-live-data-test.js delete mode 100644 tests/unit/mixins/live-data-test.js delete mode 100644 tests/unit/mixins/resizable-test.js delete mode 100644 tests/unit/mixins/sortable-test.js delete mode 100644 tests/unit/models/file-test.js delete mode 100644 tests/unit/models/plot-test.js delete mode 100644 tests/unit/models/project-test.js delete mode 100644 tests/unit/models/simulation-data-test.js delete mode 100644 tests/unit/models/simulation-model-test.js delete mode 100644 tests/unit/models/simulation-test.js delete mode 100644 tests/unit/models/simulator-status-test.js delete mode 100644 tests/unit/models/simulator-test.js delete mode 100644 tests/unit/models/user-test.js delete mode 100644 tests/unit/models/visualization-test.js delete mode 100644 tests/unit/routes/404-test.js delete mode 100644 tests/unit/routes/application-test.js delete mode 100644 tests/unit/routes/dialog/plot/value-test.js delete mode 100644 tests/unit/routes/index-test.js delete mode 100644 tests/unit/routes/login-test.js delete mode 100644 tests/unit/routes/logout-test.js delete mode 100644 tests/unit/routes/me-test.js delete mode 100644 tests/unit/routes/models-test.js delete mode 100644 tests/unit/routes/projects-test.js delete mode 100644 tests/unit/routes/projects/delete-test.js delete mode 100644 tests/unit/routes/projects/edit-test.js delete mode 100644 tests/unit/routes/projects/index-test.js delete mode 100644 tests/unit/routes/projects/new-test.js delete mode 100644 tests/unit/routes/projects/project-test.js delete mode 100644 tests/unit/routes/simulation-model/index-test.js delete mode 100644 tests/unit/routes/simulation/index-test.js delete mode 100644 tests/unit/routes/simulations-test.js delete mode 100644 tests/unit/routes/simulators-test.js delete mode 100644 tests/unit/routes/simulators/delete-test.js delete mode 100644 tests/unit/routes/simulators/edit-test.js delete mode 100644 tests/unit/routes/simulators/index-test.js delete mode 100644 tests/unit/routes/user/delete-test.js delete mode 100644 tests/unit/routes/user/edit-test.js delete mode 100644 tests/unit/routes/user/index-test.js delete mode 100644 tests/unit/routes/user/new-test.js delete mode 100644 tests/unit/routes/visualization/edit-test.js delete mode 100644 tests/unit/routes/visualization/index-test.js delete mode 100644 tests/unit/serializers/application-test.js delete mode 100644 tests/unit/serializers/project-test.js delete mode 100644 tests/unit/serializers/simulation-model-test.js delete mode 100644 tests/unit/serializers/simulation-test.js delete mode 100644 tests/unit/serializers/user-test.js delete mode 100644 tests/unit/serializers/visualization-test.js delete mode 100644 tests/unit/services/session-user-test.js delete mode 100644 tests/unit/transforms/array-test.js delete mode 100644 todo.md delete mode 100644 vendor/.gitkeep diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index 959e169..0000000 --- a/.bowerrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "directory": "bower_components", - "analytics": false -} diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 219985c..0000000 --- a/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 2 - -[*.hbs] -insert_final_newline = false - -[*.{diff,md}] -trim_trailing_whitespace = false diff --git a/.ember-cli b/.ember-cli deleted file mode 100644 index ee64cfe..0000000 --- a/.ember-cli +++ /dev/null @@ -1,9 +0,0 @@ -{ - /** - Ember CLI sends analytics information by default. The data is completely - anonymous, but there are times when you might want to disable this behavior. - - Setting `disableAnalytics` to true will prevent any data from being sent. - */ - "disableAnalytics": false -} diff --git a/.gitignore b/.gitignore index 5ad14dd..927d17b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,18 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. -# compiled output -/dist -/tmp - # dependencies /node_modules -/bower_components + +# testing +/coverage + +# production +/build # misc -/.sass-cache -/connect.lock -/coverage/* -/libpeerconnection.log +.DS_Store +.env npm-debug.log* -testem.log +yarn-debug.log* +yarn-error.log* + diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index d421faa..0000000 --- a/.jshintrc +++ /dev/null @@ -1,32 +0,0 @@ -{ - "predef": [ - "document", - "window", - "-Promise" - ], - "browser": true, - "boss": true, - "curly": true, - "debug": false, - "devel": true, - "eqeqeq": true, - "evil": true, - "forin": false, - "immed": false, - "laxbreak": false, - "newcap": true, - "noarg": true, - "noempty": false, - "nonew": false, - "nomen": false, - "onevar": false, - "plusplus": false, - "regexp": false, - "undef": true, - "sub": true, - "strict": false, - "white": false, - "eqnull": true, - "esversion": 6, - "unused": true -} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a75f20e..0000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -language: node_js -node_js: - - "4" - -sudo: false - -cache: - directories: - - $HOME/.npm - - $HOME/.cache # includes bowers cache - -before_install: - - npm config set spin false - - npm install -g bower phantomjs-prebuilt - - bower --version - - phantomjs --version - -install: - - npm install - - bower install - -script: - - npm test diff --git a/.watchmanconfig b/.watchmanconfig deleted file mode 100644 index e7834e3..0000000 --- a/.watchmanconfig +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ignore_dirs": ["tmp", "dist"] -} diff --git a/README.md b/README.md index 8081f80..e290b93 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,1572 @@ -# villasweb-frontend +This project was bootstrapped with [Create React App](https://github.com/facebookincubator/create-react-app). -This README outlines the details of collaborating on this Ember application. -A short introduction of this app could easily go here. +Below you will find some information on how to perform common tasks.
    +You can find the most recent version of this guide [here](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md). -## Prerequisites +## Table of Contents -You will need the following things properly installed on your computer. +- [Updating to New Releases](#updating-to-new-releases) +- [Sending Feedback](#sending-feedback) +- [Folder Structure](#folder-structure) +- [Available Scripts](#available-scripts) + - [npm start](#npm-start) + - [npm test](#npm-test) + - [npm run build](#npm-run-build) + - [npm run eject](#npm-run-eject) +- [Supported Language Features and Polyfills](#supported-language-features-and-polyfills) +- [Syntax Highlighting in the Editor](#syntax-highlighting-in-the-editor) +- [Displaying Lint Output in the Editor](#displaying-lint-output-in-the-editor) +- [Debugging in the Editor](#debugging-in-the-editor) +- [Changing the Page ``](#changing-the-page-title) +- [Installing a Dependency](#installing-a-dependency) +- [Importing a Component](#importing-a-component) +- [Adding a Stylesheet](#adding-a-stylesheet) +- [Post-Processing CSS](#post-processing-css) +- [Adding a CSS Preprocessor (Sass, Less etc.)](#adding-a-css-preprocessor-sass-less-etc) +- [Adding Images and Fonts](#adding-images-and-fonts) +- [Using the `public` Folder](#using-the-public-folder) + - [Changing the HTML](#changing-the-html) + - [Adding Assets Outside of the Module System](#adding-assets-outside-of-the-module-system) + - [When to Use the `public` Folder](#when-to-use-the-public-folder) +- [Using Global Variables](#using-global-variables) +- [Adding Bootstrap](#adding-bootstrap) + - [Using a Custom Theme](#using-a-custom-theme) +- [Adding Flow](#adding-flow) +- [Adding Custom Environment Variables](#adding-custom-environment-variables) + - [Referencing Environment Variables in the HTML](#referencing-environment-variables-in-the-html) + - [Adding Temporary Environment Variables In Your Shell](#adding-temporary-environment-variables-in-your-shell) + - [Adding Development Environment Variables In `.env`](#adding-development-environment-variables-in-env) +- [Can I Use Decorators?](#can-i-use-decorators) +- [Integrating with an API Backend](#integrating-with-an-api-backend) + - [Node](#node) + - [Ruby on Rails](#ruby-on-rails) +- [Proxying API Requests in Development](#proxying-api-requests-in-development) +- [Using HTTPS in Development](#using-https-in-development) +- [Generating Dynamic `<meta>` Tags on the Server](#generating-dynamic-meta-tags-on-the-server) +- [Pre-Rendering into Static HTML Files](#pre-rendering-into-static-html-files) +- [Injecting Data from the Server into the Page](#injecting-data-from-the-server-into-the-page) +- [Running Tests](#running-tests) + - [Filename Conventions](#filename-conventions) + - [Command Line Interface](#command-line-interface) + - [Version Control Integration](#version-control-integration) + - [Writing Tests](#writing-tests) + - [Testing Components](#testing-components) + - [Using Third Party Assertion Libraries](#using-third-party-assertion-libraries) + - [Initializing Test Environment](#initializing-test-environment) + - [Focusing and Excluding Tests](#focusing-and-excluding-tests) + - [Coverage Reporting](#coverage-reporting) + - [Continuous Integration](#continuous-integration) + - [Disabling jsdom](#disabling-jsdom) + - [Snapshot Testing](#snapshot-testing) + - [Editor Integration](#editor-integration) +- [Developing Components in Isolation](#developing-components-in-isolation) +- [Making a Progressive Web App](#making-a-progressive-web-app) +- [Deployment](#deployment) + - [Serving Apps with Client-Side Routing](#serving-apps-with-client-side-routing) + - [Building for Relative Paths](#building-for-relative-paths) + - [Azure](#azure) + - [Firebase](#firebase) + - [GitHub Pages](#github-pages) + - [Heroku](#heroku) + - [Modulus](#modulus) + - [Netlify](#netlify) + - [Now](#now) + - [S3 and CloudFront](#s3-and-cloudfront) + - [Surge](#surge) +- [Advanced Configuration](#advanced-configuration) +- [Troubleshooting](#troubleshooting) + - [`npm start` doesn’t detect changes](#npm-start-doesnt-detect-changes) + - [`npm test` hangs on macOS Sierra](#npm-test-hangs-on-macos-sierra) + - [`npm run build` silently fails](#npm-run-build-silently-fails) + - [`npm run build` fails on Heroku](#npm-run-build-fails-on-heroku) +- [Something Missing?](#something-missing) -* [Git](https://git-scm.com/) -* [Node.js](https://nodejs.org/) (with NPM) -* [Bower](https://bower.io/) -* [Ember CLI](https://ember-cli.com/) -* [PhantomJS](http://phantomjs.org/) +## Updating to New Releases -## Installation +Create React App is divided into two packages: -* `git clone <repository-url>` this repository -* `cd villasweb-frontend` -* `npm install` -* `bower install` +* `create-react-app` is a global command-line utility that you use to create new projects. +* `react-scripts` is a development dependency in the generated projects (including this one). -## Running / Development +You almost never need to update `create-react-app` itself: it delegates all the setup to `react-scripts`. -* `ember serve` -* Visit your app at [http://localhost:4200](http://localhost:4200). +When you run `create-react-app`, it always creates the project with the latest version of `react-scripts` so you’ll get all the new features and improvements in newly created apps automatically. -### Code Generators +To update an existing project to a new version of `react-scripts`, [open the changelog](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md), find the version you’re currently on (check `package.json` in this folder if you’re not sure), and apply the migration instructions for the newer versions. -Make use of the many generators for code, try `ember help generate` for more details +In most cases bumping the `react-scripts` version in `package.json` and running `npm install` in this folder should be enough, but it’s good to consult the [changelog](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md) for potential breaking changes. -### Running Tests +We commit to keeping the breaking changes minimal so you can upgrade `react-scripts` painlessly. -* `ember test` -* `ember test --server` +## Sending Feedback -### Building +We are always open to [your feedback](https://github.com/facebookincubator/create-react-app/issues). -* `ember build` (development) -* `ember build --environment production` (production) +## Folder Structure -### Deploying +After creation, your project should look like this: -Specify what it takes to deploy your app. +``` +my-app/ + README.md + node_modules/ + package.json + public/ + index.html + favicon.ico + src/ + App.css + App.js + App.test.js + index.css + index.js + logo.svg +``` -## Further Reading / Useful Links +For the project to build, **these files must exist with exact filenames**: -* [ember.js](http://emberjs.com/) -* [ember-cli](https://ember-cli.com/) -* Development Browser Extensions - * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) - * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) +* `public/index.html` is the page template; +* `src/index.js` is the JavaScript entry point. + +You can delete or rename the other files. + +You may create subdirectories inside `src`. For faster rebuilds, only files inside `src` are processed by Webpack.<br> +You need to **put any JS and CSS files inside `src`**, or Webpack won’t see them. + +Only files inside `public` can be used from `public/index.html`.<br> +Read instructions below for using assets from JavaScript and HTML. + +You can, however, create more top-level directories.<br> +They will not be included in the production build so you can use them for things like documentation. + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.<br> +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.<br> +You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.<br> +See the section about [running tests](#running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.<br> +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.<br> +Your app is ready to be deployed! + +See the section about [deployment](#deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Supported Language Features and Polyfills + +This project supports a superset of the latest JavaScript standard.<br> +In addition to [ES6](https://github.com/lukehoban/es6features) syntax features, it also supports: + +* [Exponentiation Operator](https://github.com/rwaldron/exponentiation-operator) (ES2016). +* [Async/await](https://github.com/tc39/ecmascript-asyncawait) (ES2017). +* [Object Rest/Spread Properties](https://github.com/sebmarkbage/ecmascript-rest-spread) (stage 3 proposal). +* [Class Fields and Static Properties](https://github.com/tc39/proposal-class-public-fields) (stage 2 proposal). +* [JSX](https://facebook.github.io/react/docs/introducing-jsx.html) and [Flow](https://flowtype.org/) syntax. + +Learn more about [different proposal stages](https://babeljs.io/docs/plugins/#presets-stage-x-experimental-presets-). + +While we recommend to use experimental proposals with some caution, Facebook heavily uses these features in the product code, so we intend to provide [codemods](https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb) if any of these proposals change in the future. + +Note that **the project only includes a few ES6 [polyfills](https://en.wikipedia.org/wiki/Polyfill)**: + +* [`Object.assign()`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) via [`object-assign`](https://github.com/sindresorhus/object-assign). +* [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) via [`promise`](https://github.com/then/promise). +* [`fetch()`](https://developer.mozilla.org/en/docs/Web/API/Fetch_API) via [`whatwg-fetch`](https://github.com/github/fetch). + +If you use any other ES6+ features that need **runtime support** (such as `Array.from()` or `Symbol`), make sure you are including the appropriate polyfills manually, or that the browsers you are targeting already support them. + +## Syntax Highlighting in the Editor + +To configure the syntax highlighting in your favorite text editor, head to the [relevant Babel documentation page](https://babeljs.io/docs/editors) and follow the instructions. Some of the most popular editors are covered. + +## Displaying Lint Output in the Editor + +>Note: this feature is available with `react-scripts@0.2.0` and higher. + +Some editors, including Sublime Text, Atom, and Visual Studio Code, provide plugins for ESLint. + +They are not required for linting. You should see the linter output right in your terminal as well as the browser console. However, if you prefer the lint results to appear right in your editor, there are some extra steps you can do. + +You would need to install an ESLint plugin for your editor first. + +>**A note for Atom `linter-eslint` users** + +>If you are using the Atom `linter-eslint` plugin, make sure that **Use global ESLint installation** option is checked: + +><img src="http://i.imgur.com/yVNNHJM.png" width="300"> + + +>**For Visual Studio Code users** + +>VS Code ESLint plugin automatically detects Create React App's configuration file. So you do not need to create `eslintrc.json` at the root directory, except when you want to add your own rules. In that case, you should include CRA's config by adding this line: + +>```js +{ + // ... + "extends": "react-app" +} +``` + +Then add this block to the `package.json` file of your project: + +```js +{ + // ... + "eslintConfig": { + "extends": "react-app" + } +} +``` + +Finally, you will need to install some packages *globally*: + +```sh +npm install -g eslint-config-react-app@0.3.0 eslint@3.8.1 babel-eslint@7.0.0 eslint-plugin-react@6.4.1 eslint-plugin-import@2.0.1 eslint-plugin-jsx-a11y@2.2.3 eslint-plugin-flowtype@2.21.0 +``` + +We recognize that this is suboptimal, but it is currently required due to the way we hide the ESLint dependency. The ESLint team is already [working on a solution to this](https://github.com/eslint/eslint/issues/3458) so this may become unnecessary in a couple of months. + +## Debugging in the Editor + +**This feature is currently only supported by [Visual Studio Code](https://code.visualstudio.com) editor.** + +Visual Studio Code supports live-editing and debugging out of the box with Create React App. This enables you as a developer to write and debug your React code without leaving the editor, and most importantly it enables you to have a continuous development workflow, where context switching is minimal, as you don’t have to switch between tools. + +You would need to have the latest version of [VS Code](https://code.visualstudio.com) and VS Code [Chrome Debugger Extension](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) installed. + +Then add the block below to your `launch.json` file and put it inside the `.vscode` folder in your app’s root directory. + +```json +{ + "version": "0.2.0", + "configurations": [{ + "name": "Chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000", + "webRoot": "${workspaceRoot}/src", + "userDataDir": "${workspaceRoot}/.vscode/chrome", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + } + }] +} +``` + +Start your app by running `npm start`, and start debugging in VS Code by pressing `F5` or by clicking the green debug icon. You can now write code, set breakpoints, make changes to the code, and debug your newly modified code—all from your editor. + +## Changing the Page `<title>` + +You can find the source HTML file in the `public` folder of the generated project. You may edit the `<title>` tag in it to change the title from “React App” to anything else. + +Note that normally you wouldn’t edit files in the `public` folder very often. For example, [adding a stylesheet](#adding-a-stylesheet) is done without touching the HTML. + +If you need to dynamically update the page title based on the content, you can use the browser [`document.title`](https://developer.mozilla.org/en-US/docs/Web/API/Document/title) API. For more complex scenarios when you want to change the title from React components, you can use [React Helmet](https://github.com/nfl/react-helmet), a third party library. + +If you use a custom server for your app in production and want to modify the title before it gets sent to the browser, you can follow advice in [this section](#generating-dynamic-meta-tags-on-the-server). Alternatively, you can pre-build each page as a static HTML file which then loads the JavaScript bundle, which is covered [here](#pre-rendering-into-static-html-files). + +## Installing a Dependency + +The generated project includes React and ReactDOM as dependencies. It also includes a set of scripts used by Create React App as a development dependency. You may install other dependencies (for example, React Router) with `npm`: + +``` +npm install --save <library-name> +``` + +## Importing a Component + +This project setup supports ES6 modules thanks to Babel.<br> +While you can still use `require()` and `module.exports`, we encourage you to use [`import` and `export`](http://exploringjs.com/es6/ch_modules.html) instead. + +For example: + +### `Button.js` + +```js +import React, { Component } from 'react'; + +class Button extends Component { + render() { + // ... + } +} + +export default Button; // Don’t forget to use export default! +``` + +### `DangerButton.js` + + +```js +import React, { Component } from 'react'; +import Button from './Button'; // Import a component from another file + +class DangerButton extends Component { + render() { + return <Button color="red" />; + } +} + +export default DangerButton; +``` + +Be aware of the [difference between default and named exports](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281). It is a common source of mistakes. + +We suggest that you stick to using default imports and exports when a module only exports a single thing (for example, a component). That’s what you get when you use `export default Button` and `import Button from './Button'`. + +Named exports are useful for utility modules that export several functions. A module may have at most one default export and as many named exports as you like. + +Learn more about ES6 modules: + +* [When to use the curly braces?](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281) +* [Exploring ES6: Modules](http://exploringjs.com/es6/ch_modules.html) +* [Understanding ES6: Modules](https://leanpub.com/understandinges6/read#leanpub-auto-encapsulating-code-with-modules) + +## Adding a Stylesheet + +This project setup uses [Webpack](https://webpack.github.io/) for handling all assets. Webpack offers a custom way of “extending” the concept of `import` beyond JavaScript. To express that a JavaScript file depends on a CSS file, you need to **import the CSS from the JavaScript file**: + +### `Button.css` + +```css +.Button { + padding: 20px; +} +``` + +### `Button.js` + +```js +import React, { Component } from 'react'; +import './Button.css'; // Tell Webpack that Button.js uses these styles + +class Button extends Component { + render() { + // You can use them as regular CSS styles + return <div className="Button" />; + } +} +``` + +**This is not required for React** but many people find this feature convenient. You can read about the benefits of this approach [here](https://medium.com/seek-ui-engineering/block-element-modifying-your-javascript-components-d7f99fcab52b). However you should be aware that this makes your code less portable to other build tools and environments than Webpack. + +In development, expressing dependencies this way allows your styles to be reloaded on the fly as you edit them. In production, all CSS files will be concatenated into a single minified `.css` file in the build output. + +If you are concerned about using Webpack-specific semantics, you can put all your CSS right into `src/index.css`. It would still be imported from `src/index.js`, but you could always remove that import if you later migrate to a different build tool. + +## Post-Processing CSS + +This project setup minifies your CSS and adds vendor prefixes to it automatically through [Autoprefixer](https://github.com/postcss/autoprefixer) so you don’t need to worry about it. + +For example, this: + +```css +.App { + display: flex; + flex-direction: row; + align-items: center; +} +``` + +becomes this: + +```css +.App { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +``` + +If you need to disable autoprefixing for some reason, [follow this section](https://github.com/postcss/autoprefixer#disabling). + +## Adding a CSS Preprocessor (Sass, Less etc.) + +Generally, we recommend that you don’t reuse the same CSS classes across different components. For example, instead of using a `.Button` CSS class in `<AcceptButton>` and `<RejectButton>` components, we recommend creating a `<Button>` component with its own `.Button` styles, that both `<AcceptButton>` and `<RejectButton>` can render (but [not inherit](https://facebook.github.io/react/docs/composition-vs-inheritance.html)). + +Following this rule often makes CSS preprocessors less useful, as features like mixins and nesting are replaced by component composition. You can, however, integrate a CSS preprocessor if you find it valuable. In this walkthrough, we will be using Sass, but you can also use Less, or another alternative. + +First, let’s install the command-line interface for Sass: + +``` +npm install node-sass --save-dev +``` + +Then in `package.json`, add the following lines to `scripts`: + +```diff + "scripts": { ++ "build-css": "node-sass src/ -o src/", ++ "watch-css": "npm run build-css && node-sass src/ -o src/ --watch", + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", +``` + +>Note: To use a different preprocessor, replace `build-css` and `watch-css` commands according to your preprocessor’s documentation. + +Now you can rename `src/App.css` to `src/App.scss` and run `npm run watch-css`. The watcher will find every Sass file in `src` subdirectories, and create a corresponding CSS file next to it, in our case overwriting `src/App.css`. Since `src/App.js` still imports `src/App.css`, the styles become a part of your application. You can now edit `src/App.scss`, and `src/App.css` will be regenerated. + +To share variables between Sass files, you can use Sass imports. For example, `src/App.scss` and other component style files could include `@import "./shared.scss";` with variable definitions. + +At this point you might want to remove all CSS files from the source control, and add `src/**/*.css` to your `.gitignore` file. It is generally a good practice to keep the build products outside of the source control. + +As a final step, you may find it convenient to run `watch-css` automatically with `npm start`, and run `build-css` as a part of `npm run build`. You can use the `&&` operator to execute two scripts sequentially. However, there is no cross-platform way to run two scripts in parallel, so we will install a package for this: + +``` +npm install --save-dev npm-run-all +``` + +Then we can change `start` and `build` scripts to include the CSS preprocessor commands: + +```diff + "scripts": { + "build-css": "node-sass src/ -o src/", + "watch-css": "npm run build-css && node-sass src/ -o src/ --watch --recursive", +- "start": "react-scripts start", +- "build": "react-scripts build", ++ "start-js": "react-scripts start", ++ "start": "npm-run-all -p watch-css start-js", ++ "build": "npm run build-css && react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +``` + +Now running `npm start` and `npm run build` also builds Sass files. Note that `node-sass` seems to have an [issue recognizing newly created files on some systems](https://github.com/sass/node-sass/issues/1891) so you might need to restart the watcher when you create a file until it’s resolved. + +## Adding Images and Fonts + +With Webpack, using static assets like images and fonts works similarly to CSS. + +You can **`import` an image right in a JavaScript module**. This tells Webpack to include that image in the bundle. Unlike CSS imports, importing an image or a font gives you a string value. This value is the final image path you can reference in your code. + +Here is an example: + +```js +import React from 'react'; +import logo from './logo.png'; // Tell Webpack this JS file uses this image + +console.log(logo); // /logo.84287d09.png + +function Header() { + // Import result is the URL of your image + return <img src={logo} alt="Logo" />; +} + +export default Header; +``` + +This ensures that when the project is built, Webpack will correctly move the images into the build folder, and provide us with correct paths. + +This works in CSS too: + +```css +.Logo { + background-image: url(./logo.png); +} +``` + +Webpack finds all relative module references in CSS (they start with `./`) and replaces them with the final paths from the compiled bundle. If you make a typo or accidentally delete an important file, you will see a compilation error, just like when you import a non-existent JavaScript module. The final filenames in the compiled bundle are generated by Webpack from content hashes. If the file content changes in the future, Webpack will give it a different name in production so you don’t need to worry about long-term caching of assets. + +Please be advised that this is also a custom feature of Webpack. + +**It is not required for React** but many people enjoy it (and React Native uses a similar mechanism for images).<br> +An alternative way of handling static assets is described in the next section. + +## Using the `public` Folder + +>Note: this feature is available with `react-scripts@0.5.0` and higher. + +### Changing the HTML + +The `public` folder contains the HTML file so you can tweak it, for example, to [set the page title](#changing-the-page-title). +The `<script>` tag with the compiled code will be added to it automatically during the build process. + +### Adding Assets Outside of the Module System + +You can also add other assets to the `public` folder. + +Note that we normally encourage you to `import` assets in JavaScript files instead. +For example, see the sections on [adding a stylesheet](#adding-a-stylesheet) and [adding images and fonts](#adding-images-and-fonts). +This mechanism provides a number of benefits: + +* Scripts and stylesheets get minified and bundled together to avoid extra network requests. +* Missing files cause compilation errors instead of 404 errors for your users. +* Result filenames include content hashes so you don’t need to worry about browsers caching their old versions. + +However there is an **escape hatch** that you can use to add an asset outside of the module system. + +If you put a file into the `public` folder, it will **not** be processed by Webpack. Instead it will be copied into the build folder untouched. To reference assets in the `public` folder, you need to use a special variable called `PUBLIC_URL`. + +Inside `index.html`, you can use it like this: + +```html +<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"> +``` + +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. + +In JavaScript code, you can use `process.env.PUBLIC_URL` for similar purposes: + +```js +render() { + // Note: this is an escape hatch and should be used sparingly! + // Normally we recommend using `import` for getting asset URLs + // as described in “Adding Images and Fonts” above this section. + return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />; +} +``` + +Keep in mind the downsides of this approach: + +* None of the files in `public` folder get post-processed or minified. +* Missing files will not be called at compilation time, and will cause 404 errors for your users. +* Result filenames won’t include content hashes so you’ll need to add query arguments or rename them every time they change. + +### When to Use the `public` Folder + +Normally we recommend importing [stylesheets](#adding-a-stylesheet), [images, and fonts](#adding-images-and-fonts) from JavaScript. +The `public` folder is useful as a workaround for a number of less common cases: + +* You need a file with a specific name in the build output, such as [`manifest.webmanifest`](https://developer.mozilla.org/en-US/docs/Web/Manifest). +* You have thousands of images and need to dynamically reference their paths. +* You want to include a small script like [`pace.js`](http://github.hubspot.com/pace/docs/welcome/) outside of the bundled code. +* Some library may be incompatible with Webpack and you have no other option but to include it as a `<script>` tag. + +Note that if you add a `<script>` that declares global variables, you also need to read the next section on using them. + +## Using Global Variables + +When you include a script in the HTML file that defines global variables and try to use one of these variables in the code, the linter will complain because it cannot see the definition of the variable. + +You can avoid this by reading the global variable explicitly from the `window` object, for example: + +```js +const $ = window.$; +``` + +This makes it obvious you are using a global variable intentionally rather than because of a typo. + +Alternatively, you can force the linter to ignore any line by adding `// eslint-disable-line` after it. + +## Adding Bootstrap + +You don’t have to use [React Bootstrap](https://react-bootstrap.github.io) together with React but it is a popular library for integrating Bootstrap with React apps. If you need it, you can integrate it with Create React App by following these steps: + +Install React Bootstrap and Bootstrap from npm. React Bootstrap does not include Bootstrap CSS so this needs to be installed as well: + +``` +npm install react-bootstrap --save +npm install bootstrap@3 --save +``` + +Import Bootstrap CSS and optionally Bootstrap theme CSS in the beginning of your ```src/index.js``` file: + +```js +import 'bootstrap/dist/css/bootstrap.css'; +import 'bootstrap/dist/css/bootstrap-theme.css'; +// Put any other imports below so that CSS from your +// components takes precedence over default styles. +``` + +Import required React Bootstrap components within ```src/App.js``` file or your custom component files: + +```js +import { Navbar, Jumbotron, Button } from 'react-bootstrap'; +``` + +Now you are ready to use the imported React Bootstrap components within your component hierarchy defined in the render method. Here is an example [`App.js`](https://gist.githubusercontent.com/gaearon/85d8c067f6af1e56277c82d19fd4da7b/raw/6158dd991b67284e9fc8d70b9d973efe87659d72/App.js) redone using React Bootstrap. + +### Using a Custom Theme + +Sometimes you might need to tweak the visual styles of Bootstrap (or equivalent package).<br> +We suggest the following approach: + +* Create a new package that depends on the package you wish to customize, e.g. Bootstrap. +* Add the necessary build steps to tweak the theme, and publish your package on npm. +* Install your own theme npm package as a dependency of your app. + +Here is an example of adding a [customized Bootstrap](https://medium.com/@tacomanator/customizing-create-react-app-aa9ffb88165) that follows these steps. + +## Adding Flow + +Flow is a static type checker that helps you write code with fewer bugs. Check out this [introduction to using static types in JavaScript](https://medium.com/@preethikasireddy/why-use-static-types-in-javascript-part-1-8382da1e0adb) if you are new to this concept. + +Recent versions of [Flow](http://flowtype.org/) work with Create React App projects out of the box. + +To add Flow to a Create React App project, follow these steps: + +1. Run `npm install --save-dev flow-bin`. +2. Add `"flow": "flow"` to the `scripts` section of your `package.json`. +3. Run `npm run flow -- init` to create a [`.flowconfig` file](https://flowtype.org/docs/advanced-configuration.html) in the root directory. +4. Add `// @flow` to any files you want to type check (for example, to `src/App.js`). + +Now you can run `npm run flow` to check the files for type errors. +You can optionally use an IDE like [Nuclide](https://nuclide.io/docs/languages/flow/) for a better integrated experience. +In the future we plan to integrate it into Create React App even more closely. + +To learn more about Flow, check out [its documentation](https://flowtype.org/). + +## Adding Custom Environment Variables + +>Note: this feature is available with `react-scripts@0.2.3` and higher. + +Your project can consume variables declared in your environment as if they were declared locally in your JS files. By +default you will have `NODE_ENV` defined for you, and any other environment variables starting with +`REACT_APP_`. + +**The environment variables are embedded during the build time**. Since Create React App produces a static HTML/CSS/JS bundle, it can’t possibly read them at runtime. To read them at runtime, you would need to load HTML into memory on the server and replace placeholders in runtime, just like [described here](#injecting-data-from-the-server-into-the-page). Alternatively you can rebuild the app on the server anytime you change them. + +>Note: You must create custom environment variables beginning with `REACT_APP_`. Any other variables except `NODE_ENV` will be ignored to avoid accidentally [exposing a private key on the machine that could have the same name](https://github.com/facebookincubator/create-react-app/issues/865#issuecomment-252199527). Changing any environment variables will require you to restart the development server if it is running. + +These environment variables will be defined for you on `process.env`. For example, having an environment +variable named `REACT_APP_SECRET_CODE` will be exposed in your JS as `process.env.REACT_APP_SECRET_CODE`. + +There is also a special built-in environment variable called `NODE_ENV`. You can read it from `process.env.NODE_ENV`. When you run `npm start`, it is always equal to `'development'`, when you run `npm test` it is always equal to `'test'`, and when you run `npm run build` to make a production bundle, it is always equal to `'production'`. **You cannot override `NODE_ENV` manually.** This prevents developers from accidentally deploying a slow development build to production. + +These environment variables can be useful for displaying information conditionally based on where the project is +deployed or consuming sensitive data that lives outside of version control. + +First, you need to have environment variables defined. For example, let’s say you wanted to consume a secret defined +in the environment inside a `<form>`: + +```jsx +render() { + return ( + <div> + <small>You are running this application in <b>{process.env.NODE_ENV}</b> mode.</small> + <form> + <input type="hidden" defaultValue={process.env.REACT_APP_SECRET_CODE} /> + </form> + </div> + ); +} +``` + +During the build, `process.env.REACT_APP_SECRET_CODE` will be replaced with the current value of the `REACT_APP_SECRET_CODE` environment variable. Remember that the `NODE_ENV` variable will be set for you automatically. + +When you load the app in the browser and inspect the `<input>`, you will see its value set to `abcdef`, and the bold text will show the environment provided when using `npm start`: + +```html +<div> + <small>You are running this application in <b>development</b> mode.</small> + <form> + <input type="hidden" value="abcdef" /> + </form> +</div> +``` + +The above form is looking for a variable called `REACT_APP_SECRET_CODE` from the environment. In order to consume this +value, we need to have it defined in the environment. This can be done using two ways: either in your shell or in +a `.env` file. Both of these ways are described in the next few sections. + +Having access to the `NODE_ENV` is also useful for performing actions conditionally: + +```js +if (process.env.NODE_ENV !== 'production') { + analytics.disable(); +} +``` + +When you compile the app with `npm run build`, the minification step will strip out this condition, and the resulting bundle will be smaller. + +### Referencing Environment Variables in the HTML + +>Note: this feature is available with `react-scripts@0.9.0` and higher. + +You can also access the environment variables starting with `REACT_APP_` in the `public/index.html`. For example: + +```html +<title>%REACT_APP_WEBSITE_NAME% +``` + +Note that the caveats from the above section apply: + +* Apart from a few built-in variables (`NODE_ENV` and `PUBLIC_URL`), variable names must start with `REACT_APP_` to work. +* The environment variables are injected at build time. If you need to inject them at runtime, [follow this approach instead](#generating-dynamic-meta-tags-on-the-server). + +### Adding Temporary Environment Variables In Your Shell + +Defining environment variables can vary between OSes. It’s also important to know that this manner is temporary for the +life of the shell session. + +#### Windows (cmd.exe) + +```cmd +set REACT_APP_SECRET_CODE=abcdef&&npm start +``` + +(Note: the lack of whitespace is intentional.) + +#### Linux, macOS (Bash) + +```bash +REACT_APP_SECRET_CODE=abcdef npm start +``` + +### Adding Development Environment Variables In `.env` + +>Note: this feature is available with `react-scripts@0.5.0` and higher. + +To define permanent environment variables, create a file called `.env` in the root of your project: + +``` +REACT_APP_SECRET_CODE=abcdef +``` + +These variables will act as the defaults if the machine does not explicitly set them.
    +Please refer to the [dotenv documentation](https://github.com/motdotla/dotenv) for more details. + +>Note: If you are defining environment variables for development, your CI and/or hosting platform will most likely need +these defined as well. Consult their documentation how to do this. For example, see the documentation for [Travis CI](https://docs.travis-ci.com/user/environment-variables/) or [Heroku](https://devcenter.heroku.com/articles/config-vars). + +## Can I Use Decorators? + +Many popular libraries use [decorators](https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841) in their documentation.
    +Create React App doesn’t support decorator syntax at the moment because: + +* It is an experimental proposal and is subject to change. +* The current specification version is not officially supported by Babel. +* If the specification changes, we won’t be able to write a codemod because we don’t use them internally at Facebook. + +However in many cases you can rewrite decorator-based code without decorators just as fine.
    +Please refer to these two threads for reference: + +* [#214](https://github.com/facebookincubator/create-react-app/issues/214) +* [#411](https://github.com/facebookincubator/create-react-app/issues/411) + +Create React App will add decorator support when the specification advances to a stable stage. + +## Integrating with an API Backend + +These tutorials will help you to integrate your app with an API backend running on another port, +using `fetch()` to access it. + +### Node +Check out [this tutorial](https://www.fullstackreact.com/articles/using-create-react-app-with-a-server/). +You can find the companion GitHub repository [here](https://github.com/fullstackreact/food-lookup-demo). + +### Ruby on Rails + +Check out [this tutorial](https://www.fullstackreact.com/articles/how-to-get-create-react-app-to-work-with-your-rails-api/). +You can find the companion GitHub repository [here](https://github.com/fullstackreact/food-lookup-demo-rails). + +## Proxying API Requests in Development + +>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.
    +For example, a production setup might look like this after the app is deployed: + +``` +/ - static server returns index.html with React app +/todos - static server returns index.html with React app +/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. + +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: + +```js + "proxy": "http://localhost:4000", +``` + +This way, when you `fetch('/api/todos')` in development, the development server will recognize that it’s not a static asset, and will proxy your request to `http://localhost:4000/api/todos` as a fallback. The development server will only attempt to send requests without a `text/html` accept header to the proxy. + +Conveniently, this avoids [CORS issues](http://stackoverflow.com/questions/21854516/understanding-ajax-cors-and-security-considerations) and error messages like this in development: + +``` +Fetch API cannot load http://localhost:4000/api/todos. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. +``` + +Keep in mind that `proxy` only has effect in development (with `npm start`), and it is up to you to ensure that URLs like `/api/todos` point to the right thing in production. You don’t have to use the `/api` prefix. Any unrecognized request without a `text/html` accept header will be redirected to the specified `proxy`. + +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. + +## Using HTTPS in Development + +>Note: this feature is available with `react-scripts@0.4.0` and higher. + +You may require the dev server to serve pages over HTTPS. One particular case where this could be useful is when using [the "proxy" feature](#proxying-api-requests-in-development) to proxy requests to an API server when that API server is itself serving HTTPS. + +To do this, set the `HTTPS` environment variable to `true`, then start the dev server as usual with `npm start`: + +#### Windows (cmd.exe) + +```cmd +set HTTPS=true&&npm start +``` + +(Note: the lack of whitespace is intentional.) + +#### Linux, macOS (Bash) + +```bash +HTTPS=true npm start +``` + +Note that the server will use a self-signed certificate, so your web browser will almost definitely display a warning upon accessing the page. + +## Generating Dynamic `` Tags on the Server + +Since Create React App doesn’t support server rendering, you might be wondering how to make `` tags dynamic and reflect the current URL. To solve this, we recommend to add placeholders into the HTML, like this: + +```html + + + + + +``` + +Then, on the server, regardless of the backend you use, you can read `index.html` into memory and replace `__OG_TITLE__`, `__OG_DESCRIPTION__`, and any other placeholders with values depending on the current URL. Just make sure to sanitize and escape the interpolated values so that they are safe to embed into HTML! + +If you use a Node server, you can even share the route matching logic between the client and the server. However duplicating it also works fine in simple cases. + +## Pre-Rendering into Static HTML Files + +If you’re hosting your `build` with a static hosting provider you can use [react-snapshot](https://www.npmjs.com/package/react-snapshot) to generate HTML pages for each route, or relative link, in your application. These pages will then seamlessly become active, or “hydrated”, when the JavaScript bundle has loaded. + +There are also opportunities to use this outside of static hosting, to take the pressure off the server when generating and caching routes. + +The primary benefit of pre-rendering is that you get the core content of each page _with_ the HTML payload—regardless of whether or not your JavaScript bundle successfully downloads. It also increases the likelihood that each route of your application will be picked up by search engines. + +You can read more about [zero-configuration pre-rendering (also called snapshotting) here](https://medium.com/superhighfives/an-almost-static-stack-6df0a2791319). + +## Injecting Data from the Server into the Page + +Similarly to the previous section, you can leave some placeholders in the HTML that inject global variables, for example: + +```js + + + + +``` + +Then, on the server, you can replace `__SERVER_DATA__` with a JSON of real data right before sending the response. The client code can then read `window.SERVER_DATA` to use it. **Make sure to [sanitize the JSON before sending it to the client](https://medium.com/node-security/the-most-common-xss-vulnerability-in-react-js-applications-2bdffbcc1fa0) as it makes your app vulnerable to XSS attacks.** + +## Running Tests + +>Note: this feature is available with `react-scripts@0.3.0` and higher.
    +>[Read the migration guide to learn how to enable it in older projects!](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md#migrating-from-023-to-030) + +Create React App uses [Jest](https://facebook.github.io/jest/) as its test runner. To prepare for this integration, we did a [major revamp](https://facebook.github.io/jest/blog/2016/09/01/jest-15.html) of Jest so if you heard bad things about it years ago, give it another try. + +Jest is a Node-based runner. This means that the tests always run in a Node environment and not in a real browser. This lets us enable fast iteration speed and prevent flakiness. + +While Jest provides browser globals such as `window` thanks to [jsdom](https://github.com/tmpvar/jsdom), they are only approximations of the real browser behavior. Jest is intended to be used for unit tests of your logic and your components rather than the DOM quirks. + +We recommend that you use a separate tool for browser end-to-end tests if you need them. They are beyond the scope of Create React App. + +### Filename Conventions + +Jest will look for test files with any of the following popular naming conventions: + +* Files with `.js` suffix in `__tests__` folders. +* Files with `.test.js` suffix. +* Files with `.spec.js` suffix. + +The `.test.js` / `.spec.js` files (or the `__tests__` folders) can be located at any depth under the `src` top level folder. + +We recommend to put the test files (or `__tests__` folders) next to the code they are testing so that relative imports appear shorter. For example, if `App.test.js` and `App.js` are in the same folder, the test just needs to `import App from './App'` instead of a long relative path. Colocation also helps find tests more quickly in larger projects. + +### Command Line Interface + +When you run `npm test`, Jest will launch in the watch mode. Every time you save a file, it will re-run the tests, just like `npm start` recompiles the code. + +The watcher includes an interactive command-line interface with the ability to run all tests, or focus on a search pattern. It is designed this way so that you can keep it open and enjoy fast re-runs. You can learn the commands from the “Watch Usage” note that the watcher prints after every run: + +![Jest watch mode](http://facebook.github.io/jest/img/blog/15-watch.gif) + +### Version Control Integration + +By default, when you run `npm test`, Jest will only run the tests related to files changed since the last commit. This is an optimization designed to make your tests runs fast regardless of how many tests you have. However it assumes that you don’t often commit the code that doesn’t pass the tests. + +Jest will always explicitly mention that it only ran tests related to the files changed since the last commit. You can also press `a` in the watch mode to force Jest to run all tests. + +Jest will always run all tests on a [continuous integration](#continuous-integration) server or if the project is not inside a Git or Mercurial repository. + +### Writing Tests + +To create tests, add `it()` (or `test()`) blocks with the name of the test and its code. You may optionally wrap them in `describe()` blocks for logical grouping but this is neither required nor recommended. + +Jest provides a built-in `expect()` global function for making assertions. A basic test could look like this: + +```js +import sum from './sum'; + +it('sums numbers', () => { + expect(sum(1, 2)).toEqual(3); + expect(sum(2, 2)).toEqual(4); +}); +``` + +All `expect()` matchers supported by Jest are [extensively documented here](http://facebook.github.io/jest/docs/expect.html).
    +You can also use [`jest.fn()` and `expect(fn).toBeCalled()`](http://facebook.github.io/jest/docs/expect.html#tohavebeencalled) to create “spies” or mock functions. + +### Testing Components + +There is a broad spectrum of component testing techniques. They range from a “smoke test” verifying that a component renders without throwing, to shallow rendering and testing some of the output, to full rendering and testing component lifecycle and state changes. + +Different projects choose different testing tradeoffs based on how often components change, and how much logic they contain. If you haven’t decided on a testing strategy yet, we recommend that you start with creating simple smoke tests for your components: + +```js +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); +}); +``` + +This test mounts a component and makes sure that it didn’t throw during rendering. Tests like this provide a lot value with very little effort so they are great as a starting point, and this is the test you will find in `src/App.test.js`. + +When you encounter bugs caused by changing components, you will gain a deeper insight into which parts of them are worth testing in your application. This might be a good time to introduce more specific tests asserting specific expected output or behavior. + +If you’d like to test components in isolation from the child components they render, we recommend using [`shallow()` rendering API](http://airbnb.io/enzyme/docs/api/shallow.html) from [Enzyme](http://airbnb.io/enzyme/). You can write a smoke test with it too: + +```sh +npm install --save-dev enzyme react-addons-test-utils +``` + +```js +import React from 'react'; +import { shallow } from 'enzyme'; +import App from './App'; + +it('renders without crashing', () => { + shallow(); +}); +``` + +Unlike the previous smoke test using `ReactDOM.render()`, this test only renders `` and doesn’t go deeper. For example, even if `` itself renders a ` - - {{/modal-dialog}} -{{/if}} diff --git a/app/templates/dialog/projects.hbs b/app/templates/dialog/projects.hbs deleted file mode 100644 index 83dae43..0000000 --- a/app/templates/dialog/projects.hbs +++ /dev/null @@ -1,92 +0,0 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New project

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter project name' value=name}} -
    - - - -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit project

    - -
    - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter project name' value=name}} -
    - - - -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete project

    - -

    Are you sure you want to delete the project {{project.name}}?

    - - - - {{/modal-dialog}} -{{/if}} diff --git a/app/templates/dialog/simulation.hbs b/app/templates/dialog/simulation.hbs deleted file mode 100644 index 9e2bfb6..0000000 --- a/app/templates/dialog/simulation.hbs +++ /dev/null @@ -1,108 +0,0 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New model

    - -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter model name' value=name}} -
    - - - -
    - - - {{input id='length' type='number' value=length min='1'}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit model

    - -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter model name' value=name}} -
    - - - -
    - - - {{input id='length' type='number' value=length min='1'}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete simulation-model

    - -

    Are you sure you want to delete the simulation-model {{simulationModel.name}}?

    - - - - {{/modal-dialog}} -{{/if}} diff --git a/app/templates/dialog/simulations.hbs b/app/templates/dialog/simulations.hbs deleted file mode 100644 index 96f847d..0000000 --- a/app/templates/dialog/simulations.hbs +++ /dev/null @@ -1,86 +0,0 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New simulation

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulation name' value=name}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Edit simulator

    - -
    - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulation name' value=name}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete simulation

    - -

    Are you sure you want to delete the simulation {{simulation.name}}?

    - - - - {{/modal-dialog}} -{{/if}} - -{{#if isShowingRunningModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Simulation running

    - - {{simulation.name}}: - - - -
    - - - - {{/modal-dialog}} -{{/if}} diff --git a/app/templates/dialog/simulators.hbs b/app/templates/dialog/simulators.hbs deleted file mode 100644 index ff43682..0000000 --- a/app/templates/dialog/simulators.hbs +++ /dev/null @@ -1,118 +0,0 @@ -{{#if isShowingNewModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New simulator

    - -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulator name' value=name}} -
    - - - {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} -
    - - - {{input id='endpoint' placeholder='Enter endpoint' value=endpoint}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingDeleteModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Delete simulator

    - -

    Are you sure you want to delete the simulator {{simulator.name}}?

    - - - - {{/modal-dialog}} -{{/if}} - -{{#if isShowingEditModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    New simulator

    - -
    - - - - - - - - - - - - - - - - -
    - - - {{input id='name' placeholder='Enter simulator name' value=simulatorName}} -
    - - - {{input id='simulatorid' type='number' value=simulatorid min='1' max='255'}} -
    - - - {{input id='endpoint' placeholder='Enter endpoint' value=simulatorEndpoint}} -
    - - -
    -
    - - {{#if errorMessage}} -

    Error: {{errorMessage}}

    - {{/if}} - {{/modal-dialog}} -{{/if}} - -{{#if isShowingRunningModal}} - {{#modal-dialog attachment="middle center" translucentOverlay=true}} -

    Simulator running

    - - {{simulator.name}}: - - - -
    - - - - {{/modal-dialog}} -{{/if}} diff --git a/app/templates/index.hbs b/app/templates/index.hbs deleted file mode 100644 index 700204b..0000000 --- a/app/templates/index.hbs +++ /dev/null @@ -1 +0,0 @@ -

    Main Content

    diff --git a/app/templates/login.hbs b/app/templates/login.hbs deleted file mode 100644 index 734af5e..0000000 --- a/app/templates/login.hbs +++ /dev/null @@ -1,19 +0,0 @@ -
    -

    Login

    - -
    -

    - - {{input id='username' placeholder='Enter username' value=username}} -

    -

    - - {{input id='password' placeholder='Enter password' type='password' value=password}} -

    - - - {{#if errorMessage}} -

    {{errorMessage}}

    - {{/if}} -
    -
    diff --git a/app/templates/logout.hbs b/app/templates/logout.hbs deleted file mode 100644 index c24cd68..0000000 --- a/app/templates/logout.hbs +++ /dev/null @@ -1 +0,0 @@ -{{outlet}} diff --git a/app/templates/me.hbs b/app/templates/me.hbs deleted file mode 100644 index eeb3fb9..0000000 --- a/app/templates/me.hbs +++ /dev/null @@ -1,20 +0,0 @@ -

    Preferences

    - -
    -

    - - {{input id='username' value=model.username readonly=true}} -

    -

    - - {{input id='mail' value=model.mail placeholder='Enter e-mail'}} -

    - - -
    - -{{#if isAdmin}} -
    - {{#link-to 'user'}}Users{{/link-to}} -
    -{{/if}} diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs deleted file mode 100644 index ce4c826..0000000 --- a/app/templates/project/index.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{{#link-to 'projects'}}Back to projects{{/link-to}} - -

    {{model.name}}

    - -
    - - - - - - {{#each model.visualizations as |visualization|}} - - - - - {{/each}} -
    Name
    - {{#link-to 'visualization.index' visualization.id}}{{visualization.name}}{{/link-to}} - -
    - Edit - Delete -
    -
    -
    - -
    - -
    - -{{partial "dialog/project"}} diff --git a/app/templates/projects.hbs b/app/templates/projects.hbs deleted file mode 100644 index ff264cd..0000000 --- a/app/templates/projects.hbs +++ /dev/null @@ -1,33 +0,0 @@ -

    Projects

    - -
    - - - - - - - {{#each model.projects as |project|}} - - - - - - {{/each}} -
    NameSimulation
    - {{#link-to "project.index" project.id}}{{project.name}}{{/link-to}} - - {{project.simulation.name}} - -
    - Edit - Delete -
    -
    -
    - -
    - -
    - -{{partial "dialog/projects"}} diff --git a/app/templates/simulation-model/index.hbs b/app/templates/simulation-model/index.hbs deleted file mode 100644 index 91872be..0000000 --- a/app/templates/simulation-model/index.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{{#link-to 'simulation.index' model.simulation.id}}Back to {{model.simulation.name}}{{/link-to}} - -

    {{model.name}}

    - -
    -

    Mapping

    - -
    - - - - - - {{#each-in model.mapping as |signal name|}} - - - - - {{/each-in}} -
    SignalName
    - {{signal}} - - {{input value=(mut (get this (concat 'name' signal)))}} -
    -
    - -
    - - -
    -
    diff --git a/app/templates/simulation/index.hbs b/app/templates/simulation/index.hbs deleted file mode 100644 index a938a9b..0000000 --- a/app/templates/simulation/index.hbs +++ /dev/null @@ -1,35 +0,0 @@ -{{#link-to 'simulations'}}Back to simulations{{/link-to}} - -

    {{model.simulation.name}}

    - -
    - - - - - - - {{#each model.simulation.models as |simulationModel|}} - - - - - - {{/each}} -
    NameSimulator
    - {{#link-to "simulation-model.index" simulationModel.id}}{{simulationModel.name}}{{/link-to}} - - {{simulationModel.simulator.name}} - -
    - Edit - Delete -
    -
    -
    - -
    - -
    - -{{partial "dialog/simulation"}} diff --git a/app/templates/simulations.hbs b/app/templates/simulations.hbs deleted file mode 100644 index 698d9a7..0000000 --- a/app/templates/simulations.hbs +++ /dev/null @@ -1,34 +0,0 @@ -

    Simulations

    - -
    - - - - - - - {{#each model as |simulation|}} - - - - - - {{/each}} -
    NameRunning
    - {{#link-to "simulation.index" simulation.id}}{{simulation.name}}{{/link-to}} - - {{simulation.running}} - -
    - Running - Edit - Delete -
    -
    -
    - -
    - -
    - -{{partial "dialog/simulations"}} diff --git a/app/templates/simulators.hbs b/app/templates/simulators.hbs deleted file mode 100644 index d70e298..0000000 --- a/app/templates/simulators.hbs +++ /dev/null @@ -1,43 +0,0 @@ -

    Simulators

    - -
    - - - - - - - - - - {{#each model as |simulator|}} - - - - - - - - {{/each}} -
    NameIDRunningEndpoint
    - {{simulator.name}} - - {{simulator.simulatorid}} - - {{simulator.running}} - - {{simulator.endpoint}} - -
    - - Edit - Delete -
    -
    -
    - -
    - -
    - -{{partial "dialog/simulators"}} diff --git a/app/templates/user/delete.hbs b/app/templates/user/delete.hbs deleted file mode 100644 index b8173d5..0000000 --- a/app/templates/user/delete.hbs +++ /dev/null @@ -1,10 +0,0 @@ -

    Delete User

    - -

    - Are you sure you want to delete the user "{{model.username}}"? -
    - This will also delete all projects belonging to this user! -

    - - - diff --git a/app/templates/user/edit.hbs b/app/templates/user/edit.hbs deleted file mode 100644 index b44372f..0000000 --- a/app/templates/user/edit.hbs +++ /dev/null @@ -1,14 +0,0 @@ -

    Edit

    - -
    -

    - - {{input id='username' value=model.username}} -

    -

    - - {{input id='mail' value=model.mail placeholder='Enter e-mail'}} -

    - - -
    diff --git a/app/templates/user/index.hbs b/app/templates/user/index.hbs deleted file mode 100644 index 9a7c1cb..0000000 --- a/app/templates/user/index.hbs +++ /dev/null @@ -1,11 +0,0 @@ -

    Users

    - -{{#link-to 'user.new'}}New user{{/link-to}} - -
    -
      - {{#each users as |user|}} -
    • {{#link-to 'user.edit' user.id}}{{user.username}}{{/link-to}} {{#link-to 'user.delete' user.id}}X{{/link-to}}
    • - {{/each}} -
    -
    diff --git a/app/templates/user/new.hbs b/app/templates/user/new.hbs deleted file mode 100644 index 0e8598b..0000000 --- a/app/templates/user/new.hbs +++ /dev/null @@ -1,21 +0,0 @@ -

    New user

    - -
    -
    -

    - - {{input id='username' placeholder='Enter username' value=username}} -

    -

    - - {{input id='password' placeholder='Enter password' type='password' value=password}} -

    - - - - - {{#if errorMessage}} -

    {{errorMessage.message}}

    - {{/if}} -
    -
    diff --git a/app/templates/visualization/edit.hbs b/app/templates/visualization/edit.hbs deleted file mode 100644 index c15d593..0000000 --- a/app/templates/visualization/edit.hbs +++ /dev/null @@ -1,37 +0,0 @@ -

    {{model.name}}

    - -
    -

    Toolbox

    - {{#draggable-item content='table'}} - Table - {{/draggable-item}} - - {{#draggable-item content='value'}} - Value - {{/draggable-item}} - - {{#draggable-item content='label'}} - Label - {{/draggable-item}} - - {{#draggable-item content='plot'}} - Plot - {{/draggable-item}} - - {{#draggable-item content='image'}} - Image - {{/draggable-item}} - -

    - Hint: Double click widgets to edit or delete them. -

    -
    - -{{#draggable-dropzone dropped='addWidget'}} - {{widget-container widgets=model.widgets editing=true data=data showWidgetDialog='showWidgetDialog'}} -{{/draggable-dropzone}} - -

    - - -

    diff --git a/app/templates/visualization/index.hbs b/app/templates/visualization/index.hbs deleted file mode 100644 index c728663..0000000 --- a/app/templates/visualization/index.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{#link-to 'project.index' model.project.id}}Back to {{model.project.name}}{{/link-to}} - -

    {{model.name}}

    - -{{widget-container widgets=model.widgets data=data}} - -

    - {{#link-to "visualization.edit" model.id}}Edit layout{{/link-to}} -

    diff --git a/app/transforms/array.js b/app/transforms/array.js deleted file mode 100644 index 7e1093f..0000000 --- a/app/transforms/array.js +++ /dev/null @@ -1,20 +0,0 @@ -import Ember from 'ember'; -import Transform from 'ember-data/transform'; - -export default Transform.extend({ - deserialize(serialized) { - if (Ember.isArray(serialized)) { - return serialized; - } else { - return []; - } - }, - - serialize(deserialized) { - if (Ember.isArray(deserialized)) { - return deserialized; - } else { - return []; - } - } -}); diff --git a/bower.json b/bower.json deleted file mode 100644 index adf3c54..0000000 --- a/bower.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "villasweb-frontend", - "dependencies": { - "jquery-ui": "1.11.4", - "bootstrap": "~3.3.5", - "flot": "~0.8.3" - } -} diff --git a/config/environment.js b/config/environment.js deleted file mode 100644 index 0783652..0000000 --- a/config/environment.js +++ /dev/null @@ -1,49 +0,0 @@ -/* jshint node: true */ - -module.exports = function(environment) { - var ENV = { - modulePrefix: 'villasweb-frontend', - environment: environment, - rootURL: '/', - locationType: 'auto', - EmberENV: { - FEATURES: { - // Here you can enable experimental features on an ember canary build - // e.g. 'with-controller': true - }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false - } - }, - - APP: { - API_HOST: 'localhost:3000' - } - }; - - if (environment === 'development') { - // ENV.APP.LOG_RESOLVER = true; - // ENV.APP.LOG_ACTIVE_GENERATION = true; - // ENV.APP.LOG_TRANSITIONS = true; - // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; - // ENV.APP.LOG_VIEW_LOOKUPS = true; - } - - if (environment === 'test') { - // Testem prefers this... - ENV.locationType = 'none'; - - // keep test console output quieter - ENV.APP.LOG_ACTIVE_GENERATION = false; - ENV.APP.LOG_VIEW_LOOKUPS = false; - - ENV.APP.rootElement = '#ember-testing'; - } - - if (environment === 'production') { - - } - - return ENV; -}; diff --git a/ember-cli-build.js b/ember-cli-build.js deleted file mode 100644 index 3418f9e..0000000 --- a/ember-cli-build.js +++ /dev/null @@ -1,32 +0,0 @@ -/*jshint node:true*/ -/* global require, module */ -var EmberApp = require('ember-cli/lib/broccoli/ember-app'); - -module.exports = function(defaults) { - var app = new EmberApp(defaults, { - // Add options here - }); - - // Use `app.import` to add additional libraries to the generated - // output files. - // - // If you need to use different assets in different - // environments, specify an object as the first parameter. That - // object's keys should be the environment name and the values - // should be the asset to use in that environment. - // - // If the library that you are including contains AMD or ES6 - // modules that you would like to import into your application - // please specify an object with the list of modules as keys - // along with the exports of each module as its value. - - app.import('bower_components/bootstrap/dist/js/bootstrap.js'); - app.import('bower_components/flot/jquery.flot.time.js'); - app.import('bower_components/jquery-ui/jquery-ui.js'); - - app.import('bower_components/jquery-ui/themes/smoothness/jquery-ui.css'); - - app.import('bower_components/jquery-ui/themes/smoothness/images/ui-icons_222222_256x240.png', { destDir: 'assets/images' }); - - return app.toTree(); -}; diff --git a/package.json b/package.json index 1a3bcb0..e8b8119 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,29 @@ { "name": "villasweb-frontend", - "version": "0.0.0", - "description": "Small description for villasweb-frontend goes here", - "license": "MIT", - "author": "", - "directories": { - "doc": "doc", - "test": "tests" - }, - "repository": "", - "scripts": { - "build": "ember build", - "start": "ember server", - "test": "ember test" + "version": "0.1.0", + "private": true, + "dependencies": { + "bootstrap": "^3.3.7", + "classnames": "^2.2.5", + "es6-promise": "^4.0.5", + "flux": "^3.1.2", + "immutable": "^3.8.1", + "react": "^15.4.2", + "react-bootstrap": "^0.30.7", + "react-d3": "^0.4.0", + "react-dnd": "^2.2.4", + "react-dnd-html5-backend": "^2.2.4", + "react-dom": "^15.4.2", + "react-router": "^3.0.2", + "superagent": "^3.5.0" }, "devDependencies": { - "broccoli-asset-rev": "^2.4.5", - "ember-ajax": "^2.4.1", - "ember-cli": "2.11.0", - "ember-cli-app-version": "^2.0.0", - "ember-cli-babel": "^5.1.7", - "ember-cli-dependency-checker": "^1.3.0", - "ember-cli-flot": "0.0.3", - "ember-cli-htmlbars": "^1.1.1", - "ember-cli-htmlbars-inline-precompile": "^0.3.3", - "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-jshint": "^2.0.1", - "ember-cli-qunit": "^3.0.1", - "ember-cli-release": "^0.2.9", - "ember-cli-sass": "5.5.2", - "ember-cli-shims": "^1.0.2", - "ember-cli-sri": "^2.1.0", - "ember-cli-test-loader": "^1.1.0", - "ember-cli-uglify": "^1.2.0", - "ember-data": "^2.11.0", - "ember-export-application-global": "^1.0.5", - "ember-load-initializers": "^0.6.0", - "ember-modal-dialog": "^0.9.0", - "ember-resolver": "^2.0.3", - "ember-simple-auth": "^1.1.0", - "ember-source": "^2.11.0", - "ember-tether": "0.3.1", - "ember-truth-helpers": "1.2.0", - "ember-uploader": "1.2.3", - "ember-welcome-page": "^2.0.2", - "loader.js": "^4.0.10" + "react-scripts": "0.9.3" }, - "engines": { - "node": ">= 0.12.0" - }, - "private": true + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } } diff --git a/public/crossdomain.xml b/public/crossdomain.xml deleted file mode 100644 index 0c16a7a..0000000 --- a/public/crossdomain.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c125de5d897c1ff5692a656485b3216123dcd89 GIT binary patch literal 24838 zcmeI4X^>UL6@VY56)S&I{`6Nu0RscWCdj@GJHx(%?6_-;yKy1n;EEf9f}pr1CW5HA zYt$%U#C=}?jWH&%G@BaHBxsWAoUb3}&6%Ei@4Ii_JRa1`RQ23*yU)_wJ$?H0>6gj0 z${d_I^w5kvTW3xYEc?FvyP3>p$!py@`@T`|dVepIsjbbvR}af%KKy7YuQ%SDC^zmNWPYR^7avI5P-@dKev}UZ^aDAOyci9Nn zwR4qEz~tSvrp|#ACvWzo9`3B;`}^{t18dxaH;?xT7#hmJiKAaI;|O=$yxzXNOHGw~ z^!5pE^SW`av%t_$22LFPsM^l%=PSp!3r`>9w%s+^ZQYnnTQ*Ggd9-1~kj_o$YdW@b ztCkJ(ZGYjusqV5L4{^)R9Gt@gzU1t|?xhE&c^q(|(R#oa*}Sj5c({A$mhrB8*Y@tc zr)K#C{KOp-eHl35ZWJ1&zkmI>9DL%!KJE@_!=W?aH;i?ZDb0O1HPFy6 zcV0Kf)eZ0BHmz9vowF7EA{z*aue9M)iJP&Zd)qYlfJ-c^sS1qY^?>s)!!Ta@x zr@Lz|80r)7<{QVk9Z$}5SDaVtz*Rc?oH5~Wcjoc^eA&EdJ^h@aZ-BvL{K2s_7Cvfr zFL&(R?D&(9OxsS%z_BzI9^Ai^AOF$PUpGk~oO(=OpMc3@Zh&KH1a9>G%%0rC)t@oQ z4d~M`hX+g^Wf8P>A&&qjq|tZe*44Laq7qVPK#QIc)s*Qj34P`NL`Q{xBI`SnR!RC? zlGdTvC%oVZ@0BgcH>}qc!uzul@{i@sH}L0|=eZBJ9qF!HHaw?`s0(_DJj(v`(memI z6jH}=BfGlSlRV4)ouv#h*65yRR>G zo;I#~BVK&l&{+H=_~Nq$d%bFLh7GE5pS&>Fr{RMe>)MM19~z6F1oQo_y>vtlpEZF# zIc82TpMc3z9;{Q)=zG5B#4+96yHCvYy8p4;C%6x`%y$2HccC9|#vGVD)**C0xX|R| z%h)}ze!Tnrvvb@RZ!GX@2lMEq`=`08b`9$%FnN@*zJLo2wD5?MbE&LN)Z>Kty*;m= zt{Cn0>Q3nk)`bR^{dVf!3ECg6Yz4YcskI>$XH*L8E)MsudhnkP0B>+M(XEcErHUBKi~ z1`fEP&WPhp{@Ew?cPlR(ma9iw8NbJWHqp=btCtM*FnP*@ZwwlJ&-Y|LEjgvJzUtPc zz5CrWNBRV8d0-bpWAl<=zM1PU8lJseDxBK^QuuCj2fg{&2#*IG5ezf1B(o%lU+OZx7So4D?yi2*h zFBkr5pG3AJs83uy!~C3mQZLp~ss7-N9oAY>t)!eC#s)CrPukK!(!G*)H?v(~JCoj# zfvgTxMV{4?zL1neQ;ITVBAdFDf`1yG$o{g7^1sR_n{RZ7tnXio?tM%240}(z9xFY0 zlz{^-G*RET;-`7`>e0b{{`!2kM)t7Si9ZqD$~wh*hyGC>z~qs@0T&u*;h}hiKGEga zHkJ;%7aNc^o_0(>Z{Gp069H;TwPTUnvvX0SJ+kGGZ0lFBWocl>kaa)AoiMta+x_-J-?#KHFnJ*! zwD1V?)4s#|?O)DlMBhVv4IgZs?d>b<6%xK3<{o91H?-%8?PK!_fm#3d>{{gQ z?*8`b{G6?bZKdO{_9IVlz{R$PcGjeL|3*|@upby()_Lf^eQ&XQe)CjsbJ3Uolrgt< zweld3GH|fZpn(=1@PencO_a_)v6tU?WV-w8wfXLbOGae0{<*C?Ead$6v+> z|EQKThJTmwXK!c6AOD+FgtDv7i<48{-OPce!KDVkzR+XKOcREPha(;$}iUb!*)f-Fb}Y4@r9z-_{OIg z`xn^T#ZtEPv_T$M*Sr+=Z{q#~8$|7Y{0!*2u${D*Jj%dfOrS~FzpH*_|55J!7kl4w z?LT!7T(!3!632pmZh?dh`n-z$_ts42pn6;c`}hx;TSYd0idsqal5&0uGV=UM{c9xQ z1KK6&TS+a^H|6B_hPo1W3 zh+Dun!`UkP%H3}*@IE18q{7&MH2f3?T6o}Jf+xI@fh=SyUOArw`*w1_-PUlHZTHc@ z--yqIxPtI}IjPRzLIZ8cPv4P=>?A&=E~~0)>&J#V;TwAR*6}`01iu~U$@prtzW6YS ze}E>gUX+0YuF}B+Uhw2x7a7Q+oOzMNFHTNN<)40Rzg#`pABKF18@l}5A>RL`?Ri;Z zC8ExD$)im1@R{N7(wIog8$Yn(6%q$yd9(zKe};OnH%;mWBs7)>ls~T3Wi6!Xqw6+dpJLVS1P| z9qV%io-nE*rYcPxiS31>U_>mbPTXxkC*!?*zefr#2vF|qr8{|4|u^7-pD|f z&OPc->UKu)=iHgIpysp;Lsbyj}GJWoBkufOA={CRTUjr%af zc5pUH9{pg?M5%+)oN`q9yBbBt@+3xHV)qGm8b)Cp-w7~CwEhtBUk0rbjrqM zTb|tQ3-5-pw^cul`T+X&s?O;?V(FD!(Q9Qg@(LTCNz{0-vBM^SX5lti3|GpxFn4;Ax6pGc~t)R!Bo${lYH(* z!F&5X*?S&}YoDCyzwv1H+XI(+rL`;RN9}iLxlfr-r&vGG8OQa@=>+a)+Ij)sd_{wu z1Am(+3-RFr4&N8N6+hqo19S#;SA1-hG>07p3}&*j4CR+rqdV)^6n; z_vFr!(a%-=#=kb{pYmNL@6|DWkw~%E2V2jYl*e1}c{e$fib?(O+hs}eoBLRo&9(;J}YV}0Mi;LZAe{U$(s= zT<-IaV$Z+q-P!~3{HxN>Kbw30jXzM&I(S<6Ksx^}HvU2Vntb!etSsm0>)j}Me^+L5{2yz--)?W`Q?az z!WLG4UNP}+#C+NKH+ZG-Q=E>IPp%LuKLx$$8NAOGr(#~P>!EA zDYlpXDR=xM?Xv5(-qp74Cw3LzBeASHSBY`OezkbOyjP!G%WSymju_C$VBl--z + + + + + + + React App + + +
    + + + diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index f591645..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# http://www.robotstxt.org -User-agent: * -Disallow: diff --git a/src/App.test.js b/src/App.test.js new file mode 100644 index 0000000..b84af98 --- /dev/null +++ b/src/App.test.js @@ -0,0 +1,8 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); +}); diff --git a/src/api/rest-api.js b/src/api/rest-api.js new file mode 100644 index 0000000..0b3008c --- /dev/null +++ b/src/api/rest-api.js @@ -0,0 +1,46 @@ +/** + * File: rest-api.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import request from 'superagent/lib/client'; +import Promise from 'es6-promise'; + +const API_URL = 'http://localhost:4000/api/v1'; + +function makeURL(part) { + // TODO: Add / if missing at front of part + return API_URL + part; +} + +class RestAPI { + get(url) { + return new Promise(function (resolve, reject) { + request.get(makeURL(url)).end(function (error, res) { + if (res.status !== 200) { + reject(); + } else { + resolve(JSON.parse(res.text)); + } + }); + }); + } + + post(url, body) { + return new Promise(function (resolve, reject) { + request.post(makeURL(url)).send(body).end(function (error, res) { + if (res.status !== 200) { + reject(); + } else { + resolve(JSON.parse(res.text)); + } + }); + }); + } +} + +export default new RestAPI(); diff --git a/app/controllers/application.js b/src/app-dispatcher.js similarity index 59% rename from app/controllers/application.js rename to src/app-dispatcher.js index 37164b4..689348d 100644 --- a/app/controllers/application.js +++ b/src/app-dispatcher.js @@ -1,14 +1,14 @@ /** - * File: application.js + * File: app-dispatcher.js * Author: Markus Grigull - * Date: 26.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import Ember from 'ember'; +import { Dispatcher } from 'flux'; -export default Ember.Controller.extend({ - session: Ember.inject.service('session') -}); +const dispatcher: Dispatcher = new Dispatcher(); + +export default dispatcher; diff --git a/app/components/file-upload.js b/src/components/footer.js similarity index 51% rename from app/components/file-upload.js rename to src/components/footer.js index 12c0dd0..cc84ea7 100644 --- a/app/components/file-upload.js +++ b/src/components/footer.js @@ -1,18 +1,22 @@ /** - * File: file-upload.js + * File: footer.js * Author: Markus Grigull - * Date: 05.12.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import EmberUploader from 'ember-uploader'; +import React, { Component } from 'react'; -export default EmberUploader.FileField.extend({ - files: null, - - filesDidChange: function(files) { - this.set('files', files); +class Footer extends Component { + render() { + return ( +
    + Copyright © {new Date().getFullYear()} +
    + ); } -}); +} + +export default Footer; diff --git a/src/components/header.js b/src/components/header.js new file mode 100644 index 0000000..b246f9d --- /dev/null +++ b/src/components/header.js @@ -0,0 +1,24 @@ +/** + * File: header.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +import '../styles/app.css'; + +class Header extends Component { + render() { + return ( +
    +

    VILLASweb

    +
    + ); + } +} + +export default Header; diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js new file mode 100644 index 0000000..c6df652 --- /dev/null +++ b/src/components/menu-sidebar.js @@ -0,0 +1,30 @@ +/** + * File: menu-sidebar.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Link } from 'react-router'; + +class SidebarMenu extends Component { + render() { + return ( +
    +

    Menu

    + +
      +
    • Home
    • +
    • Projects
    • +
    • Simulations
    • +
    • Simulators
    • +
    +
    + ); + } +} + +export default SidebarMenu; diff --git a/src/components/table.js b/src/components/table.js new file mode 100644 index 0000000..fab3bfe --- /dev/null +++ b/src/components/table.js @@ -0,0 +1,53 @@ +/** + * File: table.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +class Table extends Component { + render() { + // create sorted rows + var rows = this.props.data.map(row => { + // add cells by column keys + var rowArray = []; + + for (var i = 0; i < this.props.columns.length; i++) { + if (row[this.props.columns[i].key] != null) { + rowArray.push(row[this.props.columns[i].key].toString()); + } else { + rowArray.push(""); + } + } + + return rowArray; + }); + + return ( + + + + {this.props.columns.map(column => ( + + ))} + + + + {rows.map((row, index) => ( + + {row.map((cell, index) => ( + + ))} + + ))} + +
    {column.title}
    {cell}
    + ); + } +} + +export default Table; diff --git a/src/containers/app.js b/src/containers/app.js new file mode 100644 index 0000000..b1b8a57 --- /dev/null +++ b/src/containers/app.js @@ -0,0 +1,55 @@ +/** + * File: app.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; + +// import AppDispatcher from '../app-dispatcher'; +import VillasStore from '../stores/villas-store'; + +import Header from '../components/header'; +import Footer from '../components/footer'; +import SidebarMenu from '../components/menu-sidebar'; +import Home from './home'; +import '../styles/app.css'; + +class App extends Component { + static getStores() { + return [ VillasStore ]; + } + + static calculateState() { + return { + villas: VillasStore.getState() + }; + } + + render() { + // get children + var children = this.props.children; + if (this.props.location.pathname === "/") { + children = + } + + return ( +
    +
    + + +
    + {children} +
    + +
    +
    + ); + } +} + +export default Container.create(App); diff --git a/src/containers/home.js b/src/containers/home.js new file mode 100644 index 0000000..81ead97 --- /dev/null +++ b/src/containers/home.js @@ -0,0 +1,36 @@ +/** + * File: home.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; + +// import AppDispatcher from '../app-dispatcher'; +import VillasStore from '../stores/villas-store'; + +import '../styles/home.css'; + +class Home extends Component { + static getStores() { + return [ VillasStore ]; + } + + static calculateState() { + return { + villas: VillasStore.getState() + }; + } + + render() { + return ( +

    Home

    + ); + } +} + +export default Container.create(Home); diff --git a/src/containers/projects.js b/src/containers/projects.js new file mode 100644 index 0000000..bf87dbc --- /dev/null +++ b/src/containers/projects.js @@ -0,0 +1,39 @@ +/** + * File: projects.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; + +// import AppDispatcher from '../app-dispatcher'; +import VillasStore from '../stores/villas-store'; + +import '../styles/projects.css'; + +class Projects extends Component { + static getStores() { + return [ VillasStore ]; + } + + static calculateState() { + return { + villas: VillasStore.getState() + }; + } + + render() { + return ( +
    +

    Projects

    + +
    + ); + } +} + +export default Container.create(Projects); diff --git a/src/containers/simulators.js b/src/containers/simulators.js new file mode 100644 index 0000000..f9687da --- /dev/null +++ b/src/containers/simulators.js @@ -0,0 +1,72 @@ +/** + * File: simulators.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; +import VillasStore from '../stores/villas-store'; +import SimulatorStore from '../stores/simulator-store'; + +import Table from '../components/table'; +import '../styles/projects.css'; + +class Simulators extends Component { + static getStores() { + return [ VillasStore, SimulatorStore ]; + } + + static calculateState() { + return { + villas: VillasStore.getState(), + simulators: SimulatorStore.getState(), + + onButton + }; + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'simulators/start-load' + }); + } + + render() { + var columns = [ + { title: 'Name', key: 'name' }, + { title: 'ID', key: 'simulatorid', width: 80 }, + { title: 'Running', key: 'running', width: 80 }, + { title: 'Endpoint', key: 'endpoint', width: 120 } + ]; + + return ( +
    +

    Simulators

    + + + + + + ); + } +} + +function onButton() { + AppDispatcher.dispatch({ + type: 'simulators/start-add', + simulator: { + name: 'Virtual', + running: false, + simulatorid: 3, + endpoint: '1.1.1.1:1234' + } + }); +} + +export default Container.create(Simulators); diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js new file mode 100644 index 0000000..bba01a1 --- /dev/null +++ b/src/data-managers/simulators-data-manager.js @@ -0,0 +1,43 @@ +/** + * File: simulators-data-manager.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import RestAPI from '../api/rest-api'; +import AppDispatcher from '../app-dispatcher'; + +const SimulatorsDataManager = { + loadSimulators() { + RestAPI.get('/simulators').then(response => { + AppDispatcher.dispatch({ + type: 'simulators/loaded', + simulators: response.simulators + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/load-error', + error: error + }); + }); + }); + }, + + addSimulator(simulator) { + RestAPI.post('/simulators', { simulator: simulator }).then(response => { + AppDispatcher.dispatch({ + type: 'simulators/added', + simulator: response.simulator + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/add-error', + error: error + }); + }); + }); + } +} + +export default SimulatorsDataManager; diff --git a/app/controllers/visualization/index.js b/src/index.js similarity index 56% rename from app/controllers/visualization/index.js rename to src/index.js index bf51cbe..37758bb 100644 --- a/app/controllers/visualization/index.js +++ b/src/index.js @@ -1,15 +1,19 @@ /** * File: index.js * Author: Markus Grigull - * Date: 28.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import Ember from 'ember'; -import FetchLiveDataMixin from '../../mixins/fetch-live-data'; +import React from 'react'; +import ReactDOM from 'react-dom'; -export default Ember.Controller.extend(FetchLiveDataMixin, { +import Router from './router'; +import './styles/index.css'; -}); +ReactDOM.render( + , + document.getElementById('root') +); diff --git a/src/router.js b/src/router.js new file mode 100644 index 0000000..fca3355 --- /dev/null +++ b/src/router.js @@ -0,0 +1,32 @@ +/** + * File: router.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Router, Route, hashHistory } from 'react-router'; + +import App from './containers/app'; +import Home from './containers/home'; +import Projects from './containers/projects'; +import Simulators from './containers/simulators'; + +class Root extends Component { + render() { + return ( + + + + + + + + ); + } +} + +export default Root; diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js new file mode 100644 index 0000000..f8ff715 --- /dev/null +++ b/src/stores/simulator-store.js @@ -0,0 +1,60 @@ +/** + * File: villas-store.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import { ReduceStore } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; +import SimulatorsDataManager from '../data-managers/simulators-data-manager'; + +class SimulatorStore extends ReduceStore { + constructor() { + super(AppDispatcher); + } + + getInitialState() { + return []; + } + + reduce(state, action) { + console.log(action.type); + + switch (action.type) { + case 'simulators/start-load': + SimulatorsDataManager.loadSimulators(); + return state; + + case 'simulators/loaded': + return action.simulators; + + case 'simulators/load-error': + // TODO: Add error message + return state; + + case 'simulators/start-add': + SimulatorsDataManager.addSimulator(action.simulator); + return state; + + case 'simulators/added': + // state should always be immutable, thus make new copy + var simulators = state.slice(); + simulators.push(action.simulator); + + return simulators; + + case 'simulators/add-error': + // TODO: Add error message + return state; + + default: + return state; + } + } +} + +export default new SimulatorStore(); diff --git a/src/stores/villas-store.js b/src/stores/villas-store.js new file mode 100644 index 0000000..3fc05bf --- /dev/null +++ b/src/stores/villas-store.js @@ -0,0 +1,31 @@ +/** + * File: villas-store.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import { ReduceStore } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; + +class VillasStore extends ReduceStore { + constructor() { + super(AppDispatcher); + } + + getInitialState() { + return {}; + } + + reduce(state, action) { + switch (action.type) { + default: + return state; + } + } +} + +export default new VillasStore(); diff --git a/src/styles/app.css b/src/styles/app.css new file mode 100644 index 0000000..6ee6c69 --- /dev/null +++ b/src/styles/app.css @@ -0,0 +1,138 @@ +/** + * File: app.css + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +/** + * Application container + */ +body { + background-color: #6EA2B0; +} + +.app { + min-width: 800px; + + color: #4d4d4d; + + font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +.app header { + width: 100%; + height: 50px; + + padding: 10px 0 0 0; + + color: #103B7D; + background-color: #fff; +} + +.app header h1 { + width: 100%; + + text-align: center; +} + +.app footer { + width: 100%; + + margin-top: 20px; + + text-align: center; + + clear: both; +} + +.app-content { + min-height: 200px; + + margin: 20px 20px 20px 170px; + padding: 15px 20px; + + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), + 0 9px 18px 0 rgba(0, 0, 0, 0.1); +} + +/** + * Menus + */ +.menu-sidebar { + float: left; + + margin: 20px 0 0 20px; + padding: 20px 25px 20px 25px; + + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), + 0 9px 18px 0 rgba(0, 0, 0, 0.1); +} + +.menu-sidebar a { + color: #4d4d4d; +} + +.active { + font-weight: bold; +} + +.menu-sidebar ul { + padding-top: 10px; + + list-style: none; +} + +/** + * Tables + */ +.table { + margin-top: 20px; + + border: 0; + border-collapse: collapse; + + background-color: #f6f6f6; +} + +.table th, td { + padding: 5px; + + text-align: left; + + border: none; +} + +.table th { + background-color: #527984; + color: #fff; +} + +.table tr:nth-child(even) { + background-color: #ddd; +} + +/** + * Buttons + */ +button { + margin-top: 10px; + padding: 4px 8px; + + border: none; + + background-color: #527984; + color: #fff; + + font-size: 14px; + + cursor: pointer; +} + +button:hover { + background: #6EA2B0; +} diff --git a/app/routes/404.js b/src/styles/home.css similarity index 66% rename from app/routes/404.js rename to src/styles/home.css index b93ac29..5a74ef5 100644 --- a/app/routes/404.js +++ b/src/styles/home.css @@ -1,13 +1,8 @@ /** - * File: 404.js + * File: home.css * Author: Markus Grigull - * Date: 28.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Route.extend({ -}); diff --git a/src/styles/index.css b/src/styles/index.css new file mode 100644 index 0000000..830576d --- /dev/null +++ b/src/styles/index.css @@ -0,0 +1,4 @@ +* { + margin: 0; + padding: 0; +} diff --git a/app/controllers/dialog/widget/value.js b/src/styles/projects.css similarity index 65% rename from app/controllers/dialog/widget/value.js rename to src/styles/projects.css index 427431e..304b952 100644 --- a/app/controllers/dialog/widget/value.js +++ b/src/styles/projects.css @@ -1,13 +1,8 @@ /** - * File: value.js + * File: projects.css * Author: Markus Grigull - * Date: 12.07.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Controller.extend({ -}); diff --git a/app/components/widget-chart.js b/src/styles/simulators.css similarity index 64% rename from app/components/widget-chart.js rename to src/styles/simulators.css index 0e61a7e..8cc54ed 100644 --- a/app/components/widget-chart.js +++ b/src/styles/simulators.css @@ -1,13 +1,8 @@ /** - * File: widget-chart.js + * File: simulators.css * Author: Markus Grigull - * Date: 28.06.2016 - * Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ - -import Ember from 'ember'; - -export default Ember.Component.extend({ -}); diff --git a/testem.js b/testem.js deleted file mode 100644 index 26044b2..0000000 --- a/testem.js +++ /dev/null @@ -1,13 +0,0 @@ -/*jshint node:true*/ -module.exports = { - "framework": "qunit", - "test_page": "tests/index.html?hidepassed", - "disable_watching": true, - "launch_in_ci": [ - "PhantomJS" - ], - "launch_in_dev": [ - "PhantomJS", - "Chrome" - ] -}; diff --git a/tests/.jshintrc b/tests/.jshintrc deleted file mode 100644 index d2bd113..0000000 --- a/tests/.jshintrc +++ /dev/null @@ -1,52 +0,0 @@ -{ - "predef": [ - "document", - "window", - "location", - "setTimeout", - "$", - "-Promise", - "define", - "console", - "visit", - "exists", - "fillIn", - "click", - "keyEvent", - "triggerEvent", - "find", - "findWithAssert", - "wait", - "DS", - "andThen", - "currentURL", - "currentPath", - "currentRouteName" - ], - "node": false, - "browser": false, - "boss": true, - "curly": true, - "debug": false, - "devel": false, - "eqeqeq": true, - "evil": true, - "forin": false, - "immed": false, - "laxbreak": false, - "newcap": true, - "noarg": true, - "noempty": false, - "nonew": false, - "nomen": false, - "onevar": false, - "plusplus": false, - "regexp": false, - "undef": true, - "sub": true, - "strict": false, - "white": false, - "eqnull": true, - "esversion": 6, - "unused": true -} diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js deleted file mode 100644 index c3d4d1a..0000000 --- a/tests/helpers/destroy-app.js +++ /dev/null @@ -1,5 +0,0 @@ -import Ember from 'ember'; - -export default function destroyApp(application) { - Ember.run(application, 'destroy'); -} diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js deleted file mode 100644 index 76996fd..0000000 --- a/tests/helpers/module-for-acceptance.js +++ /dev/null @@ -1,23 +0,0 @@ -import { module } from 'qunit'; -import Ember from 'ember'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; - -const { RSVP: { Promise } } = Ember; - -export default function(name, options = {}) { - module(name, { - beforeEach() { - this.application = startApp(); - - if (options.beforeEach) { - return options.beforeEach.apply(this, arguments); - } - }, - - afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); - return Promise.resolve(afterEach).then(() => destroyApp(this.application)); - } - }); -} diff --git a/tests/helpers/resolver.js b/tests/helpers/resolver.js deleted file mode 100644 index b208d38..0000000 --- a/tests/helpers/resolver.js +++ /dev/null @@ -1,11 +0,0 @@ -import Resolver from '../../resolver'; -import config from '../../config/environment'; - -const resolver = Resolver.create(); - -resolver.namespace = { - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix -}; - -export default resolver; diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js deleted file mode 100644 index e098f1d..0000000 --- a/tests/helpers/start-app.js +++ /dev/null @@ -1,18 +0,0 @@ -import Ember from 'ember'; -import Application from '../../app'; -import config from '../../config/environment'; - -export default function startApp(attrs) { - let application; - - let attributes = Ember.merge({}, config.APP); - attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; - - Ember.run(() => { - application = Application.create(attributes); - application.setupForTesting(); - application.injectTestHelpers(); - }); - - return application; -} diff --git a/tests/index.html b/tests/index.html deleted file mode 100644 index 4def306..0000000 --- a/tests/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - VillaswebFrontend Tests - - - - {{content-for "head"}} - {{content-for "test-head"}} - - - - - - {{content-for "head-footer"}} - {{content-for "test-head-footer"}} - - - {{content-for "body"}} - {{content-for "test-body"}} - - - - - - - - {{content-for "body-footer"}} - {{content-for "test-body-footer"}} - - diff --git a/tests/integration/.gitkeep b/tests/integration/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/integration/components/draggable-dropzone-test.js b/tests/integration/components/draggable-dropzone-test.js deleted file mode 100644 index 68c8c69..0000000 --- a/tests/integration/components/draggable-dropzone-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('draggable-dropzone', 'Integration | Component | draggable dropzone', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{draggable-dropzone}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#draggable-dropzone}} - template block text - {{/draggable-dropzone}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/draggable-item-test.js b/tests/integration/components/draggable-item-test.js deleted file mode 100644 index 93830ba..0000000 --- a/tests/integration/components/draggable-item-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('draggable-item', 'Integration | Component | draggable item', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{draggable-item}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#draggable-item}} - template block text - {{/draggable-item}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/file-upload-test.js b/tests/integration/components/file-upload-test.js deleted file mode 100644 index 3c7b795..0000000 --- a/tests/integration/components/file-upload-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('file-upload', 'Integration | Component | file upload', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{file-upload}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#file-upload}} - template block text - {{/file-upload}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/flow-plot-test.js b/tests/integration/components/flow-plot-test.js deleted file mode 100644 index 949b9a7..0000000 --- a/tests/integration/components/flow-plot-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('flow-plot', 'Integration | Component | flow plot', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{flow-plot}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#flow-plot}} - template block text - {{/flow-plot}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/plot-abstract-test.js b/tests/integration/components/plot-abstract-test.js deleted file mode 100644 index 392a7fb..0000000 --- a/tests/integration/components/plot-abstract-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('plot-abstract', 'Integration | Component | plot abstract', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{plot-abstract}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#plot-abstract}} - template block text - {{/plot-abstract}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/plot-chart-test.js b/tests/integration/components/plot-chart-test.js deleted file mode 100644 index 17234e4..0000000 --- a/tests/integration/components/plot-chart-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('plot-chart', 'Integration | Component | plot chart', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{plot-chart}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#plot-chart}} - template block text - {{/plot-chart}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/plot-container-test.js b/tests/integration/components/plot-container-test.js deleted file mode 100644 index a929846..0000000 --- a/tests/integration/components/plot-container-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('plot-container', 'Integration | Component | plot container', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{plot-container}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#plot-container}} - template block text - {{/plot-container}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/plot-table-test.js b/tests/integration/components/plot-table-test.js deleted file mode 100644 index 927514e..0000000 --- a/tests/integration/components/plot-table-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('plot-table', 'Integration | Component | plot table', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{plot-table}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#plot-table}} - template block text - {{/plot-table}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/plot-value-test.js b/tests/integration/components/plot-value-test.js deleted file mode 100644 index 5a65558..0000000 --- a/tests/integration/components/plot-value-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('plot-value', 'Integration | Component | plot value', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{plot-value}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#plot-value}} - template block text - {{/plot-value}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/widget-image-test.js b/tests/integration/components/widget-image-test.js deleted file mode 100644 index 8eace27..0000000 --- a/tests/integration/components/widget-image-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('widget-image', 'Integration | Component | widget image', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{widget-image}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#widget-image}} - template block text - {{/widget-image}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/widget-label-test.js b/tests/integration/components/widget-label-test.js deleted file mode 100644 index 7312395..0000000 --- a/tests/integration/components/widget-label-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('widget-label', 'Integration | Component | widget label', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{widget-label}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#widget-label}} - template block text - {{/widget-label}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/integration/components/widget-plot-test.js b/tests/integration/components/widget-plot-test.js deleted file mode 100644 index 1b38f7a..0000000 --- a/tests/integration/components/widget-plot-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { moduleForComponent, test } from 'ember-qunit'; -import hbs from 'htmlbars-inline-precompile'; - -moduleForComponent('widget-plot', 'Integration | Component | widget plot', { - integration: true -}); - -test('it renders', function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.on('myAction', function(val) { ... }); - - this.render(hbs`{{widget-plot}}`); - - assert.equal(this.$().text().trim(), ''); - - // Template block usage: - this.render(hbs` - {{#widget-plot}} - template block text - {{/widget-plot}} - `); - - assert.equal(this.$().text().trim(), 'template block text'); -}); diff --git a/tests/test-helper.js b/tests/test-helper.js deleted file mode 100644 index e6cfb70..0000000 --- a/tests/test-helper.js +++ /dev/null @@ -1,6 +0,0 @@ -import resolver from './helpers/resolver'; -import { - setResolver -} from 'ember-qunit'; - -setResolver(resolver); diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/adapters/application-test.js b/tests/unit/adapters/application-test.js deleted file mode 100644 index f0a2101..0000000 --- a/tests/unit/adapters/application-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('adapter:application', 'Unit | Adapter | application', { - // Specify the other units that are required for this test. - // needs: ['serializer:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let adapter = this.subject(); - assert.ok(adapter); -}); diff --git a/tests/unit/controllers/application-test.js b/tests/unit/controllers/application-test.js deleted file mode 100644 index b71b4a5..0000000 --- a/tests/unit/controllers/application-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:application', 'Unit | Controller | application', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/dialog/plot/value-test.js b/tests/unit/controllers/dialog/plot/value-test.js deleted file mode 100644 index 7b1555b..0000000 --- a/tests/unit/controllers/dialog/plot/value-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:dialog/plot/value', 'Unit | Controller | dialog/plot/value', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/login-test.js b/tests/unit/controllers/login-test.js deleted file mode 100644 index b68f797..0000000 --- a/tests/unit/controllers/login-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:login', 'Unit | Controller | login', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/project/index-test.js b/tests/unit/controllers/project/index-test.js deleted file mode 100644 index b72dc07..0000000 --- a/tests/unit/controllers/project/index-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:project/index', 'Unit | Controller | project/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/projects-test.js b/tests/unit/controllers/projects-test.js deleted file mode 100644 index 174083b..0000000 --- a/tests/unit/controllers/projects-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:projects', 'Unit | Controller | projects', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/projects/new-test.js b/tests/unit/controllers/projects/new-test.js deleted file mode 100644 index 1a5e3ea..0000000 --- a/tests/unit/controllers/projects/new-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:projects/new', 'Unit | Controller | projects/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation-model/index-test.js b/tests/unit/controllers/simulation-model/index-test.js deleted file mode 100644 index 023e3c5..0000000 --- a/tests/unit/controllers/simulation-model/index-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation-model/index', 'Unit | Controller | simulation-model/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulation/index-test.js b/tests/unit/controllers/simulation/index-test.js deleted file mode 100644 index c060398..0000000 --- a/tests/unit/controllers/simulation/index-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulation/index', 'Unit | Controller | simulation/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulations-test.js b/tests/unit/controllers/simulations-test.js deleted file mode 100644 index 9b64642..0000000 --- a/tests/unit/controllers/simulations-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulations', 'Unit | Controller | simulations', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/simulators-test.js b/tests/unit/controllers/simulators-test.js deleted file mode 100644 index 285361d..0000000 --- a/tests/unit/controllers/simulators-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:simulators', 'Unit | Controller | simulators', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/user/edit-test.js b/tests/unit/controllers/user/edit-test.js deleted file mode 100644 index f06d390..0000000 --- a/tests/unit/controllers/user/edit-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:user/edit', 'Unit | Controller | user/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/users/delete-test.js b/tests/unit/controllers/users/delete-test.js deleted file mode 100644 index 68f802f..0000000 --- a/tests/unit/controllers/users/delete-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:users/delete', 'Unit | Controller | users/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/users/edit-test.js b/tests/unit/controllers/users/edit-test.js deleted file mode 100644 index debcf46..0000000 --- a/tests/unit/controllers/users/edit-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:users/edit', 'Unit | Controller | users/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/users/index-test.js b/tests/unit/controllers/users/index-test.js deleted file mode 100644 index 2395bc6..0000000 --- a/tests/unit/controllers/users/index-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:users/index', 'Unit | Controller | users/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/users/new-test.js b/tests/unit/controllers/users/new-test.js deleted file mode 100644 index 113f11e..0000000 --- a/tests/unit/controllers/users/new-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:users/new', 'Unit | Controller | users/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/visualization/edit-test.js b/tests/unit/controllers/visualization/edit-test.js deleted file mode 100644 index e0a5451..0000000 --- a/tests/unit/controllers/visualization/edit-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:visualization/edit', 'Unit | Controller | visualization/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/controllers/visualization/index-test.js b/tests/unit/controllers/visualization/index-test.js deleted file mode 100644 index d2ee03f..0000000 --- a/tests/unit/controllers/visualization/index-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('controller:visualization/index', 'Unit | Controller | visualization/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let controller = this.subject(); - assert.ok(controller); -}); diff --git a/tests/unit/mixins/draggable-test.js b/tests/unit/mixins/draggable-test.js deleted file mode 100644 index e13c254..0000000 --- a/tests/unit/mixins/draggable-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import DraggableMixin from 'villasweb-frontend/mixins/draggable'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | draggable'); - -// Replace this with your real tests. -test('it works', function(assert) { - let DraggableObject = Ember.Object.extend(DraggableMixin); - let subject = DraggableObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/mixins/droppable-test.js b/tests/unit/mixins/droppable-test.js deleted file mode 100644 index 41976f3..0000000 --- a/tests/unit/mixins/droppable-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import DroppableMixin from 'villasweb-frontend/mixins/droppable'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | droppable'); - -// Replace this with your real tests. -test('it works', function(assert) { - let DroppableObject = Ember.Object.extend(DroppableMixin); - let subject = DroppableObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/mixins/fetch-live-data-test.js b/tests/unit/mixins/fetch-live-data-test.js deleted file mode 100644 index de5b41e..0000000 --- a/tests/unit/mixins/fetch-live-data-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import FetchLiveDataMixin from 'villasweb-frontend/mixins/fetch-live-data'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | fetch live data'); - -// Replace this with your real tests. -test('it works', function(assert) { - let FetchLiveDataObject = Ember.Object.extend(FetchLiveDataMixin); - let subject = FetchLiveDataObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/mixins/live-data-test.js b/tests/unit/mixins/live-data-test.js deleted file mode 100644 index 804897f..0000000 --- a/tests/unit/mixins/live-data-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import LiveDataMixin from 'villasweb-frontend/mixins/live-data'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | live data'); - -// Replace this with your real tests. -test('it works', function(assert) { - let LiveDataObject = Ember.Object.extend(LiveDataMixin); - let subject = LiveDataObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/mixins/resizable-test.js b/tests/unit/mixins/resizable-test.js deleted file mode 100644 index eaec854..0000000 --- a/tests/unit/mixins/resizable-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import ResizableMixin from 'villasweb-frontend/mixins/resizable'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | resizable'); - -// Replace this with your real tests. -test('it works', function(assert) { - let ResizableObject = Ember.Object.extend(ResizableMixin); - let subject = ResizableObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/mixins/sortable-test.js b/tests/unit/mixins/sortable-test.js deleted file mode 100644 index 2efc2c2..0000000 --- a/tests/unit/mixins/sortable-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import Ember from 'ember'; -import SortableMixin from 'villasweb-frontend/mixins/sortable'; -import { module, test } from 'qunit'; - -module('Unit | Mixin | sortable'); - -// Replace this with your real tests. -test('it works', function(assert) { - let SortableObject = Ember.Object.extend(SortableMixin); - let subject = SortableObject.create(); - assert.ok(subject); -}); diff --git a/tests/unit/models/file-test.js b/tests/unit/models/file-test.js deleted file mode 100644 index 225d072..0000000 --- a/tests/unit/models/file-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('file', 'Unit | Model | file', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/plot-test.js b/tests/unit/models/plot-test.js deleted file mode 100644 index 50a2df7..0000000 --- a/tests/unit/models/plot-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('plot', 'Unit | Model | plot', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/project-test.js b/tests/unit/models/project-test.js deleted file mode 100644 index 2dddcd6..0000000 --- a/tests/unit/models/project-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('project', 'Unit | Model | project', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/simulation-data-test.js b/tests/unit/models/simulation-data-test.js deleted file mode 100644 index 8faab14..0000000 --- a/tests/unit/models/simulation-data-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulation-data', 'Unit | Model | simulation data', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/simulation-model-test.js b/tests/unit/models/simulation-model-test.js deleted file mode 100644 index 01f173b..0000000 --- a/tests/unit/models/simulation-model-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulation-model', 'Unit | Model | simulation-model', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/simulation-test.js b/tests/unit/models/simulation-test.js deleted file mode 100644 index fa6a585..0000000 --- a/tests/unit/models/simulation-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulation', 'Unit | Model | simulation', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/simulator-status-test.js b/tests/unit/models/simulator-status-test.js deleted file mode 100644 index 48c8a99..0000000 --- a/tests/unit/models/simulator-status-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulator-status', 'Unit | Model | simulator status', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/simulator-test.js b/tests/unit/models/simulator-test.js deleted file mode 100644 index 8a6206a..0000000 --- a/tests/unit/models/simulator-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulator', 'Unit | Model | simulator', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/user-test.js b/tests/unit/models/user-test.js deleted file mode 100644 index ba21110..0000000 --- a/tests/unit/models/user-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('user', 'Unit | Model | user', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/models/visualization-test.js b/tests/unit/models/visualization-test.js deleted file mode 100644 index f84f9bc..0000000 --- a/tests/unit/models/visualization-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('visualization', 'Unit | Model | visualization', { - // Specify the other units that are required for this test. - needs: [] -}); - -test('it exists', function(assert) { - let model = this.subject(); - // let store = this.store(); - assert.ok(!!model); -}); diff --git a/tests/unit/routes/404-test.js b/tests/unit/routes/404-test.js deleted file mode 100644 index 260a5bc..0000000 --- a/tests/unit/routes/404-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:404', 'Unit | Route | 404', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/application-test.js b/tests/unit/routes/application-test.js deleted file mode 100644 index 9808c43..0000000 --- a/tests/unit/routes/application-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:application', 'Unit | Route | application', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/dialog/plot/value-test.js b/tests/unit/routes/dialog/plot/value-test.js deleted file mode 100644 index 259de45..0000000 --- a/tests/unit/routes/dialog/plot/value-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:dialog/plot/value', 'Unit | Route | dialog/plot/value', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/index-test.js b/tests/unit/routes/index-test.js deleted file mode 100644 index 5d0f50d..0000000 --- a/tests/unit/routes/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:index', 'Unit | Route | index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/login-test.js b/tests/unit/routes/login-test.js deleted file mode 100644 index e78ebad..0000000 --- a/tests/unit/routes/login-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:login', 'Unit | Route | login', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/logout-test.js b/tests/unit/routes/logout-test.js deleted file mode 100644 index 64613a0..0000000 --- a/tests/unit/routes/logout-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:logout', 'Unit | Route | logout', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/me-test.js b/tests/unit/routes/me-test.js deleted file mode 100644 index 9719ac5..0000000 --- a/tests/unit/routes/me-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:me', 'Unit | Route | me', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/models-test.js b/tests/unit/routes/models-test.js deleted file mode 100644 index a6182e6..0000000 --- a/tests/unit/routes/models-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:models', 'Unit | Route | models', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/projects-test.js b/tests/unit/routes/projects-test.js deleted file mode 100644 index e5dfb65..0000000 --- a/tests/unit/routes/projects-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:projects', 'Unit | Route | projects', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/projects/delete-test.js b/tests/unit/routes/projects/delete-test.js deleted file mode 100644 index 7ce43e6..0000000 --- a/tests/unit/routes/projects/delete-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:projects/delete', 'Unit | Route | projects/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/projects/edit-test.js b/tests/unit/routes/projects/edit-test.js deleted file mode 100644 index 545616f..0000000 --- a/tests/unit/routes/projects/edit-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:projects/edit', 'Unit | Route | projects/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/projects/index-test.js b/tests/unit/routes/projects/index-test.js deleted file mode 100644 index c232f73..0000000 --- a/tests/unit/routes/projects/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:projects/index', 'Unit | Route | projects/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/projects/new-test.js b/tests/unit/routes/projects/new-test.js deleted file mode 100644 index 0bb6b03..0000000 --- a/tests/unit/routes/projects/new-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:projects/new', 'Unit | Route | projects/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/projects/project-test.js b/tests/unit/routes/projects/project-test.js deleted file mode 100644 index fa2d3fe..0000000 --- a/tests/unit/routes/projects/project-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:projects/project', 'Unit | Route | projects/project', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation-model/index-test.js b/tests/unit/routes/simulation-model/index-test.js deleted file mode 100644 index ae828d2..0000000 --- a/tests/unit/routes/simulation-model/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation-model/index', 'Unit | Route | simulation-model/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulation/index-test.js b/tests/unit/routes/simulation/index-test.js deleted file mode 100644 index ba31a78..0000000 --- a/tests/unit/routes/simulation/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulation/index', 'Unit | Route | simulation/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulations-test.js b/tests/unit/routes/simulations-test.js deleted file mode 100644 index b72a094..0000000 --- a/tests/unit/routes/simulations-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulations', 'Unit | Route | simulations', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulators-test.js b/tests/unit/routes/simulators-test.js deleted file mode 100644 index 8dbfe46..0000000 --- a/tests/unit/routes/simulators-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulators', 'Unit | Route | simulators', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulators/delete-test.js b/tests/unit/routes/simulators/delete-test.js deleted file mode 100644 index 98ca109..0000000 --- a/tests/unit/routes/simulators/delete-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulators/delete', 'Unit | Route | simulators/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulators/edit-test.js b/tests/unit/routes/simulators/edit-test.js deleted file mode 100644 index be49ba0..0000000 --- a/tests/unit/routes/simulators/edit-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulators/edit', 'Unit | Route | simulators/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/simulators/index-test.js b/tests/unit/routes/simulators/index-test.js deleted file mode 100644 index dfccfba..0000000 --- a/tests/unit/routes/simulators/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:simulators/index', 'Unit | Route | simulators/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/user/delete-test.js b/tests/unit/routes/user/delete-test.js deleted file mode 100644 index 4be7323..0000000 --- a/tests/unit/routes/user/delete-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:user/delete', 'Unit | Route | user/delete', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/user/edit-test.js b/tests/unit/routes/user/edit-test.js deleted file mode 100644 index 754cb31..0000000 --- a/tests/unit/routes/user/edit-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:user/edit', 'Unit | Route | user/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/user/index-test.js b/tests/unit/routes/user/index-test.js deleted file mode 100644 index fe27105..0000000 --- a/tests/unit/routes/user/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:user/index', 'Unit | Route | user/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/user/new-test.js b/tests/unit/routes/user/new-test.js deleted file mode 100644 index 5032fa8..0000000 --- a/tests/unit/routes/user/new-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:user/new', 'Unit | Route | user/new', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/visualization/edit-test.js b/tests/unit/routes/visualization/edit-test.js deleted file mode 100644 index d04fad6..0000000 --- a/tests/unit/routes/visualization/edit-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:visualization/edit', 'Unit | Route | visualization/edit', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/routes/visualization/index-test.js b/tests/unit/routes/visualization/index-test.js deleted file mode 100644 index 8dae607..0000000 --- a/tests/unit/routes/visualization/index-test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('route:visualization/index', 'Unit | Route | visualization/index', { - // Specify the other units that are required for this test. - // needs: ['controller:foo'] -}); - -test('it exists', function(assert) { - let route = this.subject(); - assert.ok(route); -}); diff --git a/tests/unit/serializers/application-test.js b/tests/unit/serializers/application-test.js deleted file mode 100644 index 705e9ec..0000000 --- a/tests/unit/serializers/application-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('application', 'Unit | Serializer | application', { - // Specify the other units that are required for this test. - needs: ['serializer:application'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); diff --git a/tests/unit/serializers/project-test.js b/tests/unit/serializers/project-test.js deleted file mode 100644 index f0131a1..0000000 --- a/tests/unit/serializers/project-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('project', 'Unit | Serializer | project', { - // Specify the other units that are required for this test. - needs: ['serializer:project'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); diff --git a/tests/unit/serializers/simulation-model-test.js b/tests/unit/serializers/simulation-model-test.js deleted file mode 100644 index 32b3e21..0000000 --- a/tests/unit/serializers/simulation-model-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulation-model', 'Unit | Serializer | simulation-model', { - // Specify the other units that are required for this test. - needs: ['serializer:simulation-model'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); diff --git a/tests/unit/serializers/simulation-test.js b/tests/unit/serializers/simulation-test.js deleted file mode 100644 index 40a61cd..0000000 --- a/tests/unit/serializers/simulation-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('simulation', 'Unit | Serializer | simulation', { - // Specify the other units that are required for this test. - needs: ['serializer:simulation'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); diff --git a/tests/unit/serializers/user-test.js b/tests/unit/serializers/user-test.js deleted file mode 100644 index 19e4a38..0000000 --- a/tests/unit/serializers/user-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('user', 'Unit | Serializer | user', { - // Specify the other units that are required for this test. - needs: ['serializer:user'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); diff --git a/tests/unit/serializers/visualization-test.js b/tests/unit/serializers/visualization-test.js deleted file mode 100644 index f31eeec..0000000 --- a/tests/unit/serializers/visualization-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { moduleForModel, test } from 'ember-qunit'; - -moduleForModel('visualization', 'Unit | Serializer | visualization', { - // Specify the other units that are required for this test. - needs: ['serializer:visualization'] -}); - -// Replace this with your real tests. -test('it serializes records', function(assert) { - let record = this.subject(); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); -}); diff --git a/tests/unit/services/session-user-test.js b/tests/unit/services/session-user-test.js deleted file mode 100644 index 230acec..0000000 --- a/tests/unit/services/session-user-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('service:session-user', 'Unit | Service | session user', { - // Specify the other units that are required for this test. - // needs: ['service:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let service = this.subject(); - assert.ok(service); -}); diff --git a/tests/unit/transforms/array-test.js b/tests/unit/transforms/array-test.js deleted file mode 100644 index 372f9af..0000000 --- a/tests/unit/transforms/array-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { moduleFor, test } from 'ember-qunit'; - -moduleFor('transform:array', 'Unit | Transform | array', { - // Specify the other units that are required for this test. - // needs: ['serializer:foo'] -}); - -// Replace this with your real tests. -test('it exists', function(assert) { - let transform = this.subject(); - assert.ok(transform); -}); diff --git a/todo.md b/todo.md deleted file mode 100644 index aca9507..0000000 --- a/todo.md +++ /dev/null @@ -1,89 +0,0 @@ -# To-Do - - Change password - - Go into edit mode if visualization is empty - - Auto-detect if simulators are running - - Remove running socket if it's not in the updated list - -websocketserverip/config.json -{ - "affinity": 1, - "debug": 5, - "stats": 3, - "name": "villas-acs", - "http": { - "htdocs": "/villas/web/socket", - "port": 80 - }, - "plugins": [ - "simple_circuit.so", - "example_hook.so" - ], - "nodes": { - "ws": { - "type": "websocket", - "unit": "MVa", - "units": [ - "V", - "A", - "Var" - ], - "description": "Demo Channel", - "source": { - "simulator": "OP5600", - "location": "ACS lab" - }, - "series": [ - { - "label": "Random walk" - }, - { - "label": "Sine" - }, - { - "label": "Rect" - } - ] - } - }, - "paths": [ - { - "in": "ws", - "out": "ws" - } - ] -} - - -websocketserverip/nodes.json: -[ - { - "name": "ws", - "connections": 1, - "state": 3, - "vectorize": 1, - "affinity": 1, - "type": "websocket", - "unit": "MVa", - "units": [ - "V", - "A", - "Var" - ], - "description": "Demo Channel", - "source": { - "simulator": "OP5600", - "location": "ACS lab" - }, - "series": [ - { - "label": "Random walk" - }, - { - "label": "Sine" - }, - { - "label": "Rect" - } - ] - } -] diff --git a/vendor/.gitkeep b/vendor/.gitkeep deleted file mode 100644 index e69de29..0000000 From 48057a99ec3d8f86445b7149cee30443c03e655e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 2 Mar 2017 14:54:42 +0100 Subject: [PATCH 052/556] Add new simulator modal Use bootstrap for buttons, forms, modals --- src/components/dialog-new-simulator.js | 108 +++++++++++++++++++++++++ src/containers/simulators.js | 42 ++++++---- src/index.js | 2 + src/stores/simulator-store.js | 4 +- src/styles/app.css | 10 ++- 5 files changed, 145 insertions(+), 21 deletions(-) create mode 100644 src/components/dialog-new-simulator.js diff --git a/src/components/dialog-new-simulator.js b/src/components/dialog-new-simulator.js new file mode 100644 index 0000000..bce7065 --- /dev/null +++ b/src/components/dialog-new-simulator.js @@ -0,0 +1,108 @@ +/** + * File: dialog-new-simulator.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + + import React, { Component } from 'react'; + import { Modal, Button, FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + + class NewSimulatorDialog extends Component { + constructor(props) { + super(props); + + this.state = { + name: '', + simulatorid: '1', + endpoint: '' + } + + this.closeModal = this.closeModal.bind(this); + this.cancelModal = this.cancelModal.bind(this); + this.handleChange = this.handleChange.bind(this); + this.validateForm = this.validateForm.bind(this); + this.resetState = this.resetState.bind(this); + } + + valid: false + + closeModal() { + this.props.onClose(this.state); + } + + cancelModal() { + this.props.onClose(null); + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', simulatorid: '1', endpoint: '' }); + } + + validateForm(target) { + // check all controls + var simulatorid = true; + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + // test if simulatorid is a number (in a string, not type of number) + if (!/^\d+$/.test(this.state.simulatorid)) { + simulatorid = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = simulatorid && endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else if (target === 'simulatorid') return simulatorid ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + + + New Simulator + + + +
    + + Name + + + + Simulator ID + + + + Endpoint + + + +
    + + + + + +
    + ); + } + } + + export default NewSimulatorDialog; diff --git a/src/containers/simulators.js b/src/containers/simulators.js index f9687da..03ecb04 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -9,15 +9,24 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; +import { Button } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import VillasStore from '../stores/villas-store'; import SimulatorStore from '../stores/simulator-store'; import Table from '../components/table'; +import NewSimulatorDialog from '../components/dialog-new-simulator'; import '../styles/projects.css'; class Simulators extends Component { + constructor(props) { + super(props); + + this.showModal = this.showModal.bind(this); + this.closeModal = this.closeModal.bind(this); + } + static getStores() { return [ VillasStore, SimulatorStore ]; } @@ -27,7 +36,7 @@ class Simulators extends Component { villas: VillasStore.getState(), simulators: SimulatorStore.getState(), - onButton + modal: false }; } @@ -37,6 +46,21 @@ class Simulators extends Component { }); } + showModal() { + this.setState({ modal: true }); + } + + closeModal(data) { + this.setState({ modal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'simulators/start-add', + simulator: data + }); + } + } + render() { var columns = [ { title: 'Name', key: 'name' }, @@ -51,22 +75,12 @@ class Simulators extends Component {
    - + + + ); } } -function onButton() { - AppDispatcher.dispatch({ - type: 'simulators/start-add', - simulator: { - name: 'Virtual', - running: false, - simulatorid: 3, - endpoint: '1.1.1.1:1234' - } - }); -} - export default Container.create(Simulators); diff --git a/src/index.js b/src/index.js index 37758bb..c7cccd4 100644 --- a/src/index.js +++ b/src/index.js @@ -11,6 +11,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; import Router from './router'; + +import 'bootstrap/dist/css/bootstrap.css'; import './styles/index.css'; ReactDOM.render( diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index f8ff715..66285e1 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -22,8 +22,6 @@ class SimulatorStore extends ReduceStore { } reduce(state, action) { - console.log(action.type); - switch (action.type) { case 'simulators/start-load': SimulatorsDataManager.loadSimulators(); @@ -44,7 +42,7 @@ class SimulatorStore extends ReduceStore { // state should always be immutable, thus make new copy var simulators = state.slice(); simulators.push(action.simulator); - + return simulators; case 'simulators/add-error': diff --git a/src/styles/app.css b/src/styles/app.css index 6ee6c69..e3c697d 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -11,7 +11,7 @@ * Application container */ body { - background-color: #6EA2B0; + background-color: #6EA2B0 !important; } .app { @@ -24,7 +24,7 @@ body { .app header { width: 100%; - height: 50px; + height: 60px; padding: 10px 0 0 0; @@ -35,6 +35,8 @@ body { .app header h1 { width: 100%; + margin: 0; + text-align: center; } @@ -119,7 +121,7 @@ body { /** * Buttons */ -button { +/*button { margin-top: 10px; padding: 4px 8px; @@ -135,4 +137,4 @@ button { button:hover { background: #6EA2B0; -} +}*/ From 2fa75f0e58cee29ba906d1e8d253565b69006a6e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 2 Mar 2017 16:22:57 +0100 Subject: [PATCH 053/556] Add delete and edit dialog to simulators --- src/api/rest-api.js | 24 +++ src/components/dialog-edit-simulator.js | 114 +++++++++++++ src/components/dialog-new-simulator.js | 162 +++++++++---------- src/components/table-control.js | 61 +++++++ src/containers/projects.js | 2 - src/containers/simulators.js | 105 ++++++++++-- src/data-managers/simulators-data-manager.js | 48 ++++-- src/stores/simulator-store.js | 35 +++- src/styles/app.css | 18 +-- src/styles/projects.css | 8 - src/styles/simulators.css | 8 - 11 files changed, 447 insertions(+), 138 deletions(-) create mode 100644 src/components/dialog-edit-simulator.js create mode 100644 src/components/table-control.js delete mode 100644 src/styles/projects.css delete mode 100644 src/styles/simulators.css diff --git a/src/api/rest-api.js b/src/api/rest-api.js index 0b3008c..bc886bb 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -41,6 +41,30 @@ class RestAPI { }); }); } + + delete(url) { + return new Promise(function (resolve, reject) { + request.delete(makeURL(url)).end(function (error, res) { + if (res.status !== 200) { + reject(); + } else { + resolve(JSON.parse(res.text)); + } + }); + }); + } + + put(url, body) { + return new Promise(function (resolve, reject) { + request.put(makeURL(url)).send(body).end(function (error, res) { + if (res.status !== 200) { + reject(); + } else { + resolve(JSON.parse(res.text)); + } + }); + }); + } } export default new RestAPI(); diff --git a/src/components/dialog-edit-simulator.js b/src/components/dialog-edit-simulator.js new file mode 100644 index 0000000..a281522 --- /dev/null +++ b/src/components/dialog-edit-simulator.js @@ -0,0 +1,114 @@ +/** + * File: dialog-new-simulator.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Modal, Button, FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +class EditSimulatorDialog extends Component { + constructor(props) { + super(props); + + this.state = { + name: '', + simulatorid: '1', + endpoint: '', + _id: '' + } + + this.closeModal = this.closeModal.bind(this); + this.cancelModal = this.cancelModal.bind(this); + this.handleChange = this.handleChange.bind(this); + this.validateForm = this.validateForm.bind(this); + this.resetState = this.resetState.bind(this); + } + + valid: false + + closeModal() { + this.props.onClose(this.state); + } + + cancelModal() { + this.props.onClose(null); + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ + name: this.props.simulator.name, + simulatorid: this.props.simulator.simulatorid, + endpoint: this.props.simulator.endpoint, + _id: this.props.simulator._id + }); + } + + validateForm(target) { + // check all controls + var simulatorid = true; + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + // test if simulatorid is a number (in a string, not type of number) + if (!/^\d+$/.test(this.state.simulatorid)) { + simulatorid = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = simulatorid && endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else if (target === 'simulatorid') return simulatorid ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + + + Edit Simulator + + + +
    + + Name + + + + Simulator ID + + + + Endpoint + + + +
    + + + + + +
    + ); + } +} + +export default EditSimulatorDialog; diff --git a/src/components/dialog-new-simulator.js b/src/components/dialog-new-simulator.js index bce7065..95a3aa0 100644 --- a/src/components/dialog-new-simulator.js +++ b/src/components/dialog-new-simulator.js @@ -7,102 +7,102 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ - import React, { Component } from 'react'; - import { Modal, Button, FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import React, { Component } from 'react'; +import { Modal, Button, FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - class NewSimulatorDialog extends Component { - constructor(props) { - super(props); +class NewSimulatorDialog extends Component { + constructor(props) { + super(props); - this.state = { - name: '', - simulatorid: '1', - endpoint: '' - } + this.state = { + name: '', + simulatorid: '1', + endpoint: '' + } - this.closeModal = this.closeModal.bind(this); - this.cancelModal = this.cancelModal.bind(this); - this.handleChange = this.handleChange.bind(this); - this.validateForm = this.validateForm.bind(this); - this.resetState = this.resetState.bind(this); - } + this.closeModal = this.closeModal.bind(this); + this.cancelModal = this.cancelModal.bind(this); + this.handleChange = this.handleChange.bind(this); + this.validateForm = this.validateForm.bind(this); + this.resetState = this.resetState.bind(this); + } - valid: false + valid: false - closeModal() { - this.props.onClose(this.state); - } + closeModal() { + this.props.onClose(this.state); + } - cancelModal() { - this.props.onClose(null); - } + cancelModal() { + this.props.onClose(null); + } - handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); - } + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } - resetState() { - this.setState({ name: '', simulatorid: '1', endpoint: '' }); - } + resetState() { + this.setState({ name: '', simulatorid: '1', endpoint: '' }); + } - validateForm(target) { - // check all controls - var simulatorid = true; - var endpoint = true; - var name = true; + validateForm(target) { + // check all controls + var simulatorid = true; + var endpoint = true; + var name = true; - if (this.state.name === '') { - name = false; - } + if (this.state.name === '') { + name = false; + } - // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.simulatorid)) { - simulatorid = false; - } + // test if simulatorid is a number (in a string, not type of number) + if (!/^\d+$/.test(this.state.simulatorid)) { + simulatorid = false; + } - if (this.state.endpoint === '') { - endpoint = false; - } + if (this.state.endpoint === '') { + endpoint = false; + } - this.valid = simulatorid && endpoint && name; + this.valid = simulatorid && endpoint && name; - // return state to control - if (target === 'name') return name ? "success" : "error"; - else if (target === 'simulatorid') return simulatorid ? "success" : "error"; - else return endpoint ? "success" : "error"; - } + // return state to control + if (target === 'name') return name ? "success" : "error"; + else if (target === 'simulatorid') return simulatorid ? "success" : "error"; + else return endpoint ? "success" : "error"; + } - render() { - return ( - - - New Simulator - + render() { + return ( + + + New Simulator + - -
    - - Name - - - - Simulator ID - - - - Endpoint - - - -
    + +
    + + Name + + + + Simulator ID + + + + Endpoint + + + +
    - - - - -
    - ); - } - } + + + + +
    + ); + } +} - export default NewSimulatorDialog; +export default NewSimulatorDialog; diff --git a/src/components/table-control.js b/src/components/table-control.js new file mode 100644 index 0000000..9256a36 --- /dev/null +++ b/src/components/table-control.js @@ -0,0 +1,61 @@ +/** + * File: table.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Button, Glyphicon } from 'react-bootstrap'; + +class ControlTable extends Component { + render() { + // create sorted rows + var rows = this.props.data.map(row => { + // add cells by column keys + var rowArray = [ row._id ]; + + for (var i = 0; i < this.props.columns.length; i++) { + if (row[this.props.columns[i].key] != null) { + rowArray.push(row[this.props.columns[i].key].toString()); + } else { + rowArray.push(""); + } + } + + return rowArray; + }); + + return ( +
    + + + {this.props.columns.map(column => ( + + ))} + + + + + {rows.map((row) => ( + + {row.filter((element, index) => { + return index !== 0; + }).map((cell, index) => ( + + ))} + + + ))} + +
    {column.title}
    {cell} + + +
    + ); + } +} + +export default ControlTable; diff --git a/src/containers/projects.js b/src/containers/projects.js index bf87dbc..825ca7f 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -13,8 +13,6 @@ import { Container } from 'flux/utils'; // import AppDispatcher from '../app-dispatcher'; import VillasStore from '../stores/villas-store'; -import '../styles/projects.css'; - class Projects extends Component { static getStores() { return [ VillasStore ]; diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 03ecb04..d01ebf2 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -9,34 +9,40 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; +import { Button, Modal } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; -import VillasStore from '../stores/villas-store'; import SimulatorStore from '../stores/simulator-store'; -import Table from '../components/table'; +import ControlTable from '../components/table-control'; import NewSimulatorDialog from '../components/dialog-new-simulator'; -import '../styles/projects.css'; +import EditSimulatorDialog from '../components/dialog-edit-simulator'; class Simulators extends Component { constructor(props) { super(props); - this.showModal = this.showModal.bind(this); - this.closeModal = this.closeModal.bind(this); + this.showNewModal = this.showNewModal.bind(this); + this.closeNewModal = this.closeNewModal.bind(this); + this.showDeleteModal = this.showDeleteModal.bind(this); + this.confirmDeleteModal = this.confirmDeleteModal.bind(this); + this.cancelDeleteModal = this.cancelDeleteModal.bind(this); + this.showEditModal = this.showEditModal.bind(this); + this.closeEditModal = this.closeEditModal.bind(this); } static getStores() { - return [ VillasStore, SimulatorStore ]; + return [ SimulatorStore ]; } static calculateState() { return { - villas: VillasStore.getState(), simulators: SimulatorStore.getState(), - modal: false + newModal: false, + deleteModal: false, + editModal: false, + modalSimulator: {} }; } @@ -46,12 +52,12 @@ class Simulators extends Component { }); } - showModal() { - this.setState({ modal: true }); + showNewModal() { + this.setState({ newModal: true }); } - closeModal(data) { - this.setState({ modal : false }); + closeNewModal(data) { + this.setState({ newModal : false }); if (data) { AppDispatcher.dispatch({ @@ -61,6 +67,56 @@ class Simulators extends Component { } } + showDeleteModal(id) { + // get simulator by id + var deleteSimulator; + + this.state.simulators.forEach((simulator) => { + if (simulator._id === id) { + deleteSimulator = simulator; + } + }); + + this.setState({ deleteModal: true, modalSimulator: deleteSimulator }); + } + + cancelDeleteModal() { + this.setState({ deleteModal: false }); + } + + confirmDeleteModal() { + this.setState({ deleteModal: false }); + + AppDispatcher.dispatch({ + type: 'simulators/start-remove', + simulator: this.state.modalSimulator + }); + } + + showEditModal(id) { + // get simulator by id + var editSimulator; + + this.state.simulators.forEach((simulator) => { + if (simulator._id === id) { + editSimulator = simulator; + } + }); + + this.setState({ editModal: true, modalSimulator: editSimulator }); + } + + closeEditModal(data) { + this.setState({ editModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'simulators/start-edit', + simulator: data + }); + } + } + render() { var columns = [ { title: 'Name', key: 'name' }, @@ -73,11 +129,28 @@ class Simulators extends Component {

    Simulators

    - + - + - + + + + + + + Delete Simulator + + + + Are you sure you want to delete the simulator '{this.state.modalSimulator.name}'? + + + + + + + ); } diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index bba01a1..d10a333 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -16,11 +16,11 @@ const SimulatorsDataManager = { AppDispatcher.dispatch({ type: 'simulators/loaded', simulators: response.simulators - }).catch(error => { - AppDispatcher.dispatch({ - type: 'simulators/load-error', - error: error - }); + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/load-error', + error: error }); }); }, @@ -30,11 +30,39 @@ const SimulatorsDataManager = { AppDispatcher.dispatch({ type: 'simulators/added', simulator: response.simulator - }).catch(error => { - AppDispatcher.dispatch({ - type: 'simulators/add-error', - error: error - }); + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/add-error', + error: error + }); + }); + }, + + removeSimulator(simulator) { + RestAPI.delete('/simulators/' + simulator._id).then(response => { + AppDispatcher.dispatch({ + type: 'simulators/removed', + simulator: simulator + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/remove-error', + error: error + }); + }); + }, + + editSimulator(simulator) { + RestAPI.put('/simulators/' + simulator._id, { simulator: simulator }).then(response => { + AppDispatcher.dispatch({ + type: 'simulators/edited', + simulator: response.simulator + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/edit-error', + error: error }); }); } diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 66285e1..83a4533 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -22,6 +22,8 @@ class SimulatorStore extends ReduceStore { } reduce(state, action) { + var simulators; + switch (action.type) { case 'simulators/start-load': SimulatorsDataManager.loadSimulators(); @@ -40,7 +42,7 @@ class SimulatorStore extends ReduceStore { case 'simulators/added': // state should always be immutable, thus make new copy - var simulators = state.slice(); + simulators = state.slice(); simulators.push(action.simulator); return simulators; @@ -49,6 +51,37 @@ class SimulatorStore extends ReduceStore { // TODO: Add error message return state; + case 'simulators/start-remove': + SimulatorsDataManager.removeSimulator(action.simulator); + return state; + + case 'simulators/removed': + return state.filter((simulator) => { + return (simulator !== action.simulator) + }); + + case 'simulators/remove-error': + // TODO: Add error message + return state; + + case 'simulators/start-edit': + SimulatorsDataManager.editSimulator(action.simulator); + return state; + + case 'simulators/edited': + simulators = state.slice(); + for (var i = 0; i < simulators.length; i++) { + if (simulators[i]._id === action.simulator._id) { + simulators[i] = action.simulator; + } + } + + return simulators; + + case 'simulators/edit-error': + // TODO: Add error message + return state; + default: return state; } diff --git a/src/styles/app.css b/src/styles/app.css index e3c697d..1230010 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -121,20 +121,14 @@ body { /** * Buttons */ -/*button { - margin-top: 10px; - padding: 4px 8px; - +.table-control-button { border: none; - background-color: #527984; - color: #fff; + background: none; - font-size: 14px; - - cursor: pointer; + padding: 0 5px; } -button:hover { - background: #6EA2B0; -}*/ +.table-control-button:hover { + color: #888; +} diff --git a/src/styles/projects.css b/src/styles/projects.css deleted file mode 100644 index 304b952..0000000 --- a/src/styles/projects.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * File: projects.css - * Author: Markus Grigull - * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ diff --git a/src/styles/simulators.css b/src/styles/simulators.css deleted file mode 100644 index 8cc54ed..0000000 --- a/src/styles/simulators.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * File: simulators.css - * Author: Markus Grigull - * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ From c6677e455351648ff9a53187b2da88671f200836 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 3 Mar 2017 13:21:25 +0100 Subject: [PATCH 054/556] Add visualization list and detailed view Placeholder widgets are displayed, modifable but not updated yet --- package.json | 1 + src/components/dialog-edit-simulator.js | 81 +++++------ src/components/dialog-edit-visualization.js | 82 +++++++++++ src/components/dialog-new-simulator.js | 82 +++++------ src/components/dialog-new-visualization.js | 77 ++++++++++ src/components/dialog.js | 49 +++++++ src/components/dropzone.js | 51 +++++++ src/components/menu-sidebar.js | 1 + src/components/table-control-link.js | 75 ++++++++++ src/components/table-control.js | 2 +- src/components/toolbox-item.js | 52 +++++++ src/components/widget.js | 65 +++++++++ src/containers/app.js | 4 +- src/containers/simulators.js | 38 ++--- src/containers/visualization.js | 96 +++++++++++++ src/containers/visualizations.js | 136 ++++++++++++++++++ src/data-managers/rest-data-manager.js | 82 +++++++++++ src/data-managers/simulators-data-manager.js | 63 +------- .../visualizations-data-manager.js | 12 ++ src/router.js | 5 + src/stores/array-store.js | 93 ++++++++++++ src/stores/simulator-store.js | 82 +---------- src/stores/visualization-store.js | 13 ++ src/styles/app.css | 41 +++++- src/styles/widgets.css | 17 +++ 25 files changed, 1036 insertions(+), 264 deletions(-) create mode 100644 src/components/dialog-edit-visualization.js create mode 100644 src/components/dialog-new-visualization.js create mode 100644 src/components/dialog.js create mode 100644 src/components/dropzone.js create mode 100644 src/components/table-control-link.js create mode 100644 src/components/toolbox-item.js create mode 100644 src/components/widget.js create mode 100644 src/containers/visualization.js create mode 100644 src/containers/visualizations.js create mode 100644 src/data-managers/rest-data-manager.js create mode 100644 src/data-managers/visualizations-data-manager.js create mode 100644 src/stores/array-store.js create mode 100644 src/stores/visualization-store.js create mode 100644 src/styles/widgets.css diff --git a/package.json b/package.json index e8b8119..1830bf3 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "react-dnd": "^2.2.4", "react-dnd-html5-backend": "^2.2.4", "react-dom": "^15.4.2", + "react-rnd": "^4.2.2", "react-router": "^3.0.2", "superagent": "^3.5.0" }, diff --git a/src/components/dialog-edit-simulator.js b/src/components/dialog-edit-simulator.js index a281522..bddec15 100644 --- a/src/components/dialog-edit-simulator.js +++ b/src/components/dialog-edit-simulator.js @@ -7,10 +7,20 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import React, { Component } from 'react'; -import { Modal, Button, FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; class EditSimulatorDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + simulator: PropTypes.object.isRequired + }; + + valid: false; + constructor(props) { super(props); @@ -19,23 +29,15 @@ class EditSimulatorDialog extends Component { simulatorid: '1', endpoint: '', _id: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); } - - this.closeModal = this.closeModal.bind(this); - this.cancelModal = this.cancelModal.bind(this); - this.handleChange = this.handleChange.bind(this); - this.validateForm = this.validateForm.bind(this); - this.resetState = this.resetState.bind(this); - } - - valid: false - - closeModal() { - this.props.onClose(this.state); - } - - cancelModal() { - this.props.onClose(null); } handleChange(e) { @@ -80,33 +82,22 @@ class EditSimulatorDialog extends Component { render() { return ( - - - Edit Simulator - - - -
    - - Name - - - - Simulator ID - - - - Endpoint - - - -
    - - - - - -
    + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + Simulator ID + this.handleChange(e)} /> + + + Endpoint + this.handleChange(e)} /> + + +
    ); } } diff --git a/src/components/dialog-edit-visualization.js b/src/components/dialog-edit-visualization.js new file mode 100644 index 0000000..5284c7a --- /dev/null +++ b/src/components/dialog-edit-visualization.js @@ -0,0 +1,82 @@ +/** + * File: dialog-new-visualization.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class EditVisualizationDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + visualization: PropTypes.object.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + _id: '' + } + } + + onClose(canceled) { + if (canceled === false) { + 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.visualization.name, + _id: this.props.visualization._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)} /> + + +
    + ); + } +} + +export default EditVisualizationDialog; diff --git a/src/components/dialog-new-simulator.js b/src/components/dialog-new-simulator.js index 95a3aa0..93a074e 100644 --- a/src/components/dialog-new-simulator.js +++ b/src/components/dialog-new-simulator.js @@ -7,34 +7,35 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import React, { Component } from 'react'; -import { Modal, Button, FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; class NewSimulatorDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + constructor(props) { super(props); - this.state = { + this.state = { name: '', simulatorid: '1', endpoint: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); } - - this.closeModal = this.closeModal.bind(this); - this.cancelModal = this.cancelModal.bind(this); - this.handleChange = this.handleChange.bind(this); - this.validateForm = this.validateForm.bind(this); - this.resetState = this.resetState.bind(this); - } - - valid: false - - closeModal() { - this.props.onClose(this.state); - } - - cancelModal() { - this.props.onClose(null); } handleChange(e) { @@ -74,33 +75,22 @@ class NewSimulatorDialog extends Component { render() { return ( - - - New Simulator - - - -
    - - Name - - - - Simulator ID - - - - Endpoint - - - -
    - - - - - -
    + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + Simulator ID + this.handleChange(e)} /> + + + Endpoint + this.handleChange(e)} /> + + +
    ); } } diff --git a/src/components/dialog-new-visualization.js b/src/components/dialog-new-visualization.js new file mode 100644 index 0000000..d24aa6e --- /dev/null +++ b/src/components/dialog-new-visualization.js @@ -0,0 +1,77 @@ +/** + * File: dialog-new-visualization.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewVisualzationDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '' + } + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '' }); + } + + 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)} /> + + +
    + ); + } +} + +export default NewVisualzationDialog; diff --git a/src/components/dialog.js b/src/components/dialog.js new file mode 100644 index 0000000..a317a02 --- /dev/null +++ b/src/components/dialog.js @@ -0,0 +1,49 @@ +/** + * File: dialog.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { Modal, Button } from 'react-bootstrap'; + +class Dialog extends Component { + static propTypes = { + title: PropTypes.string.isRequired, + show: PropTypes.bool.isRequired, + buttonTitle: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired + }; + + closeModal() { + this.props.onClose(false); + } + + cancelModal() { + this.props.onClose(true); + } + + render() { + return ( + + + {this.props.title} + + + + {this.props.children} + + + + + + + + ); + } +} + +export default Dialog; diff --git a/src/components/dropzone.js b/src/components/dropzone.js new file mode 100644 index 0000000..de2986d --- /dev/null +++ b/src/components/dropzone.js @@ -0,0 +1,51 @@ +/** + * File: dropzone.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { DropTarget } from 'react-dnd'; +import classNames from 'classnames'; + +const dropzoneTarget = { + drop(props, monitor) { + props.onDrop(monitor.getItem()); + } +}; + +function collect(connect, monitor) { + return { + connectDropTarget: connect.dropTarget(), + isOver: monitor.isOver(), + canDrop: monitor.canDrop() + }; +} + +class Dropzone extends Component { + static propTypes = { + connectDropTarget: PropTypes.func.isRequired, + isOver: PropTypes.bool.isRequired, + canDrop: PropTypes.bool.isRequired, + onDrop: PropTypes.func.isRequired + }; + + render() { + var toolboxClass = classNames({ + 'toolbox-dropzone': true, + 'toolbox-dropzone-active': this.props.isOver && this.props.canDrop && this.props.editing, + 'toolbox-dropzone-editing': this.props.editing + }); + + return this.props.connectDropTarget( +
    + {this.props.children} +
    + ); + } +} + +export default DropTarget('widget', dropzoneTarget, collect)(Dropzone); diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index c6df652..b396169 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -21,6 +21,7 @@ class SidebarMenu extends Component {
  • Projects
  • Simulations
  • Simulators
  • +
  • Visualizations
  • ); diff --git a/src/components/table-control-link.js b/src/components/table-control-link.js new file mode 100644 index 0000000..4e9c87a --- /dev/null +++ b/src/components/table-control-link.js @@ -0,0 +1,75 @@ +/** + * File: table-control-link.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { Button, Glyphicon } from 'react-bootstrap'; +import { Link } from 'react-router'; + +class ControlLinkTable extends Component { + static propTypes = { + columns: PropTypes.array.isRequired, + onEdit: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, + linkRoot: PropTypes.string.isRequired + }; + + render() { + // create sorted rows + var rows = this.props.data.map(row => { + // add cells by column keys + var rowArray = [ row._id ]; + + for (var i = 0; i < this.props.columns.length; i++) { + if (row[this.props.columns[i].key] != null) { + rowArray.push(row[this.props.columns[i].key].toString()); + } else { + rowArray.push(""); + } + } + + return rowArray; + }); + + return ( +
    + + + {this.props.columns.map(column => ( + + ))} + + + + + {rows.map((row) => ( + + {row.filter((element, index) => { + return index !== 0; + }).map((cell, index) => ( + + ))} + + + ))} + +
    {column.title}
    + {index === 0 ? ( + {cell} + ) : ( + {cell} + )} + + + +
    + ); + } +} + +export default ControlLinkTable; diff --git a/src/components/table-control.js b/src/components/table-control.js index 9256a36..ea12ca8 100644 --- a/src/components/table-control.js +++ b/src/components/table-control.js @@ -1,5 +1,5 @@ /** - * File: table.js + * File: table-control.js * Author: Markus Grigull * Date: 02.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js new file mode 100644 index 0000000..bedb46a --- /dev/null +++ b/src/components/toolbox-item.js @@ -0,0 +1,52 @@ +/** + * File: toolbox-item.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { DragSource } from 'react-dnd'; +import classNames from 'classnames'; + +const toolboxItemSource = { + beginDrag(props) { + return { + name: props.name + }; + } +}; + +function collect(connect, monitor) { + return { + connectDragSource: connect.dragSource(), + isDragging: monitor.isDragging() + } +} + +class ToolboxItem extends Component { + static propTypes = { + connectDragSource: PropTypes.func.isRequired, + isDragging: PropTypes.bool.isRequired, + name: PropTypes.string.isRequired, + type: PropTypes.string.isRequired + }; + + render() { + var itemClass = classNames({ + 'toolbox-item': true, + 'toolbox-item-dragging': this.props.isDragging + }); + var dropEffect = 'copy'; + + return this.props.connectDragSource( + + {this.props.name} + + , {dropEffect}); + } +} + +export default DragSource('widget', toolboxItemSource, collect)(ToolboxItem); diff --git a/src/components/widget.js b/src/components/widget.js new file mode 100644 index 0000000..fa37ce3 --- /dev/null +++ b/src/components/widget.js @@ -0,0 +1,65 @@ +/** + * File: widget.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import Rnd from 'react-rnd'; + +import '../styles/widgets.css'; + +class Widget extends Component { + constructor(props) { + super(props); + + this.resizeStop = this.resizeStop.bind(this); + this.dragStop = this.dragStop.bind(this); + } + + resizeStop(direction, styleSize, clientSize, delta) { + // update widget + var widget = this.props.data; + widget.width = styleSize.width; + widget.height = styleSize.height; + + this.props.onWidgetChange(widget); + } + + dragStop(event, ui) { + // update widget + var widget = this.props.data; + widget.x = ui.position.left; + widget.y = ui.position.top; + + this.props.onWidgetChange(widget); + } + + render() { + const widget = this.props.data; + + if (this.props.editing) { + return ( + { this.rnd = c; }} + initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} + bounds={'parent'} + className="widget" + onResizeStop={this.resizeStop} + onDragStop={this.dragStop} + > + {widget.name} + + ); + } else { + return ( +
    {widget.name}
    + ); + } + } +} + +export default Widget; diff --git a/src/containers/app.js b/src/containers/app.js index b1b8a57..37acdb1 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -9,6 +9,8 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; +import { DragDropContext } from 'react-dnd'; +import HTML5Backend from 'react-dnd-html5-backend'; // import AppDispatcher from '../app-dispatcher'; import VillasStore from '../stores/villas-store'; @@ -52,4 +54,4 @@ class App extends Component { } } -export default Container.create(App); +export default DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index d01ebf2..e3be874 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -19,18 +19,6 @@ import NewSimulatorDialog from '../components/dialog-new-simulator'; import EditSimulatorDialog from '../components/dialog-edit-simulator'; class Simulators extends Component { - constructor(props) { - super(props); - - this.showNewModal = this.showNewModal.bind(this); - this.closeNewModal = this.closeNewModal.bind(this); - this.showDeleteModal = this.showDeleteModal.bind(this); - this.confirmDeleteModal = this.confirmDeleteModal.bind(this); - this.cancelDeleteModal = this.cancelDeleteModal.bind(this); - this.showEditModal = this.showEditModal.bind(this); - this.closeEditModal = this.closeEditModal.bind(this); - } - static getStores() { return [ SimulatorStore ]; } @@ -52,17 +40,13 @@ class Simulators extends Component { }); } - showNewModal() { - this.setState({ newModal: true }); - } - closeNewModal(data) { this.setState({ newModal : false }); if (data) { AppDispatcher.dispatch({ type: 'simulators/start-add', - simulator: data + data: data }); } } @@ -80,16 +64,12 @@ class Simulators extends Component { this.setState({ deleteModal: true, modalSimulator: deleteSimulator }); } - cancelDeleteModal() { - this.setState({ deleteModal: false }); - } - confirmDeleteModal() { this.setState({ deleteModal: false }); AppDispatcher.dispatch({ type: 'simulators/start-remove', - simulator: this.state.modalSimulator + data: this.state.modalSimulator }); } @@ -112,7 +92,7 @@ class Simulators extends Component { if (data) { AppDispatcher.dispatch({ type: 'simulators/start-edit', - simulator: data + data: data }); } } @@ -129,13 +109,13 @@ class Simulators extends Component {

    Simulators

    - + this.showEditModal(id)} onDelete={(id) => this.showDeleteModal(id)} /> - + - + this.closeNewModal(data)} /> - + this.closeEditModal(data)} simulator={this.state.modalSimulator} /> @@ -147,8 +127,8 @@ class Simulators extends Component { - - + +
    diff --git a/src/containers/visualization.js b/src/containers/visualization.js new file mode 100644 index 0000000..dc260f0 --- /dev/null +++ b/src/containers/visualization.js @@ -0,0 +1,96 @@ +/** + * File: visualization.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { Button } from 'react-bootstrap'; + +import ToolboxItem from '../components/toolbox-item'; +import Dropzone from '../components/dropzone'; +import Widget from '../components/widget'; +import VisualizationStore from '../stores/visualization-store'; +import AppDispatcher from '../app-dispatcher'; + +class Visualization extends Component { + static getStores() { + return [ VisualizationStore ]; + } + + static calculateState() { + return { + visualizations: VisualizationStore.getState(), + + visualization: {}, + editing: false + } + } + + handleDrop(item) { + console.log(item); + } + + widgetChange(widget) { + console.log(widget); + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'visualizations/start-load' + }); + } + + componentDidUpdate() { + if (this.state.visualization._id !== this.props.params.visualization) { + this.reloadVisualization(); + } + } + + reloadVisualization() { + // select visualization by param id + this.state.visualizations.forEach((visualization) => { + if (visualization._id === this.props.params.visualization) { + this.setState({ visualization: visualization }); + } + }); + } + + render() { + return ( +
    +

    {this.state.visualization.name}

    + +
    + {this.state.editing ? ( +
    + + +
    + ) : ( + + )} +
    + + {this.state.editing && +
    + +
    + } + + this.handleDrop(item)} editing={this.state.editing}> + {this.state.visualization.widgets != null && + this.state.visualization.widgets.map((widget, index) => ( + + ))} + +
    + ); + } +} + +export default Container.create(Visualization); diff --git a/src/containers/visualizations.js b/src/containers/visualizations.js new file mode 100644 index 0000000..1de8d9b --- /dev/null +++ b/src/containers/visualizations.js @@ -0,0 +1,136 @@ +/** + * File: visualizations.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { Button, Modal } from 'react-bootstrap'; + +import AppDispatcher from '../app-dispatcher'; +import VisualizationStore from '../stores/visualization-store'; + +import ControlLinkTable from '../components/table-control-link'; +import NewVisualzationDialog from '../components/dialog-new-visualization'; +import EditVisualizationDialog from '../components/dialog-edit-visualization'; + +class Visualizations extends Component { + static getStores() { + return [ VisualizationStore ]; + } + + static calculateState() { + return { + visualizations: VisualizationStore.getState(), + + newModal: false, + deleteModal: false, + editModal: false, + modalVisualization: {} + }; + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'visualizations/start-load' + }); + } + + closeNewModal(data) { + this.setState({ newModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'visualizations/start-add', + data: data + }); + } + } + + showDeleteModal(id) { + // get visualization by id + var deleteVisualization; + + this.state.visualizations.forEach((visualization) => { + if (visualization._id === id) { + deleteVisualization = visualization; + } + }); + + this.setState({ deleteModal: true, modalVisualization: deleteVisualization }); + } + + confirmDeleteModal() { + this.setState({ deleteModal: false }); + + AppDispatcher.dispatch({ + type: 'visualizations/start-remove', + data: this.state.modalVisualization + }); + } + + showEditModal(id) { + // get visualization by id + var editVisualization; + + this.state.visualizations.forEach((visualization) => { + if (visualization._id === id) { + editVisualization = visualization; + } + }); + + this.setState({ editModal: true, modalVisualization: editVisualization }); + } + + closeEditModal(data) { + this.setState({ editModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'visualizations/start-edit', + data: data + }); + } + } + + render() { + var columns = [ + { title: 'Name', key: 'name' } + ]; + + return ( +
    +

    Visualizations

    + + this.showEditModal(id)} onDelete={(id) => this.showDeleteModal(id)} linkRoot="/visualizations"/> + + + + this.closeNewModal(data)} /> + + this.closeEditModal(data)} visualization={this.state.modalVisualization} /> + + + + Delete Visualization + + + + Are you sure you want to delete the visualization '{this.state.modalVisualization.name}'? + + + + + + + +
    + ); + } +} + +export default Container.create(Visualizations); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js new file mode 100644 index 0000000..87ef406 --- /dev/null +++ b/src/data-managers/rest-data-manager.js @@ -0,0 +1,82 @@ +/** + * File: data-manager.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import RestAPI from '../api/rest-api'; +import AppDispatcher from '../app-dispatcher'; + +class RestDataManager { + constructor(type, url) { + this.url = url; + this.type = type; + } + + load() { + RestAPI.get(this.url).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/loaded', + data: response[this.type + 's'] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/load-error', + error: error + }); + }); + } + + add(object) { + var obj = {}; + obj[this.type] = object; + + RestAPI.post(this.url, obj).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) { + RestAPI.delete(this.url + '/' + object._id).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/removed', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/remove-error', + error: error + }); + }); + } + + update(object) { + var obj = {}; + obj[this.type] = object; + + RestAPI.put(this.url + '/' + object._id, obj).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/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index d10a333..ee6e25c 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -7,65 +7,6 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from './rest-data-manager'; -const SimulatorsDataManager = { - loadSimulators() { - RestAPI.get('/simulators').then(response => { - AppDispatcher.dispatch({ - type: 'simulators/loaded', - simulators: response.simulators - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'simulators/load-error', - error: error - }); - }); - }, - - addSimulator(simulator) { - RestAPI.post('/simulators', { simulator: simulator }).then(response => { - AppDispatcher.dispatch({ - type: 'simulators/added', - simulator: response.simulator - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'simulators/add-error', - error: error - }); - }); - }, - - removeSimulator(simulator) { - RestAPI.delete('/simulators/' + simulator._id).then(response => { - AppDispatcher.dispatch({ - type: 'simulators/removed', - simulator: simulator - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'simulators/remove-error', - error: error - }); - }); - }, - - editSimulator(simulator) { - RestAPI.put('/simulators/' + simulator._id, { simulator: simulator }).then(response => { - AppDispatcher.dispatch({ - type: 'simulators/edited', - simulator: response.simulator - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'simulators/edit-error', - error: error - }); - }); - } -} - -export default SimulatorsDataManager; +export default new RestDataManager('simulator', '/simulators'); diff --git a/src/data-managers/visualizations-data-manager.js b/src/data-managers/visualizations-data-manager.js new file mode 100644 index 0000000..10210bc --- /dev/null +++ b/src/data-managers/visualizations-data-manager.js @@ -0,0 +1,12 @@ +/** + * File: visualizations-data-manager.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import RestDataManager from './rest-data-manager'; + +export default new RestDataManager('visualization', '/visualizations'); diff --git a/src/router.js b/src/router.js index fca3355..83230d4 100644 --- a/src/router.js +++ b/src/router.js @@ -14,6 +14,8 @@ import App from './containers/app'; import Home from './containers/home'; import Projects from './containers/projects'; import Simulators from './containers/simulators'; +import Visualization from './containers/visualization'; +import Visualizations from './containers/visualizations'; class Root extends Component { render() { @@ -23,6 +25,9 @@ class Root extends Component { + + + ); diff --git a/src/stores/array-store.js b/src/stores/array-store.js new file mode 100644 index 0000000..41123e8 --- /dev/null +++ b/src/stores/array-store.js @@ -0,0 +1,93 @@ +/** + * File: array-store.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import { ReduceStore } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; + +class ArrayStore extends ReduceStore { + constructor(type, dataManager) { + super(AppDispatcher); + + this.type = type; + this.dataManager = dataManager; + } + + getInitialState() { + return []; + } + + reduce(state, action) { + var array; + + switch (action.type) { + case this.type + '/start-load': + this.dataManager.load(); + return state; + + case this.type + '/loaded': + return action.data; + + case this.type + '/load-error': + // TODO: Add error message + return state; + + case this.type + '/start-add': + this.dataManager.add(action.data); + return state; + + case this.type + '/added': + // state should always be immutable, thus make new copy + array = state.slice(); + array.push(action.data); + + return array; + + case this.type + '/add-error': + // TODO: Add error message + return state; + + case this.type + '/start-remove': + this.dataManager.remove(action.data); + return state; + + case this.type + '/removed': + return state.filter((item) => { + return (item !== action.data); + }); + + case this.type + '/remove-error': + // TODO: Add error message + return state; + + case this.type + '/start-edit': + this.dataManager.update(action.data); + return state; + + case this.type + '/edited': + array = state.slice(); + for (var i = 0; i < array.length; i++) { + if (array[i]._id === action.data._id) { + array[i] = action.data; + } + } + + return array; + + case this.type + '/edit-error': + // TODO: Add error message + return state; + + default: + return state; + } + } +} + +export default ArrayStore; diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 83a4533..9413db7 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -7,85 +7,7 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import { ReduceStore } from 'flux/utils'; - -import AppDispatcher from '../app-dispatcher'; +import ArrayStore from './array-store'; import SimulatorsDataManager from '../data-managers/simulators-data-manager'; -class SimulatorStore extends ReduceStore { - constructor() { - super(AppDispatcher); - } - - getInitialState() { - return []; - } - - reduce(state, action) { - var simulators; - - switch (action.type) { - case 'simulators/start-load': - SimulatorsDataManager.loadSimulators(); - return state; - - case 'simulators/loaded': - return action.simulators; - - case 'simulators/load-error': - // TODO: Add error message - return state; - - case 'simulators/start-add': - SimulatorsDataManager.addSimulator(action.simulator); - return state; - - case 'simulators/added': - // state should always be immutable, thus make new copy - simulators = state.slice(); - simulators.push(action.simulator); - - return simulators; - - case 'simulators/add-error': - // TODO: Add error message - return state; - - case 'simulators/start-remove': - SimulatorsDataManager.removeSimulator(action.simulator); - return state; - - case 'simulators/removed': - return state.filter((simulator) => { - return (simulator !== action.simulator) - }); - - case 'simulators/remove-error': - // TODO: Add error message - return state; - - case 'simulators/start-edit': - SimulatorsDataManager.editSimulator(action.simulator); - return state; - - case 'simulators/edited': - simulators = state.slice(); - for (var i = 0; i < simulators.length; i++) { - if (simulators[i]._id === action.simulator._id) { - simulators[i] = action.simulator; - } - } - - return simulators; - - case 'simulators/edit-error': - // TODO: Add error message - return state; - - default: - return state; - } - } -} - -export default new SimulatorStore(); +export default new ArrayStore('simulators', SimulatorsDataManager); diff --git a/src/stores/visualization-store.js b/src/stores/visualization-store.js new file mode 100644 index 0000000..5b5c83f --- /dev/null +++ b/src/stores/visualization-store.js @@ -0,0 +1,13 @@ +/** + * File: visualization-store.js + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import ArrayStore from './array-store'; +import VisualizationsDataManager from '../data-managers/visualizations-data-manager'; + +export default new ArrayStore('visualizations', VisualizationsDataManager); diff --git a/src/styles/app.css b/src/styles/app.css index 1230010..aa73469 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -53,7 +53,7 @@ body { .app-content { min-height: 200px; - margin: 20px 20px 20px 170px; + margin: 20px 20px 20px 200px; padding: 15px 20px; background-color: #fff; @@ -67,6 +67,8 @@ body { .menu-sidebar { float: left; + width: 160px; + margin: 20px 0 0 20px; padding: 20px 25px 20px 25px; @@ -132,3 +134,40 @@ body { .table-control-button:hover { color: #888; } + +/** + * Toolbox + */ +.toolbox-dropzone { + width: 100%; + min-height: 400px; + + position: relative; +} + +.toolbox-dropzone-editing { + border: 3px dashed #e1e1e1; +} + +.toolbox-dropzone-active { + border-color: #aaa; +} + +.toolbox { + margin-top: 10px; + margin-bottom: 10px; +} + +.toolbox-item { + display: inline-block; + + padding: 5px 10px; + + border: 1px solid gray; + + cursor: move; +} + +.toolbox-item-dragging { + opacity: 0.4; +} diff --git a/src/styles/widgets.css b/src/styles/widgets.css new file mode 100644 index 0000000..29f86ca --- /dev/null +++ b/src/styles/widgets.css @@ -0,0 +1,17 @@ +/** + * File: widgets.css + * Author: Markus Grigull + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +.widget { + width: 100%; + height: 100%; + + padding: 5px 10px; + + border: 1px solid lightgray; +} From d9a2ae55a9911278d97909536964dc7bedb692ae Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 3 Mar 2017 16:58:35 +0100 Subject: [PATCH 055/556] Add widget context menu Widget deletion render is kinda broken, but deletion works --- package.json | 1 + src/components/widget.js | 24 ++++--- src/containers/visualization.js | 110 +++++++++++++++++++++++++------- src/styles/widgets.css | 70 +++++++++++++++++++- 4 files changed, 168 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 1830bf3..d794de0 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "immutable": "^3.8.1", "react": "^15.4.2", "react-bootstrap": "^0.30.7", + "react-contextmenu": "^2.3.0", "react-d3": "^0.4.0", "react-dnd": "^2.2.4", "react-dnd-html5-backend": "^2.2.4", diff --git a/src/components/widget.js b/src/components/widget.js index fa37ce3..424d799 100644 --- a/src/components/widget.js +++ b/src/components/widget.js @@ -9,24 +9,18 @@ import React, { Component } from 'react'; import Rnd from 'react-rnd'; +import { ContextMenuTrigger } from 'react-contextmenu'; import '../styles/widgets.css'; class Widget extends Component { - constructor(props) { - super(props); - - this.resizeStop = this.resizeStop.bind(this); - this.dragStop = this.dragStop.bind(this); - } - resizeStop(direction, styleSize, clientSize, delta) { // update widget var widget = this.props.data; widget.width = styleSize.width; widget.height = styleSize.height; - this.props.onWidgetChange(widget); + this.props.onWidgetChange(widget, this.props.index); } dragStop(event, ui) { @@ -35,7 +29,7 @@ class Widget extends Component { widget.x = ui.position.left; widget.y = ui.position.top; - this.props.onWidgetChange(widget); + this.props.onWidgetChange(widget, this.props.index); } render() { @@ -48,15 +42,19 @@ class Widget extends Component { initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} bounds={'parent'} className="widget" - onResizeStop={this.resizeStop} - onDragStop={this.dragStop} + onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} + onDragStop={(event, ui) => this.dragStop(event, ui)} > - {widget.name} + +
    {widget.name}
    +
    ); } else { return ( -
    {widget.name}
    +
    + {widget.name} +
    ); } } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index dc260f0..5257c9b 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -10,6 +10,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; +import { ContextMenu, MenuItem } from 'react-contextmenu'; import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; @@ -32,11 +33,59 @@ class Visualization extends Component { } handleDrop(item) { - console.log(item); + // add new widget + var widget = { + name: 'Name', + type: item.name, + width: 100, + height: 100, + x: 0, + y: 0, + z: 0 + }; + + var visualization = this.state.visualization; + visualization.widgets.push(widget); + + this.setState({ visualization: visualization }); + this.forceUpdate(); } - widgetChange(widget) { - console.log(widget); + widgetChange(widget, index) { + // save changes temporarily + var visualization = this.state.visualization; + visualization.widgets[index] = widget; + + this.setState({ visualization: visualization }); + } + + editWidget(e, data) { + + } + + deleteWidget(e, data) { + // delete widget temporarily + var visualization = this.state.visualization; + visualization.widgets.splice(data.index, 1); + + this.setState({ visualization: visualization }); + this.forceUpdate(); + } + + saveChanges() { + AppDispatcher.dispatch({ + type: 'visualizations/start-edit', + data: this.state.visualization + }); + + this.setState({ editing: false }); + } + + discardChanges() { + this.setState({ editing: false, visualization: {} }); + + this.reloadVisualization(); + this.forceUpdate(); } componentWillMount() { @@ -55,39 +104,56 @@ class Visualization extends Component { // select visualization by param id this.state.visualizations.forEach((visualization) => { if (visualization._id === this.props.params.visualization) { - this.setState({ visualization: visualization }); + // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside + this.setState({ visualization: JSON.parse(JSON.stringify(visualization)) }); } }); } render() { + console.log(this.state.visualization.widgets); + return (
    -

    {this.state.visualization.name}

    -
    - {this.state.editing ? ( -
    - - -
    - ) : ( - - )} +

    + {this.state.visualization.name} +

    + +
    + {this.state.editing ? ( +
    + + +
    + ) : ( + + )} +
    - {this.state.editing && -
    - -
    - } +
    + {this.state.editing && +
    + +
    + } + + this.handleDrop(item)} editing={this.state.editing}> + {this.state.visualization.widgets != null && + this.state.visualization.widgets.map((widget, index) => ( + this.widgetChange(w, i)} editing={this.state.editing} index={index} /> + ))} + - this.handleDrop(item)} editing={this.state.editing}> {this.state.visualization.widgets != null && this.state.visualization.widgets.map((widget, index) => ( - + + this.editWidget(e, data)}>Edit + this.deleteWidget(e, data)}>Delete + ))} - +
    ); } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 29f86ca..7fe801b 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -11,7 +11,73 @@ width: 100%; height: 100%; - padding: 5px 10px; - border: 1px solid lightgray; } + +.react-contextmenu { + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 16px; + color: #373a3c; + text-align: left; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,.15); + border-radius: .25rem; + outline: none; + opacity: 0; + pointer-events: none; + z-index: 100; +} + +.react-contextmenu.react-contextmenu--visible { + opacity: 1; + pointer-events: auto; +} + +.react-contextmenu-item { + width: 200px; + padding: 3px 20px; + font-weight: 400; + line-height: 1.5; + color: #373a3c; + text-align: inherit; + white-space: nowrap; + background: 0 0; + border: 0; + cursor: pointer; +} + +.react-contextmenu-item.react-contextmenu-item--active, +.react-contextmenu-item:hover { + color: #fff; + background-color: #0275d8; + border-color: #0275d8; + text-decoration: none; +} + +.react-contextmenu-item--divider { + margin-bottom: 3px; + padding: 2px 0; + border-bottom: 1px solid rgba(0,0,0,.15); + cursor: inherit; +} +.react-contextmenu-item--divider:hover { + background-color: transparent; + border-color: rgba(0,0,0,.15); +} + +.react-contextmenu-item.react-contextmenu-submenu { + padding: 0; +} + +.react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item { +} + +.react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item:after { + content: "▶"; + display: inline-block; + position: absolute; + right: 7px; +} From 5441bd46f6fd5e0869fa418d626dcb7ab6b63179 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 4 Mar 2017 10:31:13 +0100 Subject: [PATCH 056/556] Add websocket api with simulator data Simulator data is passed to each widget to process the data --- src/api/websocket-api.js | 36 +++++++++++ src/containers/visualization.js | 15 +++-- src/{components => containers}/widget.js | 44 +++++++++---- src/data-managers/rest-data-manager.js | 2 +- src/data-managers/simulator-data-manager.js | 72 +++++++++++++++++++++ src/stores/simulator-data-store.js | 66 +++++++++++++++++++ 6 files changed, 218 insertions(+), 17 deletions(-) create mode 100644 src/api/websocket-api.js rename src/{components => containers}/widget.js (76%) create mode 100644 src/data-managers/simulator-data-manager.js create mode 100644 src/stores/simulator-data-store.js diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js new file mode 100644 index 0000000..33f96b8 --- /dev/null +++ b/src/api/websocket-api.js @@ -0,0 +1,36 @@ +/** + * File: websocket-api.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +class WebsocketAPI { + constructor() { + this.sockets = {}; + } + + addSocket(endpoint, identifier, callbacks) { + // create web socket client + var socket = new WebSocket('ws://' + endpoint, 'live'); + socket.binaryType = 'arraybuffer'; + + // register callbacks + if (callbacks.onOpen) socket.addEventListener('open', event => callbacks.onOpen(event)); + if (callbacks.onClose) socket.addEventListener('close', event => callbacks.onClose(event)); + if (callbacks.onMessage) socket.addEventListener('message', event => callbacks.onMessage(event)); + if (callbacks.onError) socket.addEventListener('error', event => callbacks.onError(event)); + + // save socket + this.sockets[identifier] = socket; + } + + removeSocket(identifier) { + this.sockets[identifier].close(); + delete this.sockets[identifier]; + } +} + +export default new WebsocketAPI(); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 5257c9b..f2c33f2 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -14,7 +14,7 @@ import { ContextMenu, MenuItem } from 'react-contextmenu'; import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; -import Widget from '../components/widget'; +import Widget from './widget'; import VisualizationStore from '../stores/visualization-store'; import AppDispatcher from '../app-dispatcher'; @@ -27,8 +27,7 @@ class Visualization extends Component { return { visualizations: VisualizationStore.getState(), - visualization: {}, - editing: false + visualization: {} } } @@ -92,6 +91,14 @@ class Visualization extends Component { AppDispatcher.dispatch({ type: 'visualizations/start-load' }); + + AppDispatcher.dispatch({ + type: 'simulatorData/open', + endpoint: 'localhost:5000', + identifier: 'RTDS' + }); + + this.setState({ editing: false }); } componentDidUpdate() { @@ -111,8 +118,6 @@ class Visualization extends Component { } render() { - console.log(this.state.visualization.widgets); - return (
    diff --git a/src/components/widget.js b/src/containers/widget.js similarity index 76% rename from src/components/widget.js rename to src/containers/widget.js index 424d799..949cb4a 100644 --- a/src/components/widget.js +++ b/src/containers/widget.js @@ -1,26 +1,32 @@ /** * File: widget.js * Author: Markus Grigull - * Date: 02.03.2017 + * Date: 04.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ import React, { Component } from 'react'; -import Rnd from 'react-rnd'; +import { Container } from 'flux/utils'; import { ContextMenuTrigger } from 'react-contextmenu'; +import Rnd from 'react-rnd'; + +import SimulatorDataStore from '../stores/simulator-data-store'; import '../styles/widgets.css'; class Widget extends Component { - resizeStop(direction, styleSize, clientSize, delta) { - // update widget - var widget = this.props.data; - widget.width = styleSize.width; - widget.height = styleSize.height; + static getStores() { + return [ SimulatorDataStore ]; + } - this.props.onWidgetChange(widget, this.props.index); + static calculateState() { + return { + simulatorData: SimulatorDataStore.getState(), + + widget: {} + }; } dragStop(event, ui) { @@ -32,9 +38,25 @@ class Widget extends Component { this.props.onWidgetChange(widget, this.props.index); } + resizeStop(direction, styleSize, clientSize, delta) { + // update widget + var widget = this.props.data; + widget.width = styleSize.width; + widget.height = styleSize.height; + + this.props.onWidgetChange(widget, this.props.index); + } + render() { const widget = this.props.data; + var value = ''; + + if (this.state.simulatorData.RTDS && this.state.simulatorData.RTDS.values) { + const arr = this.state.simulatorData.RTDS.values[this.props.index]; + value = arr[arr.length - 1].y; + } + if (this.props.editing) { return ( this.dragStop(event, ui)} > -
    {widget.name}
    +
    {value}
    ); } else { return (
    - {widget.name} + {value}
    ); } } } -export default Widget; +export default Container.create(Widget); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 87ef406..cf5a47b 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -1,5 +1,5 @@ /** - * File: data-manager.js + * File: rest-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC diff --git a/src/data-managers/simulator-data-manager.js b/src/data-managers/simulator-data-manager.js new file mode 100644 index 0000000..049eda2 --- /dev/null +++ b/src/data-managers/simulator-data-manager.js @@ -0,0 +1,72 @@ +/** + * File: simulator-data-manager.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import WebsocketAPI from '../api/websocket-api'; +import AppDispatcher from '../app-dispatcher'; + +class SimulationDataManager { + open(endpoint, identifier) { + WebsocketAPI.addSocket(endpoint, identifier, { onOpen: event => this.onOpen(event), onClose: event => this.onClose(event), onMessage: event => this.onMessage(event) }); + } + + onOpen(event) { + // TODO: Add identifiers to callbacks + + AppDispatcher.dispatch({ + type: 'simulatorData/opened', + identifier: 'RTDS', + signals: 8 + }); + } + + onClose(event) { + AppDispatcher.dispatch({ + type: 'simulatorData/closed' + }); + } + + onMessage(event) { + var message = this.bufferToMessage(event.data); + + AppDispatcher.dispatch({ + type: 'simulatorData/data-changed', + data: message, + identifier: 'RTDS' + }); + } + + bufferToMessage(blob) { + // parse incoming message into usable data + var data = new DataView(blob); + + let OFFSET_ENDIAN = 1; + let OFFSET_TYPE = 2; + let OFFSET_VERSION = 4; + + var bits = data.getUint8(0); + var simulator = data.getUint8(0x01); + var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; + var length = data.getUint16(0x02, endian); + + var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); + + return { + endian: endian, + version: (bits >> OFFSET_VERSION) & 0xF, + type: (bits >> OFFSET_TYPE) & 0x3, + length: length, + sequence: data.getUint32(0x04, endian), + timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, + values: values, + simulator: simulator + }; + } +} + +export default new SimulationDataManager(); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js new file mode 100644 index 0000000..14b426b --- /dev/null +++ b/src/stores/simulator-data-store.js @@ -0,0 +1,66 @@ +/** + * File: simulator-data-store.js + * Author: Markus Grigull + * Date: 03.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import { ReduceStore } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; +import SimulatorDataManager from '../data-managers/simulator-data-manager'; + +class SimulationDataStore extends ReduceStore { + constructor() { + super(AppDispatcher); + } + + getInitialState() { + return {}; + } + + reduce(state, action) { + var i; + + switch (action.type) { + case 'simulatorData/open': + SimulatorDataManager.open(action.endpoint, action.identifier); + return state; + + case 'simulatorData/opened': + // create entry for simulator + state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; + + for (i = 0; i < action.signals; i++) { + state[action.identifier].values.push([]); + } + + return state; + + case 'simulatorData/data-changed': + // add data to simulator + for (i = 0; i < state[action.identifier].signals; i++) { + state[action.identifier].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); + } + + // update metadata + state[action.identifier].timestamp = action.data.timestamp; + state[action.identifier].sequence = action.data.sequence; + + // explicit call to prevent array copy + this.__emitChange(); + + return state; + + case 'simulatorData/closed': + return state; + + default: + return state; + } + } +} + +export default new SimulationDataStore(); From 1939df5f33a724e268781633f633c78831b85285 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 6 Mar 2017 21:55:51 +0100 Subject: [PATCH 057/556] Fix rest API, array-data-manager --- src/api/rest-api.js | 16 ++++++++-------- src/containers/home.js | 2 -- src/containers/visualization.js | 20 +++++++++++++++----- src/stores/array-store.js | 10 +++++----- src/stores/simulator-data-store.js | 8 ++++++++ src/styles/home.css | 8 -------- 6 files changed, 36 insertions(+), 28 deletions(-) delete mode 100644 src/styles/home.css diff --git a/src/api/rest-api.js b/src/api/rest-api.js index bc886bb..40329c2 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -21,8 +21,8 @@ class RestAPI { get(url) { return new Promise(function (resolve, reject) { request.get(makeURL(url)).end(function (error, res) { - if (res.status !== 200) { - reject(); + if (res == null || res.status !== 200) { + reject(error); } else { resolve(JSON.parse(res.text)); } @@ -33,8 +33,8 @@ class RestAPI { post(url, body) { return new Promise(function (resolve, reject) { request.post(makeURL(url)).send(body).end(function (error, res) { - if (res.status !== 200) { - reject(); + if (res == null || res.status !== 200) { + reject(error); } else { resolve(JSON.parse(res.text)); } @@ -45,8 +45,8 @@ class RestAPI { delete(url) { return new Promise(function (resolve, reject) { request.delete(makeURL(url)).end(function (error, res) { - if (res.status !== 200) { - reject(); + if (res == null || res.status !== 200) { + reject(error); } else { resolve(JSON.parse(res.text)); } @@ -57,8 +57,8 @@ class RestAPI { put(url, body) { return new Promise(function (resolve, reject) { request.put(makeURL(url)).send(body).end(function (error, res) { - if (res.status !== 200) { - reject(); + if (res == null || res.status !== 200) { + reject(error); } else { resolve(JSON.parse(res.text)); } diff --git a/src/containers/home.js b/src/containers/home.js index 81ead97..ae74541 100644 --- a/src/containers/home.js +++ b/src/containers/home.js @@ -13,8 +13,6 @@ import { Container } from 'flux/utils'; // import AppDispatcher from '../app-dispatcher'; import VillasStore from '../stores/villas-store'; -import '../styles/home.css'; - class Home extends Component { static getStores() { return [ VillasStore ]; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index f2c33f2..9fd585f 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -23,11 +23,23 @@ class Visualization extends Component { return [ VisualizationStore ]; } - static calculateState() { + static calculateState(prevState) { + if (prevState) { + return { + visualizations: VisualizationStore.getState(), + + visualization: prevState.visualization, + editing: prevState.editing, + grid: prevState.grid + }; + } + return { visualizations: VisualizationStore.getState(), - visualization: {} + visualization: {}, + editing: false, + grid: false } } @@ -97,8 +109,6 @@ class Visualization extends Component { endpoint: 'localhost:5000', identifier: 'RTDS' }); - - this.setState({ editing: false }); } componentDidUpdate() { @@ -147,7 +157,7 @@ class Visualization extends Component { this.handleDrop(item)} editing={this.state.editing}> {this.state.visualization.widgets != null && this.state.visualization.widgets.map((widget, index) => ( - this.widgetChange(w, i)} editing={this.state.editing} index={index} /> + this.widgetChange(w, i)} editing={this.state.editing} index={index} grid={this.state.grid} /> ))} diff --git a/src/stores/array-store.js b/src/stores/array-store.js index 41123e8..8f2179d 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -43,11 +43,11 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/added': - // state should always be immutable, thus make new copy - array = state.slice(); - array.push(action.data); + // signal array change since its not automatically detected + state.push(action.data); + this.__emitChange(); - return array; + return state; case this.type + '/add-error': // TODO: Add error message @@ -59,7 +59,7 @@ class ArrayStore extends ReduceStore { case this.type + '/removed': return state.filter((item) => { - return (item !== action.data); + return (item !== action.original); }); case this.type + '/remove-error': diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 14b426b..38b69a3 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -12,6 +12,8 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import SimulatorDataManager from '../data-managers/simulator-data-manager'; +const MAX_VALUES = 10000; + class SimulationDataStore extends ReduceStore { constructor() { super(AppDispatcher); @@ -43,6 +45,12 @@ class SimulationDataStore extends ReduceStore { // add data to simulator for (i = 0; i < state[action.identifier].signals; i++) { state[action.identifier].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); + + // erase old values + if (state[action.identifier].values[i].length > MAX_VALUES) { + const pos = state[action.identifier].values[i].length - MAX_VALUES; + state[action.identifier].values[i].splice(0, pos); + } } // update metadata diff --git a/src/styles/home.css b/src/styles/home.css deleted file mode 100644 index 5a74ef5..0000000 --- a/src/styles/home.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * File: home.css - * Author: Markus Grigull - * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ From 01488c49396822eb7e24cdb8ab0c8460acf71591 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 6 Mar 2017 22:01:33 +0100 Subject: [PATCH 058/556] Add simulation(s) route Move dialogs to components/dialog directory Change table component, add table-column component, this makes table-control and table-control-link obsolete Fix minor bugs --- src/components/{ => dialog}/dialog.js | 0 src/components/dialog/edit-simulation.js | 83 ++++++++++ .../edit-simulator.js} | 5 +- .../edit-visualization.js} | 3 +- src/components/dialog/new-simulation.js | 76 +++++++++ .../new-simulator.js} | 5 +- .../new-visualization.js} | 3 +- src/components/menu-sidebar.js | 2 +- src/components/table-column.js | 32 ++++ src/components/table-control-link.js | 75 --------- src/components/table-control.js | 61 ------- src/components/table.js | 87 +++++++--- src/containers/simulation.js | 150 ++++++++++++++++++ src/containers/simulations.js | 136 ++++++++++++++++ src/containers/simulators.js | 52 ++---- src/containers/visualizations.js | 52 ++---- src/containers/widget.js | 33 ++-- src/data-managers/rest-data-manager.js | 3 +- src/data-managers/simulations-data-manager.js | 12 ++ src/router.js | 5 + src/stores/simulation-store.js | 13 ++ 21 files changed, 636 insertions(+), 252 deletions(-) rename src/components/{ => dialog}/dialog.js (100%) create mode 100644 src/components/dialog/edit-simulation.js rename src/components/{dialog-edit-simulator.js => dialog/edit-simulator.js} (95%) rename src/components/{dialog-edit-visualization.js => dialog/edit-visualization.js} (96%) create mode 100644 src/components/dialog/new-simulation.js rename src/components/{dialog-new-simulator.js => dialog/new-simulator.js} (95%) rename src/components/{dialog-new-visualization.js => dialog/new-visualization.js} (96%) create mode 100644 src/components/table-column.js delete mode 100644 src/components/table-control-link.js delete mode 100644 src/components/table-control.js create mode 100644 src/containers/simulation.js create mode 100644 src/containers/simulations.js create mode 100644 src/data-managers/simulations-data-manager.js create mode 100644 src/stores/simulation-store.js diff --git a/src/components/dialog.js b/src/components/dialog/dialog.js similarity index 100% rename from src/components/dialog.js rename to src/components/dialog/dialog.js diff --git a/src/components/dialog/edit-simulation.js b/src/components/dialog/edit-simulation.js new file mode 100644 index 0000000..af9dfa4 --- /dev/null +++ b/src/components/dialog/edit-simulation.js @@ -0,0 +1,83 @@ +/** + * File: new-simulation.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class EditSimulationDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + simulation: PropTypes.object.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + _id: '' + } + } + + onClose(canceled) { + if (canceled === false) { + 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.simulation.name, + _id: this.props.simulation._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)} /> + + +
    +
    + ); + } +} + +export default EditSimulationDialog; diff --git a/src/components/dialog-edit-simulator.js b/src/components/dialog/edit-simulator.js similarity index 95% rename from src/components/dialog-edit-simulator.js rename to src/components/dialog/edit-simulator.js index bddec15..ad6fa39 100644 --- a/src/components/dialog-edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -1,5 +1,5 @@ /** - * File: dialog-new-simulator.js + * File: new-simulator.js * Author: Markus Grigull * Date: 02.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -87,14 +87,17 @@ class EditSimulatorDialog extends Component { Name this.handleChange(e)} /> + Simulator ID this.handleChange(e)} /> + Endpoint this.handleChange(e)} /> + diff --git a/src/components/dialog-edit-visualization.js b/src/components/dialog/edit-visualization.js similarity index 96% rename from src/components/dialog-edit-visualization.js rename to src/components/dialog/edit-visualization.js index 5284c7a..e31f96a 100644 --- a/src/components/dialog-edit-visualization.js +++ b/src/components/dialog/edit-visualization.js @@ -1,5 +1,5 @@ /** - * File: dialog-new-visualization.js + * File: new-visualization.js * Author: Markus Grigull * Date: 03.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -72,6 +72,7 @@ class EditVisualizationDialog extends Component { Name this.handleChange(e)} /> + diff --git a/src/components/dialog/new-simulation.js b/src/components/dialog/new-simulation.js new file mode 100644 index 0000000..617f00b --- /dev/null +++ b/src/components/dialog/new-simulation.js @@ -0,0 +1,76 @@ +/** + * File: new-simulation.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewSimulationDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '' }); + } + + 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"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default NewSimulationDialog; diff --git a/src/components/dialog-new-simulator.js b/src/components/dialog/new-simulator.js similarity index 95% rename from src/components/dialog-new-simulator.js rename to src/components/dialog/new-simulator.js index 93a074e..87eb407 100644 --- a/src/components/dialog-new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -1,5 +1,5 @@ /** - * File: dialog-new-simulator.js + * File: new-simulator.js * Author: Markus Grigull * Date: 02.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -80,14 +80,17 @@ class NewSimulatorDialog extends Component { Name this.handleChange(e)} /> + Simulator ID this.handleChange(e)} /> + Endpoint this.handleChange(e)} /> + diff --git a/src/components/dialog-new-visualization.js b/src/components/dialog/new-visualization.js similarity index 96% rename from src/components/dialog-new-visualization.js rename to src/components/dialog/new-visualization.js index d24aa6e..06b3c73 100644 --- a/src/components/dialog-new-visualization.js +++ b/src/components/dialog/new-visualization.js @@ -1,5 +1,5 @@ /** - * File: dialog-new-visualization.js + * File: new-visualization.js * Author: Markus Grigull * Date: 03.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -67,6 +67,7 @@ class NewVisualzationDialog extends Component { Name this.handleChange(e)} /> + diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index b396169..509f33d 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -19,7 +19,7 @@ class SidebarMenu extends Component {
    • Home
    • Projects
    • -
    • Simulations
    • +
    • Simulations
    • Simulators
    • Visualizations
    diff --git a/src/components/table-column.js b/src/components/table-column.js new file mode 100644 index 0000000..d657859 --- /dev/null +++ b/src/components/table-column.js @@ -0,0 +1,32 @@ +/** + * File: table-column.js + * Author: Markus Grigull + * Date: 06.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +class TableColumn extends Component { + static defaultProps = { + title: '', + modifier: null, + width: null, + editButton: false, + deleteButton: false, + link: '/', + linkKey: '' + }; + + render() { + return ( + + {this.props.title} + + ); + } +} + +export default TableColumn; diff --git a/src/components/table-control-link.js b/src/components/table-control-link.js deleted file mode 100644 index 4e9c87a..0000000 --- a/src/components/table-control-link.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * File: table-control-link.js - * Author: Markus Grigull - * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component, PropTypes } from 'react'; -import { Button, Glyphicon } from 'react-bootstrap'; -import { Link } from 'react-router'; - -class ControlLinkTable extends Component { - static propTypes = { - columns: PropTypes.array.isRequired, - onEdit: PropTypes.func.isRequired, - onDelete: PropTypes.func.isRequired, - linkRoot: PropTypes.string.isRequired - }; - - render() { - // create sorted rows - var rows = this.props.data.map(row => { - // add cells by column keys - var rowArray = [ row._id ]; - - for (var i = 0; i < this.props.columns.length; i++) { - if (row[this.props.columns[i].key] != null) { - rowArray.push(row[this.props.columns[i].key].toString()); - } else { - rowArray.push(""); - } - } - - return rowArray; - }); - - return ( - - - - {this.props.columns.map(column => ( - - ))} - - - - - {rows.map((row) => ( - - {row.filter((element, index) => { - return index !== 0; - }).map((cell, index) => ( - - ))} - - - ))} - -
    {column.title}
    - {index === 0 ? ( - {cell} - ) : ( - {cell} - )} - - - -
    - ); - } -} - -export default ControlLinkTable; diff --git a/src/components/table-control.js b/src/components/table-control.js deleted file mode 100644 index ea12ca8..0000000 --- a/src/components/table-control.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * File: table-control.js - * Author: Markus Grigull - * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { Button, Glyphicon } from 'react-bootstrap'; - -class ControlTable extends Component { - render() { - // create sorted rows - var rows = this.props.data.map(row => { - // add cells by column keys - var rowArray = [ row._id ]; - - for (var i = 0; i < this.props.columns.length; i++) { - if (row[this.props.columns[i].key] != null) { - rowArray.push(row[this.props.columns[i].key].toString()); - } else { - rowArray.push(""); - } - } - - return rowArray; - }); - - return ( - - - - {this.props.columns.map(column => ( - - ))} - - - - - {rows.map((row) => ( - - {row.filter((element, index) => { - return index !== 0; - }).map((cell, index) => ( - - ))} - - - ))} - -
    {column.title}
    {cell} - - -
    - ); - } -} - -export default ControlTable; diff --git a/src/components/table.js b/src/components/table.js index fab3bfe..898e65f 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -8,46 +8,93 @@ **********************************************************************************/ import React, { Component } from 'react'; +import { Table, Button, Glyphicon } from 'react-bootstrap'; +import { Link } from 'react-router'; + +import TableColumn from './table-column'; + +class CustomTable extends Component { + static defaultProps = { + width: null + }; -class Table extends Component { render() { - // create sorted rows - var rows = this.props.data.map(row => { - // add cells by column keys - var rowArray = []; + // create sorted data for rows + var rows = []; + if (this.props.data) { + rows = this.props.data.map((row, index) => { + var array = []; - for (var i = 0; i < this.props.columns.length; i++) { - if (row[this.props.columns[i].key] != null) { - rowArray.push(row[this.props.columns[i].key].toString()); - } else { - rowArray.push(""); + for (var i = 0; i < this.props.children.length; i++) { + // only handle table-column children + if (this.props.children[i].type === TableColumn) { + // add content to cell + var cell = []; + + // add data to cell + const dataKey = this.props.children[i].props.dataKey; + if (dataKey && row[dataKey] != null) { + // get content + var content; + const modifier = this.props.children[i].props.modifier; + + if (modifier) { + content = modifier(row[dataKey]); + } else { + content = row[dataKey].toString(); + } + + // check if cell should be a link + const linkKey = this.props.children[i].props.linkKey; + if (linkKey && row[linkKey] != null) { + cell.push({content}); + } else { + cell.push(content); + } + } + + // add buttons + if (this.props.children[i].props.editButton) { + const onEdit = this.props.children[i].props.onEdit; + cell.push(); + } + + if (this.props.children[i].props.deleteButton) { + const onDelete = this.props.children[i].props.onDelete; + cell.push(); + } + + array.push(cell); + } } - } - return rowArray; - }); + return array; + }); + } return ( - +
    - {this.props.columns.map(column => ( - - ))} + {this.props.children} {rows.map((row, index) => ( {row.map((cell, index) => ( - + ))} ))} -
    {column.title}
    {cell} + {cell.map((element, index) => ( + {element} + ))} +
    + ); } } -export default Table; +export default CustomTable; diff --git a/src/containers/simulation.js b/src/containers/simulation.js new file mode 100644 index 0000000..a4b59b7 --- /dev/null +++ b/src/containers/simulation.js @@ -0,0 +1,150 @@ +/** + * File: simulation.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; + +import SimulationStore from '../stores/simulation-store'; +import SimulatorStore from '../stores/simulator-store'; +import AppDispatcher from '../app-dispatcher'; + +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewSimulationModelDialog from '../components/dialog/new-simulation-model'; +import EditSimulationModelDialog from '../components/dialog/edit-simulation-model'; + +class Simulation extends Component { + static getStores() { + return [ SimulationStore, SimulatorStore ]; + } + + static calculateState() { + return { + simulations: SimulationStore.getState(), + simulators: SimulatorStore.getState(), + + newModal: false, + deleteModal: false, + editModal: false, + modalData: {}, + + simulation: {} + } + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'simulations/start-load' + }); + + AppDispatcher.dispatch({ + type: 'simulators/start-load' + }); + } + + componentDidUpdate() { + if (this.state.simulation._id !== this.props.params.simulation) { + this.reloadSimulation(); + } + } + + reloadSimulation() { + // select simulation by param id + this.state.simulations.forEach((simulation) => { + if (simulation._id === this.props.params.simulation) { + // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside + this.setState({ simulation: JSON.parse(JSON.stringify(simulation)) }); + } + }); + } + + closeNewModal(data) { + this.setState({ newModal : false }); + + if (data) { + this.state.simulation.models.push(data); + + AppDispatcher.dispatch({ + type: 'simulations/start-edit', + data: this.state.simulation + }); + } + } + + confirmDeleteModal() { + this.setState({ deleteModal: false }); + + + + /*AppDispatcher.dispatch({ + type: 'visualizations/start-remove', + data: this.state.modalVisualization + });*/ + } + + closeEditModal(data) { + this.setState({ editModal : false }); + + if (data) { + /*AppDispatcher.dispatch({ + type: 'visualizations/start-edit', + data: data + });*/ + } + } + + getSimulatorName(id) { + for (var i = 0; i < this.state.simulators.length; i++) { + if (this.state.simulators[i]._id === id) { + return this.state.simulators[i].name; + } + } + + return id; + } + + render() { + return ( +
    +

    {this.state.simulation.name}

    + + + + this.getSimulatorName(id)} /> + + this.setState({ editModal: true, modalData: this.state.simulation.models[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index] })} /> +
    + + + + this.closeNewModal(data)} simulators={this.state.simulators} /> + + this.closeEditModal(data)} data={this.state.modalData} /> + + + + Delete Simulation Model + + + + Are you sure you want to delete the simulation model '{this.state.modalData.name}'? + + + + + + + +
    + ); + } +} + +export default Container.create(Simulation); diff --git a/src/containers/simulations.js b/src/containers/simulations.js new file mode 100644 index 0000000..dd80a71 --- /dev/null +++ b/src/containers/simulations.js @@ -0,0 +1,136 @@ +/** + * File: simulations.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; + +import AppDispatcher from '../app-dispatcher'; +import SimulationStore from '../stores/simulation-store'; + +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewSimulationDialog from '../components/dialog/new-simulation'; +import EditSimulationDialog from '../components/dialog/edit-simulation'; + +class Simulations extends Component { + static getStores() { + return [ SimulationStore ]; + } + + static calculateState() { + return { + simulations: SimulationStore.getState(), + + newModal: false, + deleteModal: false, + editModal: false, + modalSimulation: {} + }; + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'simulations/start-load' + }); + } + + closeNewModal(data) { + this.setState({ newModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'simulations/start-add', + data: data + }); + } + } + + 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 }); + } + + confirmDeleteModal() { + this.setState({ deleteModal: false }); + + AppDispatcher.dispatch({ + type: 'simulations/start-remove', + data: this.state.modalSimulation + }); + } + + 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) { + AppDispatcher.dispatch({ + type: 'simulations/start-edit', + data: data + }); + } + } + + render() { + return ( +
    +

    Simulations

    + + + + this.setState({ editModal: true, modalSimulation: this.state.simulations[index] })} onDelete={index => this.setState({ deleteModal: true, modalSimulation: this.state.simulations[index] })} /> +
    + + + + this.closeNewModal(data)} /> + + this.closeEditModal(data)} simulation={this.state.modalSimulation} /> + + + + Delete Simulation + + + + Are you sure you want to delete the simulation '{this.state.modalSimulation.name}'? + + + + + + + +
    + ); + } +} + +export default Container.create(Simulations); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index e3be874..00ab175 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -9,14 +9,15 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import SimulatorStore from '../stores/simulator-store'; -import ControlTable from '../components/table-control'; -import NewSimulatorDialog from '../components/dialog-new-simulator'; -import EditSimulatorDialog from '../components/dialog-edit-simulator'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewSimulatorDialog from '../components/dialog/new-simulator'; +import EditSimulatorDialog from '../components/dialog/edit-simulator'; class Simulators extends Component { static getStores() { @@ -51,19 +52,6 @@ class Simulators extends Component { } } - showDeleteModal(id) { - // get simulator by id - var deleteSimulator; - - this.state.simulators.forEach((simulator) => { - if (simulator._id === id) { - deleteSimulator = simulator; - } - }); - - this.setState({ deleteModal: true, modalSimulator: deleteSimulator }); - } - confirmDeleteModal() { this.setState({ deleteModal: false }); @@ -73,19 +61,6 @@ class Simulators extends Component { }); } - showEditModal(id) { - // get simulator by id - var editSimulator; - - this.state.simulators.forEach((simulator) => { - if (simulator._id === id) { - editSimulator = simulator; - } - }); - - this.setState({ editModal: true, modalSimulator: editSimulator }); - } - closeEditModal(data) { this.setState({ editModal : false }); @@ -98,20 +73,19 @@ class Simulators extends Component { } render() { - var columns = [ - { title: 'Name', key: 'name' }, - { title: 'ID', key: 'simulatorid', width: 80 }, - { title: 'Running', key: 'running', width: 80 }, - { title: 'Endpoint', key: 'endpoint', width: 120 } - ]; - return (

    Simulators

    - this.showEditModal(id)} onDelete={(id) => this.showDeleteModal(id)} /> + + + + + + this.setState({ editModal: true, modalSimulator: this.state.simulators[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index] })} /> +
    - + this.closeNewModal(data)} /> diff --git a/src/containers/visualizations.js b/src/containers/visualizations.js index 1de8d9b..782fdd1 100644 --- a/src/containers/visualizations.js +++ b/src/containers/visualizations.js @@ -9,14 +9,15 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import VisualizationStore from '../stores/visualization-store'; -import ControlLinkTable from '../components/table-control-link'; -import NewVisualzationDialog from '../components/dialog-new-visualization'; -import EditVisualizationDialog from '../components/dialog-edit-visualization'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewVisualzationDialog from '../components/dialog/new-visualization'; +import EditVisualizationDialog from '../components/dialog/edit-visualization'; class Visualizations extends Component { static getStores() { @@ -30,7 +31,7 @@ class Visualizations extends Component { newModal: false, deleteModal: false, editModal: false, - modalVisualization: {} + modalData: {} }; } @@ -51,19 +52,6 @@ class Visualizations extends Component { } } - showDeleteModal(id) { - // get visualization by id - var deleteVisualization; - - this.state.visualizations.forEach((visualization) => { - if (visualization._id === id) { - deleteVisualization = visualization; - } - }); - - this.setState({ deleteModal: true, modalVisualization: deleteVisualization }); - } - confirmDeleteModal() { this.setState({ deleteModal: false }); @@ -73,19 +61,6 @@ class Visualizations extends Component { }); } - showEditModal(id) { - // get visualization by id - var editVisualization; - - this.state.visualizations.forEach((visualization) => { - if (visualization._id === id) { - editVisualization = visualization; - } - }); - - this.setState({ editModal: true, modalVisualization: editVisualization }); - } - closeEditModal(data) { this.setState({ editModal : false }); @@ -98,21 +73,20 @@ class Visualizations extends Component { } render() { - var columns = [ - { title: 'Name', key: 'name' } - ]; - return (

    Visualizations

    - this.showEditModal(id)} onDelete={(id) => this.showDeleteModal(id)} linkRoot="/visualizations"/> + + + this.setState({ editModal: true, modalData: this.state.visualizations[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.visualizations[index] })} /> +
    - + this.closeNewModal(data)} /> - this.closeEditModal(data)} visualization={this.state.modalVisualization} /> + this.closeEditModal(data)} visualization={this.state.modalData} /> @@ -120,7 +94,7 @@ class Visualizations extends Component { - Are you sure you want to delete the visualization '{this.state.modalVisualization.name}'? + Are you sure you want to delete the visualization '{this.state.modalData.name}'? diff --git a/src/containers/widget.js b/src/containers/widget.js index 949cb4a..b436075 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -13,6 +13,7 @@ import { ContextMenuTrigger } from 'react-contextmenu'; import Rnd from 'react-rnd'; import SimulatorDataStore from '../stores/simulator-data-store'; +import WidgetValue from '../components/widget-value'; import '../styles/widgets.css'; @@ -21,12 +22,20 @@ class Widget extends Component { return [ SimulatorDataStore ]; } - static calculateState() { - return { - simulatorData: SimulatorDataStore.getState(), + static calculateState(prevState) { + if (prevState) { + return { + simulatorData: SimulatorDataStore.getState(), - widget: {} - }; + sequence: prevState.sequence + 1 + } + } else { + return { + simulatorData: SimulatorDataStore.getState(), + + sequence: 0 + }; + } } dragStop(event, ui) { @@ -50,11 +59,9 @@ class Widget extends Component { render() { const widget = this.props.data; - var value = ''; - - if (this.state.simulatorData.RTDS && this.state.simulatorData.RTDS.values) { - const arr = this.state.simulatorData.RTDS.values[this.props.index]; - value = arr[arr.length - 1].y; + var grid = this.props.grid; + if (!grid) { + grid = [ 1, 1 ]; } if (this.props.editing) { @@ -66,16 +73,18 @@ class Widget extends Component { className="widget" onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} onDragStop={(event, ui) => this.dragStop(event, ui)} + moveGrid={grid} + resizeGrid={grid} > -
    {value}
    +
    ); } else { return (
    - {value} +
    ); } diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index cf5a47b..db92935 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -51,7 +51,8 @@ class RestDataManager { RestAPI.delete(this.url + '/' + object._id).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', - data: response[this.type] + data: response[this.type], + original: object }); }).catch(error => { AppDispatcher.dispatch({ diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js new file mode 100644 index 0000000..4a9d0bf --- /dev/null +++ b/src/data-managers/simulations-data-manager.js @@ -0,0 +1,12 @@ +/** + * File: simulation-data-manager.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + + import RestDataManager from './rest-data-manager'; + + export default new RestDataManager('simulation', '/simulations'); diff --git a/src/router.js b/src/router.js index 83230d4..5689e6e 100644 --- a/src/router.js +++ b/src/router.js @@ -16,6 +16,8 @@ import Projects from './containers/projects'; import Simulators from './containers/simulators'; import Visualization from './containers/visualization'; import Visualizations from './containers/visualizations'; +import Simulations from './containers/simulations'; +import Simulation from './containers/simulation'; class Root extends Component { render() { @@ -28,6 +30,9 @@ class Root extends Component { + + + ); diff --git a/src/stores/simulation-store.js b/src/stores/simulation-store.js new file mode 100644 index 0000000..89854f5 --- /dev/null +++ b/src/stores/simulation-store.js @@ -0,0 +1,13 @@ +/** + * File: simulation-store.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import ArrayStore from './array-store'; +import SimulationsDataManager from '../data-managers/simulations-data-manager'; + +export default new ArrayStore('simulations', SimulationsDataManager); From 04e7ea218401678d9d568671347e1541306fc047 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 7 Mar 2017 11:12:22 +0100 Subject: [PATCH 059/556] Add simulation-model route and dialogs Add inline edit to table --- .../dialog/edit-simulation-model.js | 140 ++++++++++++++++++ src/components/dialog/edit-widget-value.js | 92 ++++++++++++ src/components/dialog/new-simulation-model.js | 136 +++++++++++++++++ src/components/table-column.js | 4 +- src/components/table.js | 38 ++++- src/containers/simulation.js | 31 ++-- src/styles/app.css | 25 +--- 7 files changed, 422 insertions(+), 44 deletions(-) create mode 100644 src/components/dialog/edit-simulation-model.js create mode 100644 src/components/dialog/edit-widget-value.js create mode 100644 src/components/dialog/new-simulation-model.js diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js new file mode 100644 index 0000000..e51380c --- /dev/null +++ b/src/components/dialog/edit-simulation-model.js @@ -0,0 +1,140 @@ +/** + * File: edit-simulation-model.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Table from '../table'; +import TableColumn from '../table-column'; +import Dialog from './dialog'; + +class EditSimulationModelDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + data: PropTypes.object.isRequired, + simulators: PropTypes.array.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + simulator: '', + length: 1 + } + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + if (e.target.id === 'length') { + // change mapping size + if (e.target.value > this.state.mapping.length) { + // add missing signals + while (this.state.mapping.length < e.target.value) { + this.state.mapping.push({ name: 'Signal', type: 'Type' }); + } + } else { + // remove signals + this.state.mapping.splice(e.target.value, this.state.mapping.length - e.target.value); + } + } + + this.setState({ [e.target.id]: e.target.value }); + } + + handleMappingChange(event, row, column) { + var mapping = this.state.mapping; + + if (column === 1) { + mapping[row].name = event.target.value; + } else if (column === 2) { + mapping[row].type = event.target.value; + } + + this.setState({ mapping: mapping }); + } + + resetState() { + this.setState({ + name: this.props.data.name, + simulator: this.props.data.simulator, + length: this.props.data.length, + mapping: this.props.data.mapping + }); + } + + validateForm(target) { + // check all controls + var name = true; + var length = true; + + if (this.state.name === '') { + name = false; + } + + // test if simulatorid is a number (in a string, not type of number) + if (!/^\d+$/.test(this.state.length)) { + length = false; + } + + this.valid = name && length; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else if (target === 'length') return length ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + Simulator + this.handleChange(e)}> + {this.props.simulators.map(simulator => ( + + ))} + + + + Length + this.handleChange(e)} /> + + + + Mapping + + + this.handleMappingChange(event, row, column)} /> + this.handleMappingChange(event, row, column)} /> +
    +
    +
    +
    + ); + } +} + +export default EditSimulationModelDialog; diff --git a/src/components/dialog/edit-widget-value.js b/src/components/dialog/edit-widget-value.js new file mode 100644 index 0000000..1fa5de8 --- /dev/null +++ b/src/components/dialog/edit-widget-value.js @@ -0,0 +1,92 @@ +/** + * File: edit-widget-value.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class EditWidgetValueDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + simulator: '', + signal: 0 + } + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '' }); + } + + 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)} /> + + + + Simulator + + + + + + + Signal + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default EditWidgetValueDialog; diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js new file mode 100644 index 0000000..005c928 --- /dev/null +++ b/src/components/dialog/new-simulation-model.js @@ -0,0 +1,136 @@ +/** + * File: new-simulation-model.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; + +import Table from '../table'; +import TableColumn from '../table-column'; +import Dialog from './dialog'; + +class NewSimulationModelDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + simulators: PropTypes.array.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + simulator: '', + length: '1', + mapping: [ { name: 'Signal', type: 'Type' } ] + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + if (e.target.id === 'length') { + // change mapping size + if (e.target.value > this.state.mapping.length) { + // add missing signals + while (this.state.mapping.length < e.target.value) { + this.state.mapping.push({ name: 'Signal', type: 'Type' }); + } + } else { + // remove signals + this.state.mapping.splice(e.target.value, this.state.mapping.length - e.target.value); + } + } + + this.setState({ [e.target.id]: e.target.value }); + } + + handleMappingChange(event, row, column) { + var mapping = this.state.mapping; + + if (column === 1) { + mapping[row].name = event.target.value; + } else if (column === 2) { + mapping[row].type = event.target.value; + } + + this.setState({ mapping: mapping }); + } + + resetState() { + this.setState({ name: '', simulator: '', length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); + } + + validateForm(target) { + // check all controls + var name = true; + var length = true; + + if (this.state.name === '') { + name = false; + } + + // test if simulatorid is a number (in a string, not type of number) + if (!/^\d+$/.test(this.state.length)) { + length = false; + } + + this.valid = name && length; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else if (target === 'length') return length ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + Simulator + this.handleChange(e)}> + {this.props.simulators.map(simulator => ( + + ))} + + + + Length + this.handleChange(e)} /> + + + + Mapping + Click Name or Type cell to edit + + + this.handleMappingChange(event, row, column)} /> + this.handleMappingChange(event, row, column)} /> +
    +
    +
    +
    + ); + } +} + +export default NewSimulationModelDialog; diff --git a/src/components/table-column.js b/src/components/table-column.js index d657859..905ca2a 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -17,7 +17,9 @@ class TableColumn extends Component { editButton: false, deleteButton: false, link: '/', - linkKey: '' + linkKey: '', + dataIndex: false, + inlineEditable: false }; render() { diff --git a/src/components/table.js b/src/components/table.js index 898e65f..a40eff8 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -8,16 +8,28 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { Table, Button, Glyphicon } from 'react-bootstrap'; +import { Table, Button, Glyphicon, FormControl } from 'react-bootstrap'; import { Link } from 'react-router'; import TableColumn from './table-column'; class CustomTable extends Component { + constructor(props) { + super(props); + + this.state = { + editCell: [ -1, -1 ] + }; + } + static defaultProps = { width: null }; + onClick(event, row, column) { + this.setState({ editCell: [ column, row ]}); // x, y + } + render() { // create sorted data for rows var rows = []; @@ -53,6 +65,10 @@ class CustomTable extends Component { } } + if (this.props.children[i].props.dataIndex) { + cell.push(index); + } + // add buttons if (this.props.children[i].props.editButton) { const onEdit = this.props.children[i].props.onEdit; @@ -80,13 +96,19 @@ class CustomTable extends Component { - {rows.map((row, index) => ( - - {row.map((cell, index) => ( - - {cell.map((element, index) => ( - {element} - ))} + {rows.map((row, rowIndex) => ( + + {row.map((cell, cellIndex) => ( + this.onClick(event, rowIndex, cellIndex) : () => {}}> + {(this.state.editCell[0] === cellIndex && this.state.editCell[1] === rowIndex ) ? ( + this.props.children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} /> + ) : ( + + {cell.map((element, elementIndex) => ( + {element} + ))} + + )} ))} diff --git a/src/containers/simulation.js b/src/containers/simulation.js index a4b59b7..b6f6c97 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -34,6 +34,7 @@ class Simulation extends Component { deleteModal: false, editModal: false, modalData: {}, + modalIndex: null, simulation: {} } @@ -79,24 +80,30 @@ class Simulation extends Component { } confirmDeleteModal() { - this.setState({ deleteModal: false }); + // remove model from simulation + var simulation = this.state.simulation; + simulation.models.splice(this.state.modalIndex, 1); + this.setState({ deleteModal: false, simulation: simulation }); - - /*AppDispatcher.dispatch({ - type: 'visualizations/start-remove', - data: this.state.modalVisualization - });*/ + AppDispatcher.dispatch({ + type: 'simulations/start-edit', + data: simulation + }); } closeEditModal(data) { this.setState({ editModal : false }); if (data) { - /*AppDispatcher.dispatch({ - type: 'visualizations/start-edit', - data: data - });*/ + var simulation = this.state.simulation; + simulation.models[this.state.modalIndex] = data; + this.setState({ simulation: simulation }); + + AppDispatcher.dispatch({ + type: 'simulations/start-edit', + data: simulation + }); } } @@ -119,14 +126,14 @@ class Simulation extends Component { this.getSimulatorName(id)} /> - this.setState({ editModal: true, modalData: this.state.simulation.models[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index] })} /> + this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} /> this.closeNewModal(data)} simulators={this.state.simulators} /> - this.closeEditModal(data)} data={this.state.modalData} /> + this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> diff --git a/src/styles/app.css b/src/styles/app.css index aa73469..c1aad96 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -28,7 +28,7 @@ body { padding: 10px 0 0 0; - color: #103B7D; + color: #527984; background-color: #fff; } @@ -51,7 +51,7 @@ body { } .app-content { - min-height: 200px; + min-height: 400px; margin: 20px 20px 20px 200px; padding: 15px 20px; @@ -94,32 +94,11 @@ body { /** * Tables */ -.table { - margin-top: 20px; - - border: 0; - border-collapse: collapse; - - background-color: #f6f6f6; -} - -.table th, td { - padding: 5px; - - text-align: left; - - border: none; -} - .table th { background-color: #527984; color: #fff; } -.table tr:nth-child(even) { - background-color: #ddd; -} - /** * Buttons */ From bcb92422ffd7c13bc2e748cdef22557af0d9c251 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 8 Mar 2017 12:54:21 +0100 Subject: [PATCH 060/556] Add projects route and link to visualizations Change rest data-manager element update mechanism Fix new simulation-data dialog default simulator property --- src/components/dialog/dialog.js | 2 +- src/components/dialog/edit-project.js | 94 ++++++++++++++++ src/components/dialog/new-project.js | 86 +++++++++++++++ src/components/dialog/new-simulation-model.js | 2 +- src/components/menu-sidebar.js | 1 - .../{visualizations.js => project.js} | 104 +++++++++++++++--- src/containers/projects.js | 98 ++++++++++++++++- src/data-managers/projects-data-manager.js | 12 ++ src/data-managers/rest-data-manager.js | 36 ++++-- src/data-managers/simulations-data-manager.js | 4 +- src/router.js | 6 +- src/stores/array-store.js | 53 ++++++--- src/stores/project-store.js | 13 +++ 13 files changed, 458 insertions(+), 53 deletions(-) create mode 100644 src/components/dialog/edit-project.js create mode 100644 src/components/dialog/new-project.js rename src/containers/{visualizations.js => project.js} (55%) create mode 100644 src/data-managers/projects-data-manager.js create mode 100644 src/stores/project-store.js diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index a317a02..e3c774d 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -39,7 +39,7 @@ class Dialog extends Component { - + ); diff --git a/src/components/dialog/edit-project.js b/src/components/dialog/edit-project.js new file mode 100644 index 0000000..b4facfb --- /dev/null +++ b/src/components/dialog/edit-project.js @@ -0,0 +1,94 @@ +/** + * File: edit-project.js + * Author: Markus Grigull + * Date: 07.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class EditProjectDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + project: PropTypes.object.isRequired, + simulations: PropTypes.array.isRequired + }; + + valid: true; + + constructor(props) { + super(props); + + this.state = { + name: '', + simulation: '', + _id: '' + } + } + + onClose(canceled) { + if (canceled === false) { + 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/components/dialog/new-project.js b/src/components/dialog/new-project.js new file mode 100644 index 0000000..6abc0c8 --- /dev/null +++ b/src/components/dialog/new-project.js @@ -0,0 +1,86 @@ +/** + * File: new-project.js + * Author: Markus Grigull + * Date: 07.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewProjectDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + simulations: PropTypes.array.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + simulation: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + 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]._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"; + } + + 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/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 005c928..cb3ca63 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -72,7 +72,7 @@ class NewSimulationModelDialog extends Component { } resetState() { - this.setState({ name: '', simulator: '', length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); + this.setState({ name: '', simulator: this.props.simulators[0]._id, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); } validateForm(target) { diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 509f33d..afe51a6 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -21,7 +21,6 @@ class SidebarMenu extends Component {
  • Projects
  • Simulations
  • Simulators
  • -
  • Visualizations
  • ); diff --git a/src/containers/visualizations.js b/src/containers/project.js similarity index 55% rename from src/containers/visualizations.js rename to src/containers/project.js index 782fdd1..34804d7 100644 --- a/src/containers/visualizations.js +++ b/src/containers/project.js @@ -1,5 +1,5 @@ /** - * File: visualizations.js + * File: project.js * Author: Markus Grigull * Date: 03.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -12,6 +12,7 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; +import ProjectStore from '../stores/project-store'; import VisualizationStore from '../stores/visualization-store'; import Table from '../components/table'; @@ -21,35 +22,95 @@ import EditVisualizationDialog from '../components/dialog/edit-visualization'; class Visualizations extends Component { static getStores() { - return [ VisualizationStore ]; + return [ ProjectStore, VisualizationStore ]; } - static calculateState() { - return { - visualizations: VisualizationStore.getState(), + static calculateState(prevState) { + if (prevState) { + return { + projects: ProjectStore.getState(), + visualizations: VisualizationStore.getState(), - newModal: false, - deleteModal: false, - editModal: false, - modalData: {} - }; + newModal: prevState.newModal, + deleteModal: prevState.deleteModal, + editModal: prevState.editModal, + modalData: prevState.modalData, + + project: prevState.project, + reload: prevState.reload + }; + } else { + return { + projects: ProjectStore.getState(), + visualizations: VisualizationStore.getState(), + + newModal: false, + deleteModal: false, + editModal: false, + modalData: {}, + + project: {}, + reload: false + }; + } } componentWillMount() { AppDispatcher.dispatch({ - type: 'visualizations/start-load' + type: 'projects/start-load' + }); + } + + componentDidUpdate() { + if (this.state.project._id !== this.props.params.project /*|| this.state.reload*/) { + this.reloadProject(); + + if (this.state.reload) { + this.setState({ reload: false }); + } + } + } + + loadVisualizations(ids) { + if (AppDispatcher.isDispatching()) { + // try again later + var self = this; + setTimeout(function() { + self.loadVisualizations(ids); + }, 1); + } else { + AppDispatcher.dispatch({ + type: 'visualizations/start-load', + data: ids + }); + } + } + + reloadProject() { + // select project by param id + this.state.projects.forEach((project) => { + if (project._id === this.props.params.project) { + // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside + this.setState({ project: JSON.parse(JSON.stringify(project)) }); + + // load visualizations + this.loadVisualizations(project.visualizations); + } }); } closeNewModal(data) { - this.setState({ newModal : false }); - if (data) { + // add project to visualization + data.project = this.state.project._id; + AppDispatcher.dispatch({ type: 'visualizations/start-add', data: data }); } + + this.setState({ newModal: false, reload: data != null }); } confirmDeleteModal() { @@ -73,11 +134,24 @@ class Visualizations extends Component { } render() { + // get visualizations for this project + var visualizations = []; + + if (this.state.visualizations && this.state.project.visualizations) { + this.state.visualizations.forEach((visualization) => { + this.state.project.visualizations.forEach((id) => { + if (visualization._id === id) { + visualizations.push(visualization); + } + }); + }); + } + return (
    -

    Visualizations

    +

    {this.state.project.name}

    - +
    this.setState({ editModal: true, modalData: this.state.visualizations[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.visualizations[index] })} />
    diff --git a/src/containers/projects.js b/src/containers/projects.js index 825ca7f..4e6a4b6 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -9,26 +9,116 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; -// import AppDispatcher from '../app-dispatcher'; -import VillasStore from '../stores/villas-store'; +import AppDispatcher from '../app-dispatcher'; +import ProjectStore from '../stores/project-store'; +import SimulationStore from '../stores/simulation-store'; + +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewProjectDialog from '../components/dialog/new-project'; +import EditProjectDialog from '../components/dialog/edit-project'; class Projects extends Component { static getStores() { - return [ VillasStore ]; + return [ ProjectStore, SimulationStore ]; } static calculateState() { return { - villas: VillasStore.getState() + projects: ProjectStore.getState(), + simulations: SimulationStore.getState(), + + newModal: false, + editModal: false, + deleteModal: false, + modalData: {} }; } + componentWillMount() { + AppDispatcher.dispatch({ + type: 'projects/start-load' + }); + + AppDispatcher.dispatch({ + type: 'simulations/start-load' + }); + } + + closeNewModal(data) { + this.setState({ newModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'projects/start-add', + data: data + }); + } + } + + confirmDeleteModal() { + this.setState({ deleteModal: false }); + + AppDispatcher.dispatch({ + type: 'projects/start-remove', + data: this.state.modalData + }); + } + + closeEditModal(data) { + this.setState({ editModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'projects/start-edit', + data: data + }); + } + } + + 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; + } + 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.closeNewModal(data)} simulations={this.state.simulations} /> + + this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> + + + + Delete Project + + + + Are you sure you want to delete the project '{this.state.modalData.name}'? + + + + + + +
    ); } diff --git a/src/data-managers/projects-data-manager.js b/src/data-managers/projects-data-manager.js new file mode 100644 index 0000000..a85801d --- /dev/null +++ b/src/data-managers/projects-data-manager.js @@ -0,0 +1,12 @@ +/** + * File: projects-data-manager.js + * Author: Markus Grigull + * Date: 07.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import RestDataManager from './rest-data-manager'; + +export default new RestDataManager('project', '/projects'); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index db92935..0b5d178 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -16,18 +16,34 @@ class RestDataManager { this.type = type; } - load() { - RestAPI.get(this.url).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/loaded', - data: response[this.type + 's'] + load(id) { + if (id != null) { + // load single object + RestAPI.get(this.url + '/' + id).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/loaded', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/load-error', + error: error + }); }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/load-error', - error: error + } else { + // load all objects + RestAPI.get(this.url).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/loaded', + data: response[this.type + 's'] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/load-error', + error: error + }); }); - }); + } } add(object) { diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index 4a9d0bf..d5a606e 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -7,6 +7,6 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ - import RestDataManager from './rest-data-manager'; +import RestDataManager from './rest-data-manager'; - export default new RestDataManager('simulation', '/simulations'); +export default new RestDataManager('simulation', '/simulations'); diff --git a/src/router.js b/src/router.js index 5689e6e..49ed410 100644 --- a/src/router.js +++ b/src/router.js @@ -13,9 +13,9 @@ import { Router, Route, hashHistory } from 'react-router'; import App from './containers/app'; import Home from './containers/home'; import Projects from './containers/projects'; +import Project from './containers/project'; import Simulators from './containers/simulators'; import Visualization from './containers/visualization'; -import Visualizations from './containers/visualizations'; import Simulations from './containers/simulations'; import Simulation from './containers/simulation'; @@ -25,10 +25,12 @@ class Root extends Component { + + + - diff --git a/src/stores/array-store.js b/src/stores/array-store.js index 8f2179d..b7c166a 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -23,16 +23,46 @@ class ArrayStore extends ReduceStore { return []; } - reduce(state, action) { - var array; + updateElements(state, newElements) { + // search for existing element to update + state.forEach((element, index, array) => { + newElements.forEach((updateElement, index) => { + if (element._id === updateElement._id) { + array[index] = element; + // remove updated element from update list + newElements.splice(index, 1); + } + }); + }); + + // all elements still in the list will just be added + state = state.concat(newElements); + + // announce change to listeners + this.__emitChange(); + + return state; + } + + reduce(state, action) { switch (action.type) { case this.type + '/start-load': - this.dataManager.load(); + if (Array.isArray(action.data)) { + action.data.forEach((id) => { + this.dataManager.load(id); + }); + } else { + this.dataManager.load(action.data); + } return state; case this.type + '/loaded': - return action.data; + if (Array.isArray(action.data)) { + return this.updateElements(state, action.data); + } else { + return this.updateElements(state, [action.data]); + } case this.type + '/load-error': // TODO: Add error message @@ -43,11 +73,7 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/added': - // signal array change since its not automatically detected - state.push(action.data); - this.__emitChange(); - - return state; + return this.updateElements(state, [action.data]); case this.type + '/add-error': // TODO: Add error message @@ -71,14 +97,7 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/edited': - array = state.slice(); - for (var i = 0; i < array.length; i++) { - if (array[i]._id === action.data._id) { - array[i] = action.data; - } - } - - return array; + return this.updateElements(state, [action.data]); case this.type + '/edit-error': // TODO: Add error message diff --git a/src/stores/project-store.js b/src/stores/project-store.js new file mode 100644 index 0000000..405820f --- /dev/null +++ b/src/stores/project-store.js @@ -0,0 +1,13 @@ +/** + * File: project-store.js + * Author: Markus Grigull + * Date: 07.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import ArrayStore from './array-store'; +import ProjectsDataManager from '../data-managers/projects-data-manager'; + +export default new ArrayStore('projects', ProjectsDataManager); From 7161ea7adc3a064fdb2809b430ad6b9fc913bb2c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 8 Mar 2017 15:41:53 +0100 Subject: [PATCH 061/556] Add unique simulator sockets Add automatic simulator-data load Add missing widget-value component --- src/api/websocket-api.js | 16 ++--- src/app-dispatcher.js | 18 +++++- src/components/widget-value.js | 34 ++++++++++ src/containers/app.js | 62 +++++++++++++++++-- src/containers/project.js | 20 ++---- src/containers/visualization.js | 56 ++++++++--------- src/containers/widget.js | 2 +- ...ager.js => simulator-data-data-manager.js} | 39 ++++++++---- src/stores/simulator-data-store.js | 9 ++- 9 files changed, 178 insertions(+), 78 deletions(-) create mode 100644 src/components/widget-value.js rename src/data-managers/{simulator-data-manager.js => simulator-data-data-manager.js} (56%) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index 33f96b8..c5cad2c 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -8,13 +8,9 @@ **********************************************************************************/ class WebsocketAPI { - constructor() { - this.sockets = {}; - } - - addSocket(endpoint, identifier, callbacks) { + addSocket(endpoint, callbacks) { // create web socket client - var socket = new WebSocket('ws://' + endpoint, 'live'); + var socket = new WebSocket(this.getURL(endpoint), 'live'); socket.binaryType = 'arraybuffer'; // register callbacks @@ -23,13 +19,11 @@ class WebsocketAPI { if (callbacks.onMessage) socket.addEventListener('message', event => callbacks.onMessage(event)); if (callbacks.onError) socket.addEventListener('error', event => callbacks.onError(event)); - // save socket - this.sockets[identifier] = socket; + return socket; } - removeSocket(identifier) { - this.sockets[identifier].close(); - delete this.sockets[identifier]; + getURL(endpoint) { + return 'ws://' + endpoint; } } diff --git a/src/app-dispatcher.js b/src/app-dispatcher.js index 689348d..52ba2af 100644 --- a/src/app-dispatcher.js +++ b/src/app-dispatcher.js @@ -9,6 +9,20 @@ import { Dispatcher } from 'flux'; -const dispatcher: Dispatcher = new Dispatcher(); +class AppDispatcher extends Dispatcher { + dispatch(payload) { + if (this.isDispatching()) { + // try again later + var self = this; -export default dispatcher; + setTimeout(function() { + self.dispatch(payload); + }, 1); + } else { + // do actual dispatch + super.dispatch(payload); + } + } +} + +export default new AppDispatcher(); diff --git a/src/components/widget-value.js b/src/components/widget-value.js new file mode 100644 index 0000000..e016d0a --- /dev/null +++ b/src/components/widget-value.js @@ -0,0 +1,34 @@ +/** + * File: widget-value.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +//import EditWidgetValueDialog from './dialog-edit-widget-value'; + +class WidgetValue extends Component { + render() { + // calculate value + var value = null; + const identifier = '58bfd9facd76830327c8b6d4'; + const signal = 2; + + if (this.props.data && this.props.data[identifier] && this.props.data[identifier].values) { + const signalArray = this.props.data[identifier].values[signal]; + value = signalArray[signalArray.length - 1].y; + } + + return ( +
    + {this.props.widget.name}: {value} +
    + ); + } +} + +export default WidgetValue; diff --git a/src/containers/app.js b/src/containers/app.js index 37acdb1..d5283ac 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -12,8 +12,9 @@ import { Container } from 'flux/utils'; import { DragDropContext } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; -// import AppDispatcher from '../app-dispatcher'; -import VillasStore from '../stores/villas-store'; +import AppDispatcher from '../app-dispatcher'; +import SimulationStore from '../stores/simulation-store'; +import SimulatorStore from '../stores/simulator-store'; import Header from '../components/header'; import Footer from '../components/footer'; @@ -23,15 +24,68 @@ import '../styles/app.css'; class App extends Component { static getStores() { - return [ VillasStore ]; + return [ SimulationStore, SimulatorStore ]; } static calculateState() { return { - villas: VillasStore.getState() + simulators: SimulatorStore.getState(), + simulations: SimulationStore.getState() }; } + componentWillMount() { + // load all simulators and simulations to fetch simulation data + AppDispatcher.dispatch({ + type: 'simulators/start-load' + }); + + AppDispatcher.dispatch({ + type: 'simulations/start-load' + }); + } + + componentDidUpdate() { + if (this.state.simulators && this.state.simulations && this.state.simulations.length > 0) { + // get list of used simulators + var simulators = []; + + this.state.simulations.forEach((simulation) => { + // open connection to each simulator running a simulation model + simulation.models.forEach((simulationModel) => { + // add simulator to list if not already part of + const index = simulators.findIndex((element) => { + return element.simulator === simulationModel.simulator; + }); + + if (index === -1) { + simulators.push({ simulator: simulationModel.simulator, signals: simulationModel.length }); + } else { + if (simulators[index].length < simulationModel.length) { + simulators[index].length = simulationModel.length; + } + } + }); + }); + + // open connection to each simulator + this.state.simulators.forEach((simulator) => { + const index = simulators.findIndex((element) => { + return element.simulator === simulator._id; + }); + + if (index !== -1) { + AppDispatcher.dispatch({ + type: 'simulatorData/open', + identifier: simulator._id, + endpoint: simulator.endpoint, + signals: simulators[index].signals + }); + } + }); + } + } + render() { // get children var children = this.props.children; diff --git a/src/containers/project.js b/src/containers/project.js index 34804d7..910eebe 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -71,21 +71,6 @@ class Visualizations extends Component { } } - loadVisualizations(ids) { - if (AppDispatcher.isDispatching()) { - // try again later - var self = this; - setTimeout(function() { - self.loadVisualizations(ids); - }, 1); - } else { - AppDispatcher.dispatch({ - type: 'visualizations/start-load', - data: ids - }); - } - } - reloadProject() { // select project by param id this.state.projects.forEach((project) => { @@ -94,7 +79,10 @@ class Visualizations extends Component { this.setState({ project: JSON.parse(JSON.stringify(project)) }); // load visualizations - this.loadVisualizations(project.visualizations); + AppDispatcher.dispatch({ + type: 'visualizations/start-load', + data: project.visualizations + }); } }); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 9fd585f..31bf209 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -15,12 +15,15 @@ import { ContextMenu, MenuItem } from 'react-contextmenu'; import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; import Widget from './widget'; + import VisualizationStore from '../stores/visualization-store'; +import ProjectStore from '../stores/project-store'; +import SimulationStore from '../stores/simulation-store'; import AppDispatcher from '../app-dispatcher'; class Visualization extends Component { static getStores() { - return [ VisualizationStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore ]; } static calculateState(prevState) { @@ -38,11 +41,34 @@ class Visualization extends Component { visualizations: VisualizationStore.getState(), visualization: {}, + simulation: null, editing: false, grid: false } } + componentWillMount() { + AppDispatcher.dispatch({ + type: 'visualizations/start-load' + }); + } + + componentDidUpdate() { + if (this.state.visualization._id !== this.props.params.visualization) { + this.reloadVisualization(); + } + } + + reloadVisualization() { + // select visualization by param id + this.state.visualizations.forEach((visualization) => { + if (visualization._id === this.props.params.visualization) { + // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside + this.setState({ visualization: JSON.parse(JSON.stringify(visualization)) }); + } + }); + } + handleDrop(item) { // add new widget var widget = { @@ -99,34 +125,6 @@ class Visualization extends Component { this.forceUpdate(); } - componentWillMount() { - AppDispatcher.dispatch({ - type: 'visualizations/start-load' - }); - - AppDispatcher.dispatch({ - type: 'simulatorData/open', - endpoint: 'localhost:5000', - identifier: 'RTDS' - }); - } - - componentDidUpdate() { - if (this.state.visualization._id !== this.props.params.visualization) { - this.reloadVisualization(); - } - } - - reloadVisualization() { - // select visualization by param id - this.state.visualizations.forEach((visualization) => { - if (visualization._id === this.props.params.visualization) { - // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside - this.setState({ visualization: JSON.parse(JSON.stringify(visualization)) }); - } - }); - } - render() { return (
    diff --git a/src/containers/widget.js b/src/containers/widget.js index b436075..c24a0a0 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -84,7 +84,7 @@ class Widget extends Component { } else { return (
    - +
    ); } diff --git a/src/data-managers/simulator-data-manager.js b/src/data-managers/simulator-data-data-manager.js similarity index 56% rename from src/data-managers/simulator-data-manager.js rename to src/data-managers/simulator-data-data-manager.js index 049eda2..2dffa9a 100644 --- a/src/data-managers/simulator-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -1,5 +1,5 @@ /** - * File: simulator-data-manager.js + * File: simulator-data-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -10,34 +10,47 @@ import WebsocketAPI from '../api/websocket-api'; import AppDispatcher from '../app-dispatcher'; -class SimulationDataManager { - open(endpoint, identifier) { - WebsocketAPI.addSocket(endpoint, identifier, { onOpen: event => this.onOpen(event), onClose: event => this.onClose(event), onMessage: event => this.onMessage(event) }); +class SimulatorDataDataManager { + constructor() { + this._sockets = {}; } - onOpen(event) { - // TODO: Add identifiers to callbacks + open(endpoint, identifier, signals) { + // pass signals to onOpen callback + if (this._sockets[identifier] != null) { + if (this._sockets[identifier].url !== WebsocketAPI.getURL(endpoint)) { + // replace connection, since endpoint changed + this._sockets.close(); + this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + } + } else { + this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + } + } + + onOpen(event, identifier, signals) { AppDispatcher.dispatch({ type: 'simulatorData/opened', - identifier: 'RTDS', - signals: 8 + identifier: identifier, + signals: signals }); } - onClose(event) { + onClose(event, identifier) { AppDispatcher.dispatch({ - type: 'simulatorData/closed' + type: 'simulatorData/closed', + identifier: identifier }); } - onMessage(event) { + onMessage(event, identifier) { var message = this.bufferToMessage(event.data); AppDispatcher.dispatch({ type: 'simulatorData/data-changed', data: message, - identifier: 'RTDS' + identifier: identifier }); } @@ -69,4 +82,4 @@ class SimulationDataManager { } } -export default new SimulationDataManager(); +export default new SimulatorDataDataManager(); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 38b69a3..c14644f 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -10,7 +10,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; -import SimulatorDataManager from '../data-managers/simulator-data-manager'; +import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; const MAX_VALUES = 10000; @@ -28,7 +28,7 @@ class SimulationDataStore extends ReduceStore { switch (action.type) { case 'simulatorData/open': - SimulatorDataManager.open(action.endpoint, action.identifier); + SimulatorDataDataManager.open(action.endpoint, action.identifier, action.signals); return state; case 'simulatorData/opened': @@ -63,6 +63,11 @@ class SimulationDataStore extends ReduceStore { return state; case 'simulatorData/closed': + // close and delete socket + state[action.identifier].close(); + state[action.identifier] = null; + + this.__emitChange(); return state; default: From 24d009e214a9ad8b351e415fd92b78b284c80c85 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 8 Mar 2017 20:30:23 +0100 Subject: [PATCH 062/556] Add edit dialog to widgets and value-widget Data and simulation is passed properly to widgets --- src/components/dialog/edit-widget-value.js | 106 ++++++++------------- src/components/dialog/edit-widget.js | 95 ++++++++++++++++++ src/components/widget-value.js | 11 +-- src/containers/visualization.js | 80 +++++++++++++--- src/containers/widget.js | 4 +- 5 files changed, 205 insertions(+), 91 deletions(-) create mode 100644 src/components/dialog/edit-widget.js diff --git a/src/components/dialog/edit-widget-value.js b/src/components/dialog/edit-widget-value.js index 1fa5de8..7f16a03 100644 --- a/src/components/dialog/edit-widget-value.js +++ b/src/components/dialog/edit-widget-value.js @@ -7,86 +7,58 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React, { Component } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; -import Dialog from './dialog'; - -class EditWidgetValueDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - - valid: false; - +class EditValueWidget extends Component { constructor(props) { super(props); this.state = { - name: '', - simulator: '', - signal: 0 - } + widget: { + simulator: '', + signal: 0 + } + }; } - onClose(canceled) { - if (canceled === false) { - this.props.onClose(this.state); - } else { - this.props.onClose(); - } - } - - handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); - } - - resetState() { - this.setState({ name: '' }); - } - - 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"; + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); } render() { + // get selected simulation model + var simulationModel = {}; + + if (this.props.simulation) { + this.props.simulation.models.forEach((model) => { + if (model.simulation === this.state.widget.simulation) { + simulationModel = model; + } + }); + } + return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Simulator - - - - - - - Signal - this.handleChange(e)} /> - - -
    -
    +
    + + Simulator + this.props.handleChange(e)}> + {this.props.simulation.models.map((model, index) => ( + + ))} + + + + Signal + this.props.handleChange(e)}> + {simulationModel.mapping.map((signal, index) => ( + + ))} + + +
    ); } } -export default EditWidgetValueDialog; +export default EditValueWidget; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js new file mode 100644 index 0000000..c777466 --- /dev/null +++ b/src/components/dialog/edit-widget.js @@ -0,0 +1,95 @@ +/** + * File: edit-widget.js + * Author: Markus Grigull + * Date: 08.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +import EditValueWidget from './edit-widget-value'; + +class EditWidgetDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: true; + + constructor(props) { + super(props); + + this.state = { + widget: { + name: '', + simulator: '', + signal: 0 + } + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state.widget); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + var widget = this.state.widget; + widget[e.target.id] = e.target.value; + this.setState({ widget: widget }); + + console.log(this.state.widget); + } + + resetState() { + this.setState({ widget: this.props.widget }); + } + + 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"; + } + + render() { + // get widget part + var widgetDialog = null; + + if (this.props.widget && this.props.widget.type === 'Value') { + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; + } + + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + {widgetDialog} +
    +
    + ); + } +} + +export default EditWidgetDialog; diff --git a/src/components/widget-value.js b/src/components/widget-value.js index e016d0a..92987b6 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -9,23 +9,20 @@ import React, { Component } from 'react'; -//import EditWidgetValueDialog from './dialog-edit-widget-value'; - class WidgetValue extends Component { render() { // calculate value var value = null; - const identifier = '58bfd9facd76830327c8b6d4'; - const signal = 2; + const widget = this.props.widget; - if (this.props.data && this.props.data[identifier] && this.props.data[identifier].values) { - const signalArray = this.props.data[identifier].values[signal]; + if (this.props.data && this.props.data[widget.simulator] && this.props.data[widget.simulator].values) { + const signalArray = this.props.data[widget.simulator].values[widget.signal]; value = signalArray[signalArray.length - 1].y; } return (
    - {this.props.widget.name}: {value} + {widget.name}: {value}
    ); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 31bf209..e1fb132 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -15,6 +15,7 @@ import { ContextMenu, MenuItem } from 'react-contextmenu'; import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; import Widget from './widget'; +import EditWidget from '../components/dialog/edit-widget'; import VisualizationStore from '../stores/visualization-store'; import ProjectStore from '../stores/project-store'; @@ -27,24 +28,25 @@ class Visualization extends Component { } static calculateState(prevState) { - if (prevState) { - return { - visualizations: VisualizationStore.getState(), - - visualization: prevState.visualization, - editing: prevState.editing, - grid: prevState.grid - }; + if (prevState == null) { + prevState = {}; } return { visualizations: VisualizationStore.getState(), + projects: ProjectStore.getState(), + simulations: SimulationStore.getState(), - visualization: {}, - simulation: null, - editing: false, - grid: false - } + visualization: prevState.visualization || {}, + project: prevState.project || null, + simulation: prevState.simulation || null, + editing: prevState.editing || false, + grid: prevState.grid || false, + + editModal: prevState.editModal || false, + modalData: prevState.modalData || null, + modalIndex: prevState.modalIndex || null + }; } componentWillMount() { @@ -57,6 +59,29 @@ class Visualization extends Component { if (this.state.visualization._id !== this.props.params.visualization) { this.reloadVisualization(); } + + // load depending project + if (this.state.project == null && this.state.projects) { + this.state.projects.forEach((project) => { + if (project._id === this.state.visualization.project) { + this.setState({ project: project, simulation: null }); + + AppDispatcher.dispatch({ + type: 'simulations/start-load', + data: project.simulation + }); + } + }); + } + + // 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 }); + } + }); + } } reloadVisualization() { @@ -64,7 +89,12 @@ class Visualization extends Component { this.state.visualizations.forEach((visualization) => { if (visualization._id === this.props.params.visualization) { // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside - this.setState({ visualization: JSON.parse(JSON.stringify(visualization)) }); + this.setState({ visualization: JSON.parse(JSON.stringify(visualization)), project: null }); + + AppDispatcher.dispatch({ + type: 'projects/start-load', + data: visualization.project + }); } }); } @@ -81,6 +111,12 @@ class Visualization extends Component { z: 0 }; + // set type specific properties + if (item.name === 'Value') { + widget.simulator = this.state.simulation.models[0].simulator; + widget.signal = 0; + } + var visualization = this.state.visualization; visualization.widgets.push(widget); @@ -97,7 +133,19 @@ class Visualization extends Component { } editWidget(e, data) { + this.setState({ editModal: true, modalData: this.state.visualization.widgets[data.index], modalIndex: data.index }); + } + closeEdit(data) { + if (data) { + // save changes temporarily + var visualization = this.state.visualization; + visualization.widgets[this.state.modalIndex] = data; + + this.setState({ editModal: false, visualization: visualization }); + } else { + this.setState({ editModal: false }); + } } deleteWidget(e, data) { @@ -155,7 +203,7 @@ class Visualization extends Component { this.handleDrop(item)} editing={this.state.editing}> {this.state.visualization.widgets != null && this.state.visualization.widgets.map((widget, index) => ( - this.widgetChange(w, i)} editing={this.state.editing} index={index} grid={this.state.grid} /> + this.widgetChange(w, i)} editing={this.state.editing} index={index} grid={this.state.grid} /> ))} @@ -166,6 +214,8 @@ class Visualization extends Component { this.deleteWidget(e, data)}>Delete ))} + + this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} />
    ); diff --git a/src/containers/widget.js b/src/containers/widget.js index c24a0a0..67e7bd4 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -77,14 +77,14 @@ class Widget extends Component { resizeGrid={grid} > - + ); } else { return (
    - +
    ); } From 98909301b964730019a824bc6447bd17bf12789d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 13 Mar 2017 16:39:43 +0100 Subject: [PATCH 063/556] Add plot widget Plot edit dialog not created yet --- src/components/dialog/edit-widget-plot.js | 0 src/components/dialog/edit-widget.js | 1 + src/components/widget-plot.js | 66 +++++++++++++++++++++++ src/containers/visualization.js | 5 ++ src/containers/widget.js | 18 +++++-- src/stores/simulator-data-store.js | 11 ++-- src/styles/app.css | 2 + src/styles/widgets.css | 2 + 8 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/components/dialog/edit-widget-plot.js create mode 100644 src/components/widget-plot.js diff --git a/src/components/dialog/edit-widget-plot.js b/src/components/dialog/edit-widget-plot.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index c777466..21ba51b 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -13,6 +13,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; import EditValueWidget from './edit-widget-value'; +import editPlotWidget from './edit-widget-plot'; class EditWidgetDialog extends Component { static propTypes = { diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js new file mode 100644 index 0000000..fad5f0c --- /dev/null +++ b/src/components/widget-plot.js @@ -0,0 +1,66 @@ +/** + * File: widget-plot.js + * Author: Markus Grigull + * Date: 08.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { LineChart } from 'rd3'; + +class WidgetPlot extends Component { + render() { + // get selected simulation model + const widget = this.props.widget; + var simulationModel; + + if (this.props.simulation && this.props.simulation.models && this.props.data[widget.simulator]) { + this.props.simulation.models.forEach((model) => { + if (model.simulator === widget.simulator) { + simulationModel = model; + } + }); + } else { + return (
    ); + } + + if (widget.plotType === 'table') { + return ( +
    Table
    + ); + } else if (widget.plotType === 'multiple') { + // get selected data + var lineData = []; + const latestTimestamp = this.props.data[widget.simulator].values[0][this.props.data[widget.simulator].values[0].length - 1].x; + + widget.signals.forEach((signal) => { + lineData.push({ + name: simulationModel.mapping[signal].name, + values: this.props.data[widget.simulator].values[signal] + }); + }); + + return ( +
    + {return new Date(d.x);}} + hoverAnimation={false} + circleRadius={0} + domain={{ x: [latestTimestamp - 10000, latestTimestamp] }} + /> +
    + ); + } else { + return (
    Error
    ); + } + } +} + +export default WidgetPlot; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e1fb132..13dea0f 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -115,6 +115,10 @@ class Visualization extends Component { if (item.name === 'Value') { widget.simulator = this.state.simulation.models[0].simulator; widget.signal = 0; + } else if (item.name === 'Plot') { + widget.simulator = this.state.simulation.models[0].simulator; + widget.plotType = 'multiple'; + widget.signals = [ 0 ]; } var visualization = this.state.visualization; @@ -197,6 +201,7 @@ class Visualization extends Component { {this.state.editing &&
    +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 67e7bd4..d6ac0d8 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -14,6 +14,7 @@ import Rnd from 'react-rnd'; import SimulatorDataStore from '../stores/simulator-data-store'; import WidgetValue from '../components/widget-value'; +import WidgetPlot from '../components/widget-plot'; import '../styles/widgets.css'; @@ -57,13 +58,22 @@ class Widget extends Component { } render() { - const widget = this.props.data; - + // configure grid var grid = this.props.grid; if (!grid) { grid = [ 1, 1 ]; } + // get widget element + const widget = this.props.data; + var element = null; + + if (widget.type === 'Value') { + element = + } else if (widget.type === 'Plot') { + element = + } + if (this.props.editing) { return ( - + {element} ); } else { return (
    - + {element}
    ); } diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index c14644f..1fe5816 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -12,7 +12,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; -const MAX_VALUES = 10000; +const MAX_VALUES = 100; class SimulationDataStore extends ReduceStore { constructor() { @@ -64,10 +64,13 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/closed': // close and delete socket - state[action.identifier].close(); - state[action.identifier] = null; + if (state[action.identifier]) { + state[action.identifier].close(); + state[action.identifier] = null; + + this.__emitChange(); + } - this.__emitChange(); return state; default: diff --git a/src/styles/app.css b/src/styles/app.css index c1aad96..b7d16e3 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -142,6 +142,8 @@ body { padding: 5px 10px; + margin-right: 10px; + border: 1px solid gray; cursor: move; diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 7fe801b..fb9a781 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -12,6 +12,8 @@ height: 100%; border: 1px solid lightgray; + + padding: 3px 6px; } .react-contextmenu { From 913280af2e318eed0c1a4272de83da91df714d24 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 13 Mar 2017 20:42:26 +0100 Subject: [PATCH 064/556] Add plot widget edit dialog for multiple plot type --- src/components/dialog/edit-widget-plot.js | 89 +++++++++++++++++++++++ src/components/dialog/edit-widget.js | 14 ++-- 2 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-plot.js b/src/components/dialog/edit-widget-plot.js index e69de29..837e15c 100644 --- a/src/components/dialog/edit-widget-plot.js +++ b/src/components/dialog/edit-widget-plot.js @@ -0,0 +1,89 @@ +/** + * File: edit-widget-plot.js + * Author: Markus Grigull + * Date: 13.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; + +class EditPlotWidget extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + simulator: '', + plotType: '', + signals: [] + } + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + handleSignalChange(e, index) { + var signals = this.state.widget.signals; + + if (e.target.checked) { + // add signal + signals.push(index); + } else { + // remove signal + const pos = signals.indexOf(index); + if (pos > -1) { + signals.splice(pos, 1); + } + } + + this.props.handleChange({ target: { id: 'signals', value: signals } }); + } + + render() { + // get selected simulation model + var simulationModel = {}; + + if (this.props.simulation) { + this.props.simulation.models.forEach((model) => { + if (model.simulation === this.state.widget.simulation) { + simulationModel = model; + } + }); + } + + return ( +
    + + Simulator + this.props.handleChange(e)}> + {this.props.simulation.models.map((model, index) => ( + + ))} + + + + Type + this.props.handleChange(e)}> + + + + + {this.state.widget.plotType === 'multiple' && + + Signals + {simulationModel.mapping.map((signal, index) => ( + this.handleSignalChange(e, index)}>{signal.name} + ))} + + } +
    + ); + } +} + +export default EditPlotWidget; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 21ba51b..bd9dbc5 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -13,7 +13,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; import EditValueWidget from './edit-widget-value'; -import editPlotWidget from './edit-widget-plot'; +import EditPlotWidget from './edit-widget-plot'; class EditWidgetDialog extends Component { static propTypes = { @@ -43,12 +43,12 @@ class EditWidgetDialog extends Component { } } - handleChange(e) { + handleChange(e, index) { var widget = this.state.widget; widget[e.target.id] = e.target.value; this.setState({ widget: widget }); - console.log(this.state.widget); + //console.log(this.state.widget); } resetState() { @@ -73,8 +73,12 @@ class EditWidgetDialog extends Component { // get widget part var widgetDialog = null; - if (this.props.widget && this.props.widget.type === 'Value') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; + if (this.props.widget) { + if (this.props.widget.type === 'Value') { + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; + } else if (this.props.widget.type === 'Plot') { + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + } } return ( From 42e4afbed87af1a296cb9c774c1ca7ee4c1ab504 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 14 Mar 2017 19:00:13 +0100 Subject: [PATCH 065/556] Increase widget performance Make rest-api more universal usable --- src/api/rest-api.js | 15 +-- src/components/widget-plot.js | 110 ++++++++++-------- src/components/widget-value.js | 31 +++-- src/containers/visualization.js | 4 +- src/containers/widget.js | 4 +- src/data-managers/rest-data-manager.js | 16 ++- .../simulator-data-data-manager.js | 6 + src/stores/simulator-data-store.js | 37 +++--- 8 files changed, 135 insertions(+), 88 deletions(-) diff --git a/src/api/rest-api.js b/src/api/rest-api.js index 40329c2..d01e996 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -10,17 +10,10 @@ import request from 'superagent/lib/client'; import Promise from 'es6-promise'; -const API_URL = 'http://localhost:4000/api/v1'; - -function makeURL(part) { - // TODO: Add / if missing at front of part - return API_URL + part; -} - class RestAPI { get(url) { return new Promise(function (resolve, reject) { - request.get(makeURL(url)).end(function (error, res) { + request.get(url).set('Access-Control-Allow-Origin', '*').end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { @@ -32,7 +25,7 @@ class RestAPI { post(url, body) { return new Promise(function (resolve, reject) { - request.post(makeURL(url)).send(body).end(function (error, res) { + request.post(url).send(body).end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { @@ -44,7 +37,7 @@ class RestAPI { delete(url) { return new Promise(function (resolve, reject) { - request.delete(makeURL(url)).end(function (error, res) { + request.delete(url).end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { @@ -56,7 +49,7 @@ class RestAPI { put(url, body) { return new Promise(function (resolve, reject) { - request.put(makeURL(url)).send(body).end(function (error, res) { + request.put(url).send(body).end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index fad5f0c..140a0f6 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -11,55 +11,73 @@ import React, { Component } from 'react'; import { LineChart } from 'rd3'; class WidgetPlot extends Component { + constructor(props) { + super(props); + + this.state = { + values: [], + firstTimestamp: 0, + latestTimestamp: 0, + sequence: null + }; + } + + componentWillReceiveProps(nextProps) { + // check data + const simulator = nextProps.widget.simulator; + + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + // clear values + this.setState({ values: [], sequence: null }); + return; + } + + // check if new data, otherwise skip + if (this.state.sequence >= nextProps.data[simulator].sequence) { + return; + } + + // get timestamps + const latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; + const firstTimestamp = latestTimestamp - nextProps.widget.time * 100; + + // find element index representing firstTimestamp + const firstIndex = nextProps.data[simulator].values[0].findIndex((value) => { + return value.x >= firstTimestamp; + }); + + // copy all values for each signal in time region + var values = []; + + nextProps.widget.signals.forEach((signal) => { + values.push({ + values: nextProps.data[simulator].values[signal].slice(firstIndex, nextProps.data[simulator].values[signal].length - 1) + }); + }); + + this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence }); + } + render() { - // get selected simulation model - const widget = this.props.widget; - var simulationModel; - - if (this.props.simulation && this.props.simulation.models && this.props.data[widget.simulator]) { - this.props.simulation.models.forEach((model) => { - if (model.simulator === widget.simulator) { - simulationModel = model; - } - }); - } else { - return (
    ); + if (this.state.sequence == null) { + return (
    Empty
    ); } - if (widget.plotType === 'table') { - return ( -
    Table
    - ); - } else if (widget.plotType === 'multiple') { - // get selected data - var lineData = []; - const latestTimestamp = this.props.data[widget.simulator].values[0][this.props.data[widget.simulator].values[0].length - 1].x; - - widget.signals.forEach((signal) => { - lineData.push({ - name: simulationModel.mapping[signal].name, - values: this.props.data[widget.simulator].values[signal] - }); - }); - - return ( -
    - {return new Date(d.x);}} - hoverAnimation={false} - circleRadius={0} - domain={{ x: [latestTimestamp - 10000, latestTimestamp] }} - /> -
    - ); - } else { - return (
    Error
    ); - } + return ( +
    + {return new Date(d.x);}} + hoverAnimation={false} + circleRadius={0} + domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} + /> +
    + ); } } diff --git a/src/components/widget-value.js b/src/components/widget-value.js index 92987b6..c096695 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -10,19 +10,34 @@ import React, { Component } from 'react'; class WidgetValue extends Component { - render() { - // calculate value - var value = null; - const widget = this.props.widget; + constructor(props) { + super(props); - if (this.props.data && this.props.data[widget.simulator] && this.props.data[widget.simulator].values) { - const signalArray = this.props.data[widget.simulator].values[widget.signal]; - value = signalArray[signalArray.length - 1].y; + this.state = { + value: '' + }; + } + + componentWillReceiveProps(nextProps) { + // update value + const simulator = nextProps.widget.simulator; + + if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { + this.setState({ value: '' }); + return; } + // check if value has changed + const signal = nextProps.data[simulator].values[nextProps.widget.signal]; + if (this.state.value !== signal[signal.length - 1].y) { + this.setState({ value: signal[signal.length - 1].y }); + } + } + + render() { return (
    - {widget.name}: {value} + {this.props.widget.name}: {this.state.value}
    ); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 13dea0f..827d57d 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -117,8 +117,10 @@ class Visualization extends Component { widget.signal = 0; } else if (item.name === 'Plot') { widget.simulator = this.state.simulation.models[0].simulator; - widget.plotType = 'multiple'; widget.signals = [ 0 ]; + widget.time = 300; + widget.width = 400; + widget.height = 200; } var visualization = this.state.visualization; diff --git a/src/containers/widget.js b/src/containers/widget.js index d6ac0d8..680cc6f 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -69,9 +69,9 @@ class Widget extends Component { var element = null; if (widget.type === 'Value') { - element = + element = } else if (widget.type === 'Plot') { - element = + element = } if (this.props.editing) { diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 0b5d178..5c5c68c 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -10,16 +10,22 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; +const API_URL = 'http://localhost:4000/api/v1'; + class RestDataManager { constructor(type, url) { this.url = url; this.type = type; } + makeURL(part) { + return API_URL + part; + } + load(id) { if (id != null) { // load single object - RestAPI.get(this.url + '/' + id).then(response => { + RestAPI.get(this.makeURL(this.url + '/' + id)).then(response => { AppDispatcher.dispatch({ type: this.type + 's/loaded', data: response[this.type] @@ -32,7 +38,7 @@ class RestDataManager { }); } else { // load all objects - RestAPI.get(this.url).then(response => { + RestAPI.get(this.makeURL(this.url)).then(response => { AppDispatcher.dispatch({ type: this.type + 's/loaded', data: response[this.type + 's'] @@ -50,7 +56,7 @@ class RestDataManager { var obj = {}; obj[this.type] = object; - RestAPI.post(this.url, obj).then(response => { + RestAPI.post(this.makeURL(this.url), obj).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', data: response[this.type] @@ -64,7 +70,7 @@ class RestDataManager { } remove(object) { - RestAPI.delete(this.url + '/' + object._id).then(response => { + RestAPI.delete(this.makeURL(this.url + '/' + object._id)).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], @@ -82,7 +88,7 @@ class RestDataManager { var obj = {}; obj[this.type] = object; - RestAPI.put(this.url + '/' + object._id, obj).then(response => { + RestAPI.put(this.makeURL(this.url + '/' + object._id), obj).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 2dffa9a..aded151 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -23,9 +23,13 @@ class SimulatorDataDataManager { this._sockets.close(); this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + + console.log('Modified socket'); } } else { this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + + console.log('New socket'); } } @@ -47,6 +51,8 @@ class SimulatorDataDataManager { onMessage(event, identifier) { var message = this.bufferToMessage(event.data); + //console.log(message); + AppDispatcher.dispatch({ type: 'simulatorData/data-changed', data: message, diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 1fe5816..fb97e8f 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -12,7 +12,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; -const MAX_VALUES = 100; +const MAX_VALUES = 1000; class SimulationDataStore extends ReduceStore { constructor() { @@ -39,27 +39,34 @@ class SimulationDataStore extends ReduceStore { state[action.identifier].values.push([]); } + console.log('Socket opened'); + return state; case 'simulatorData/data-changed': - // add data to simulator - for (i = 0; i < state[action.identifier].signals; i++) { - state[action.identifier].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); + // only add data, if newer than current + if (state[action.identifier].sequence < action.data.sequence) { + // add data to simulator + for (i = 0; i < state[action.identifier].signals; i++) { + state[action.identifier].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); - // erase old values - if (state[action.identifier].values[i].length > MAX_VALUES) { - const pos = state[action.identifier].values[i].length - MAX_VALUES; - state[action.identifier].values[i].splice(0, pos); + // erase old values + if (state[action.identifier].values[i].length > MAX_VALUES) { + const pos = state[action.identifier].values[i].length - MAX_VALUES; + state[action.identifier].values[i].splice(0, pos); + } } + + // update metadata + state[action.identifier].timestamp = action.data.timestamp; + state[action.identifier].sequence = action.data.sequence; + + // explicit call to prevent array copy + this.__emitChange(); + } else { + console.log('same sequence'); } - // update metadata - state[action.identifier].timestamp = action.data.timestamp; - state[action.identifier].sequence = action.data.sequence; - - // explicit call to prevent array copy - this.__emitChange(); - return state; case 'simulatorData/closed': From 245188e1df4a202a62ed3b9d3dcf48d83d2b2e1e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 14 Mar 2017 21:53:53 +0100 Subject: [PATCH 066/556] Add table widget --- src/components/dialog/edit-widget-table.js | 55 +++++++++++++++++ src/components/dialog/edit-widget.js | 3 + src/components/widget-table.js | 72 ++++++++++++++++++++++ src/containers/visualization.js | 5 ++ src/containers/widget.js | 4 ++ 5 files changed, 139 insertions(+) create mode 100644 src/components/dialog/edit-widget-table.js create mode 100644 src/components/widget-table.js diff --git a/src/components/dialog/edit-widget-table.js b/src/components/dialog/edit-widget-table.js new file mode 100644 index 0000000..81d24a8 --- /dev/null +++ b/src/components/dialog/edit-widget-table.js @@ -0,0 +1,55 @@ +/** + * File: edit-widget-table.js + * Author: Markus Grigull + * Date: 14.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + + import React, { Component } from 'react'; + import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + + class EditTableWidget extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + simulator: '' + } + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + render() { + // get selected simulation model + var simulationModel = {}; + + if (this.props.simulation) { + this.props.simulation.models.forEach((model) => { + if (model.simulation === this.state.widget.simulation) { + simulationModel = model; + } + }); + } + + return ( +
    + + Simulator + this.props.handleChange(e)}> + {this.props.simulation.models.map((model, index) => ( + + ))} + + +
    + ); + } + } + + export default EditTableWidget; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index bd9dbc5..4f63349 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -14,6 +14,7 @@ import Dialog from './dialog'; import EditValueWidget from './edit-widget-value'; import EditPlotWidget from './edit-widget-plot'; +import EditTableWidget from './edit-widget-table'; class EditWidgetDialog extends Component { static propTypes = { @@ -78,6 +79,8 @@ class EditWidgetDialog extends Component { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; } else if (this.props.widget.type === 'Plot') { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + } else if (this.props.widget.type === 'Table') { + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } } diff --git a/src/components/widget-table.js b/src/components/widget-table.js new file mode 100644 index 0000000..071c084 --- /dev/null +++ b/src/components/widget-table.js @@ -0,0 +1,72 @@ +/** + * File: widget-table.js + * Author: Markus Grigull + * Date: 14.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +import Table from './table'; +import TableColumn from './table-column'; + +class WidgetTable extends Component { + constructor(props) { + super(props); + + this.state = { + rows: [], + sequence: null + }; + } + + componentWillReceiveProps(nextProps) { + // check data + const simulator = nextProps.widget.simulator; + + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + // clear values + this.setState({ rows: [], sequence: null }); + return; + } + + // check if new data, otherwise skip + if (this.state.sequence >= nextProps.data[simulator].sequence) { + return; + } + + // get simulation model + const simulationModel = nextProps.simulation.models.find((model) => { + return (model.simulator === simulator); + }); + + // get rows + var rows = []; + + nextProps.data[simulator].values.forEach((signal, index) => { + rows.push({ + name: simulationModel.mapping[index].name, + value: signal[signal.length - 1].y + }) + }); + + this.setState({ rows: rows, sequence: nextProps.data[simulator].sequence }); + } + + render() { + return ( +
    +

    {this.props.widget.name}

    + + + + +
    +
    + ); + } +} + +export default WidgetTable; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 827d57d..54c1ab0 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -121,6 +121,10 @@ class Visualization extends Component { widget.time = 300; widget.width = 400; widget.height = 200; + } else if (item.name === 'Table') { + widget.simulator = this.state.simulation.models[0].simulator; + widget.width = 400; + widget.height = 200; } var visualization = this.state.visualization; @@ -204,6 +208,7 @@ class Visualization extends Component {
    +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 680cc6f..d7d615f 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -13,8 +13,10 @@ import { ContextMenuTrigger } from 'react-contextmenu'; import Rnd from 'react-rnd'; import SimulatorDataStore from '../stores/simulator-data-store'; + import WidgetValue from '../components/widget-value'; import WidgetPlot from '../components/widget-plot'; +import WidgetTable from '../components/widget-table'; import '../styles/widgets.css'; @@ -72,6 +74,8 @@ class Widget extends Component { element = } else if (widget.type === 'Plot') { element = + } else if (widget.type === 'Table') { + element = } if (this.props.editing) { From e504b4d726e578d5db7b2b95c7406f7fcccad4a7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 14 Mar 2017 22:00:23 +0100 Subject: [PATCH 067/556] Add label widget --- src/components/widget-label.js | 20 ++++++++++++++++++++ src/containers/visualization.js | 3 +++ src/containers/widget.js | 3 +++ 3 files changed, 26 insertions(+) create mode 100644 src/components/widget-label.js diff --git a/src/components/widget-label.js b/src/components/widget-label.js new file mode 100644 index 0000000..2c29650 --- /dev/null +++ b/src/components/widget-label.js @@ -0,0 +1,20 @@ +/** + * File: widget-label.js + * Author: Markus Grigull + * Date: 14.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +class WidgetLabel extends Component { + render() { + return ( +

    {this.props.widget.name}

    + ); + } +} + +export default WidgetLabel; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 54c1ab0..e6baf3c 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -125,6 +125,8 @@ class Visualization extends Component { widget.simulator = this.state.simulation.models[0].simulator; widget.width = 400; widget.height = 200; + } else if (item.name === 'Label') { + } var visualization = this.state.visualization; @@ -209,6 +211,7 @@ class Visualization extends Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index d7d615f..603691c 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -17,6 +17,7 @@ import SimulatorDataStore from '../stores/simulator-data-store'; import WidgetValue from '../components/widget-value'; import WidgetPlot from '../components/widget-plot'; import WidgetTable from '../components/widget-table'; +import WidgetLabel from '../components/widget-label'; import '../styles/widgets.css'; @@ -76,6 +77,8 @@ class Widget extends Component { element = } else if (widget.type === 'Table') { element = + } else if (widget.type === 'Label') { + element = } if (this.props.editing) { From 6af05ccfe3daa8d76651852b2fd4aa3e2093c366 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 15 Mar 2017 12:16:17 +0100 Subject: [PATCH 068/556] Add time property to plot widget Add disabled toolbox items --- src/components/dialog/edit-widget-plot.js | 30 ++++++++++------------ src/components/dialog/edit-widget-table.js | 11 -------- src/components/toolbox-item.js | 25 +++++++++++++----- src/components/widget-plot.js | 21 ++++++++++----- src/containers/visualization.js | 1 + src/stores/simulator-data-store.js | 4 +-- src/styles/app.css | 8 ++++++ 7 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/components/dialog/edit-widget-plot.js b/src/components/dialog/edit-widget-plot.js index 837e15c..a2371e3 100644 --- a/src/components/dialog/edit-widget-plot.js +++ b/src/components/dialog/edit-widget-plot.js @@ -8,7 +8,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox, HelpBlock } from 'react-bootstrap'; class EditPlotWidget extends Component { constructor(props) { @@ -17,8 +17,8 @@ class EditPlotWidget extends Component { this.state = { widget: { simulator: '', - plotType: '', - signals: [] + signals: [], + time: 0 } }; } @@ -58,6 +58,11 @@ class EditPlotWidget extends Component { return (
    + + Time + this.props.handleChange(e)} /> + Time in seconds + Simulator this.props.handleChange(e)}> @@ -66,21 +71,12 @@ class EditPlotWidget extends Component { ))} - - Type - this.props.handleChange(e)}> - - - + + Signals + {simulationModel.mapping.map((signal, index) => ( + this.handleSignalChange(e, index)}>{signal.name} + ))} - {this.state.widget.plotType === 'multiple' && - - Signals - {simulationModel.mapping.map((signal, index) => ( - this.handleSignalChange(e, index)}>{signal.name} - ))} - - }
    ); } diff --git a/src/components/dialog/edit-widget-table.js b/src/components/dialog/edit-widget-table.js index 81d24a8..0388ebd 100644 --- a/src/components/dialog/edit-widget-table.js +++ b/src/components/dialog/edit-widget-table.js @@ -26,17 +26,6 @@ } render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - return (
    diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js index bedb46a..4cc0144 100644 --- a/src/components/toolbox-item.js +++ b/src/components/toolbox-item.js @@ -34,18 +34,31 @@ class ToolboxItem extends Component { type: PropTypes.string.isRequired }; + static defaultProps = { + disabled: false + }; + render() { var itemClass = classNames({ 'toolbox-item': true, - 'toolbox-item-dragging': this.props.isDragging + 'toolbox-item-dragging': this.props.isDragging, + 'toolbox-item-disabled': this.props.disabled }); var dropEffect = 'copy'; - return this.props.connectDragSource( - - {this.props.name} - - , {dropEffect}); + if (this.props.disabled === false) { + return this.props.connectDragSource( + + {this.props.name} + + , {dropEffect}); + } else { + return ( + + {this.props.name} + + ); + } } } diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 140a0f6..96de856 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -38,13 +38,20 @@ class WidgetPlot extends Component { } // get timestamps - const latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; - const firstTimestamp = latestTimestamp - nextProps.widget.time * 100; + var latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; + var firstTimestamp = latestTimestamp - nextProps.widget.time * 1000; + var firstIndex; - // find element index representing firstTimestamp - const firstIndex = nextProps.data[simulator].values[0].findIndex((value) => { - return value.x >= firstTimestamp; - }); + if (nextProps.data[simulator].values[0][0].x < firstTimestamp) { + // find element index representing firstTimestamp + firstIndex = nextProps.data[simulator].values[0].findIndex((value) => { + return value.x >= firstTimestamp; + }); + } else { + firstIndex = 0; + firstTimestamp = nextProps.data[simulator].values[0][0].x; + latestTimestamp = firstTimestamp + nextProps.widget.time * 1000; + } // copy all values for each signal in time region var values = []; @@ -71,7 +78,7 @@ class WidgetPlot extends Component { data={this.state.values} title={this.props.widget.name} gridHorizontal={true} - xAccessor={(d) => {return new Date(d.x);}} + xAccessor={(d) => { if (d != null) { return new Date(d.x); } }} hoverAnimation={false} circleRadius={0} domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e6baf3c..3a58018 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -212,6 +212,7 @@ class Visualization extends Component { +
    } diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index fb97e8f..7e5145b 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -12,7 +12,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; -const MAX_VALUES = 1000; +const MAX_VALUES = 10000; class SimulationDataStore extends ReduceStore { constructor() { @@ -71,7 +71,7 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/closed': // close and delete socket - if (state[action.identifier]) { + if (state[action.identifier] != null) { state[action.identifier].close(); state[action.identifier] = null; diff --git a/src/styles/app.css b/src/styles/app.css index b7d16e3..4c70f45 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -152,3 +152,11 @@ body { .toolbox-item-dragging { opacity: 0.4; } + +.toolbox-item-disabled { + border-color: lightgray; + + color: lightgray; + + cursor: default !important; +} From 6c9cc8946afccf0baf3ab077186d2a7a7454d213 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 15 Mar 2017 13:13:39 +0100 Subject: [PATCH 069/556] Add widgets at cursor drop position, widget zIndex Add context menu for zIndex ordering Bug: zIndex is only applied after saving visualization --- src/components/dialog/edit-simulator.js | 16 +---- src/components/dialog/edit-widget.js | 3 + src/components/dialog/new-simulator.js | 17 +----- src/components/dropzone.js | 12 +++- src/containers/simulators.js | 1 - src/containers/visualization.js | 61 +++++++++++++++++-- src/containers/widget.js | 5 +- .../simulator-data-data-manager.js | 10 +-- src/stores/simulator-data-store.js | 2 - src/styles/widgets.css | 2 + 10 files changed, 79 insertions(+), 50 deletions(-) diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index ad6fa39..2ed14fb 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -26,7 +26,6 @@ class EditSimulatorDialog extends Component { this.state = { name: '', - simulatorid: '1', endpoint: '', _id: '' }; @@ -47,7 +46,6 @@ class EditSimulatorDialog extends Component { resetState() { this.setState({ name: this.props.simulator.name, - simulatorid: this.props.simulator.simulatorid, endpoint: this.props.simulator.endpoint, _id: this.props.simulator._id }); @@ -55,7 +53,6 @@ class EditSimulatorDialog extends Component { validateForm(target) { // check all controls - var simulatorid = true; var endpoint = true; var name = true; @@ -63,20 +60,14 @@ class EditSimulatorDialog extends Component { name = false; } - // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.simulatorid)) { - simulatorid = false; - } - if (this.state.endpoint === '') { endpoint = false; } - this.valid = simulatorid && endpoint && name; + this.valid = endpoint && name; // return state to control if (target === 'name') return name ? "success" : "error"; - else if (target === 'simulatorid') return simulatorid ? "success" : "error"; else return endpoint ? "success" : "error"; } @@ -89,11 +80,6 @@ class EditSimulatorDialog extends Component { this.handleChange(e)} /> - - Simulator ID - this.handleChange(e)} /> - - Endpoint this.handleChange(e)} /> diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 4f63349..8a7c3b0 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -15,6 +15,7 @@ import Dialog from './dialog'; import EditValueWidget from './edit-widget-value'; import EditPlotWidget from './edit-widget-plot'; import EditTableWidget from './edit-widget-table'; +import EditImageWidget from './edit-widget-image'; class EditWidgetDialog extends Component { static propTypes = { @@ -81,6 +82,8 @@ class EditWidgetDialog extends Component { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Table') { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + } else if (this.props.widget.type === 'Image') { + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } } diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 87eb407..7726e85 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -25,7 +25,6 @@ class NewSimulatorDialog extends Component { this.state = { name: '', - simulatorid: '1', endpoint: '' }; } @@ -43,12 +42,11 @@ class NewSimulatorDialog extends Component { } resetState() { - this.setState({ name: '', simulatorid: '1', endpoint: '' }); + this.setState({ name: '', endpoint: '' }); } validateForm(target) { // check all controls - var simulatorid = true; var endpoint = true; var name = true; @@ -56,20 +54,14 @@ class NewSimulatorDialog extends Component { name = false; } - // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.simulatorid)) { - simulatorid = false; - } - if (this.state.endpoint === '') { endpoint = false; } - this.valid = simulatorid && endpoint && name; + this.valid = endpoint && name; // return state to control if (target === 'name') return name ? "success" : "error"; - else if (target === 'simulatorid') return simulatorid ? "success" : "error"; else return endpoint ? "success" : "error"; } @@ -82,11 +74,6 @@ class NewSimulatorDialog extends Component { this.handleChange(e)} /> - - Simulator ID - this.handleChange(e)} /> - - Endpoint this.handleChange(e)} /> diff --git a/src/components/dropzone.js b/src/components/dropzone.js index de2986d..88572d2 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -12,8 +12,14 @@ import { DropTarget } from 'react-dnd'; import classNames from 'classnames'; const dropzoneTarget = { - drop(props, monitor) { - props.onDrop(monitor.getItem()); + drop(props, monitor, component) { + // get drop position + var position = monitor.getSourceClientOffset(); + var dropzoneRect = component.wrapper.getBoundingClientRect(); + position.x -= dropzoneRect.left; + position.y -= dropzoneRect.top; + + props.onDrop(monitor.getItem(), position); } }; @@ -41,7 +47,7 @@ class Dropzone extends Component { }); return this.props.connectDropTarget( -
    +
    this.wrapper = wrapper}> {this.props.children}
    ); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 00ab175..6bbbe3d 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -79,7 +79,6 @@ class Simulators extends Component { - this.setState({ editModal: true, modalSimulator: this.state.simulators[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index] })} /> diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 3a58018..4c77bc2 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -99,15 +99,15 @@ class Visualization extends Component { }); } - handleDrop(item) { + handleDrop(item, position) { // add new widget var widget = { name: 'Name', type: item.name, width: 100, height: 100, - x: 0, - y: 0, + x: position.x, + y: position.y, z: 0 }; @@ -185,6 +185,54 @@ class Visualization extends Component { this.forceUpdate(); } + moveWidgetAbove(e, data) { + // increase z-Order + var visualization = this.state.visualization; + var widget = visualization.widgets[data.index] + widget.z++; + + visualization.widgets[data.index] = widget; + this.setState({ visualization: visualization }); + this.forceUpdate(); + } + + moveWidgetToFront(e, data) { + // increase z-Order + var visualization = this.state.visualization; + var widget = visualization.widgets[data.index] + widget.z = 100; + + visualization.widgets[data.index] = widget; + this.setState({ visualization: visualization }); + this.forceUpdate(); + } + + moveWidgetUnderneath(e, data) { + // decrease z-Order + var visualization = this.state.visualization; + var widget = visualization.widgets[data.index] + + widget.z--; + if (widget.z < 0) { + widget.z = 0; + } + + visualization.widgets[data.index] = widget; + this.setState({ visualization: visualization }); + this.forceUpdate(); + } + + moveWidgetToBack(e, data) { + // increase z-Order + var visualization = this.state.visualization; + var widget = visualization.widgets[data.index] + widget.z = 0; + + visualization.widgets[data.index] = widget; + this.setState({ visualization: visualization }); + this.forceUpdate(); + } + render() { return (
    @@ -216,7 +264,7 @@ class Visualization extends Component {
    } - this.handleDrop(item)} editing={this.state.editing}> + this.handleDrop(item, position)} editing={this.state.editing}> {this.state.visualization.widgets != null && this.state.visualization.widgets.map((widget, index) => ( this.widgetChange(w, i)} editing={this.state.editing} index={index} grid={this.state.grid} /> @@ -228,6 +276,11 @@ class Visualization extends Component { this.editWidget(e, data)}>Edit this.deleteWidget(e, data)}>Delete + + this.moveWidgetAbove(e, data)}>Move above + this.moveWidgetToFront(e, data)}>Move to front + this.moveWidgetUnderneath(e, data)}>Move underneath + this.moveWidgetToBack(e, data)}>Move to back ))} diff --git a/src/containers/widget.js b/src/containers/widget.js index 603691c..968e5f6 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -61,6 +61,8 @@ class Widget extends Component { } render() { + console.log('render widget ' + this.props.data.z + this.props.data.type); + // configure grid var grid = this.props.grid; if (!grid) { @@ -92,6 +94,7 @@ class Widget extends Component { onDragStop={(event, ui) => this.dragStop(event, ui)} moveGrid={grid} resizeGrid={grid} + zIndex={widget.z} > {element} @@ -100,7 +103,7 @@ class Widget extends Component { ); } else { return ( -
    +
    {element}
    ); diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index aded151..dec7f66 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -23,13 +23,9 @@ class SimulatorDataDataManager { this._sockets.close(); this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); - - console.log('Modified socket'); } } else { this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); - - console.log('New socket'); } } @@ -51,8 +47,6 @@ class SimulatorDataDataManager { onMessage(event, identifier) { var message = this.bufferToMessage(event.data); - //console.log(message); - AppDispatcher.dispatch({ type: 'simulatorData/data-changed', data: message, @@ -69,7 +63,6 @@ class SimulatorDataDataManager { let OFFSET_VERSION = 4; var bits = data.getUint8(0); - var simulator = data.getUint8(0x01); var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; var length = data.getUint16(0x02, endian); @@ -82,8 +75,7 @@ class SimulatorDataDataManager { length: length, sequence: data.getUint32(0x04, endian), timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, - values: values, - simulator: simulator + values: values }; } } diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 7e5145b..0568dcc 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -39,8 +39,6 @@ class SimulationDataStore extends ReduceStore { state[action.identifier].values.push([]); } - console.log('Socket opened'); - return state; case 'simulatorData/data-changed': diff --git a/src/styles/widgets.css b/src/styles/widgets.css index fb9a781..3ef8ecd 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -14,6 +14,8 @@ border: 1px solid lightgray; padding: 3px 6px; + + background-color: #fff; } .react-contextmenu { From 5a1de494fbc4d7dd52a3e90b37ed62d13a4c16c6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 15 Mar 2017 15:34:51 +0100 Subject: [PATCH 070/556] Add visualization automatic resize Fix widget top and/or left edge resize --- src/components/dropzone.js | 2 +- src/containers/visualization.js | 17 ++++++++++++++++- src/containers/widget.js | 12 +++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/components/dropzone.js b/src/components/dropzone.js index 88572d2..dbb5dbc 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -47,7 +47,7 @@ class Dropzone extends Component { }); return this.props.connectDropTarget( -
    this.wrapper = wrapper}> +
    this.wrapper = wrapper}> {this.props.children}
    ); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 4c77bc2..14cbc96 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -142,6 +142,7 @@ class Visualization extends Component { visualization.widgets[index] = widget; this.setState({ visualization: visualization }); + this.forceUpdate(); } editWidget(e, data) { @@ -234,6 +235,20 @@ class Visualization extends Component { } render() { + // calculate widget area height + var height = 0; + + if (this.state.visualization.widgets) { + this.state.visualization.widgets.forEach((widget) => { + if (widget.y + widget.height > height) { + height = widget.y + widget.height; + } + }); + + // add padding + height += 40; + } + return (
    @@ -264,7 +279,7 @@ class Visualization extends Component {
    } - this.handleDrop(item, position)} editing={this.state.editing}> + this.handleDrop(item, position)} editing={this.state.editing}> {this.state.visualization.widgets != null && this.state.visualization.widgets.map((widget, index) => ( this.widgetChange(w, i)} editing={this.state.editing} index={index} grid={this.state.grid} /> diff --git a/src/containers/widget.js b/src/containers/widget.js index 968e5f6..6cdcdb8 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -54,6 +54,16 @@ class Widget extends Component { resizeStop(direction, styleSize, clientSize, delta) { // update widget var widget = this.props.data; + + // 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 = styleSize.width; widget.height = styleSize.height; @@ -61,7 +71,7 @@ class Widget extends Component { } render() { - console.log('render widget ' + this.props.data.z + this.props.data.type); + //console.log('render widget ' + this.props.data.z + this.props.data.type); // configure grid var grid = this.props.grid; From 5bf9ad9f8d8dc9877c14c9db4be895ad596f2ae7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 16 Mar 2017 10:22:25 +0100 Subject: [PATCH 071/556] Add authentication Uses jwt tokens, token is stored locally between refreshes --- src/api/rest-api.js | 40 +++++++++++--- src/components/footer.js | 2 +- src/components/login-form.js | 72 +++++++++++++++++++++++++ src/components/menu-sidebar.js | 1 + src/containers/app.js | 19 ++++++- src/containers/login.js | 71 ++++++++++++++++++++++++ src/containers/logout.js | 51 ++++++++++++++++++ src/data-managers/users-data-manager.js | 48 +++++++++++++++++ src/router.js | 6 +++ src/stores/user-store.js | 58 ++++++++++++++++++++ src/styles/app.css | 20 +++++-- 11 files changed, 374 insertions(+), 14 deletions(-) create mode 100644 src/components/login-form.js create mode 100644 src/containers/login.js create mode 100644 src/containers/logout.js create mode 100644 src/data-managers/users-data-manager.js create mode 100644 src/stores/user-store.js diff --git a/src/api/rest-api.js b/src/api/rest-api.js index d01e996..e81ffa4 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -11,9 +11,15 @@ import request from 'superagent/lib/client'; import Promise from 'es6-promise'; class RestAPI { - get(url) { + get(url, token) { return new Promise(function (resolve, reject) { - request.get(url).set('Access-Control-Allow-Origin', '*').end(function (error, res) { + var req = request.get(url).set('Access-Control-Allow-Origin', '*'); + + if (token != null) { + req.set('x-access-token', token); + } + + req.end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { @@ -23,9 +29,15 @@ class RestAPI { }); } - post(url, body) { + post(url, body, token) { return new Promise(function (resolve, reject) { - request.post(url).send(body).end(function (error, res) { + var req = request.post(url).send(body); + + if (token != null) { + req.set('x-access-token', token); + } + + req.end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { @@ -35,9 +47,15 @@ class RestAPI { }); } - delete(url) { + delete(url, token) { return new Promise(function (resolve, reject) { - request.delete(url).end(function (error, res) { + var req = request.delete(url); + + if (token != null) { + req.set('x-access-token', token); + } + + req.end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { @@ -47,9 +65,15 @@ class RestAPI { }); } - put(url, body) { + put(url, body, token) { return new Promise(function (resolve, reject) { - request.put(url).send(body).end(function (error, res) { + var req = request.put(url).send(body); + + if (token != null) { + req.set('x-access-token', token); + } + + req.end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { diff --git a/src/components/footer.js b/src/components/footer.js index cc84ea7..77b7136 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -12,7 +12,7 @@ import React, { Component } from 'react'; class Footer extends Component { render() { return ( -
    +
    Copyright © {new Date().getFullYear()}
    ); diff --git a/src/components/login-form.js b/src/components/login-form.js new file mode 100644 index 0000000..e4e329f --- /dev/null +++ b/src/components/login-form.js @@ -0,0 +1,72 @@ +/** + * File: login-form.js + * Author: Markus Grigull + * Date: 15.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Form, Button, FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; + +import AppDispatcher from '../app-dispatcher'; + +class LoginForm extends Component { + constructor(props) { + super(props); + + this.state = { + username: '', + password: '' + } + } + + login(event) { + // prevent from submitting the form since we send an action + event.preventDefault(); + + // send login action + AppDispatcher.dispatch({ + type: 'users/login', + username: this.state.username, + password: this.state.password + }); + } + + handleChange(event) { + this.setState({ [event.target.id]: event.target.value }); + } + + render() { + return ( +
    + +
    + Username + + + this.handleChange(e)} /> + + + + + + Password + + + this.handleChange(e)} /> + + + + + + + + + + ); + } +} + +export default LoginForm; diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index afe51a6..12ed741 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -21,6 +21,7 @@ class SidebarMenu extends Component {
  • Projects
  • Simulations
  • Simulators
  • +
  • Logout
  • ); diff --git a/src/containers/app.js b/src/containers/app.js index d5283ac..3172cb9 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -15,6 +15,7 @@ import HTML5Backend from 'react-dnd-html5-backend'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; import SimulatorStore from '../stores/simulator-store'; +import UserStore from '../stores/user-store'; import Header from '../components/header'; import Footer from '../components/footer'; @@ -24,17 +25,31 @@ import '../styles/app.css'; class App extends Component { static getStores() { - return [ SimulationStore, SimulatorStore ]; + return [ SimulationStore, SimulatorStore, UserStore ]; } static calculateState() { return { simulators: SimulatorStore.getState(), - simulations: SimulationStore.getState() + simulations: SimulationStore.getState(), + currentUser: UserStore.getState().currentUser }; } componentWillMount() { + // if token stored locally, request user + const token = localStorage.getItem('token'); + + if (token != null && token !== '') { + AppDispatcher.dispatch({ + type: 'users/logged-in', + token: token + }); + } else { + // transition to login page + this.props.router.push('/login'); + } + // load all simulators and simulations to fetch simulation data AppDispatcher.dispatch({ type: 'simulators/start-load' diff --git a/src/containers/login.js b/src/containers/login.js new file mode 100644 index 0000000..4541ebf --- /dev/null +++ b/src/containers/login.js @@ -0,0 +1,71 @@ +/** + * File: login.js + * Author: Markus Grigull + * Date: 15.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { PageHeader } from 'react-bootstrap'; + +import LoginForm from '../components/login-form'; +import Header from '../components/header'; +import Footer from '../components/footer'; + +import AppDispatcher from '../app-dispatcher'; +import UserStore from '../stores/user-store'; + +class Login extends Component { + static getStores() { + return [ UserStore ]; + } + + static calculateState() { + return { + currentUser: UserStore.getState().currentUser, + token: UserStore.getState().token + }; + } + + componentWillUpdate(nextProps, nextState) { + // if token stored locally, request user + const token = localStorage.getItem('token'); + + if (token != null && token !== '') { + AppDispatcher.dispatch({ + type: 'users/logged-in', + token: token + }); + } + + // check if logged in + if (nextState.currentUser != null) { + // save login in local storage + localStorage.setItem('token', this.state.token); + + // transition to index + this.props.router.push('/'); + } + } + + render() { + return ( +
    +
    + +
    + Login + + +
    + +
    +
    + ); + } +} + +export default Container.create(Login); diff --git a/src/containers/logout.js b/src/containers/logout.js new file mode 100644 index 0000000..cf74720 --- /dev/null +++ b/src/containers/logout.js @@ -0,0 +1,51 @@ +/** + * File: logout.js + * Author: Markus Grigull + * Date: 15.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; +import UserStore from '../stores/villas-store'; + +class Home extends Component { + static getStores() { + return [ UserStore ]; + } + + static calculateState() { + return { + currentUser: UserStore.getState().currentUser + }; + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'users/logout' + }); + } + + componentWillUpdate(nextProps, nextState) { + // check if logged out + if (nextState.currentUser == null) { + // discard login token + localStorage.setItem('token', ''); + + // transition to login page + this.props.router.push('/login'); + } + } + + render() { + return ( + Login out + ); + } +} + +export default Container.create(Home); diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js new file mode 100644 index 0000000..7ba1723 --- /dev/null +++ b/src/data-managers/users-data-manager.js @@ -0,0 +1,48 @@ +/** + * File: users-data-manager.js + * Author: Markus Grigull + * Date: 15.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import RestDataManager from './rest-data-manager'; +import RestAPI from '../api/rest-api'; +import AppDispatcher from '../app-dispatcher'; + +class UsersDataManager extends RestDataManager { + constructor() { + super('user', '/users'); + } + + login(username, password) { + RestAPI.post(this.makeURL('/authenticate'), { username: username, password: password }).then(response => { + AppDispatcher.dispatch({ + type: 'users/logged-in', + token: response.token + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'users/login-error', + error: error + }); + }); + } + + getCurrentUser(token) { + RestAPI.get(this.makeURL('/users/me'), token).then(response => { + AppDispatcher.dispatch({ + type: 'users/current-user', + user: response + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'users/current-user-error', + error: error + }); + }); + } +} + +export default new UsersDataManager(); diff --git a/src/router.js b/src/router.js index 49ed410..aff704e 100644 --- a/src/router.js +++ b/src/router.js @@ -18,6 +18,8 @@ import Simulators from './containers/simulators'; import Visualization from './containers/visualization'; import Simulations from './containers/simulations'; import Simulation from './containers/simulation'; +import Login from './containers/login'; +import Logout from './containers/logout'; class Root extends Component { render() { @@ -35,7 +37,11 @@ class Root extends Component { + + + + ); } diff --git a/src/stores/user-store.js b/src/stores/user-store.js new file mode 100644 index 0000000..b094ee3 --- /dev/null +++ b/src/stores/user-store.js @@ -0,0 +1,58 @@ +/** + * File: user-store.js + * Author: Markus Grigull + * Date: 15.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import { ReduceStore } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; +import UsersDataManager from '../data-managers/users-data-manager'; + +class UserStore extends ReduceStore { + constructor() { + super(AppDispatcher); + } + + getInitialState() { + return { + users: [], + currentUser: null, + token: null + }; + } + + reduce(state, action) { + switch (action.type) { + case 'users/login': + UsersDataManager.login(action.username, action.password); + return state; + + case 'users/logout': + // delete user and token + return { token: null, currentUser: null }; + + case 'users/logged-in': + // request logged-in user data + UsersDataManager.getCurrentUser(action.token); + + return { token: action.token }; + + case 'users/current-user': + // save logged-in user + return { currentUser: action.user }; + + case 'users/login-error': + console.log(action); + return state; + + default: + return state; + } + } +} + +export default new UserStore(); diff --git a/src/styles/app.css b/src/styles/app.css index 4c70f45..6c7ad7a 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -22,7 +22,7 @@ body { font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; } -.app header { +.app-header { width: 100%; height: 60px; @@ -32,7 +32,7 @@ body { background-color: #fff; } -.app header h1 { +.app-header h1 { width: 100%; margin: 0; @@ -40,7 +40,7 @@ body { text-align: center; } -.app footer { +.app-footer { width: 100%; margin-top: 20px; @@ -91,6 +91,20 @@ body { list-style: none; } +/** + * Login form + */ +.login-container { + width: 500px; + + margin: 30px auto; + padding: 15px 20px; + + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), + 0 9px 18px 0 rgba(0, 0, 0, 0.1); +} + /** * Tables */ From 73a576ab889099f0a8e33dd7bb29e530e5708b91 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 16 Mar 2017 12:25:54 +0100 Subject: [PATCH 072/556] Add plot-table widget Bug: Width of plot in new widget is not correct resized --- src/components/table-column.js | 3 +- src/components/table.js | 140 ++++++++++++++++------------ src/components/widget-plot-table.js | 112 ++++++++++++++++++++++ src/containers/visualization.js | 8 +- src/containers/widget.js | 4 + 5 files changed, 205 insertions(+), 62 deletions(-) create mode 100644 src/components/widget-plot-table.js diff --git a/src/components/table-column.js b/src/components/table-column.js index 905ca2a..7be0160 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -19,7 +19,8 @@ class TableColumn extends Component { link: '/', linkKey: '', dataIndex: false, - inlineEditable: false + inlineEditable: false, + clickable: false }; render() { diff --git a/src/components/table.js b/src/components/table.js index a40eff8..3b64cd8 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -11,13 +11,14 @@ import React, { Component } from 'react'; import { Table, Button, Glyphicon, FormControl } from 'react-bootstrap'; import { Link } from 'react-router'; -import TableColumn from './table-column'; +//import TableColumn from './table-column'; class CustomTable extends Component { constructor(props) { super(props); this.state = { + rows: [], editCell: [ -1, -1 ] }; } @@ -30,78 +31,97 @@ class CustomTable extends Component { this.setState({ editCell: [ column, row ]}); // x, y } + addCell(data, index, child) { + // add data to cell + const dataKey = child.props.dataKey; + var cell = []; + + if (dataKey && data[dataKey] != null) { + // get content + var content; + const modifier = child.props.modifier; + + if (modifier) { + content = modifier(data[dataKey]); + } else { + content = data[dataKey].toString(); + } + + // check if cell should be a link + const linkKey = child.props.linkKey; + if (linkKey && data[linkKey] != null) { + cell.push({content}); + } else if (child.props.clickable) { + cell.push( child.props.onClick(index)}>{content}); + } else { + cell.push(content); + } + } + + if (child.props.dataIndex) { + cell.push(index); + } + + // add buttons + if (child.props.editButton) { + cell.push(); + } + + if (child.props.deleteButton) { + cell.push(); + } + + return cell; + } + + componentWillReceiveProps(nextProps) { + // check if data exists + if (nextProps.data == null) { + this.setState({ rows: [] }); + return; + } + + // create row data + var rows = nextProps.data.map((data, index) => { + // check if multiple columns + if (Array.isArray(nextProps.children)) { + var row = []; + + nextProps.children.forEach(child => { + row.push(this.addCell(data, index, child)); + }); + + return row; + } else { + // table only has a single column + return [ this.addCell(data, index, nextProps.children) ]; + } + }); + + this.setState({ rows: rows }); + } + render() { - // create sorted data for rows - var rows = []; - if (this.props.data) { - rows = this.props.data.map((row, index) => { - var array = []; - - for (var i = 0; i < this.props.children.length; i++) { - // only handle table-column children - if (this.props.children[i].type === TableColumn) { - // add content to cell - var cell = []; - - // add data to cell - const dataKey = this.props.children[i].props.dataKey; - if (dataKey && row[dataKey] != null) { - // get content - var content; - const modifier = this.props.children[i].props.modifier; - - if (modifier) { - content = modifier(row[dataKey]); - } else { - content = row[dataKey].toString(); - } - - // check if cell should be a link - const linkKey = this.props.children[i].props.linkKey; - if (linkKey && row[linkKey] != null) { - cell.push({content}); - } else { - cell.push(content); - } - } - - if (this.props.children[i].props.dataIndex) { - cell.push(index); - } - - // add buttons - if (this.props.children[i].props.editButton) { - const onEdit = this.props.children[i].props.onEdit; - cell.push(); - } - - if (this.props.children[i].props.deleteButton) { - const onDelete = this.props.children[i].props.onDelete; - cell.push(); - } - - array.push(cell); - } - } - - return array; - }); + // get children + var children = this.props.children; + if (Array.isArray(this.props.children) === false) { + children = [ children ]; } return ( -
    +
    {this.props.children} - {rows.map((row, rowIndex) => ( + {this.state.rows.map((row, rowIndex) => ( {row.map((cell, cellIndex) => ( - +
    this.onClick(event, rowIndex, cellIndex) : () => {}}> + this.onClick(event, rowIndex, cellIndex) : () => {}}> {(this.state.editCell[0] === cellIndex && this.state.editCell[1] === rowIndex ) ? ( - this.props.children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} /> + children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} /> ) : ( {cell.map((element, elementIndex) => ( diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js new file mode 100644 index 0000000..ddca1c0 --- /dev/null +++ b/src/components/widget-plot-table.js @@ -0,0 +1,112 @@ +/** + * File: widget-plot-table.js + * Author: Markus Grigull + * Date: 15.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { LineChart } from 'rd3'; +import { Col } from 'react-bootstrap'; + +import Table from './table'; +import TableColumn from './table-column'; + +class WidgetPlotTable extends Component { + constructor(props) { + super(props); + + this.state = { + signal: 0, + firstTimestamp: 0, + latestTimestamp: 0, + sequence: null, + rows: [], + values: [] + }; + } + + componentWillReceiveProps(nextProps) { + // check data + const simulator = nextProps.widget.simulator; + + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + // clear values + this.setState({ values: [], sequence: null, rows: [] }); + return; + } + + // check if new data, otherwise skip + if (this.state.sequence >= nextProps.data[simulator].sequence) { + return; + } + + // get simulation model + const simulationModel = nextProps.simulation.models.find((model) => { + return (model.simulator === simulator); + }); + + // get rows + var rows = []; + + simulationModel.mapping.forEach((signal) => { + rows.push({ name: signal.name }) + }); + + // get timestamps + var latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; + var firstTimestamp = latestTimestamp - nextProps.widget.time * 1000; + var firstIndex; + + if (nextProps.data[simulator].values[0][0].x < firstTimestamp) { + // find element index representing firstTimestamp + firstIndex = nextProps.data[simulator].values[0].findIndex((value) => { + return value.x >= firstTimestamp; + }); + } else { + firstIndex = 0; + firstTimestamp = nextProps.data[simulator].values[0][0].x; + latestTimestamp = firstTimestamp + nextProps.widget.time * 1000; + } + + // copy all values for each signal in time region + var values = [{ + values: nextProps.data[simulator].values[this.state.signal].slice(firstIndex, nextProps.data[simulator].values[this.state.signal].length - 1) + }]; + + this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, rows: rows }); + } + + render() { + return ( +
    +

    {this.props.widget.name}

    + +
    + this.setState({ signal: index }) } /> +
    + + + + {this.state.sequence && + { if (d != null) { return new Date(d.x); } }} + hoverAnimation={false} + circleRadius={0} + domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} + /> + } + +
    + ); + } +} + +export default WidgetPlotTable; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 14cbc96..ac4ff03 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -118,7 +118,7 @@ class Visualization extends Component { } else if (item.name === 'Plot') { widget.simulator = this.state.simulation.models[0].simulator; widget.signals = [ 0 ]; - widget.time = 300; + widget.time = 60; widget.width = 400; widget.height = 200; } else if (item.name === 'Table') { @@ -127,6 +127,11 @@ class Visualization extends Component { widget.height = 200; } else if (item.name === 'Label') { + } else if (item.name === 'PlotTable') { + widget.simulator = this.state.simulation.models[0].simulator; + widget.width = 500; + widget.height = 400; + widget.time = 60 } var visualization = this.state.visualization; @@ -276,6 +281,7 @@ class Visualization extends Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 6cdcdb8..dd4dc74 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -18,6 +18,7 @@ import WidgetValue from '../components/widget-value'; import WidgetPlot from '../components/widget-plot'; import WidgetTable from '../components/widget-table'; import WidgetLabel from '../components/widget-label'; +import WidgetPlotTable from '../components/widget-plot-table'; import '../styles/widgets.css'; @@ -83,6 +84,7 @@ class Widget extends Component { const widget = this.props.data; var element = null; + // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Value') { element = } else if (widget.type === 'Plot') { @@ -91,6 +93,8 @@ class Widget extends Component { element = } else if (widget.type === 'Label') { element = + } else if (widget.type === 'PlotTable') { + element = } if (this.props.editing) { From 93da46973d458b80d8d5d106c6536bdb8138f9ef Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 16 Mar 2017 21:21:57 +0100 Subject: [PATCH 073/556] Add image widget Add file upload, used for image widget atm Image widget is buggy atm --- src/api/rest-api.js | 18 +++++ src/components/dialog/edit-widget-image.js | 71 ++++++++++++++++++++ src/components/dialog/edit-widget.js | 4 +- src/components/widget-image.js | 49 ++++++++++++++ src/containers/visualization.js | 11 ++- src/containers/widget.js | 15 ++++- src/data-managers/files-data-manager.js | 35 ++++++++++ src/data-managers/simulators-data-manager.js | 18 ++++- src/stores/file-store.js | 38 +++++++++++ src/stores/simulator-store.js | 29 +++++++- 10 files changed, 280 insertions(+), 8 deletions(-) create mode 100644 src/components/dialog/edit-widget-image.js create mode 100644 src/components/widget-image.js create mode 100644 src/data-managers/files-data-manager.js create mode 100644 src/stores/file-store.js diff --git a/src/api/rest-api.js b/src/api/rest-api.js index e81ffa4..2709d05 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -82,6 +82,24 @@ class RestAPI { }); }); } + + upload(url, data, token) { + return new Promise(function (resolve, reject) { + var req = request.post(url).send(data); + + if (token != null) { + req.set('x-access-token', token); + } + + req.end(function (error, res) { + if (res == null || res.status !== 200) { + reject(error); + } else { + resolve(JSON.parse(res.text)); + } + }); + }); + } } export default new RestAPI(); diff --git a/src/components/dialog/edit-widget-image.js b/src/components/dialog/edit-widget-image.js new file mode 100644 index 0000000..f7b06e4 --- /dev/null +++ b/src/components/dialog/edit-widget-image.js @@ -0,0 +1,71 @@ +/** + * File: edit-widget-value.js + * Author: Markus Grigull + * Date: 04.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel, Button } from 'react-bootstrap'; + +import AppDispatcher from '../../app-dispatcher'; + +class EditImageWidget extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + file: '' + }, + fileList: null + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + startFileUpload() { + // get selected file + var formData = new FormData(); + + for (var key in this.state.fileList) { + if (this.state.fileList.hasOwnProperty(key) && this.state.fileList[key] instanceof File) { + formData.append(key, this.state.fileList[key]); + } + } + + // upload files + AppDispatcher.dispatch({ + type: 'files/start-upload', + data: formData + }); + } + + render() { + return ( +
    + + Image + this.props.handleChange(e)}> + {this.props.files.map((file, index) => ( + + ))} + + + + + Upload + this.setState({ fileList: e.target.files }) } /> + + + +
    + ); + } +} + +export default EditImageWidget; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 8a7c3b0..506fef3 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -83,13 +83,13 @@ class EditWidgetDialog extends Component { } else if (this.props.widget.type === 'Table') { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Image') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } } return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    + Name this.handleChange(e)} /> diff --git a/src/components/widget-image.js b/src/components/widget-image.js new file mode 100644 index 0000000..c04a4a1 --- /dev/null +++ b/src/components/widget-image.js @@ -0,0 +1,49 @@ +/** + * File: widget-image.js + * Author: Markus Grigull + * Date: 14.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +const API_URL = 'http://localhost:4000/'; + +class WidgetImage extends Component { + constructor(props) { + super(props); + + this.state = { + file: null + }; + } + + componentWillReceiveProps(nextProps) { + // check if file is set + if (nextProps.widget.file == null) { + this.setState({ file: null }); + return; + } + + // get file by id + nextProps.files.forEach(file => { + if (file._id === nextProps.widget.file) { + this.setState({ file: file }); + } + }); + } + + render() { + return ( +
    + {this.state.file && + {this.state.file.name} + } +
    + ); + } +} + +export default WidgetImage; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index ac4ff03..b4228b1 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -20,11 +20,12 @@ import EditWidget from '../components/dialog/edit-widget'; import VisualizationStore from '../stores/visualization-store'; import ProjectStore from '../stores/project-store'; import SimulationStore from '../stores/simulation-store'; +import FileStore from '../stores/file-store'; import AppDispatcher from '../app-dispatcher'; class Visualization extends Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore, FileStore ]; } static calculateState(prevState) { @@ -36,6 +37,7 @@ class Visualization extends Component { visualizations: VisualizationStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), + files: FileStore.getState(), visualization: prevState.visualization || {}, project: prevState.project || null, @@ -132,6 +134,9 @@ class Visualization extends Component { widget.width = 500; widget.height = 400; widget.time = 60 + } else if (item.name === 'Image') { + widget.width = 200; + widget.height = 200; } var visualization = this.state.visualization; @@ -280,7 +285,7 @@ class Visualization extends Component { - +
    } @@ -305,7 +310,7 @@ class Visualization extends Component { ))} - this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} /> + this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} files={this.state.files} />
    ); diff --git a/src/containers/widget.js b/src/containers/widget.js index dd4dc74..f145d28 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -12,37 +12,48 @@ import { Container } from 'flux/utils'; import { ContextMenuTrigger } from 'react-contextmenu'; import Rnd from 'react-rnd'; +import AppDispatcher from '../app-dispatcher'; import SimulatorDataStore from '../stores/simulator-data-store'; +import FileStore from '../stores/file-store'; import WidgetValue from '../components/widget-value'; import WidgetPlot from '../components/widget-plot'; import WidgetTable from '../components/widget-table'; import WidgetLabel from '../components/widget-label'; import WidgetPlotTable from '../components/widget-plot-table'; +import WidgetImage from '../components/widget-image'; import '../styles/widgets.css'; class Widget extends Component { static getStores() { - return [ SimulatorDataStore ]; + return [ SimulatorDataStore, FileStore ]; } static calculateState(prevState) { if (prevState) { return { simulatorData: SimulatorDataStore.getState(), + files: FileStore.getState(), sequence: prevState.sequence + 1 } } else { return { simulatorData: SimulatorDataStore.getState(), + files: FileStore.getState(), sequence: 0 }; } } + componentWillMount() { + AppDispatcher.dispatch({ + type: 'files/start-load' + }); + } + dragStop(event, ui) { // update widget var widget = this.props.data; @@ -95,6 +106,8 @@ class Widget extends Component { element = } else if (widget.type === 'PlotTable') { element = + } else if (widget.type === 'Image') { + element = } if (this.props.editing) { diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js new file mode 100644 index 0000000..385c778 --- /dev/null +++ b/src/data-managers/files-data-manager.js @@ -0,0 +1,35 @@ +/** + * File: files-data-manager.js + * Author: Markus Grigull + * Date: 16.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import RestDataManager from './rest-data-manager'; +import RestAPI from '../api/rest-api'; +import AppDispatcher from '../app-dispatcher'; + +class FilesDataManager extends RestDataManager { + constructor() { + super('file', '/files'); + } + + upload(file) { + RestAPI.upload(this.makeURL('/upload'), file).then(response => { + AppDispatcher.dispatch({ + type: 'files/uploaded' + }); + + console.log(response); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'files/upload-error', + error: error + }); + }); + } +} + +export default new FilesDataManager(); diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index ee6e25c..94c8bac 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -8,5 +8,21 @@ **********************************************************************************/ import RestDataManager from './rest-data-manager'; +import RestAPI from '../api/rest-api'; +//import AppDispatcher from '../app-dispatcher'; -export default new RestDataManager('simulator', '/simulators'); +class SimulatorsDataManager extends RestDataManager { + constructor() { + super('simulator', '/simulators'); + } + + isRunning(simulator) { + RestAPI.get('http://localhost/nodes.json').then(response => { + console.log(response); + }).catch(error => { + console.log(error); + }); + } +} + +export default new SimulatorsDataManager(); diff --git a/src/stores/file-store.js b/src/stores/file-store.js new file mode 100644 index 0000000..57bf1c9 --- /dev/null +++ b/src/stores/file-store.js @@ -0,0 +1,38 @@ +/** + * File: file-store.js + * Author: Markus Grigull + * Date: 16.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import ArrayStore from './array-store'; +import FilesDataManager from '../data-managers/files-data-manager'; + +class FileStore extends ArrayStore { + constructor() { + super('files', FilesDataManager); + } + + reduce(state, action) { + switch (action.type) { + case 'files/start-upload': + FilesDataManager.upload(action.data); + return state; + + case 'files/uploaded': + console.log('ready uploaded'); + return state; + + case 'files/upload-error': + console.log(action.error); + return state; + + default: + return super.reduce(state, action); + } + } +} + +export default new FileStore(); diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 9413db7..5b9fde4 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -10,4 +10,31 @@ import ArrayStore from './array-store'; import SimulatorsDataManager from '../data-managers/simulators-data-manager'; -export default new ArrayStore('simulators', SimulatorsDataManager); +class SimulatorStore extends ArrayStore { + constructor() { + super('simulators', SimulatorsDataManager); + } + + reduce(state, action) { + // handle action + state = super.reduce(state, action); + + if (action.type === 'simulators/loaded') { + // get simulator running state + if (Array.isArray(action.data)) { + action.data.forEach((simulator) => { + //SimulatorsDataManager.isRunning(simulator); + }); + } else { + //SimulatorsDataManager.isRunning(action.data); + } + } else if (action.type === 'simulators/running') { + // set running state + console.log(action); + } + + return state; + } +} + +export default new SimulatorStore(); From 11418cc6e5a770ed73a4e0806110f9feb77b8828 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 16 Mar 2017 22:04:30 +0100 Subject: [PATCH 074/556] Add README.md, move old README.md to REACT.md --- REACT.md | 1572 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README | 1 + README.md | 1574 +---------------------------------------------------- 3 files changed, 1588 insertions(+), 1559 deletions(-) create mode 100644 REACT.md create mode 120000 README diff --git a/REACT.md b/REACT.md new file mode 100644 index 0000000..e290b93 --- /dev/null +++ b/REACT.md @@ -0,0 +1,1572 @@ +This project was bootstrapped with [Create React App](https://github.com/facebookincubator/create-react-app). + +Below you will find some information on how to perform common tasks.
    +You can find the most recent version of this guide [here](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md). + +## Table of Contents + +- [Updating to New Releases](#updating-to-new-releases) +- [Sending Feedback](#sending-feedback) +- [Folder Structure](#folder-structure) +- [Available Scripts](#available-scripts) + - [npm start](#npm-start) + - [npm test](#npm-test) + - [npm run build](#npm-run-build) + - [npm run eject](#npm-run-eject) +- [Supported Language Features and Polyfills](#supported-language-features-and-polyfills) +- [Syntax Highlighting in the Editor](#syntax-highlighting-in-the-editor) +- [Displaying Lint Output in the Editor](#displaying-lint-output-in-the-editor) +- [Debugging in the Editor](#debugging-in-the-editor) +- [Changing the Page ``](#changing-the-page-title) +- [Installing a Dependency](#installing-a-dependency) +- [Importing a Component](#importing-a-component) +- [Adding a Stylesheet](#adding-a-stylesheet) +- [Post-Processing CSS](#post-processing-css) +- [Adding a CSS Preprocessor (Sass, Less etc.)](#adding-a-css-preprocessor-sass-less-etc) +- [Adding Images and Fonts](#adding-images-and-fonts) +- [Using the `public` Folder](#using-the-public-folder) + - [Changing the HTML](#changing-the-html) + - [Adding Assets Outside of the Module System](#adding-assets-outside-of-the-module-system) + - [When to Use the `public` Folder](#when-to-use-the-public-folder) +- [Using Global Variables](#using-global-variables) +- [Adding Bootstrap](#adding-bootstrap) + - [Using a Custom Theme](#using-a-custom-theme) +- [Adding Flow](#adding-flow) +- [Adding Custom Environment Variables](#adding-custom-environment-variables) + - [Referencing Environment Variables in the HTML](#referencing-environment-variables-in-the-html) + - [Adding Temporary Environment Variables In Your Shell](#adding-temporary-environment-variables-in-your-shell) + - [Adding Development Environment Variables In `.env`](#adding-development-environment-variables-in-env) +- [Can I Use Decorators?](#can-i-use-decorators) +- [Integrating with an API Backend](#integrating-with-an-api-backend) + - [Node](#node) + - [Ruby on Rails](#ruby-on-rails) +- [Proxying API Requests in Development](#proxying-api-requests-in-development) +- [Using HTTPS in Development](#using-https-in-development) +- [Generating Dynamic `<meta>` Tags on the Server](#generating-dynamic-meta-tags-on-the-server) +- [Pre-Rendering into Static HTML Files](#pre-rendering-into-static-html-files) +- [Injecting Data from the Server into the Page](#injecting-data-from-the-server-into-the-page) +- [Running Tests](#running-tests) + - [Filename Conventions](#filename-conventions) + - [Command Line Interface](#command-line-interface) + - [Version Control Integration](#version-control-integration) + - [Writing Tests](#writing-tests) + - [Testing Components](#testing-components) + - [Using Third Party Assertion Libraries](#using-third-party-assertion-libraries) + - [Initializing Test Environment](#initializing-test-environment) + - [Focusing and Excluding Tests](#focusing-and-excluding-tests) + - [Coverage Reporting](#coverage-reporting) + - [Continuous Integration](#continuous-integration) + - [Disabling jsdom](#disabling-jsdom) + - [Snapshot Testing](#snapshot-testing) + - [Editor Integration](#editor-integration) +- [Developing Components in Isolation](#developing-components-in-isolation) +- [Making a Progressive Web App](#making-a-progressive-web-app) +- [Deployment](#deployment) + - [Serving Apps with Client-Side Routing](#serving-apps-with-client-side-routing) + - [Building for Relative Paths](#building-for-relative-paths) + - [Azure](#azure) + - [Firebase](#firebase) + - [GitHub Pages](#github-pages) + - [Heroku](#heroku) + - [Modulus](#modulus) + - [Netlify](#netlify) + - [Now](#now) + - [S3 and CloudFront](#s3-and-cloudfront) + - [Surge](#surge) +- [Advanced Configuration](#advanced-configuration) +- [Troubleshooting](#troubleshooting) + - [`npm start` doesn’t detect changes](#npm-start-doesnt-detect-changes) + - [`npm test` hangs on macOS Sierra](#npm-test-hangs-on-macos-sierra) + - [`npm run build` silently fails](#npm-run-build-silently-fails) + - [`npm run build` fails on Heroku](#npm-run-build-fails-on-heroku) +- [Something Missing?](#something-missing) + +## Updating to New Releases + +Create React App is divided into two packages: + +* `create-react-app` is a global command-line utility that you use to create new projects. +* `react-scripts` is a development dependency in the generated projects (including this one). + +You almost never need to update `create-react-app` itself: it delegates all the setup to `react-scripts`. + +When you run `create-react-app`, it always creates the project with the latest version of `react-scripts` so you’ll get all the new features and improvements in newly created apps automatically. + +To update an existing project to a new version of `react-scripts`, [open the changelog](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md), find the version you’re currently on (check `package.json` in this folder if you’re not sure), and apply the migration instructions for the newer versions. + +In most cases bumping the `react-scripts` version in `package.json` and running `npm install` in this folder should be enough, but it’s good to consult the [changelog](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md) for potential breaking changes. + +We commit to keeping the breaking changes minimal so you can upgrade `react-scripts` painlessly. + +## Sending Feedback + +We are always open to [your feedback](https://github.com/facebookincubator/create-react-app/issues). + +## Folder Structure + +After creation, your project should look like this: + +``` +my-app/ + README.md + node_modules/ + package.json + public/ + index.html + favicon.ico + src/ + App.css + App.js + App.test.js + index.css + index.js + logo.svg +``` + +For the project to build, **these files must exist with exact filenames**: + +* `public/index.html` is the page template; +* `src/index.js` is the JavaScript entry point. + +You can delete or rename the other files. + +You may create subdirectories inside `src`. For faster rebuilds, only files inside `src` are processed by Webpack.<br> +You need to **put any JS and CSS files inside `src`**, or Webpack won’t see them. + +Only files inside `public` can be used from `public/index.html`.<br> +Read instructions below for using assets from JavaScript and HTML. + +You can, however, create more top-level directories.<br> +They will not be included in the production build so you can use them for things like documentation. + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.<br> +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.<br> +You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.<br> +See the section about [running tests](#running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.<br> +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.<br> +Your app is ready to be deployed! + +See the section about [deployment](#deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Supported Language Features and Polyfills + +This project supports a superset of the latest JavaScript standard.<br> +In addition to [ES6](https://github.com/lukehoban/es6features) syntax features, it also supports: + +* [Exponentiation Operator](https://github.com/rwaldron/exponentiation-operator) (ES2016). +* [Async/await](https://github.com/tc39/ecmascript-asyncawait) (ES2017). +* [Object Rest/Spread Properties](https://github.com/sebmarkbage/ecmascript-rest-spread) (stage 3 proposal). +* [Class Fields and Static Properties](https://github.com/tc39/proposal-class-public-fields) (stage 2 proposal). +* [JSX](https://facebook.github.io/react/docs/introducing-jsx.html) and [Flow](https://flowtype.org/) syntax. + +Learn more about [different proposal stages](https://babeljs.io/docs/plugins/#presets-stage-x-experimental-presets-). + +While we recommend to use experimental proposals with some caution, Facebook heavily uses these features in the product code, so we intend to provide [codemods](https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb) if any of these proposals change in the future. + +Note that **the project only includes a few ES6 [polyfills](https://en.wikipedia.org/wiki/Polyfill)**: + +* [`Object.assign()`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) via [`object-assign`](https://github.com/sindresorhus/object-assign). +* [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) via [`promise`](https://github.com/then/promise). +* [`fetch()`](https://developer.mozilla.org/en/docs/Web/API/Fetch_API) via [`whatwg-fetch`](https://github.com/github/fetch). + +If you use any other ES6+ features that need **runtime support** (such as `Array.from()` or `Symbol`), make sure you are including the appropriate polyfills manually, or that the browsers you are targeting already support them. + +## Syntax Highlighting in the Editor + +To configure the syntax highlighting in your favorite text editor, head to the [relevant Babel documentation page](https://babeljs.io/docs/editors) and follow the instructions. Some of the most popular editors are covered. + +## Displaying Lint Output in the Editor + +>Note: this feature is available with `react-scripts@0.2.0` and higher. + +Some editors, including Sublime Text, Atom, and Visual Studio Code, provide plugins for ESLint. + +They are not required for linting. You should see the linter output right in your terminal as well as the browser console. However, if you prefer the lint results to appear right in your editor, there are some extra steps you can do. + +You would need to install an ESLint plugin for your editor first. + +>**A note for Atom `linter-eslint` users** + +>If you are using the Atom `linter-eslint` plugin, make sure that **Use global ESLint installation** option is checked: + +><img src="http://i.imgur.com/yVNNHJM.png" width="300"> + + +>**For Visual Studio Code users** + +>VS Code ESLint plugin automatically detects Create React App's configuration file. So you do not need to create `eslintrc.json` at the root directory, except when you want to add your own rules. In that case, you should include CRA's config by adding this line: + +>```js +{ + // ... + "extends": "react-app" +} +``` + +Then add this block to the `package.json` file of your project: + +```js +{ + // ... + "eslintConfig": { + "extends": "react-app" + } +} +``` + +Finally, you will need to install some packages *globally*: + +```sh +npm install -g eslint-config-react-app@0.3.0 eslint@3.8.1 babel-eslint@7.0.0 eslint-plugin-react@6.4.1 eslint-plugin-import@2.0.1 eslint-plugin-jsx-a11y@2.2.3 eslint-plugin-flowtype@2.21.0 +``` + +We recognize that this is suboptimal, but it is currently required due to the way we hide the ESLint dependency. The ESLint team is already [working on a solution to this](https://github.com/eslint/eslint/issues/3458) so this may become unnecessary in a couple of months. + +## Debugging in the Editor + +**This feature is currently only supported by [Visual Studio Code](https://code.visualstudio.com) editor.** + +Visual Studio Code supports live-editing and debugging out of the box with Create React App. This enables you as a developer to write and debug your React code without leaving the editor, and most importantly it enables you to have a continuous development workflow, where context switching is minimal, as you don’t have to switch between tools. + +You would need to have the latest version of [VS Code](https://code.visualstudio.com) and VS Code [Chrome Debugger Extension](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) installed. + +Then add the block below to your `launch.json` file and put it inside the `.vscode` folder in your app’s root directory. + +```json +{ + "version": "0.2.0", + "configurations": [{ + "name": "Chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000", + "webRoot": "${workspaceRoot}/src", + "userDataDir": "${workspaceRoot}/.vscode/chrome", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + } + }] +} +``` + +Start your app by running `npm start`, and start debugging in VS Code by pressing `F5` or by clicking the green debug icon. You can now write code, set breakpoints, make changes to the code, and debug your newly modified code—all from your editor. + +## Changing the Page `<title>` + +You can find the source HTML file in the `public` folder of the generated project. You may edit the `<title>` tag in it to change the title from “React App” to anything else. + +Note that normally you wouldn’t edit files in the `public` folder very often. For example, [adding a stylesheet](#adding-a-stylesheet) is done without touching the HTML. + +If you need to dynamically update the page title based on the content, you can use the browser [`document.title`](https://developer.mozilla.org/en-US/docs/Web/API/Document/title) API. For more complex scenarios when you want to change the title from React components, you can use [React Helmet](https://github.com/nfl/react-helmet), a third party library. + +If you use a custom server for your app in production and want to modify the title before it gets sent to the browser, you can follow advice in [this section](#generating-dynamic-meta-tags-on-the-server). Alternatively, you can pre-build each page as a static HTML file which then loads the JavaScript bundle, which is covered [here](#pre-rendering-into-static-html-files). + +## Installing a Dependency + +The generated project includes React and ReactDOM as dependencies. It also includes a set of scripts used by Create React App as a development dependency. You may install other dependencies (for example, React Router) with `npm`: + +``` +npm install --save <library-name> +``` + +## Importing a Component + +This project setup supports ES6 modules thanks to Babel.<br> +While you can still use `require()` and `module.exports`, we encourage you to use [`import` and `export`](http://exploringjs.com/es6/ch_modules.html) instead. + +For example: + +### `Button.js` + +```js +import React, { Component } from 'react'; + +class Button extends Component { + render() { + // ... + } +} + +export default Button; // Don’t forget to use export default! +``` + +### `DangerButton.js` + + +```js +import React, { Component } from 'react'; +import Button from './Button'; // Import a component from another file + +class DangerButton extends Component { + render() { + return <Button color="red" />; + } +} + +export default DangerButton; +``` + +Be aware of the [difference between default and named exports](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281). It is a common source of mistakes. + +We suggest that you stick to using default imports and exports when a module only exports a single thing (for example, a component). That’s what you get when you use `export default Button` and `import Button from './Button'`. + +Named exports are useful for utility modules that export several functions. A module may have at most one default export and as many named exports as you like. + +Learn more about ES6 modules: + +* [When to use the curly braces?](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281) +* [Exploring ES6: Modules](http://exploringjs.com/es6/ch_modules.html) +* [Understanding ES6: Modules](https://leanpub.com/understandinges6/read#leanpub-auto-encapsulating-code-with-modules) + +## Adding a Stylesheet + +This project setup uses [Webpack](https://webpack.github.io/) for handling all assets. Webpack offers a custom way of “extending” the concept of `import` beyond JavaScript. To express that a JavaScript file depends on a CSS file, you need to **import the CSS from the JavaScript file**: + +### `Button.css` + +```css +.Button { + padding: 20px; +} +``` + +### `Button.js` + +```js +import React, { Component } from 'react'; +import './Button.css'; // Tell Webpack that Button.js uses these styles + +class Button extends Component { + render() { + // You can use them as regular CSS styles + return <div className="Button" />; + } +} +``` + +**This is not required for React** but many people find this feature convenient. You can read about the benefits of this approach [here](https://medium.com/seek-ui-engineering/block-element-modifying-your-javascript-components-d7f99fcab52b). However you should be aware that this makes your code less portable to other build tools and environments than Webpack. + +In development, expressing dependencies this way allows your styles to be reloaded on the fly as you edit them. In production, all CSS files will be concatenated into a single minified `.css` file in the build output. + +If you are concerned about using Webpack-specific semantics, you can put all your CSS right into `src/index.css`. It would still be imported from `src/index.js`, but you could always remove that import if you later migrate to a different build tool. + +## Post-Processing CSS + +This project setup minifies your CSS and adds vendor prefixes to it automatically through [Autoprefixer](https://github.com/postcss/autoprefixer) so you don’t need to worry about it. + +For example, this: + +```css +.App { + display: flex; + flex-direction: row; + align-items: center; +} +``` + +becomes this: + +```css +.App { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +``` + +If you need to disable autoprefixing for some reason, [follow this section](https://github.com/postcss/autoprefixer#disabling). + +## Adding a CSS Preprocessor (Sass, Less etc.) + +Generally, we recommend that you don’t reuse the same CSS classes across different components. For example, instead of using a `.Button` CSS class in `<AcceptButton>` and `<RejectButton>` components, we recommend creating a `<Button>` component with its own `.Button` styles, that both `<AcceptButton>` and `<RejectButton>` can render (but [not inherit](https://facebook.github.io/react/docs/composition-vs-inheritance.html)). + +Following this rule often makes CSS preprocessors less useful, as features like mixins and nesting are replaced by component composition. You can, however, integrate a CSS preprocessor if you find it valuable. In this walkthrough, we will be using Sass, but you can also use Less, or another alternative. + +First, let’s install the command-line interface for Sass: + +``` +npm install node-sass --save-dev +``` + +Then in `package.json`, add the following lines to `scripts`: + +```diff + "scripts": { ++ "build-css": "node-sass src/ -o src/", ++ "watch-css": "npm run build-css && node-sass src/ -o src/ --watch", + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", +``` + +>Note: To use a different preprocessor, replace `build-css` and `watch-css` commands according to your preprocessor’s documentation. + +Now you can rename `src/App.css` to `src/App.scss` and run `npm run watch-css`. The watcher will find every Sass file in `src` subdirectories, and create a corresponding CSS file next to it, in our case overwriting `src/App.css`. Since `src/App.js` still imports `src/App.css`, the styles become a part of your application. You can now edit `src/App.scss`, and `src/App.css` will be regenerated. + +To share variables between Sass files, you can use Sass imports. For example, `src/App.scss` and other component style files could include `@import "./shared.scss";` with variable definitions. + +At this point you might want to remove all CSS files from the source control, and add `src/**/*.css` to your `.gitignore` file. It is generally a good practice to keep the build products outside of the source control. + +As a final step, you may find it convenient to run `watch-css` automatically with `npm start`, and run `build-css` as a part of `npm run build`. You can use the `&&` operator to execute two scripts sequentially. However, there is no cross-platform way to run two scripts in parallel, so we will install a package for this: + +``` +npm install --save-dev npm-run-all +``` + +Then we can change `start` and `build` scripts to include the CSS preprocessor commands: + +```diff + "scripts": { + "build-css": "node-sass src/ -o src/", + "watch-css": "npm run build-css && node-sass src/ -o src/ --watch --recursive", +- "start": "react-scripts start", +- "build": "react-scripts build", ++ "start-js": "react-scripts start", ++ "start": "npm-run-all -p watch-css start-js", ++ "build": "npm run build-css && react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +``` + +Now running `npm start` and `npm run build` also builds Sass files. Note that `node-sass` seems to have an [issue recognizing newly created files on some systems](https://github.com/sass/node-sass/issues/1891) so you might need to restart the watcher when you create a file until it’s resolved. + +## Adding Images and Fonts + +With Webpack, using static assets like images and fonts works similarly to CSS. + +You can **`import` an image right in a JavaScript module**. This tells Webpack to include that image in the bundle. Unlike CSS imports, importing an image or a font gives you a string value. This value is the final image path you can reference in your code. + +Here is an example: + +```js +import React from 'react'; +import logo from './logo.png'; // Tell Webpack this JS file uses this image + +console.log(logo); // /logo.84287d09.png + +function Header() { + // Import result is the URL of your image + return <img src={logo} alt="Logo" />; +} + +export default Header; +``` + +This ensures that when the project is built, Webpack will correctly move the images into the build folder, and provide us with correct paths. + +This works in CSS too: + +```css +.Logo { + background-image: url(./logo.png); +} +``` + +Webpack finds all relative module references in CSS (they start with `./`) and replaces them with the final paths from the compiled bundle. If you make a typo or accidentally delete an important file, you will see a compilation error, just like when you import a non-existent JavaScript module. The final filenames in the compiled bundle are generated by Webpack from content hashes. If the file content changes in the future, Webpack will give it a different name in production so you don’t need to worry about long-term caching of assets. + +Please be advised that this is also a custom feature of Webpack. + +**It is not required for React** but many people enjoy it (and React Native uses a similar mechanism for images).<br> +An alternative way of handling static assets is described in the next section. + +## Using the `public` Folder + +>Note: this feature is available with `react-scripts@0.5.0` and higher. + +### Changing the HTML + +The `public` folder contains the HTML file so you can tweak it, for example, to [set the page title](#changing-the-page-title). +The `<script>` tag with the compiled code will be added to it automatically during the build process. + +### Adding Assets Outside of the Module System + +You can also add other assets to the `public` folder. + +Note that we normally encourage you to `import` assets in JavaScript files instead. +For example, see the sections on [adding a stylesheet](#adding-a-stylesheet) and [adding images and fonts](#adding-images-and-fonts). +This mechanism provides a number of benefits: + +* Scripts and stylesheets get minified and bundled together to avoid extra network requests. +* Missing files cause compilation errors instead of 404 errors for your users. +* Result filenames include content hashes so you don’t need to worry about browsers caching their old versions. + +However there is an **escape hatch** that you can use to add an asset outside of the module system. + +If you put a file into the `public` folder, it will **not** be processed by Webpack. Instead it will be copied into the build folder untouched. To reference assets in the `public` folder, you need to use a special variable called `PUBLIC_URL`. + +Inside `index.html`, you can use it like this: + +```html +<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"> +``` + +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. + +In JavaScript code, you can use `process.env.PUBLIC_URL` for similar purposes: + +```js +render() { + // Note: this is an escape hatch and should be used sparingly! + // Normally we recommend using `import` for getting asset URLs + // as described in “Adding Images and Fonts” above this section. + return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />; +} +``` + +Keep in mind the downsides of this approach: + +* None of the files in `public` folder get post-processed or minified. +* Missing files will not be called at compilation time, and will cause 404 errors for your users. +* Result filenames won’t include content hashes so you’ll need to add query arguments or rename them every time they change. + +### When to Use the `public` Folder + +Normally we recommend importing [stylesheets](#adding-a-stylesheet), [images, and fonts](#adding-images-and-fonts) from JavaScript. +The `public` folder is useful as a workaround for a number of less common cases: + +* You need a file with a specific name in the build output, such as [`manifest.webmanifest`](https://developer.mozilla.org/en-US/docs/Web/Manifest). +* You have thousands of images and need to dynamically reference their paths. +* You want to include a small script like [`pace.js`](http://github.hubspot.com/pace/docs/welcome/) outside of the bundled code. +* Some library may be incompatible with Webpack and you have no other option but to include it as a `<script>` tag. + +Note that if you add a `<script>` that declares global variables, you also need to read the next section on using them. + +## Using Global Variables + +When you include a script in the HTML file that defines global variables and try to use one of these variables in the code, the linter will complain because it cannot see the definition of the variable. + +You can avoid this by reading the global variable explicitly from the `window` object, for example: + +```js +const $ = window.$; +``` + +This makes it obvious you are using a global variable intentionally rather than because of a typo. + +Alternatively, you can force the linter to ignore any line by adding `// eslint-disable-line` after it. + +## Adding Bootstrap + +You don’t have to use [React Bootstrap](https://react-bootstrap.github.io) together with React but it is a popular library for integrating Bootstrap with React apps. If you need it, you can integrate it with Create React App by following these steps: + +Install React Bootstrap and Bootstrap from npm. React Bootstrap does not include Bootstrap CSS so this needs to be installed as well: + +``` +npm install react-bootstrap --save +npm install bootstrap@3 --save +``` + +Import Bootstrap CSS and optionally Bootstrap theme CSS in the beginning of your ```src/index.js``` file: + +```js +import 'bootstrap/dist/css/bootstrap.css'; +import 'bootstrap/dist/css/bootstrap-theme.css'; +// Put any other imports below so that CSS from your +// components takes precedence over default styles. +``` + +Import required React Bootstrap components within ```src/App.js``` file or your custom component files: + +```js +import { Navbar, Jumbotron, Button } from 'react-bootstrap'; +``` + +Now you are ready to use the imported React Bootstrap components within your component hierarchy defined in the render method. Here is an example [`App.js`](https://gist.githubusercontent.com/gaearon/85d8c067f6af1e56277c82d19fd4da7b/raw/6158dd991b67284e9fc8d70b9d973efe87659d72/App.js) redone using React Bootstrap. + +### Using a Custom Theme + +Sometimes you might need to tweak the visual styles of Bootstrap (or equivalent package).<br> +We suggest the following approach: + +* Create a new package that depends on the package you wish to customize, e.g. Bootstrap. +* Add the necessary build steps to tweak the theme, and publish your package on npm. +* Install your own theme npm package as a dependency of your app. + +Here is an example of adding a [customized Bootstrap](https://medium.com/@tacomanator/customizing-create-react-app-aa9ffb88165) that follows these steps. + +## Adding Flow + +Flow is a static type checker that helps you write code with fewer bugs. Check out this [introduction to using static types in JavaScript](https://medium.com/@preethikasireddy/why-use-static-types-in-javascript-part-1-8382da1e0adb) if you are new to this concept. + +Recent versions of [Flow](http://flowtype.org/) work with Create React App projects out of the box. + +To add Flow to a Create React App project, follow these steps: + +1. Run `npm install --save-dev flow-bin`. +2. Add `"flow": "flow"` to the `scripts` section of your `package.json`. +3. Run `npm run flow -- init` to create a [`.flowconfig` file](https://flowtype.org/docs/advanced-configuration.html) in the root directory. +4. Add `// @flow` to any files you want to type check (for example, to `src/App.js`). + +Now you can run `npm run flow` to check the files for type errors. +You can optionally use an IDE like [Nuclide](https://nuclide.io/docs/languages/flow/) for a better integrated experience. +In the future we plan to integrate it into Create React App even more closely. + +To learn more about Flow, check out [its documentation](https://flowtype.org/). + +## Adding Custom Environment Variables + +>Note: this feature is available with `react-scripts@0.2.3` and higher. + +Your project can consume variables declared in your environment as if they were declared locally in your JS files. By +default you will have `NODE_ENV` defined for you, and any other environment variables starting with +`REACT_APP_`. + +**The environment variables are embedded during the build time**. Since Create React App produces a static HTML/CSS/JS bundle, it can’t possibly read them at runtime. To read them at runtime, you would need to load HTML into memory on the server and replace placeholders in runtime, just like [described here](#injecting-data-from-the-server-into-the-page). Alternatively you can rebuild the app on the server anytime you change them. + +>Note: You must create custom environment variables beginning with `REACT_APP_`. Any other variables except `NODE_ENV` will be ignored to avoid accidentally [exposing a private key on the machine that could have the same name](https://github.com/facebookincubator/create-react-app/issues/865#issuecomment-252199527). Changing any environment variables will require you to restart the development server if it is running. + +These environment variables will be defined for you on `process.env`. For example, having an environment +variable named `REACT_APP_SECRET_CODE` will be exposed in your JS as `process.env.REACT_APP_SECRET_CODE`. + +There is also a special built-in environment variable called `NODE_ENV`. You can read it from `process.env.NODE_ENV`. When you run `npm start`, it is always equal to `'development'`, when you run `npm test` it is always equal to `'test'`, and when you run `npm run build` to make a production bundle, it is always equal to `'production'`. **You cannot override `NODE_ENV` manually.** This prevents developers from accidentally deploying a slow development build to production. + +These environment variables can be useful for displaying information conditionally based on where the project is +deployed or consuming sensitive data that lives outside of version control. + +First, you need to have environment variables defined. For example, let’s say you wanted to consume a secret defined +in the environment inside a `<form>`: + +```jsx +render() { + return ( + <div> + <small>You are running this application in <b>{process.env.NODE_ENV}</b> mode.</small> + <form> + <input type="hidden" defaultValue={process.env.REACT_APP_SECRET_CODE} /> + </form> + </div> + ); +} +``` + +During the build, `process.env.REACT_APP_SECRET_CODE` will be replaced with the current value of the `REACT_APP_SECRET_CODE` environment variable. Remember that the `NODE_ENV` variable will be set for you automatically. + +When you load the app in the browser and inspect the `<input>`, you will see its value set to `abcdef`, and the bold text will show the environment provided when using `npm start`: + +```html +<div> + <small>You are running this application in <b>development</b> mode.</small> + <form> + <input type="hidden" value="abcdef" /> + </form> +</div> +``` + +The above form is looking for a variable called `REACT_APP_SECRET_CODE` from the environment. In order to consume this +value, we need to have it defined in the environment. This can be done using two ways: either in your shell or in +a `.env` file. Both of these ways are described in the next few sections. + +Having access to the `NODE_ENV` is also useful for performing actions conditionally: + +```js +if (process.env.NODE_ENV !== 'production') { + analytics.disable(); +} +``` + +When you compile the app with `npm run build`, the minification step will strip out this condition, and the resulting bundle will be smaller. + +### Referencing Environment Variables in the HTML + +>Note: this feature is available with `react-scripts@0.9.0` and higher. + +You can also access the environment variables starting with `REACT_APP_` in the `public/index.html`. For example: + +```html +<title>%REACT_APP_WEBSITE_NAME% +``` + +Note that the caveats from the above section apply: + +* Apart from a few built-in variables (`NODE_ENV` and `PUBLIC_URL`), variable names must start with `REACT_APP_` to work. +* The environment variables are injected at build time. If you need to inject them at runtime, [follow this approach instead](#generating-dynamic-meta-tags-on-the-server). + +### Adding Temporary Environment Variables In Your Shell + +Defining environment variables can vary between OSes. It’s also important to know that this manner is temporary for the +life of the shell session. + +#### Windows (cmd.exe) + +```cmd +set REACT_APP_SECRET_CODE=abcdef&&npm start +``` + +(Note: the lack of whitespace is intentional.) + +#### Linux, macOS (Bash) + +```bash +REACT_APP_SECRET_CODE=abcdef npm start +``` + +### Adding Development Environment Variables In `.env` + +>Note: this feature is available with `react-scripts@0.5.0` and higher. + +To define permanent environment variables, create a file called `.env` in the root of your project: + +``` +REACT_APP_SECRET_CODE=abcdef +``` + +These variables will act as the defaults if the machine does not explicitly set them.
    +Please refer to the [dotenv documentation](https://github.com/motdotla/dotenv) for more details. + +>Note: If you are defining environment variables for development, your CI and/or hosting platform will most likely need +these defined as well. Consult their documentation how to do this. For example, see the documentation for [Travis CI](https://docs.travis-ci.com/user/environment-variables/) or [Heroku](https://devcenter.heroku.com/articles/config-vars). + +## Can I Use Decorators? + +Many popular libraries use [decorators](https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841) in their documentation.
    +Create React App doesn’t support decorator syntax at the moment because: + +* It is an experimental proposal and is subject to change. +* The current specification version is not officially supported by Babel. +* If the specification changes, we won’t be able to write a codemod because we don’t use them internally at Facebook. + +However in many cases you can rewrite decorator-based code without decorators just as fine.
    +Please refer to these two threads for reference: + +* [#214](https://github.com/facebookincubator/create-react-app/issues/214) +* [#411](https://github.com/facebookincubator/create-react-app/issues/411) + +Create React App will add decorator support when the specification advances to a stable stage. + +## Integrating with an API Backend + +These tutorials will help you to integrate your app with an API backend running on another port, +using `fetch()` to access it. + +### Node +Check out [this tutorial](https://www.fullstackreact.com/articles/using-create-react-app-with-a-server/). +You can find the companion GitHub repository [here](https://github.com/fullstackreact/food-lookup-demo). + +### Ruby on Rails + +Check out [this tutorial](https://www.fullstackreact.com/articles/how-to-get-create-react-app-to-work-with-your-rails-api/). +You can find the companion GitHub repository [here](https://github.com/fullstackreact/food-lookup-demo-rails). + +## Proxying API Requests in Development + +>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.
    +For example, a production setup might look like this after the app is deployed: + +``` +/ - static server returns index.html with React app +/todos - static server returns index.html with React app +/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. + +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: + +```js + "proxy": "http://localhost:4000", +``` + +This way, when you `fetch('/api/todos')` in development, the development server will recognize that it’s not a static asset, and will proxy your request to `http://localhost:4000/api/todos` as a fallback. The development server will only attempt to send requests without a `text/html` accept header to the proxy. + +Conveniently, this avoids [CORS issues](http://stackoverflow.com/questions/21854516/understanding-ajax-cors-and-security-considerations) and error messages like this in development: + +``` +Fetch API cannot load http://localhost:4000/api/todos. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. +``` + +Keep in mind that `proxy` only has effect in development (with `npm start`), and it is up to you to ensure that URLs like `/api/todos` point to the right thing in production. You don’t have to use the `/api` prefix. Any unrecognized request without a `text/html` accept header will be redirected to the specified `proxy`. + +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. + +## Using HTTPS in Development + +>Note: this feature is available with `react-scripts@0.4.0` and higher. + +You may require the dev server to serve pages over HTTPS. One particular case where this could be useful is when using [the "proxy" feature](#proxying-api-requests-in-development) to proxy requests to an API server when that API server is itself serving HTTPS. + +To do this, set the `HTTPS` environment variable to `true`, then start the dev server as usual with `npm start`: + +#### Windows (cmd.exe) + +```cmd +set HTTPS=true&&npm start +``` + +(Note: the lack of whitespace is intentional.) + +#### Linux, macOS (Bash) + +```bash +HTTPS=true npm start +``` + +Note that the server will use a self-signed certificate, so your web browser will almost definitely display a warning upon accessing the page. + +## Generating Dynamic `` Tags on the Server + +Since Create React App doesn’t support server rendering, you might be wondering how to make `` tags dynamic and reflect the current URL. To solve this, we recommend to add placeholders into the HTML, like this: + +```html + + + + + +``` + +Then, on the server, regardless of the backend you use, you can read `index.html` into memory and replace `__OG_TITLE__`, `__OG_DESCRIPTION__`, and any other placeholders with values depending on the current URL. Just make sure to sanitize and escape the interpolated values so that they are safe to embed into HTML! + +If you use a Node server, you can even share the route matching logic between the client and the server. However duplicating it also works fine in simple cases. + +## Pre-Rendering into Static HTML Files + +If you’re hosting your `build` with a static hosting provider you can use [react-snapshot](https://www.npmjs.com/package/react-snapshot) to generate HTML pages for each route, or relative link, in your application. These pages will then seamlessly become active, or “hydrated”, when the JavaScript bundle has loaded. + +There are also opportunities to use this outside of static hosting, to take the pressure off the server when generating and caching routes. + +The primary benefit of pre-rendering is that you get the core content of each page _with_ the HTML payload—regardless of whether or not your JavaScript bundle successfully downloads. It also increases the likelihood that each route of your application will be picked up by search engines. + +You can read more about [zero-configuration pre-rendering (also called snapshotting) here](https://medium.com/superhighfives/an-almost-static-stack-6df0a2791319). + +## Injecting Data from the Server into the Page + +Similarly to the previous section, you can leave some placeholders in the HTML that inject global variables, for example: + +```js + + + + +``` + +Then, on the server, you can replace `__SERVER_DATA__` with a JSON of real data right before sending the response. The client code can then read `window.SERVER_DATA` to use it. **Make sure to [sanitize the JSON before sending it to the client](https://medium.com/node-security/the-most-common-xss-vulnerability-in-react-js-applications-2bdffbcc1fa0) as it makes your app vulnerable to XSS attacks.** + +## Running Tests + +>Note: this feature is available with `react-scripts@0.3.0` and higher.
    +>[Read the migration guide to learn how to enable it in older projects!](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md#migrating-from-023-to-030) + +Create React App uses [Jest](https://facebook.github.io/jest/) as its test runner. To prepare for this integration, we did a [major revamp](https://facebook.github.io/jest/blog/2016/09/01/jest-15.html) of Jest so if you heard bad things about it years ago, give it another try. + +Jest is a Node-based runner. This means that the tests always run in a Node environment and not in a real browser. This lets us enable fast iteration speed and prevent flakiness. + +While Jest provides browser globals such as `window` thanks to [jsdom](https://github.com/tmpvar/jsdom), they are only approximations of the real browser behavior. Jest is intended to be used for unit tests of your logic and your components rather than the DOM quirks. + +We recommend that you use a separate tool for browser end-to-end tests if you need them. They are beyond the scope of Create React App. + +### Filename Conventions + +Jest will look for test files with any of the following popular naming conventions: + +* Files with `.js` suffix in `__tests__` folders. +* Files with `.test.js` suffix. +* Files with `.spec.js` suffix. + +The `.test.js` / `.spec.js` files (or the `__tests__` folders) can be located at any depth under the `src` top level folder. + +We recommend to put the test files (or `__tests__` folders) next to the code they are testing so that relative imports appear shorter. For example, if `App.test.js` and `App.js` are in the same folder, the test just needs to `import App from './App'` instead of a long relative path. Colocation also helps find tests more quickly in larger projects. + +### Command Line Interface + +When you run `npm test`, Jest will launch in the watch mode. Every time you save a file, it will re-run the tests, just like `npm start` recompiles the code. + +The watcher includes an interactive command-line interface with the ability to run all tests, or focus on a search pattern. It is designed this way so that you can keep it open and enjoy fast re-runs. You can learn the commands from the “Watch Usage” note that the watcher prints after every run: + +![Jest watch mode](http://facebook.github.io/jest/img/blog/15-watch.gif) + +### Version Control Integration + +By default, when you run `npm test`, Jest will only run the tests related to files changed since the last commit. This is an optimization designed to make your tests runs fast regardless of how many tests you have. However it assumes that you don’t often commit the code that doesn’t pass the tests. + +Jest will always explicitly mention that it only ran tests related to the files changed since the last commit. You can also press `a` in the watch mode to force Jest to run all tests. + +Jest will always run all tests on a [continuous integration](#continuous-integration) server or if the project is not inside a Git or Mercurial repository. + +### Writing Tests + +To create tests, add `it()` (or `test()`) blocks with the name of the test and its code. You may optionally wrap them in `describe()` blocks for logical grouping but this is neither required nor recommended. + +Jest provides a built-in `expect()` global function for making assertions. A basic test could look like this: + +```js +import sum from './sum'; + +it('sums numbers', () => { + expect(sum(1, 2)).toEqual(3); + expect(sum(2, 2)).toEqual(4); +}); +``` + +All `expect()` matchers supported by Jest are [extensively documented here](http://facebook.github.io/jest/docs/expect.html).
    +You can also use [`jest.fn()` and `expect(fn).toBeCalled()`](http://facebook.github.io/jest/docs/expect.html#tohavebeencalled) to create “spies” or mock functions. + +### Testing Components + +There is a broad spectrum of component testing techniques. They range from a “smoke test” verifying that a component renders without throwing, to shallow rendering and testing some of the output, to full rendering and testing component lifecycle and state changes. + +Different projects choose different testing tradeoffs based on how often components change, and how much logic they contain. If you haven’t decided on a testing strategy yet, we recommend that you start with creating simple smoke tests for your components: + +```js +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); +}); +``` + +This test mounts a component and makes sure that it didn’t throw during rendering. Tests like this provide a lot value with very little effort so they are great as a starting point, and this is the test you will find in `src/App.test.js`. + +When you encounter bugs caused by changing components, you will gain a deeper insight into which parts of them are worth testing in your application. This might be a good time to introduce more specific tests asserting specific expected output or behavior. + +If you’d like to test components in isolation from the child components they render, we recommend using [`shallow()` rendering API](http://airbnb.io/enzyme/docs/api/shallow.html) from [Enzyme](http://airbnb.io/enzyme/). You can write a smoke test with it too: + +```sh +npm install --save-dev enzyme react-addons-test-utils +``` + +```js +import React from 'react'; +import { shallow } from 'enzyme'; +import App from './App'; + +it('renders without crashing', () => { + shallow(); +}); +``` + +Unlike the previous smoke test using `ReactDOM.render()`, this test only renders `` and doesn’t go deeper. For example, even if `` itself renders a ` - - - ) : ( - - )} +
    +
    + + {this.state.visualization.name} +
    + {this.state.editing ? ( +
    + + +
    + ) : ( +
    + +
    + )}
    diff --git a/src/styles/app.css b/src/styles/app.css index 6c7ad7a..a806c08 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -174,3 +174,34 @@ body { cursor: default !important; } + +/** + * Sections + */ +.section-header div { + display: inline-block; + vertical-align: middle; + height: 100%; +} + +.section-title { + font-size: 1.5em; +} + +.section-header .section-buttons-group { + margin-right: 10px; + margin-left: 10px; +} + +.section-header button { + padding-left: 3px; + padding-right: 3px; +} + +.section-header .btn-link:hover, .section-header .btn-link:focus { + text-decoration: none; +} + +.section-header .glyphicon { + font-size: 0.8em; +} From bd577acae91c710416ad97e36f8bab2324c8bd4b Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 23 Mar 2017 15:32:33 +0100 Subject: [PATCH 085/556] Vis area full cover --- src/components/dropzone.js | 1 + src/containers/visualization.js | 8 +++---- src/styles/app.css | 42 +++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/components/dropzone.js b/src/components/dropzone.js index dbb5dbc..18815e2 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -41,6 +41,7 @@ class Dropzone extends Component { render() { var toolboxClass = classNames({ + 'box-content': true, 'toolbox-dropzone': true, 'toolbox-dropzone-active': this.props.isOver && this.props.canDrop && this.props.editing, 'toolbox-dropzone-editing': this.props.editing diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 18e75bc..e3b729e 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -260,8 +260,8 @@ class Visualization extends Component { } return ( -
    -
    +
    +
    {this.state.visualization.name} @@ -285,9 +285,9 @@ class Visualization extends Component { )}
    -
    +
    {this.state.editing && -
    +
    diff --git a/src/styles/app.css b/src/styles/app.css index a806c08..f1972a0 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -14,9 +14,13 @@ body { background-color: #6EA2B0 !important; } +#root { + height: 100vh; +} + .app { min-width: 800px; - + height: 100%; color: #4d4d4d; font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; @@ -42,8 +46,10 @@ body { .app-footer { width: 100%; - - margin-top: 20px; + height: 60px; + position: absolute; + bottom: 0px; + padding-top: 20px; text-align: center; @@ -51,9 +57,14 @@ body { } .app-content { + position: absolute; + bottom: 0px; + top: 60px; + right: 0px; + left: 200px; min-height: 400px; - margin: 20px 20px 20px 200px; + margin: 20px 20px 60px 20px; padding: 15px 20px; background-color: #fff; @@ -178,6 +189,27 @@ body { /** * Sections */ + +.box { + display: -webkit-flex; + display: flex; + flex-direction: column; +} + +.box-header { + -webkit-flex: 0 0 auto; + flex: 0 0 auto; +} + +.box-content { + -webkit-flex: 1 0 auto; + flex: 1 0 auto; +} + +.section { + height: 100%; +} + .section-header div { display: inline-block; vertical-align: middle; @@ -204,4 +236,4 @@ body { .section-header .glyphicon { font-size: 0.8em; -} +} \ No newline at end of file From 4b02ee11757c90899751c1024bcdbaa7723f79f4 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 27 Mar 2017 15:09:31 +0200 Subject: [PATCH 086/556] issue #26 widget edit changes are applied after save --- src/components/dialog/edit-widget.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 506fef3..2b7a21e 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -29,7 +29,7 @@ class EditWidgetDialog extends Component { super(props); this.state = { - widget: { + temporal: { name: '', simulator: '', signal: 0 @@ -39,22 +39,23 @@ class EditWidgetDialog extends Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state.widget); + this.props.onClose(this.state.temporal); } else { this.props.onClose(); } } handleChange(e, index) { - var widget = this.state.widget; - widget[e.target.id] = e.target.value; - this.setState({ widget: widget }); + var update = this.state.temporal; + update[e.target.id] = e.target.value; + this.setState({ temporal: update }); //console.log(this.state.widget); } resetState() { - this.setState({ widget: this.props.widget }); + var widget_data = Object.assign({}, this.props.widget); + this.setState({ temporal: widget_data }); } validateForm(target) { @@ -77,13 +78,13 @@ class EditWidgetDialog extends Component { if (this.props.widget) { if (this.props.widget.type === 'Value') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; } else if (this.props.widget.type === 'Plot') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Table') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Image') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } } @@ -92,7 +93,7 @@ class EditWidgetDialog extends Component { Name - this.handleChange(e)} /> + this.handleChange(e)} /> From 747491bf06886186d7af7007b7330cbb91f43378 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 27 Mar 2017 15:11:23 +0200 Subject: [PATCH 087/556] issue #30 fixed widget delete --- src/containers/visualization.js | 166 +++++++++++++++++++------------- 1 file changed, 100 insertions(+), 66 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 18e75bc..3289d0e 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -47,7 +47,9 @@ class Visualization extends Component { editModal: prevState.editModal || false, modalData: prevState.modalData || null, - modalIndex: prevState.modalIndex || null + modalIndex: prevState.modalIndex || null, + + last_widget_key: prevState.last_widget_key || 0 }; } @@ -85,13 +87,34 @@ class Visualization extends Component { }); } } + + getNewWidgetKey() { + // Increase the counter and update the state + return this.state.last_widget_key++; + } + + transformToWidgetsDict(widgets) { + var widgetsDict = {}; + // Create a new key and make a copy of the widget object + widgets.forEach( (widget) => widgetsDict[this.getNewWidgetKey()] = Object.assign({}, widget) ); + return widgetsDict; + } + + transformToWidgetsList(widgets) { + return Object.keys(widgets).map( (key) => widgets[key]); + } reloadVisualization() { // select visualization by param id - this.state.visualizations.forEach((visualization) => { - if (visualization._id === this.props.params.visualization) { - // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside - this.setState({ visualization: JSON.parse(JSON.stringify(visualization)), project: null }); + this.state.visualizations.forEach((tempVisualization) => { + if (tempVisualization._id === this.props.params.visualization) { + + // convert widgets list to a dictionary + var visualization = Object.assign({}, tempVisualization, { + widgets: tempVisualization.widgets? this.transformToWidgetsDict(tempVisualization.widgets) : {} + }); + + this.setState({ visualization: visualization, project: null }); AppDispatcher.dispatch({ type: 'projects/start-load', @@ -139,31 +162,44 @@ class Visualization extends Component { widget.height = 200; } - var visualization = this.state.visualization; - visualization.widgets.push(widget); + var new_widgets = this.state.visualization.widgets; + var widget_key = this.getNewWidgetKey(); + new_widgets[widget_key] = widget; + + var visualization = Object.assign({}, this.state.visualization, { + widgets: new_widgets + }); this.setState({ visualization: visualization }); - this.forceUpdate(); } - widgetChange(widget, index) { - // save changes temporarily - var visualization = this.state.visualization; - visualization.widgets[index] = widget; + widgetChange(updated_widget, key) { + + var widgets_update = {}; + widgets_update[key] = updated_widget; + var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); + var visualization = Object.assign({}, this.state.visualization, { + widgets: new_widgets + }); this.setState({ visualization: visualization }); - this.forceUpdate(); } editWidget(e, data) { - this.setState({ editModal: true, modalData: this.state.visualization.widgets[data.index], modalIndex: data.index }); + this.setState({ editModal: true, modalData: this.state.visualization.widgets[data.key], modalIndex: data.key }); } closeEdit(data) { if (data) { // save changes temporarily - var visualization = this.state.visualization; - visualization.widgets[this.state.modalIndex] = data; + var widgets_update = {}; + widgets_update[this.state.modalIndex] = data; + + var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); + + var visualization = Object.assign({}, this.state.visualization, { + widgets: new_widgets + }); this.setState({ editModal: false, visualization: visualization }); } else { @@ -172,18 +208,22 @@ class Visualization extends Component { } deleteWidget(e, data) { - // delete widget temporarily - var visualization = this.state.visualization; - visualization.widgets.splice(data.index, 1); - + delete this.state.visualization.widgets[data.key]; + var visualization = Object.assign({}, this.state.visualization, { + widgets: this.state.visualization.widgets + }); this.setState({ visualization: visualization }); - this.forceUpdate(); } saveChanges() { + // Transform to a list + var visualization = Object.assign({}, this.state.visualization, { + widgets: this.transformToWidgetsList(this.state.visualization.widgets) + }); + AppDispatcher.dispatch({ type: 'visualizations/start-edit', - data: this.state.visualization + data: visualization }); this.setState({ editing: false }); @@ -193,63 +233,57 @@ class Visualization extends Component { this.setState({ editing: false, visualization: {} }); this.reloadVisualization(); - this.forceUpdate(); } - moveWidgetAbove(e, data) { + moveWidget(e, data, applyDirection) { + var widget = this.state.visualization.widgets[data.key]; + var updated_widgets = {}; + updated_widgets[data.key] = applyDirection(widget); + var new_widgets = Object.assign({}, this.state.visualization.widgets, updated_widgets); + + var visualization = Object.assign({}, this.state.visualization, { + widgets: new_widgets + }); + this.setState({ visualization: visualization }); + + } + + moveAbove(widget) { // increase z-Order - var visualization = this.state.visualization; - var widget = visualization.widgets[data.index] widget.z++; - - visualization.widgets[data.index] = widget; - this.setState({ visualization: visualization }); - this.forceUpdate(); + return widget; } - moveWidgetToFront(e, data) { + moveToFront(widget) { // increase z-Order - var visualization = this.state.visualization; - var widget = visualization.widgets[data.index] widget.z = 100; - - visualization.widgets[data.index] = widget; - this.setState({ visualization: visualization }); - this.forceUpdate(); + return widget; } - moveWidgetUnderneath(e, data) { + moveUnderneath(widget) { // decrease z-Order - var visualization = this.state.visualization; - var widget = visualization.widgets[data.index] - widget.z--; if (widget.z < 0) { widget.z = 0; } - - visualization.widgets[data.index] = widget; - this.setState({ visualization: visualization }); - this.forceUpdate(); + return widget; } - moveWidgetToBack(e, data) { + moveToBack(widget) { // increase z-Order - var visualization = this.state.visualization; - var widget = visualization.widgets[data.index] widget.z = 0; - - visualization.widgets[data.index] = widget; - this.setState({ visualization: visualization }); - this.forceUpdate(); + return widget; } render() { // calculate widget area height var height = 0; - if (this.state.visualization.widgets) { - this.state.visualization.widgets.forEach((widget) => { + var current_widgets = this.state.visualization.widgets; + + if (current_widgets) { + Object.keys(current_widgets).forEach( (widget_key) => { + var widget = current_widgets[widget_key]; if (widget.y + widget.height > height) { height = widget.y + widget.height; } @@ -298,22 +332,22 @@ class Visualization extends Component { } this.handleDrop(item, position)} editing={this.state.editing}> - {this.state.visualization.widgets != null && - this.state.visualization.widgets.map((widget, index) => ( - this.widgetChange(w, i)} editing={this.state.editing} index={index} grid={this.state.grid} /> + {current_widgets != null && + Object.keys(current_widgets).map( (widget_key) => ( + this.widgetChange(w, k)} editing={this.state.editing} index={widget_key} grid={this.state.grid} /> ))} - {this.state.visualization.widgets != null && - this.state.visualization.widgets.map((widget, index) => ( - - this.editWidget(e, data)}>Edit - this.deleteWidget(e, data)}>Delete + {current_widgets != null && + Object.keys(current_widgets).map( (widget_key) => ( + + this.editWidget(e, data)}>Edit + this.deleteWidget(e, data)}>Delete - this.moveWidgetAbove(e, data)}>Move above - this.moveWidgetToFront(e, data)}>Move to front - this.moveWidgetUnderneath(e, data)}>Move underneath - this.moveWidgetToBack(e, data)}>Move to back + 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 ))} From ce402018570d058d8ef62d2b92c3fdd075578d9a Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 27 Mar 2017 18:05:19 +0200 Subject: [PATCH 088/556] widgets minimum widths and heights --- src/containers/visualization.js | 13 ++++++++++++- src/containers/widget.js | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index cd3bc67..fbc1589 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -140,24 +140,35 @@ class Visualization extends Component { if (item.name === 'Value') { widget.simulator = this.state.simulation.models[0].simulator; widget.signal = 0; + widget.minWidth = 70; + widget.minHeight = 20; } else if (item.name === 'Plot') { widget.simulator = this.state.simulation.models[0].simulator; widget.signals = [ 0 ]; widget.time = 60; + widget.minWidth = 400; + widget.minHeight = 200; widget.width = 400; widget.height = 200; } else if (item.name === 'Table') { widget.simulator = this.state.simulation.models[0].simulator; + widget.minWidth = 300; + widget.minHeight = 200; widget.width = 400; widget.height = 200; } else if (item.name === 'Label') { - + widget.minWidth = 70; + widget.minHeight = 20; } else if (item.name === 'PlotTable') { widget.simulator = this.state.simulation.models[0].simulator; + widget.minWidth = 400; + widget.minHeight = 200; widget.width = 500; widget.height = 400; widget.time = 60 } else if (item.name === 'Image') { + widget.minWidth = 100; + widget.minHeight = 100; widget.width = 200; widget.height = 200; } diff --git a/src/containers/widget.js b/src/containers/widget.js index f145d28..3e914d5 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -109,12 +109,14 @@ class Widget extends Component { } else if (widget.type === 'Image') { element = } - + if (this.props.editing) { return ( { this.rnd = c; }} initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} + minWidth={ widget.minWidth } + minHeight={ widget.minHeight } bounds={'parent'} className="widget" onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} From 002a4cb1b593e04e819c68ed8cc5dbaeab6b15e0 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 27 Mar 2017 18:06:47 +0200 Subject: [PATCH 089/556] responsive plot table --- src/components/widget-plot-table.js | 47 ++++++++++++++++------------- src/styles/widgets.css | 14 +++++++++ 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index ddca1c0..dd34c1e 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -9,7 +9,6 @@ import React, { Component } from 'react'; import { LineChart } from 'rd3'; -import { Col } from 'react-bootstrap'; import Table from './table'; import TableColumn from './table-column'; @@ -19,6 +18,7 @@ class WidgetPlotTable extends Component { super(props); this.state = { + size: { w: 0, h: 0 }, signal: 0, firstTimestamp: 0, latestTimestamp: 0, @@ -32,6 +32,9 @@ class WidgetPlotTable extends Component { // check data const simulator = nextProps.widget.simulator; + // plot size + this.setState({ size: { w: this.props.widget.width - 100, h: this.props.widget.height - 20 }}); + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { // clear values this.setState({ values: [], sequence: null, rows: [] }); @@ -81,29 +84,31 @@ class WidgetPlotTable extends Component { render() { return ( -
    +

    {this.props.widget.name}

    - - - this.setState({ signal: index }) } /> -
    - +
    +
    + + this.setState({ signal: index }) } /> +
    +
    - - {this.state.sequence && - { if (d != null) { return new Date(d.x); } }} - hoverAnimation={false} - circleRadius={0} - domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} - /> - } - +
    + {this.state.sequence && + { if (d != null) { return new Date(d.x); } }} + hoverAnimation={false} + circleRadius={0} + domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} + /> + } +
    +
    ); } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 3ef8ecd..cb5b745 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -85,3 +85,17 @@ position: absolute; right: 7px; } + +.plot-table-widget .content { + display: -webkit-flex; + display: flex; +} + +.plot-table-widget .widget-table { + min-width: 100px; +} + +.plot-table-widget .widget-plot { + -webkit-flex: 1 0 auto; + flex: 1 0 auto; +} \ No newline at end of file From 0e655f2613ced169c493d2986d91cfc45d19b53d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 27 Mar 2017 20:12:58 +0200 Subject: [PATCH 090/556] Fix user login --- src/containers/app.js | 7 +++++++ src/containers/login.js | 30 ++++++++++++++++-------------- src/stores/user-store.js | 12 ++++++++++-- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index ee162c6..7768e89 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -95,6 +95,13 @@ class App extends Component { } componentWillUpdate(nextProps, nextState) { + // check if user is still logged in + if (UserStore.getState().token == null) { + this.props.router.push('/login'); + + return; + } + // open connection to each required simulator const requiredSimulators = this.requiredSimulatorsBySimulations(); diff --git a/src/containers/login.js b/src/containers/login.js index 4541ebf..7f62ab4 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -32,22 +32,24 @@ class Login extends Component { componentWillUpdate(nextProps, nextState) { // if token stored locally, request user - const token = localStorage.getItem('token'); + if (nextState.token == null) { + const token = localStorage.getItem('token'); - if (token != null && token !== '') { - AppDispatcher.dispatch({ - type: 'users/logged-in', - token: token - }); - } + if (token != null && token !== '' && nextState.currentUser == null) { + AppDispatcher.dispatch({ + type: 'users/logged-in', + token: token + }); + } + } else { + // check if logged in + if (nextState.currentUser != null) { + // save login in local storage + localStorage.setItem('token', nextState.token); - // check if logged in - if (nextState.currentUser != null) { - // save login in local storage - localStorage.setItem('token', this.state.token); - - // transition to index - this.props.router.push('/'); + // transition to index + nextProps.router.push('/'); + } } } diff --git a/src/stores/user-store.js b/src/stores/user-store.js index b094ee3..b7be604 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -26,6 +26,8 @@ class UserStore extends ReduceStore { } reduce(state, action) { + console.log(action.type); + switch (action.type) { case 'users/login': UsersDataManager.login(action.username, action.password); @@ -37,13 +39,19 @@ class UserStore extends ReduceStore { case 'users/logged-in': // request logged-in user data + console.log(action.token); UsersDataManager.getCurrentUser(action.token); - return { token: action.token }; + return Object.assign({}, state, { token: action.token }); case 'users/current-user': // save logged-in user - return { currentUser: action.user }; + return Object.assign({}, state, { currentUser: action.user }); + + case 'users/current-user-error': + // discard user token + //return { currentUser: null, token: null }; + return state; case 'users/login-error': console.log(action); From 5d5096a6957d962cb1c375b3dd8ebfdf40091e86 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 27 Mar 2017 20:25:22 +0200 Subject: [PATCH 091/556] Fix logout --- src/containers/app.js | 4 ++-- src/containers/logout.js | 2 +- src/stores/user-store.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index 7768e89..3f8ccff 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -97,9 +97,9 @@ class App extends Component { componentWillUpdate(nextProps, nextState) { // check if user is still logged in if (UserStore.getState().token == null) { - this.props.router.push('/login'); + //this.props.router.push('/login'); - return; + //return; } // open connection to each required simulator diff --git a/src/containers/logout.js b/src/containers/logout.js index cf74720..35078c4 100644 --- a/src/containers/logout.js +++ b/src/containers/logout.js @@ -37,7 +37,7 @@ class Home extends Component { localStorage.setItem('token', ''); // transition to login page - this.props.router.push('/login'); + nextProps.router.push('/login'); } } diff --git a/src/stores/user-store.js b/src/stores/user-store.js index b7be604..a256ded 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -35,7 +35,7 @@ class UserStore extends ReduceStore { case 'users/logout': // delete user and token - return { token: null, currentUser: null }; + return Object.assign({}, state, { token: null, currentUser: null }); case 'users/logged-in': // request logged-in user data From 4c795701b49a50929ef4b1ebf346db145ac2de09 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 27 Mar 2017 20:52:44 +0200 Subject: [PATCH 092/556] Force logout when backend is offline --- src/containers/app.js | 8 +++++--- src/containers/logout.js | 8 ++++---- src/stores/user-store.js | 8 ++------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index 3f8ccff..8b3e7aa 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -65,6 +65,7 @@ class App extends Component { return { simulations: SimulationStore.getState(), currentUser: UserStore.getState().currentUser, + token: UserStore.getState().token, runningSimulators: simulators }; @@ -96,10 +97,11 @@ class App extends Component { componentWillUpdate(nextProps, nextState) { // check if user is still logged in - if (UserStore.getState().token == null) { - //this.props.router.push('/login'); + if (nextState.token == null) { + // discard local token + localStorage.setItem('token', ''); - //return; + this.props.router.push('/login'); } // open connection to each required simulator diff --git a/src/containers/logout.js b/src/containers/logout.js index 35078c4..91dc617 100644 --- a/src/containers/logout.js +++ b/src/containers/logout.js @@ -28,14 +28,14 @@ class Home extends Component { AppDispatcher.dispatch({ type: 'users/logout' }); + + // discard login token + localStorage.setItem('token', ''); } componentWillUpdate(nextProps, nextState) { // check if logged out - if (nextState.currentUser == null) { - // discard login token - localStorage.setItem('token', ''); - + if (nextState.token == null) { // transition to login page nextProps.router.push('/login'); } diff --git a/src/stores/user-store.js b/src/stores/user-store.js index a256ded..c2111b7 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -26,8 +26,6 @@ class UserStore extends ReduceStore { } reduce(state, action) { - console.log(action.type); - switch (action.type) { case 'users/login': UsersDataManager.login(action.username, action.password); @@ -35,11 +33,10 @@ class UserStore extends ReduceStore { case 'users/logout': // delete user and token - return Object.assign({}, state, { token: null, currentUser: null }); + return Object.assign({}, state, { token: null }); case 'users/logged-in': // request logged-in user data - console.log(action.token); UsersDataManager.getCurrentUser(action.token); return Object.assign({}, state, { token: action.token }); @@ -50,8 +47,7 @@ class UserStore extends ReduceStore { case 'users/current-user-error': // discard user token - //return { currentUser: null, token: null }; - return state; + return Object.assign({}, state, { currentUser: null, token: null }); case 'users/login-error': console.log(action); From 3a87013f9b5c5771d8849261d0aa3352f61416c9 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 21 Mar 2017 19:15:27 +0100 Subject: [PATCH 093/556] Add notification system and data managers Add notification on simulator running state --- package.json | 5 +++-- src/containers/app.js | 8 +++++++ .../notifications-data-manager.js | 22 +++++++++++++++++++ src/stores/simulator-store.js | 13 +++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/data-managers/notifications-data-manager.js diff --git a/package.json b/package.json index 00dba54..0116f0a 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "es6-promise": "^4.0.5", "flux": "^3.1.2", "immutable": "^3.8.1", + "rd3": "^0.7.4", "react": "^15.4.2", "react-bootstrap": "^0.30.7", "react-contextmenu": "^2.3.0", @@ -15,10 +16,10 @@ "react-dnd": "^2.2.4", "react-dnd-html5-backend": "^2.2.4", "react-dom": "^15.4.2", + "react-notification-system": "^0.2.13", "react-rnd": "^4.2.2", "react-router": "^3.0.2", - "superagent": "^3.5.0", - "rd3": "^0.7.4" + "superagent": "^3.5.0" }, "devDependencies": { "react-scripts": "0.9.3" diff --git a/src/containers/app.js b/src/containers/app.js index 8b3e7aa..34c7b07 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -11,11 +11,13 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { DragDropContext } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; +import NotificationSystem from 'react-notification-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 Header from '../components/header'; import Footer from '../components/footer'; @@ -95,6 +97,10 @@ class App extends Component { }); } + componentDidMount() { + NotificationsDataManager.setSystem(this.refs.notificationSystem); + } + componentWillUpdate(nextProps, nextState) { // check if user is still logged in if (nextState.token == null) { @@ -160,6 +166,8 @@ class App extends Component { return (
    + +
    diff --git a/src/data-managers/notifications-data-manager.js b/src/data-managers/notifications-data-manager.js new file mode 100644 index 0000000..b5798bb --- /dev/null +++ b/src/data-managers/notifications-data-manager.js @@ -0,0 +1,22 @@ +/** + * File: notifications-data-manager.js + * Author: Markus Grigull + * Date: 21.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +class NotificationsDataManager { + _notificationSystem = null; + + setSystem(notificationSystem) { + this._notificationSystem = notificationSystem; + } + + addNotification(notification) { + this._notificationSystem.addNotification(notification); + } +} + +export default new NotificationsDataManager(); diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index c2ac8e9..1e7d48b 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -9,6 +9,7 @@ import ArrayStore from './array-store'; import SimulatorsDataManager from '../data-managers/simulators-data-manager'; +import NotificationsDataManager from '../data-managers/notifications-data-manager'; class SimulatorStore extends ArrayStore { constructor() { @@ -51,6 +52,12 @@ class SimulatorStore extends ArrayStore { return element._id === action.identifier; }); + NotificationsDataManager.addNotification({ + title: 'Simulator online', + message: 'Simulator \'' + simulator.name + '\' went online.', + level: 'info' + }); + // restart requesting again SimulatorsDataManager.stopRunningDetection(simulator); @@ -65,6 +72,12 @@ class SimulatorStore extends ArrayStore { // update running state simulator.running = false; + NotificationsDataManager.addNotification({ + title: 'Simulator offline', + message: 'Simulator \'' + simulator.name + '\' went offline.', + level: 'info' + }); + // restart requesting again SimulatorsDataManager.startRunningDetection(simulator); From 4a317708b3bd5c2f318d89fa1acb79cd42326b0c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 21 Mar 2017 19:41:11 +0100 Subject: [PATCH 094/556] Don't show simulator notification on mount --- src/data-managers/simulator-data-data-manager.js | 15 ++++++++++----- src/stores/simulator-store.js | 12 +++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index ad11d03..35c9a17 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -25,15 +25,21 @@ class SimulatorDataDataManager { this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); } } else { - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + // set flag if a socket to this simulator was already create before + if (this._sockets[identifier] === null) { + this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + } else { + this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + } } } - onOpen(event, identifier, signals) { + onOpen(event, identifier, signals, firstOpen) { AppDispatcher.dispatch({ type: 'simulatorData/opened', identifier: identifier, - signals: signals + signals: signals, + firstOpen: firstOpen }); } @@ -43,8 +49,7 @@ class SimulatorDataDataManager { identifier: identifier }); - // remove from list - delete this._sockets[identifier]; + // remove from list, keep null reference for flag detection this._sockets[identifier] = null; } diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 1e7d48b..a1ec187 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -52,11 +52,13 @@ class SimulatorStore extends ArrayStore { return element._id === action.identifier; }); - NotificationsDataManager.addNotification({ - title: 'Simulator online', - message: 'Simulator \'' + simulator.name + '\' went online.', - level: 'info' - }); + if (action.firstOpen === false) { + NotificationsDataManager.addNotification({ + title: 'Simulator online', + message: 'Simulator \'' + simulator.name + '\' went online.', + level: 'info' + }); + } // restart requesting again SimulatorsDataManager.stopRunningDetection(simulator); From b2bd914752c75c188147b5418d1e04d9813cd006 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 27 Mar 2017 21:23:42 +0200 Subject: [PATCH 095/556] Add backend offline notification --- src/containers/login.js | 8 ++++++++ src/stores/user-store.js | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/containers/login.js b/src/containers/login.js index 7f62ab4..9453900 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -10,10 +10,12 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { PageHeader } from 'react-bootstrap'; +import NotificationSystem from 'react-notification-system'; 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 AppDispatcher from '../app-dispatcher'; import UserStore from '../stores/user-store'; @@ -30,6 +32,10 @@ class Login extends Component { }; } + componentDidMount() { + NotificationsDataManager.setSystem(this.refs.notificationSystem); + } + componentWillUpdate(nextProps, nextState) { // if token stored locally, request user if (nextState.token == null) { @@ -56,6 +62,8 @@ class Login extends Component { render() { return (
    + +
    diff --git a/src/stores/user-store.js b/src/stores/user-store.js index c2111b7..a0765f7 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -11,6 +11,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import UsersDataManager from '../data-managers/users-data-manager'; +import NotificationsDataManager from '../data-managers/notifications-data-manager'; class UserStore extends ReduceStore { constructor() { @@ -50,7 +51,12 @@ class UserStore extends ReduceStore { return Object.assign({}, state, { currentUser: null, token: null }); case 'users/login-error': - console.log(action); + // server offline + NotificationsDataManager.addNotification({ + title: 'Server offline', + message: 'The server is offline. Please try again later.', + level: 'error' + }); return state; default: From 4f5e8e67740112f5eccfa304c745a175c64fd269 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Mar 2017 10:47:16 +0200 Subject: [PATCH 096/556] Close simulator connections on logout --- src/containers/app.js | 2 ++ src/data-managers/simulator-data-data-manager.js | 15 +++++++++++++-- src/stores/simulator-data-store.js | 2 +- src/stores/simulator-store.js | 16 +++++++++------- src/stores/user-store.js | 4 ++++ 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index 34c7b07..61f4d16 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -108,6 +108,8 @@ class App extends Component { localStorage.setItem('token', ''); this.props.router.push('/login'); + + return; } // open connection to each required simulator diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 35c9a17..57dc126 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -34,6 +34,16 @@ class SimulatorDataDataManager { } } + closeAll() { + // close every open socket + for (var key in this._sockets) { + if (this._sockets.hasOwnProperty(key)) { + this._sockets[key].close(4000); + delete this._sockets[key]; + } + } + } + onOpen(event, identifier, signals, firstOpen) { AppDispatcher.dispatch({ type: 'simulatorData/opened', @@ -46,11 +56,12 @@ class SimulatorDataDataManager { onClose(event, identifier) { AppDispatcher.dispatch({ type: 'simulatorData/closed', - identifier: identifier + identifier: identifier, + notification: (event.code !== 4000) }); // remove from list, keep null reference for flag detection - this._sockets[identifier] = null; + delete this._sockets[identifier]; } onMessage(event, identifier) { diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 0f95fa2..741c339 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -62,7 +62,7 @@ class SimulationDataStore extends ReduceStore { // explicit call to prevent array copy this.__emitChange(); } else { - console.log('same sequence'); + console.log('same sequence ' + state[action.identifier].sequence + ' ' + action.data.sequence); } return state; diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index a1ec187..69303b3 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -74,14 +74,16 @@ class SimulatorStore extends ArrayStore { // update running state simulator.running = false; - NotificationsDataManager.addNotification({ - title: 'Simulator offline', - message: 'Simulator \'' + simulator.name + '\' went offline.', - level: 'info' - }); + if (action.notification) { + NotificationsDataManager.addNotification({ + title: 'Simulator offline', + message: 'Simulator \'' + simulator.name + '\' went offline.', + level: 'info' + }); - // restart requesting again - SimulatorsDataManager.startRunningDetection(simulator); + // restart requesting again + SimulatorsDataManager.startRunningDetection(simulator); + } return this.updateElements(state, [ simulator ]); diff --git a/src/stores/user-store.js b/src/stores/user-store.js index a0765f7..c3467d2 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -12,6 +12,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import UsersDataManager from '../data-managers/users-data-manager'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; class UserStore extends ReduceStore { constructor() { @@ -33,6 +34,9 @@ class UserStore extends ReduceStore { return state; case 'users/logout': + // disconnect from all simulators + SimulatorDataDataManager.closeAll(); + // delete user and token return Object.assign({}, state, { token: null }); From fb34f809f808b83e6883ca021ecf8fd1d5f15136 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 28 Mar 2017 11:55:29 +0200 Subject: [PATCH 097/556] replaced table with signal list to bootstrap buttons --- src/components/widget-plot-table.js | 15 +++++++++------ src/containers/widget.js | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index dd34c1e..5305ff8 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -10,8 +10,7 @@ import React, { Component } from 'react'; import { LineChart } from 'rd3'; -import Table from './table'; -import TableColumn from './table-column'; +import { ButtonGroup, Button } from 'react-bootstrap'; class WidgetPlotTable extends Component { constructor(props) { @@ -81,17 +80,21 @@ class WidgetPlotTable extends Component { this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, rows: rows }); } - + render() { + console.log("Signal: " + this.state.signal); return (

    {this.props.widget.name}

    - - this.setState({ signal: index }) } /> -
    + + { this.state.rows.map( (row, index) => ( + + )) + } +
    diff --git a/src/containers/widget.js b/src/containers/widget.js index 3e914d5..8cde808 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -105,7 +105,7 @@ class Widget extends Component { } else if (widget.type === 'Label') { element = } else if (widget.type === 'PlotTable') { - element = + element = } else if (widget.type === 'Image') { element = } From 1c5f42a4f100e91e912ba35cef19a94a63ed8c24 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 28 Mar 2017 11:56:09 +0200 Subject: [PATCH 098/556] disabled buttons while editing the visualization --- src/styles/widgets.css | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index cb5b745..dd1521c 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -93,8 +93,27 @@ .plot-table-widget .widget-table { min-width: 100px; + display: flex; + flex-direction: column; + justify-content: center; } +/* Reset Bootstrap styles to "disable" while editing */ +.plot-table-widget .widget-table .btn[disabled] { + cursor: inherit; +} + +.btn-default[disabled]:hover { + background-color: #fff; + border-color: #ccc; +} + +.btn-default.active[disabled]:hover { + background-color: #e6e6e6; + border-color: #adadad; +} + /* End reset */ + .plot-table-widget .widget-plot { -webkit-flex: 1 0 auto; flex: 1 0 auto; From 8b93eecfaddb362f59b549aabcace35b2f94a39f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Mar 2017 13:34:59 +0200 Subject: [PATCH 099/556] Add project logo --- doc/villasweb.png | Bin 0 -> 3638 bytes doc/villasweb.svg | 158 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 doc/villasweb.png create mode 100644 doc/villasweb.svg diff --git a/doc/villasweb.png b/doc/villasweb.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2bac8924288a3dcf6aee9037d362f1e00ea484 GIT binary patch literal 3638 zcmV-64$1L}P)>ExKNrw zs-iIg*n?qwS1{&Qw}) z5EWLkjLxN|3px^Gam9*gPB^wUd7Q8iz%5q59s}cEz->x`GTJX!67r6sr6{?St+@*Jmqy=xHshOpkRL!jRk`^4G zXzP^5X4VaUyW%#M-wqgoov{bxXMVfk1!=(n7C-d~#i1OOk-&$3yW=KbOTlOCt$cjO z-pa?DomiZ|lOrdGpfVFU?Y(F2lX}(AD==+u^!5y8m7*8KR(4`Dqx8YN=2;!yd;^KV zeBf!?o*2~>=Z|*GVHfyX2tIY+j;_IT@!5#X0kSST-Jr^gR%UR1>CjQlvwD8yUW5`< z?{9-C;{{LoB7NHK>YU8;iT$?70voby;IboAg~CKUwtw30>dB~nH3^DC@3Ls@FhoPZ zXWl=7v!rZ>|JClwyDhOwfd|@kq4JIfwBX10kAA1wxgTxlM%S!aC@qx~kOUc?a)SSG zcTF!P9tNfZfezlr1~z4C?Ag)>Lr0sP4M%P#!BWt%mz_xq?iFDTTZi`ynJCCgMf*5( z+Y=xQj~}jITOJA}nw>4$G6Iz~AcGtKW4z!g@f-e^Z*RZvx4VbzRb{=c+D8=}I(n(< z>Rx?=`=;)x9M;V6qVc;pa_Wy7n{lVSfAaQ|)EWMRJ<*#oY*r}xJ=}j56=YM~;<IDezdesqeY6nyHwmol}k-!w!QDRlSPd>yJQyVPYZD;+he-ecRH zCg}wK^M9=xfh}tg24DTtZla$c)-(U~VD78_`q4g;M(`;=t-eKsC8|vF+n2APQX_%* zjCBt@`QLuK(iV&teCoa(U1N3e*&xpW*ZA#EE5rnTECHFfZdmRazn!@fMhpJ^x2tm$ zN`L`=`_e`}M|ghygSoFDqJBHm5=II>skZVi5vv5q_S=^ZQmbkgzLGuWmwr2PIYtTo z{o1OYHZn&gx!&ezg*eE%xLR|!Was?OZ)ch?Lhx`nZ2e~V-BVO#Dawr=m^{?@x4-L_ zgfB()`GG(E;N@^QY`bpns_yvAgtw~h6_HZlJ06&8KzK1LL*`|iuo7pljn7uEDubf$ zNkR%Xj>y~Vx~(g@;g{jbJ1eh`TUL>_Z-PN**l7ps!m{CG_FwwX{9RQ8ElZZ6Ts{!u z1}d2!M3KCkIebsj$A+P&FD=U z(B%pf@gPQu)DV}#@`s=J)NNa?KFrv?kuGvBSg0@$xYkWu7myEBwP4#rdApss+t^)I z-v%iKzU{>QuEIHm60u^7%dXPnaQ#Gdz}&+ zpnSyWcLwi%|2r!DnIcDBeugfBmQd$&MB z;U5)yZq-9$j=5=Q^v=rb1#5}GU(oTXQ*B1jf4OVV2ah=2c6VIxv5`nH-aF{QII;fR zwxl5X-Ms&B-_}L)-mDrTmQ@PcdIDhMo^X9`3*8$-t-imG^p{s#M{PyW;xFfi8ihriUyqb}D z8yvf%3p9QaAAS6d>KqYS4QlK%A?_6Eoj=a1>cTUbJqDRB_NCN3oVVkell6BhGE;>! zosEMV7+0i=NKHI$7rg%H=z~uA<0Xx?>NSt=+Ods9Vwrl>Th~@x5!~*W;$K)Q6KWpG zt##NPU#J<8^Eoj2vDc$7+oGF+et!D|CKc(zN3W)c*q8F^Be}IIe3UNIzebo84`XWS zZnZm2z_!i#5l?5hN0<_mwBR0KQap?)(o-3e;^9uS%#E8SF($<$o#7r}Qal_N{6oG5 z3zoK%j_U2kl90w!+6+np$FWKEW?4tnGbJJ}VM?)XOopd2CdDHyxCfXN4|7J#Op1!b z*ao%B(i!dnCdDHyxCfXN4`XWSCI!W5Y&EA5lFo3CFeN6&WOyoLQasWb?g1vn!x+I$ z3X0RDeAjA++To@|#03;{igjZ$Je4si9>xf6Qc#>G<%{$V6<;Z?xG9fkOopd2CdDHy zxCfXN4`YgSlY-(j9qn3m<99zjYt;if`mUH8D+d{q;i-&C@i68$+@P2^PU<(yI(C_< z`b>!=M;jbE$ZWn;I=w)^tRE}w^_lT4XD^|Op(|c11h!;y{#hpPQqrrt=#BD z4BWu5BE3caSk>Np+qUYBVrR}i81iT9h}O8dvhw;&+bUAEp9U;bDrc>c41&XjR?Q@} z8phmOUbXT%ZCLs%kGGC!Ms01zt;bGJ$JT|mH(Pl)LNcwjiYna{S#a74{#XCS|Sbxb?hl;8un!ZuT`OgFt@Lzr3n4BhIr2$9uDg-+(Pu1L7I{ z9kz~9_j^)Yk=zxxZ>iXRpKaS~@o?*i28}H~8gggri2jjC7sSi0Jb2%R!oy>o+uflF z_r9m$uyym`Arn<)C1@Yl>|ErK2y;Il>+IUBHMM=#Gd^k6gujr zA04HvqjtWB$FRlQ(SLagSJuQk45W@TCEGG0_m5e|+Mo(;nFS3ce20 z_K8GqSJl-hk9lBDfsK|ev%Z{=djz0+B+@%mgA2sF`o%8WqVRYq&y59|+Jq6~@;7XW zKB1z24-E9c+)0!L00;|#o*vlzji~(f@5bkD_rTT_F+y+vUV16BcaMJ4K#PIv{C3A7 z&Z7E4_wzlMADohX-fw5XB*7c$y`}mVMOG>r^4pirAV@^e9~~c`_nF_mT#9jmH_>x* z4rmYpaCPuj~@Mc`eq z3(ibvxqWXUNhLS{s?u$9bP~!6#J8=Xj)4@{ebR;=Ji|yn!5itl@h9EurG9}T1wf`p zW*Y=8&C;xee)N(#f!Tu3+0=_*AP?)K^{r)6*4D~FlJI0ytJY4~g|W$<8-?>5vjq=F z`jODXDDNQ@Qk?&9t$j3Wb9D~3E92IOM45YjQu6G9dL>+$)8;tBJ-}|}M$N`s1L^OOck*qSu*^q)FG_II=h_kloq=yyKJoJA1AOB znA8!og49^H6rP{_#HSs(-ei(d@FsqZ=<_TZSKiv?8JnWn*jfVI)kcdStLV(c#L=&{ z+t(x^nFVh|b`h{=5+2ubWvaF|!#Z?&x}Xbbeg1fzpey594NFb#C3Aul5FBWnR6tCM zSkcOqruCKATLG&GmEq9Ei)qouYY8M~5}uF}D>iybvI*YU%o>+66B4{8 zSp+|e@B(LK1*`JU`Rz + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + From 0f4e86d24a19de717fa0e115326730b3469e1610 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 29 Mar 2017 15:26:28 +0200 Subject: [PATCH 100/556] issue #27 fixed context menu triggered at the widget border --- src/containers/visualization.js | 2 +- src/containers/widget.js | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index fbc1589..9d108fa 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -330,7 +330,7 @@ class Visualization extends Component { )}
    -
    +
    e.preventDefault() }> {this.state.editing &&
    diff --git a/src/containers/widget.js b/src/containers/widget.js index 8cde808..163e0b4 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -48,6 +48,13 @@ class Widget extends Component { } } + constructor(props) { + super(props); + + // Reference to the context menu element + this.contextMenuTriggerViaDraggable = null; + } + componentWillMount() { AppDispatcher.dispatch({ type: 'files/start-load' @@ -82,7 +89,20 @@ class Widget extends Component { 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); + } + } + } + render() { + + + //console.log('render widget ' + this.props.data.z + this.props.data.type); // configure grid @@ -119,13 +139,14 @@ class Widget extends Component { minHeight={ widget.minHeight } bounds={'parent'} className="widget" + onResizeStart={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} onDragStop={(event, ui) => this.dragStop(event, ui)} moveGrid={grid} resizeGrid={grid} zIndex={widget.z} > - + this.contextMenuTriggerViaDraggable = c} > {element} From e7cbb7fdaa8f3912f9027120881f327c2b40e994 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 29 Mar 2017 16:27:26 +0200 Subject: [PATCH 101/556] issue #27 full context menu trigger area --- src/containers/widget.js | 2 +- src/styles/widgets.css | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 163e0b4..7aa540f 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -138,7 +138,7 @@ class Widget extends Component { minWidth={ widget.minWidth } minHeight={ widget.minHeight } bounds={'parent'} - className="widget" + className="editing-widget" onResizeStart={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} onDragStop={(event, ui) => this.dragStop(event, ui)} diff --git a/src/styles/widgets.css b/src/styles/widgets.css index dd1521c..c6a9c91 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -8,16 +8,26 @@ **********************************************************************************/ .widget { - width: 100%; - height: 100%; - border: 1px solid lightgray; - padding: 3px 6px; - background-color: #fff; } +.editing-widget { + border: 1px solid lightgray; + background-color: #fff; +} + +/* Area to trigger the context menu */ +.react-contextmenu-wrapper { + width: 100%; + height: 100%; + position: absolute; + top: 0px; + left: 0px; + padding: 3px 6px; +} + .react-contextmenu { min-width: 160px; padding: 5px 0; From d8df5b8f03f1e2dc07d723ef59145caf20a86d53 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 30 Mar 2017 10:13:22 +0200 Subject: [PATCH 102/556] initial button widget --- src/components/widget-button.js | 33 ++++++++++++++++++++ src/containers/visualization.js | 3 ++ src/containers/widget.js | 3 ++ src/styles/widgets.css | 55 ++++++++++++++++++++++++++++++--- 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/components/widget-button.js diff --git a/src/components/widget-button.js b/src/components/widget-button.js new file mode 100644 index 0000000..72f33fa --- /dev/null +++ b/src/components/widget-button.js @@ -0,0 +1,33 @@ +/** + * File: widget-button.js + * Author: Ricardo Hernandez-Montoya + * Date: 29.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +class WidgetButton extends Component { + + action(e) { + e.target.blur(); // Remove focus + console.log('Button widget action'); + } + + render() { + return ( +
    + { this.props.editing ? ( + + ) : ( + + ) + } +
    + ); + } +} + +export default WidgetButton; \ No newline at end of file diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 9d108fa..fefec05 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -142,6 +142,8 @@ class Visualization extends Component { widget.signal = 0; widget.minWidth = 70; widget.minHeight = 20; + widget.width = 120; + widget.height = 70; } else if (item.name === 'Plot') { widget.simulator = this.state.simulation.models[0].simulator; widget.signals = [ 0 ]; @@ -339,6 +341,7 @@ class Visualization extends Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 7aa540f..9aa7b92 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -22,6 +22,7 @@ import WidgetTable from '../components/widget-table'; import WidgetLabel from '../components/widget-label'; import WidgetPlotTable from '../components/widget-plot-table'; import WidgetImage from '../components/widget-image'; +import WidgetButton from '../components/widget-button'; import '../styles/widgets.css'; @@ -128,6 +129,8 @@ class Widget extends Component { element = } else if (widget.type === 'Image') { element = + } else if (widget.type === 'Button') { + element = } if (this.props.editing) { diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c6a9c91..d3205d2 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -8,13 +8,10 @@ **********************************************************************************/ .widget { - border: 1px solid lightgray; - padding: 3px 6px; background-color: #fff; } .editing-widget { - border: 1px solid lightgray; background-color: #fff; } @@ -96,6 +93,13 @@ right: 7px; } +.plot-table-widget, .plot-widget, .value-widget, .image-widget, .label-widget { + width: 100%; + height: 100%; + padding: 3px 6px; + border: 1px solid lightgray; +} + .plot-table-widget .content { display: -webkit-flex; display: flex; @@ -109,8 +113,9 @@ } /* Reset Bootstrap styles to "disable" while editing */ -.plot-table-widget .widget-table .btn[disabled] { +div[class*="-widget"] .btn[disabled] { cursor: inherit; + pointer-events: none; } .btn-default[disabled]:hover { @@ -127,4 +132,46 @@ .plot-table-widget .widget-plot { -webkit-flex: 1 0 auto; flex: 1 0 auto; +} + +/*.single-value-widget { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 95%; + height: 95%; +}*/ + +.single-value-widget { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.single-value-widget > * { + width: 50%; + float: left; + margin: 5px; + font-size: 1vw; +} + +/* Button widget styling */ +.button-widget button { + border-radius: 25px; + border-style: double; + border-width: 5px; + overflow-x: hidden; +} + +.button-widget button:hover { + border-style: double; +} +/* End button widget styling */ + +.full { + width: 100%; + height: 100%; } \ No newline at end of file From 492343423167770ec2b8349bee34eddbfaa6964b Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 30 Mar 2017 12:22:42 +0200 Subject: [PATCH 103/556] initial number input widget --- src/components/widget-number-input.js | 69 +++++++++++++++++++++++++++ src/containers/visualization.js | 11 +++++ src/containers/widget.js | 3 ++ src/styles/widgets.css | 10 +++- 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/components/widget-number-input.js diff --git a/src/components/widget-number-input.js b/src/components/widget-number-input.js new file mode 100644 index 0000000..13061bb --- /dev/null +++ b/src/components/widget-number-input.js @@ -0,0 +1,69 @@ +/** + * File: widget-number-input.js + * Author: Ricardo Hernandez-Montoya + * Date: 29.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Form, FormGroup, Col, ControlLabel, FormControl } from 'react-bootstrap'; + +class WidgetNumberInput extends Component { + + static whichValidationStateIs( condition ) { + switch(condition) { + case 'ok': return null; + case 'error': return 'error'; + default: return 'error'; + } + } + + constructor(props) { + super(props); + + this.state = { + value: '', + validationState: WidgetNumberInput.whichValidationStateIs('ok') + }; + } + + validateInput(e) { + if (e.target.value === '' || e.target.value.endsWith('.')) { + this.setState({ + validationState: WidgetNumberInput.whichValidationStateIs('ok'), + value: e.target.value }); + } else { + var num = Number(e.target.value); + if (Number.isNaN(num)) { + this.setState({ validationState: WidgetNumberInput.whichValidationStateIs('error'), + value: e.target.value }); + } else { + this.setState({ + validationState: WidgetNumberInput.whichValidationStateIs('ok'), + value: num }); + } + } + } + + render() { + return ( +
    + + + + {this.props.widget.name} + + + this.validateInput(e) } placeholder="Enter value" value={ this.state.value } /> + + + + +
    + ); + } +} + +export default WidgetNumberInput; \ No newline at end of file diff --git a/src/containers/visualization.js b/src/containers/visualization.js index fefec05..7a82db8 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -173,6 +173,16 @@ class Visualization extends Component { widget.minHeight = 100; widget.width = 200; widget.height = 200; + } else if (item.name === 'Button') { + widget.minWidth = 100; + widget.minHeight = 50; + widget.width = 100; + widget.height = 100; + } else if (item.name === 'NumberInput') { + widget.minWidth = 200; + widget.minHeight = 50; + widget.width = 200; + widget.height = 50; } var new_widgets = this.state.visualization.widgets; @@ -342,6 +352,7 @@ class Visualization extends Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 9aa7b92..9062b2b 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -23,6 +23,7 @@ import WidgetLabel from '../components/widget-label'; import WidgetPlotTable from '../components/widget-plot-table'; import WidgetImage from '../components/widget-image'; import WidgetButton from '../components/widget-button'; +import WidgetNumberInput from '../components/widget-number-input'; import '../styles/widgets.css'; @@ -131,6 +132,8 @@ class Widget extends Component { element = } else if (widget.type === 'Button') { element = + } else if (widget.type === 'NumberInput') { + element = } if (this.props.editing) { diff --git a/src/styles/widgets.css b/src/styles/widgets.css index d3205d2..9861347 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -113,7 +113,7 @@ } /* Reset Bootstrap styles to "disable" while editing */ -div[class*="-widget"] .btn[disabled] { +div[class*="-widget"] .btn[disabled], .form-control[disabled] { cursor: inherit; pointer-events: none; } @@ -174,4 +174,10 @@ div[class*="-widget"] .btn[disabled] { .full { width: 100%; height: 100%; -} \ No newline at end of file +} + +/* Number input widget */ +.number-input-widget label { + cursor: inherit; +} +/* Number input widget */ \ No newline at end of file From b6c3f7b3de7bbf342ad3f752eb413a274b3f1bec Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 30 Mar 2017 14:28:13 +0200 Subject: [PATCH 104/556] initial slider widget --- src/components/widget-slider.js | 48 +++++++++++++++++++++++++++++++++ src/containers/visualization.js | 6 +++++ src/containers/widget.js | 3 +++ src/styles/widgets.css | 18 ++++++++++--- 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/components/widget-slider.js diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js new file mode 100644 index 0000000..73d1cb1 --- /dev/null +++ b/src/components/widget-slider.js @@ -0,0 +1,48 @@ +/** + * File: widget-slider.js + * Author: Ricardo Hernandez-Montoya + * Date: 30.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Form, FormGroup, Col, ControlLabel } from 'react-bootstrap'; + +class WidgetSlider extends Component { + + constructor(props) { + super(props); + + this.state = { + value: 50 + }; + } + + valueChanged(e) { + this.setState({ value: e.target.value }); + } + + render() { + return ( +
    +
    + + + {this.props.widget.name} + + + this.valueChanged(e) } defaultValue={ this.state.value }/> + + + { this.state.value } + + +
    +
    + ); + } +} + +export default WidgetSlider; \ No newline at end of file diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 7a82db8..fa74942 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -183,6 +183,11 @@ class Visualization extends Component { widget.minHeight = 50; widget.width = 200; widget.height = 50; + } else if (item.name === 'Slider') { + widget.minWidth = 380; + widget.minHeight = 30; + widget.width = 400; + widget.height = 50; } var new_widgets = this.state.visualization.widgets; @@ -353,6 +358,7 @@ class Visualization extends Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 9062b2b..8120d41 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -24,6 +24,7 @@ import WidgetPlotTable from '../components/widget-plot-table'; import WidgetImage from '../components/widget-image'; import WidgetButton from '../components/widget-button'; import WidgetNumberInput from '../components/widget-number-input'; +import WidgetSlider from '../components/widget-slider'; import '../styles/widgets.css'; @@ -134,6 +135,8 @@ class Widget extends Component { element = } else if (widget.type === 'NumberInput') { element = + } else if (widget.type === 'Slider') { + element = } if (this.props.editing) { diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 9861347..707bb0a 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -113,7 +113,7 @@ } /* Reset Bootstrap styles to "disable" while editing */ -div[class*="-widget"] .btn[disabled], .form-control[disabled] { +div[class*="-widget"] .btn[disabled], div[class*="-widget"] input[disabled], .form-control[disabled] { cursor: inherit; pointer-events: none; } @@ -177,7 +177,19 @@ div[class*="-widget"] .btn[disabled], .form-control[disabled] { } /* Number input widget */ -.number-input-widget label { +div[class*="-widget"] label { cursor: inherit; } -/* Number input widget */ \ No newline at end of file +/* End number input widget */ + +input[type=range]::-moz-range-thumb { + background: #ffffff; +} + +input[type=range]::-webkit-slider-thumb { + background: #ffffff; +} + +input[type=range]::-ms-thumb { + background: #ffffff; +} \ No newline at end of file From e9c553b993525de1f4622033442233a36784450d Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 31 Mar 2017 14:53:19 +0200 Subject: [PATCH 105/556] initial gauge widget --- package.json | 3 +- src/components/widget-gauge.js | 79 +++++++++++++++++++++++++++++++++ src/containers/visualization.js | 8 ++++ src/containers/widget.js | 3 ++ src/styles/widgets.css | 31 ++++++++++++- 5 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 src/components/widget-gauge.js diff --git a/package.json b/package.json index 0116f0a..82f575a 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "react-notification-system": "^0.2.13", "react-rnd": "^4.2.2", "react-router": "^3.0.2", - "superagent": "^3.5.0" + "superagent": "^3.5.0", + "gaugeJS": "^1.3.2" }, "devDependencies": { "react-scripts": "0.9.3" diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js new file mode 100644 index 0000000..064d7c6 --- /dev/null +++ b/src/components/widget-gauge.js @@ -0,0 +1,79 @@ +/** + * File: widget-gauge.js + * Author: Ricardo Hernandez-Montoya + * Date: 31.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { Gauge } from 'gaugeJS'; + +class WidgetGauge extends Component { + constructor(props) { + super(props); + + this.gaugeCanvas = null; + this.gauge = null; + + this.state = { + value: 0 + }; + } + + componentDidMount() { + const opts = { + angle: -0.25, + lineWidth: 0.2, + pointer: { + length: 0.6, + strokeWidth: 0.035 + }, + colorStart: '#6EA2B0', + colorStop: '#6EA2B0', + strokeColor: '#E0E0E0', + highDpiSupport: true + }; + + this.gauge = new Gauge(this.gaugeCanvas).setOptions(opts); + this.gauge.maxValue = 1; + this.gauge.setMinValue(0); + this.gauge.animationSpeed = 30; + this.gauge.set(this.state.value); + } + + componentDidUpdate() { + // update gauge's value + this.gauge.set(this.state.value); + } + + componentWillReceiveProps(nextProps) { + // update value + const simulator = nextProps.widget.simulator; + + if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { + this.setState({ value: 0 }); + return; + } + + // check if value has changed + const signal = nextProps.data[simulator].values[nextProps.widget.signal]; + const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; // Take just 3 decimal positions + if (this.state.value !== new_value) { + this.setState({ value: new_value }); + } + } + + render() { + return ( +
    +
    { this.props.widget.name }
    + this.gaugeCanvas = node } /> +
    { this.state.value }
    +
    + ); + } +} + +export default WidgetGauge; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index fa74942..432b1b3 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -188,6 +188,13 @@ class Visualization extends Component { widget.minHeight = 30; widget.width = 400; widget.height = 50; + } else if (item.name === 'Gauge') { + widget.simulator = this.state.simulation.models[0].simulator; + widget.signal = 0; + widget.minWidth = 200; + widget.minHeight = 150; + widget.width = 200; + widget.height = 150; } var new_widgets = this.state.visualization.widgets; @@ -359,6 +366,7 @@ class Visualization extends Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 8120d41..c34bc1c 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -25,6 +25,7 @@ import WidgetImage from '../components/widget-image'; import WidgetButton from '../components/widget-button'; import WidgetNumberInput from '../components/widget-number-input'; import WidgetSlider from '../components/widget-slider'; +import WidgetGauge from '../components/widget-gauge'; import '../styles/widgets.css'; @@ -137,6 +138,8 @@ class Widget extends Component { element = } else if (widget.type === 'Slider') { element = + } else if (widget.type === 'Gauge') { + element = } if (this.props.editing) { diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 707bb0a..4e404ac 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -182,6 +182,7 @@ div[class*="-widget"] label { } /* End number input widget */ +/* Slider widget */ input[type=range]::-moz-range-thumb { background: #ffffff; } @@ -192,4 +193,32 @@ input[type=range]::-webkit-slider-thumb { input[type=range]::-ms-thumb { background: #ffffff; -} \ No newline at end of file +} +/* End slider widget */ + +/* Gauge widget */ +.gauge-widget { + width: 100%; + height: 100%; +} + +.gauge-widget canvas { + width: 100%; + height: 100%; +} + +.gauge-name { + width: 100%; + text-align: center; + font-weight: bold; +} + +.gauge-value { + position: absolute; + width: 100%; + font-weight: bold; + font-size: large; + bottom: 0px; + text-align: center; +} +/* End gauge widget */ \ No newline at end of file From 47520e2ca980f1b5761488453942ac2ba366aee0 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 3 Apr 2017 13:52:39 +0200 Subject: [PATCH 106/556] gauge widget: static labels and measurement unit --- src/components/widget-gauge.js | 36 +++++++++++++++++++++++++++++----- src/styles/widgets.css | 15 +++++++++++--- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 064d7c6..84dad58 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -22,20 +22,35 @@ class WidgetGauge extends Component { }; } - componentDidMount() { - const opts = { + staticLabels(gauge_dom_width) { + var label_font_size = gauge_dom_width * 0.05; // font scaling factor + return { + font: label_font_size + 'px "Helvetica Neue"', + labels: [0.0, 0.1, 0.5, 0.9, 1.0], + color: "#000000", + fractionDigits: 1 + } + } + + computeGaugeOptions(gauge_dom_width) { + return { angle: -0.25, lineWidth: 0.2, pointer: { length: 0.6, strokeWidth: 0.035 }, + radiusScale: 0.9, colorStart: '#6EA2B0', colorStop: '#6EA2B0', strokeColor: '#E0E0E0', - highDpiSupport: true + highDpiSupport: true, + staticLabels: this.staticLabels(gauge_dom_width) }; + } + componentDidMount() { + const opts = this.computeGaugeOptions(this.gaugeCanvas.width); this.gauge = new Gauge(this.gaugeCanvas).setOptions(opts); this.gauge.maxValue = 1; this.gauge.setMinValue(0); @@ -43,6 +58,12 @@ class WidgetGauge extends Component { this.gauge.set(this.state.value); } + componentWillUpdate() { + + // Update labels after possible resize + this.gauge.setOptions({ staticLabels: this.staticLabels(this.gaugeCanvas.width) }); + } + componentDidUpdate() { // update gauge's value this.gauge.set(this.state.value); @@ -59,17 +80,22 @@ class WidgetGauge extends Component { // check if value has changed const signal = nextProps.data[simulator].values[nextProps.widget.signal]; - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; // Take just 3 decimal positions + // 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 + const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; if (this.state.value !== new_value) { this.setState({ value: new_value }); } } render() { + var componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; + return ( -
    +
    { this.props.widget.name }
    this.gaugeCanvas = node } /> +
    Voltage (V)
    { this.state.value }
    ); diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 4e404ac..cf757a4 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -204,21 +204,30 @@ input[type=range]::-ms-thumb { .gauge-widget canvas { width: 100%; - height: 100%; + height: 90%; } .gauge-name { + height: 10%; width: 100%; text-align: center; font-weight: bold; } +.gauge-unit { + position: absolute; + width: 100%; + font-size: large; + bottom: 25%; + text-align: center; +} + .gauge-value { position: absolute; width: 100%; font-weight: bold; - font-size: large; - bottom: 0px; + font-size: xx-large; + bottom: 10%; text-align: center; } /* End gauge widget */ \ No newline at end of file From baddee0df33197bc168fc2b472fc9f830df8177f Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 3 Apr 2017 15:56:48 +0200 Subject: [PATCH 107/556] display signal type in gauge --- src/components/widget-gauge.js | 8 +++++++- src/containers/widget.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 84dad58..bc820f0 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -90,12 +90,18 @@ class WidgetGauge extends Component { render() { var componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; + var signalType = null; + + if (this.props.simulation) { + var simulationModel = this.props.simulation.models.filter((model) => model.simulator === this.props.widget.simulator)[0]; + signalType = simulationModel && simulationModel.length > 0? simulationModel.mapping[this.props.widget.signal].type : ''; + } return (
    { this.props.widget.name }
    this.gaugeCanvas = node } /> -
    Voltage (V)
    +
    { signalType }
    { this.state.value }
    ); diff --git a/src/containers/widget.js b/src/containers/widget.js index c34bc1c..0aff5d1 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -139,7 +139,7 @@ class Widget extends Component { } else if (widget.type === 'Slider') { element = } else if (widget.type === 'Gauge') { - element = + element = } if (this.props.editing) { From 6da223ef3d438df805680271a70bdc8fe6fd0323 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 3 Apr 2017 15:59:05 +0200 Subject: [PATCH 108/556] allow signal selection in gauge edit menu & modular edit controls (code reuse) --- .../dialog/edit-widget-signal-control.js | 54 +++++++++++++++++++ .../dialog/edit-widget-simulator-control.js | 44 +++++++++++++++ src/components/dialog/edit-widget.js | 11 +++- 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/components/dialog/edit-widget-signal-control.js create mode 100644 src/components/dialog/edit-widget-simulator-control.js diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js new file mode 100644 index 0000000..fd2cd5e --- /dev/null +++ b/src/components/dialog/edit-widget-signal-control.js @@ -0,0 +1,54 @@ +/** + * File: edit-widget-signal-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 03.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +class EditWidgetSignalControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + simulator: '' + } + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + // get selected simulation model + var simulationModel = {}; + + if (this.props.simulation) { + this.props.simulation.models.forEach((model) => { + if (model.simulation === this.state.widget.simulation) { + simulationModel = model; + } + }); + } + + return ( + + Signal + this.props.handleChange(e)}> + {simulationModel.mapping.map((signal, index) => ( + + ))} + + + ); + } +} + +export default EditWidgetSignalControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js new file mode 100644 index 0000000..baa9679 --- /dev/null +++ b/src/components/dialog/edit-widget-simulator-control.js @@ -0,0 +1,44 @@ +/** + * File: edit-widget-simulator-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 03.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +class EditWidgetSimulatorControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + simulator: '' + } + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + + return ( + + Simulator + this.props.handleChange(e)}> + {this.props.simulation.models.map((model, index) => ( + + ))} + + + ); + } +} + +export default EditWidgetSimulatorControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 2b7a21e..7275649 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -16,6 +16,8 @@ import EditValueWidget from './edit-widget-value'; import EditPlotWidget from './edit-widget-plot'; import EditTableWidget from './edit-widget-table'; import EditImageWidget from './edit-widget-image'; +import EditWidgetSimulatorControl from './edit-widget-simulator-control'; +import EditWidgetSignalControl from './edit-widget-signal-control'; class EditWidgetDialog extends Component { static propTypes = { @@ -75,6 +77,8 @@ class EditWidgetDialog extends Component { render() { // get widget part var widgetDialog = null; + // Use a list to concatenate the controls according to the widget type + var dialogControls = []; if (this.props.widget) { if (this.props.widget.type === 'Value') { @@ -85,6 +89,11 @@ class EditWidgetDialog extends Component { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Image') { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + } else if (this.props.widget.type === 'Gauge') { + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + ) } } @@ -96,7 +105,7 @@ class EditWidgetDialog extends Component { this.handleChange(e)} /> - + { dialogControls } {widgetDialog} From 083ea7d3a6face0391450ccf6351f4ab2b4164ba Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 3 Apr 2017 16:29:36 +0200 Subject: [PATCH 109/556] gauge widget: font sizes (still not responsive) --- src/styles/widgets.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index cf757a4..b0e7ac0 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -217,7 +217,7 @@ input[type=range]::-ms-thumb { .gauge-unit { position: absolute; width: 100%; - font-size: large; + font-size: 1.0em; bottom: 25%; text-align: center; } @@ -226,7 +226,7 @@ input[type=range]::-ms-thumb { position: absolute; width: 100%; font-weight: bold; - font-size: xx-large; + font-size: 1.5em; bottom: 10%; text-align: center; } From 5907986330711a1a5f55e6bca9180db08581c4b4 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 3 Apr 2017 16:44:26 +0200 Subject: [PATCH 110/556] table widget: limited decimals number --- src/components/widget-table.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 071c084..91e59de 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -48,7 +48,7 @@ class WidgetTable extends Component { nextProps.data[simulator].values.forEach((signal, index) => { rows.push({ name: simulationModel.mapping[index].name, - value: signal[signal.length - 1].y + value: signal[signal.length - 1].y.toFixed(3) }) }); @@ -57,7 +57,7 @@ class WidgetTable extends Component { render() { return ( -
    +

    {this.props.widget.name}

    From b5b2d7bc69723b1279559bb7afb4158fd922294d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 28 Mar 2017 11:26:29 +0200 Subject: [PATCH 111/556] Fix project and simulator-data new dialog Check in dialogs if default item for checkbox exists and add validation --- src/components/dialog/new-project.js | 15 ++++++++++++--- src/components/dialog/new-simulation-model.js | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/new-project.js b/src/components/dialog/new-project.js index 6abc0c8..ae08024 100644 --- a/src/components/dialog/new-project.js +++ b/src/components/dialog/new-project.js @@ -43,21 +43,30 @@ class NewProjectDialog extends Component { } resetState() { - this.setState({ name: '', simulation: this.props.simulations[0]._id }); + 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; } - this.valid = name; + 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() { @@ -69,7 +78,7 @@ class NewProjectDialog extends Component { this.handleChange(e)} /> - + Simulation this.handleChange(e)}> {this.props.simulations.map(simulation => ( diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index cb3ca63..e8cf8aa 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -72,28 +72,39 @@ class NewSimulationModelDialog extends Component { } resetState() { - this.setState({ name: '', simulator: this.props.simulators[0]._id, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); + this.setState({ + name: '', + simulator: this.props.simulators[0] != null ? this.props.simulators[0]._id : '', + length: '1', + mapping: [ { name: 'Signal', type: 'Type' } ] + }); } validateForm(target) { // check all controls var name = true; var length = true; + var simulator = true; if (this.state.name === '') { name = false; } + if (this.state.simulator === '') { + simulator = false; + } + // test if simulatorid is a number (in a string, not type of number) if (!/^\d+$/.test(this.state.length)) { length = false; } - this.valid = name && length; + this.valid = name && length && simulator; // return state to control if (target === 'name') return name ? "success" : "error"; else if (target === 'length') return length ? "success" : "error"; + else if (target === 'simulator') return simulator ? "success" : "error"; } render() { From 1112153611fad04368b2702756249c30611f3f81 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 4 Apr 2017 12:05:14 +0200 Subject: [PATCH 112/556] allow signal type selection in plot table widget --- .../dialog/edit-widget-signal-type-control.js | 64 +++++++++++++++++++ src/components/dialog/edit-widget.js | 6 ++ src/components/widget-plot-table.js | 31 +++++---- src/containers/visualization.js | 1 + src/styles/widgets.css | 6 ++ 5 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 src/components/dialog/edit-widget-signal-type-control.js diff --git a/src/components/dialog/edit-widget-signal-type-control.js b/src/components/dialog/edit-widget-signal-type-control.js new file mode 100644 index 0000000..8978186 --- /dev/null +++ b/src/components/dialog/edit-widget-signal-type-control.js @@ -0,0 +1,64 @@ +/** + * File: edit-widget-signal-type-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 03.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +class EditWidgetSignalTypeControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + // get selected simulation model + var simulationModel = {}; + + if (this.props.simulation) { + this.props.simulation.models.forEach((model) => { + if (model.simulation === this.state.widget.simulation) { + simulationModel = model; + } + }); + } + + // Obtain unique signal types with the help of dictionary keys + var signalTypes = Object.keys(simulationModel.mapping.reduce( (collection, signal) => { + var lower = signal.type.toLowerCase(); + collection[lower] = ''; + return collection; + }, {})); + + var capitalize = (str) => { return str.charAt(0).toUpperCase() + str.slice(1); } + + var selectedValue = signalTypes.includes(this.state.widget.signalType) ? this.state.widget.signalType : ''; + + return ( + + Signal type + this.props.handleChange(e)}> + + {signalTypes.map((type, index) => ( + + ))} + + + ); + } +} + +export default EditWidgetSignalTypeControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 7275649..689f731 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -18,6 +18,7 @@ import EditTableWidget from './edit-widget-table'; import EditImageWidget from './edit-widget-image'; import EditWidgetSimulatorControl from './edit-widget-simulator-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; +import EditWidgetSignalTypeControl from './edit-widget-signal-type-control'; class EditWidgetDialog extends Component { static propTypes = { @@ -94,6 +95,11 @@ class EditWidgetDialog extends Component { this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> ) + } else if (this.props.widget.type === 'PlotTable') { + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + ) } } diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 5305ff8..70859c4 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -52,10 +52,13 @@ class WidgetPlotTable extends Component { // get rows var rows = []; - - simulationModel.mapping.forEach((signal) => { - rows.push({ name: signal.name }) - }); + // populate the table rows with the signals of the chosen type + simulationModel.mapping + .filter( (signal) => + signal.type.toLowerCase() === nextProps.widget.signalType) + .forEach((signal) => { + rows.push({ name: signal.name }) + }); // get timestamps var latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; @@ -82,19 +85,23 @@ class WidgetPlotTable extends Component { } render() { - console.log("Signal: " + this.state.signal); return ( -
    +

    {this.props.widget.name}

    - - { this.state.rows.map( (row, index) => ( - - )) - } - + { this.state.rows && this.state.rows.length > 0 ? ( + + { this.state.rows.map( (row, index) => ( + + )) + } + + ) : ( + No signal found, select a different signal type. + ) + }
    diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 432b1b3..100c484 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -163,6 +163,7 @@ class Visualization extends Component { widget.minHeight = 20; } else if (item.name === 'PlotTable') { widget.simulator = this.state.simulation.models[0].simulator; + widget.signalType = this.state.simulation.models[0].mapping[0].type.toLowerCase(); widget.minWidth = 400; widget.minHeight = 200; widget.width = 500; diff --git a/src/styles/widgets.css b/src/styles/widgets.css index b0e7ac0..097f866 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -93,6 +93,7 @@ right: 7px; } +/* PlotTable widget */ .plot-table-widget, .plot-widget, .value-widget, .image-widget, .label-widget { width: 100%; height: 100%; @@ -112,6 +113,11 @@ justify-content: center; } +.plot-table-widget small { + text-align: center; +} +/* End PlotTable Widget */ + /* Reset Bootstrap styles to "disable" while editing */ div[class*="-widget"] .btn[disabled], div[class*="-widget"] input[disabled], .form-control[disabled] { cursor: inherit; From 4433f7fde71b1d2721eee828fa7b5da3b7ca729f Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 4 Apr 2017 17:31:43 +0200 Subject: [PATCH 113/556] PlotTableWidget: multiple streams with different colors --- package.json | 3 +- src/components/widget-plot-table.js | 89 +++++++++++++++++++++-------- src/styles/widgets.css | 9 +++ 3 files changed, 75 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 82f575a..7d9df16 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "react-rnd": "^4.2.2", "react-router": "^3.0.2", "superagent": "^3.5.0", - "gaugeJS": "^1.3.2" + "gaugeJS": "^1.3.2", + "d3-scale": "^1.0.5" }, "devDependencies": { "react-scripts": "0.9.3" diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 70859c4..9c5154b 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -9,8 +9,10 @@ import React, { Component } from 'react'; import { LineChart } from 'rd3'; +import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; +import classNames from 'classnames'; -import { ButtonGroup, Button } from 'react-bootstrap'; +import { FormGroup, Checkbox } from 'react-bootstrap'; class WidgetPlotTable extends Component { constructor(props) { @@ -18,12 +20,13 @@ class WidgetPlotTable extends Component { this.state = { size: { w: 0, h: 0 }, - signal: 0, + signals: [], firstTimestamp: 0, latestTimestamp: 0, sequence: null, - rows: [], - values: [] + signalsOfCurrType: [], + values: [], + active_sim_model: {} }; } @@ -34,9 +37,13 @@ class WidgetPlotTable extends Component { // plot size this.setState({ size: { w: this.props.widget.width - 100, h: this.props.widget.height - 20 }}); + if (nextProps.widget.signalType !== this.props.widget.signalType) { + this.setState({ signals: []}); + } + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { // clear values - this.setState({ values: [], sequence: null, rows: [] }); + this.setState({ values: [], sequence: null, signalsOfCurrType: [] }); return; } @@ -46,18 +53,23 @@ class WidgetPlotTable extends Component { } // get simulation model - const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator === simulator); + const simulationModel = nextProps.simulation.models.find((model, model_index) => { + var found = false; + if (model.simulator === simulator) { + this.setState({ active_sim_model: model_index }); + found = true; + } + return found; }); - // get rows - var rows = []; - // populate the table rows with the signals of the chosen type + // get signals belonging to the currently selected type + var filteredSignals = {}; simulationModel.mapping .filter( (signal) => signal.type.toLowerCase() === nextProps.widget.signalType) .forEach((signal) => { - rows.push({ name: signal.name }) + // Store signals to be shown in a dictionary + filteredSignals[signal.name.toLowerCase()] = ''; }); // get timestamps @@ -77,30 +89,56 @@ class WidgetPlotTable extends Component { } // copy all values for each signal in time region - var values = [{ - values: nextProps.data[simulator].values[this.state.signal].slice(firstIndex, nextProps.data[simulator].values[this.state.signal].length - 1) - }]; + var values = []; + this.state.signals.forEach((signal_index, i, arr) => ( + values.push( + { values: nextProps.data[simulator].values[signal_index].slice(firstIndex, nextProps.data[simulator].values[signal_index].length - 1)}) + )); - this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, rows: rows }); + this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, signalsOfCurrType: filteredSignals }); } + updateSignalSelection(signal_index, checked) { + // If the signal is selected, add it to array, remove it otherwise + this.setState({ + signals: checked? this.state.signals.concat(signal_index) : this.state.signals.filter( (idx) => idx !== signal_index ) + }); + } + render() { + var checkBoxes = []; + if (this.state.signalsOfCurrType && Object.keys(this.state.signalsOfCurrType).length > 0) { + // Create checkboxes using the signal indices from simulation model + checkBoxes = this.props.simulation.models[this.state.active_sim_model].mapping.reduce( + // Loop through simulation model signals + (accum, model_signal, signal_index) => { + // Append them if they belong to the current selected type + if (this.state.signalsOfCurrType.hasOwnProperty(model_signal.name.toLowerCase())) { + // Tag as active if it is currently selected + var chkBxClasses = classNames({ + 'btn': true, + 'btn-default': true, + 'active': this.state.signals.indexOf(signal_index) > -1 + }); + accum.push( + this.updateSignalSelection(signal_index, e.target.checked) } > { model_signal.name } + ) + } + return accum; + }, []); + } + return (

    {this.props.widget.name}

    - { this.state.rows && this.state.rows.length > 0 ? ( - - { this.state.rows.map( (row, index) => ( - - )) - } - - ) : ( - No signal found, select a different signal type. - ) + { checkBoxes.length > 0 ? ( + + { checkBoxes } + + ) : ( No signal found, select a different signal type. ) }
    @@ -110,6 +148,7 @@ class WidgetPlotTable extends Component { width={ this.state.size.w || 100 } height={ this.state.size.h || 100 } data={this.state.values} + colors={ scaleOrdinal(schemeCategory10) } gridHorizontal={true} xAccessor={(d) => { if (d != null) { return new Date(d.x); } }} hoverAnimation={false} diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 097f866..bfd3531 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -104,6 +104,7 @@ .plot-table-widget .content { display: -webkit-flex; display: flex; + height: 100%; } .plot-table-widget .widget-table { @@ -116,6 +117,14 @@ .plot-table-widget small { text-align: center; } + +.plot-table-widget .checkbox label { + padding: 0px; +} + +.plot-table-widget input[type="checkbox"] { + display: none; +} /* End PlotTable Widget */ /* Reset Bootstrap styles to "disable" while editing */ From 119b651b11b9ca2a2b3df2e848e88631573239e7 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 4 Apr 2017 17:42:56 +0200 Subject: [PATCH 114/556] fixed PlotTable cursor while editing --- 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 bfd3531..e43c7ef 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -128,7 +128,7 @@ /* End PlotTable Widget */ /* Reset Bootstrap styles to "disable" while editing */ -div[class*="-widget"] .btn[disabled], div[class*="-widget"] input[disabled], .form-control[disabled] { +div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input[disabled], .form-control[disabled], .checkbox.disabled label { cursor: inherit; pointer-events: none; } From 42cee87ef16ce645e2efd5b9ba216c0d023fbe15 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 5 Apr 2017 11:32:02 +0200 Subject: [PATCH 115/556] scale plot tick count to width --- src/components/widget-plot-table.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 9c5154b..7f084c6 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -128,6 +128,9 @@ class WidgetPlotTable extends Component { }, []); } + // Make tick count proportional to the plot width using a rough scale ratio + var tickCount = Math.round(this.state.size.w / 80); + return (

    {this.props.widget.name}

    @@ -151,6 +154,7 @@ class WidgetPlotTable extends Component { colors={ scaleOrdinal(schemeCategory10) } gridHorizontal={true} xAccessor={(d) => { if (d != null) { return new Date(d.x); } }} + xAxisTickCount={ tickCount } hoverAnimation={false} circleRadius={0} domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} From 6b426ce1940b5014d92b9aa85295a6a0f900908e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 5 Apr 2017 17:17:58 +0200 Subject: [PATCH 116/556] fixed gauge widget labels weird rendering while editing --- src/components/widget-gauge.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index bc820f0..a61c3e8 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -22,8 +22,8 @@ class WidgetGauge extends Component { }; } - staticLabels(gauge_dom_width) { - var label_font_size = gauge_dom_width * 0.05; // font scaling factor + staticLabels(widget_height) { + var label_font_size = widget_height * 0.055; // font scaling factor return { font: label_font_size + 'px "Helvetica Neue"', labels: [0.0, 0.1, 0.5, 0.9, 1.0], @@ -32,7 +32,7 @@ class WidgetGauge extends Component { } } - computeGaugeOptions(gauge_dom_width) { + computeGaugeOptions(widget_height) { return { angle: -0.25, lineWidth: 0.2, @@ -45,12 +45,12 @@ class WidgetGauge extends Component { colorStop: '#6EA2B0', strokeColor: '#E0E0E0', highDpiSupport: true, - staticLabels: this.staticLabels(gauge_dom_width) + staticLabels: this.staticLabels(widget_height) }; } componentDidMount() { - const opts = this.computeGaugeOptions(this.gaugeCanvas.width); + const opts = this.computeGaugeOptions(this.props.widget.height); this.gauge = new Gauge(this.gaugeCanvas).setOptions(opts); this.gauge.maxValue = 1; this.gauge.setMinValue(0); @@ -59,9 +59,8 @@ class WidgetGauge extends Component { } componentWillUpdate() { - // Update labels after possible resize - this.gauge.setOptions({ staticLabels: this.staticLabels(this.gaugeCanvas.width) }); + this.gauge.setOptions({ staticLabels: this.staticLabels(this.props.widget.height) }); } componentDidUpdate() { From 5a317632724edf7b829c420e8785857f6cdfcb33 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 7 Apr 2017 13:47:18 +0200 Subject: [PATCH 117/556] widget plot table signal preselection --- .../dialog/edit-widget-signals-control.js | 68 ++++++++++ src/components/dialog/edit-widget.js | 10 +- src/components/widget-plot-table.js | 121 ++++++++++++------ src/containers/visualization.js | 23 +++- src/containers/widget.js | 2 +- 5 files changed, 169 insertions(+), 55 deletions(-) create mode 100644 src/components/dialog/edit-widget-signals-control.js diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js new file mode 100644 index 0000000..2842618 --- /dev/null +++ b/src/components/dialog/edit-widget-signals-control.js @@ -0,0 +1,68 @@ +/** + * File: edit-widget-signals-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 03.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, Checkbox, ControlLabel } from 'react-bootstrap'; + +class EditWidgetSignalsControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + simulator: '', + preselectedSignals: [] + } + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + handleSignalChange(checked, index) { + var signals = this.state.widget.preselectedSignals; + var new_signals; + + if (checked) { + // add signal + new_signals = signals.concat(index); + } else { + // remove signal + new_signals = signals.filter( (idx) => idx !== index ); + } + + this.props.handleChange({ target: { id: 'preselectedSignals', value: new_signals } }); + } + + render() { + // get selected simulation model + var simulationModel = {}; + + if (this.props.simulation) { + this.props.simulation.models.forEach((model) => { + if (model.simulation === this.state.widget.simulation) { + simulationModel = model; + } + }); + } + + return ( + + Signals + {simulationModel.mapping.map((signal, index) => ( + this.handleSignalChange(e.target.checked, index)}>{signal.name} + ))} + + ); + } +} + +export default EditWidgetSignalsControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 689f731..ec6c7d9 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -18,7 +18,7 @@ import EditTableWidget from './edit-widget-table'; import EditImageWidget from './edit-widget-image'; import EditWidgetSimulatorControl from './edit-widget-simulator-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; -import EditWidgetSignalTypeControl from './edit-widget-signal-type-control'; +import EditWidgetSignalsControl from './edit-widget-signals-control'; class EditWidgetDialog extends Component { static propTypes = { @@ -92,13 +92,13 @@ class EditWidgetDialog extends Component { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Gauge') { dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> ) } else if (this.props.widget.type === 'PlotTable') { dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> ) } } diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 7f084c6..734b051 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -20,13 +20,12 @@ class WidgetPlotTable extends Component { this.state = { size: { w: 0, h: 0 }, - signals: [], firstTimestamp: 0, latestTimestamp: 0, sequence: null, - signalsOfCurrType: [], values: [], - active_sim_model: {} + preselectedSignals: [], + signals: [] }; } @@ -37,13 +36,30 @@ class WidgetPlotTable extends Component { // plot size this.setState({ size: { w: this.props.widget.width - 100, h: this.props.widget.height - 20 }}); - if (nextProps.widget.signalType !== this.props.widget.signalType) { - this.setState({ signals: []}); + // Update internal selected signals state with props (different array objects) + if (this.props.widget.signals !== nextProps.widget.signals) { + this.setState( {signals: nextProps.widget.signals}); } + // Identify if there was a change in the preselected signals + if (nextProps.simulation && (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.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); + this.setState({ + signals: intersection, + values: this.state.values.filter( (values) => intersection.includes(values.index)) + }); + + this.updatePreselectedSignalsState(nextProps); + return; + } + + // Identify simulation reset if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { // clear values - this.setState({ values: [], sequence: null, signalsOfCurrType: [] }); + this.setState({ values: [], sequence: null }); return; } @@ -52,25 +68,42 @@ class WidgetPlotTable extends Component { return; } + this.updatePlotData(nextProps); + } + + // 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(nextProps) { + const simulator = nextProps.widget.simulator; + // get simulation model - const simulationModel = nextProps.simulation.models.find((model, model_index) => { - var found = false; - if (model.simulator === simulator) { - this.setState({ active_sim_model: model_index }); - found = true; - } - return found; + const simulationModel = nextProps.simulation.models.find((model) => { + return (model.simulator === simulator); }); - // get signals belonging to the currently selected type - var filteredSignals = {}; - simulationModel.mapping - .filter( (signal) => - signal.type.toLowerCase() === nextProps.widget.signalType) - .forEach((signal) => { - // Store signals to be shown in a dictionary - filteredSignals[signal.name.toLowerCase()] = ''; - }); + // Create checkboxes using the signal indices from simulation model + const preselectedSignals = simulationModel.mapping.reduce( + // 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) { + accum.push( + { + index: signal_index, + name: model_signal.name + } + ) + } + return accum; + }, []); + this.setState({ preselectedSignals: preselectedSignals }); + } + + updatePlotData(nextProps) { + const simulator = nextProps.widget.simulator; // get timestamps var latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; @@ -91,41 +124,38 @@ class WidgetPlotTable extends Component { // copy all values for each signal in time region var values = []; this.state.signals.forEach((signal_index, i, arr) => ( + // Include signal index, useful to relate them to the signal selection values.push( - { values: nextProps.data[simulator].values[signal_index].slice(firstIndex, nextProps.data[simulator].values[signal_index].length - 1)}) + { + index: signal_index, + values: nextProps.data[simulator].values[signal_index].slice(firstIndex, nextProps.data[simulator].values[signal_index].length - 1)}) )); - this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, signalsOfCurrType: filteredSignals }); + this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence }); } - + updateSignalSelection(signal_index, checked) { - // If the signal is selected, add it to array, remove it otherwise - this.setState({ + // 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 ) }); + this.props.onWidgetChange(new_widget); } render() { var checkBoxes = []; - if (this.state.signalsOfCurrType && Object.keys(this.state.signalsOfCurrType).length > 0) { + + if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { // Create checkboxes using the signal indices from simulation model - checkBoxes = this.props.simulation.models[this.state.active_sim_model].mapping.reduce( - // Loop through simulation model signals - (accum, model_signal, signal_index) => { - // Append them if they belong to the current selected type - if (this.state.signalsOfCurrType.hasOwnProperty(model_signal.name.toLowerCase())) { - // Tag as active if it is currently selected + checkBoxes = this.state.preselectedSignals.map( (signal) => { + var checked = this.state.signals.indexOf(signal.index) > -1; var chkBxClasses = classNames({ 'btn': true, 'btn-default': true, - 'active': this.state.signals.indexOf(signal_index) > -1 + 'active': checked }); - accum.push( - this.updateSignalSelection(signal_index, e.target.checked) } > { model_signal.name } - ) - } - return accum; - }, []); + return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } + }); } // Make tick count proportional to the plot width using a rough scale ratio @@ -150,7 +180,7 @@ class WidgetPlotTable extends Component { { if (d != null) { return new Date(d.x); } }} @@ -160,6 +190,13 @@ class WidgetPlotTable extends Component { domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} /> } +
    + { + this.state.signals.map((signal) => + ({signal} + ',') + ) + } +
    diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 100c484..cf81c40 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -163,7 +163,8 @@ class Visualization extends Component { widget.minHeight = 20; } else if (item.name === 'PlotTable') { widget.simulator = this.state.simulation.models[0].simulator; - widget.signalType = this.state.simulation.models[0].mapping[0].type.toLowerCase(); + widget.preselectedSignals = []; + widget.signals = []; // initialize selected signals widget.minWidth = 400; widget.minHeight = 200; widget.width = 500; @@ -209,7 +210,12 @@ class Visualization extends Component { this.setState({ visualization: visualization }); } - widgetChange(updated_widget, key) { + 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; @@ -218,7 +224,7 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets }); - this.setState({ visualization: visualization }); + this.setState({ visualization: visualization }, callback); } editWidget(e, data) { @@ -251,6 +257,11 @@ class Visualization extends Component { this.setState({ visualization: visualization }); } + stopEditing() { + // Provide the callback so it can be called when state change is applied + this.setState({ editing: false }, this.saveChanges ); + } + saveChanges() { // Transform to a list var visualization = Object.assign({}, this.state.visualization, { @@ -261,8 +272,6 @@ class Visualization extends Component { type: 'visualizations/start-edit', data: visualization }); - - this.setState({ editing: false }); } discardChanges() { @@ -339,7 +348,7 @@ class Visualization extends Component {
    {this.state.editing ? (
    -
    + Orientation + + + { + Object.keys(WidgetSlider.OrientationTypes).map( (type) => { + let value = WidgetSlider.OrientationTypes[type].value; + let name = WidgetSlider.OrientationTypes[type].name; + + return ( + this.handleOrientationChange(value)}> + { name } + ) + }) + } + + + + ); + } +} + +export default EditWidgetOrientation; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index ec6c7d9..a5a2daa 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -19,6 +19,7 @@ import EditImageWidget from './edit-widget-image'; import EditWidgetSimulatorControl from './edit-widget-simulator-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; import EditWidgetSignalsControl from './edit-widget-signals-control'; +import EditWidgetOrientation from './edit-widget-orientation'; class EditWidgetDialog extends Component { static propTypes = { @@ -100,6 +101,10 @@ class EditWidgetDialog extends Component { this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> ) + } else if (this.props.widget.type === 'Slider') { + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + ) } } diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index 73d1cb1..40f890f 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -8,10 +8,17 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { Form, FormGroup, Col, ControlLabel } from 'react-bootstrap'; +import classNames from 'classnames'; class WidgetSlider extends Component { + static get OrientationTypes() { + return ({ + HORIZONTAL: {value: 0, name: 'Horizontal'}, + VERTICAL: {value: 1, name: 'Vertical'} + }) + } + constructor(props) { super(props); @@ -25,22 +32,40 @@ class WidgetSlider extends Component { } render() { + let fields = { + 'name': this.props.widget.name, + 'control': this.valueChanged(e) } defaultValue={ this.state.value }/>, + 'value': this.state.value + } + + let vertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; + var widgetClasses = classNames({ + 'slider-widget': true, + 'full': true, + 'vertical': vertical, + 'horizontal': !vertical + }); + return ( -
    -
    - -
    - {this.props.widget.name} - - - this.valueChanged(e) } defaultValue={ this.state.value }/> - - - { this.state.value } - - - - + this.props.widget.orientation === WidgetSlider.OrientationTypes.HORIZONTAL.value? ( +
    +
    + +
    +
    + { fields.control } + { fields.value } +
    +
    + ) : ( +
    +
    + + { fields.value } +
    +
    { fields.control }
    +
    + ) ); } } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index d6acda6..6085b06 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -23,6 +23,8 @@ import SimulationStore from '../stores/simulation-store'; import FileStore from '../stores/file-store'; import AppDispatcher from '../app-dispatcher'; +import WidgetSlider from '../components/widget-slider'; + class Visualization extends Component { static getStores() { return [ VisualizationStore, ProjectStore, SimulationStore, FileStore ]; @@ -190,6 +192,7 @@ class Visualization extends Component { widget.minHeight = 30; widget.width = 400; widget.height = 50; + widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation } else if (item.name === 'Gauge') { widget.simulator = this.state.simulation.models[0].simulator; widget.signal = 0; diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 45956cb..78795e1 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -283,6 +283,15 @@ div[class*="-widget"] label { /* End number input widget */ /* Slider widget */ +.slider-widget.vertical input[type="range"] { + position: absolute; + top: 40%; + left: 50%; + transform: rotate(270deg); + /*margin-left: 20px;*/ + width: 150px; +} + input[type=range]::-moz-range-thumb { background: #ffffff; } @@ -294,6 +303,31 @@ input[type=range]::-webkit-slider-thumb { input[type=range]::-ms-thumb { background: #ffffff; } + +.slider-widget.horizontal div { + width: 50%; + display: inline-block; + text-align: center; + vertical-align: top; +} + +.slider-widget.horizontal span { + display: block; + margin: 5px; +} + +.slider-widget.vertical div { + width: 50%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-around; +} + +.slider-widget span { + font-size: 1.5em; + font-weight: 600; +} /* End slider widget */ /* Gauge widget */ From d7af57c692acd139b1570ceb2372e601a2962d3e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 11 Apr 2017 12:20:37 +0200 Subject: [PATCH 129/556] show border hint while editing for widgets without border --- src/containers/widget.js | 16 ++++++++++++++-- src/styles/widgets.css | 14 +++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 6a1ac6c..8f17940 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -11,6 +11,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { ContextMenuTrigger } from 'react-contextmenu'; import Rnd from 'react-rnd'; +import classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; import SimulatorDataStore from '../stores/simulator-data-store'; @@ -117,6 +118,7 @@ class Widget extends Component { // get widget element const widget = this.props.data; + var borderedWidget = false; var element = null; // dummy is passed to widgets to keep updating them while in edit mode @@ -124,14 +126,18 @@ class Widget extends Component { element = } else if (widget.type === 'Plot') { element = + borderedWidget = true; } else if (widget.type === 'Table') { element = } else if (widget.type === 'Label') { element = + borderedWidget = true; } else if (widget.type === 'PlotTable') { element = this.props.onWidgetStatusChange(w, this.props.index) } /> + borderedWidget = true; } else if (widget.type === 'Image') { element = + borderedWidget = true; } else if (widget.type === 'Button') { element = } else if (widget.type === 'NumberInput') { @@ -142,6 +148,12 @@ class Widget extends Component { element = } + let widgetClasses = classNames({ + 'widget': !this.props.editing, + 'editing-widget': this.props.editing, + 'border': borderedWidget + }); + if (this.props.editing) { return ( this.borderWasClicked(event) } onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} onDragStop={(event, ui) => this.dragStop(event, ui)} @@ -165,7 +177,7 @@ class Widget extends Component { ); } else { return ( -
    +
    {element}
    ); diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 78795e1..c8b5678 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -8,11 +8,20 @@ **********************************************************************************/ .widget { - background-color: #fff; + background-color: #fff; +} + +.border { + border: 1px solid lightgray; } .editing-widget { - background-color: #fff; + background-color: #fff; +} + +.editing-widget:not(.border):hover { + outline: 1px solid lightgray; + outline-offset: -10px; } /* Area to trigger the context menu */ @@ -134,7 +143,6 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input width: 100%; height: 100%; padding: 3px 6px; - border: 1px solid lightgray; } .plot-table-widget { From 36ca3d2a846a5c47df5732c0252a961fca983243 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 11 Apr 2017 14:54:16 +0200 Subject: [PATCH 130/556] Sort project's visualizations list --- src/containers/project.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 910eebe..3b4b30c 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -126,13 +126,11 @@ class Visualizations extends Component { var visualizations = []; if (this.state.visualizations && this.state.project.visualizations) { - this.state.visualizations.forEach((visualization) => { - this.state.project.visualizations.forEach((id) => { - if (visualization._id === id) { - visualizations.push(visualization); - } - }); - }); + visualizations = this.state.visualizations.filter( + (visualization) => this.state.project.visualizations.includes(visualization._id) + ).sort( + (visA, visB) => visA.name.localeCompare(visB.name) + ); } return ( From 08c082c0bc1007dfccbdc794d152565a9e7a0f36 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 11 Apr 2017 17:23:17 +0200 Subject: [PATCH 131/556] Fixed correct visualization deletion --- src/containers/project.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 3b4b30c..2440bb4 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -106,7 +106,7 @@ class Visualizations extends Component { AppDispatcher.dispatch({ type: 'visualizations/start-remove', - data: this.state.modalVisualization + data: this.state.modalData }); } @@ -139,7 +139,7 @@ class Visualizations extends Component {
    - this.setState({ editModal: true, modalData: this.state.visualizations[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.visualizations[index] })} /> + this.setState({ editModal: true, modalData: visualizations[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalData: visualizations[index] })} />
    From 5f7488c265892560ee751eb6c27080c62a5e2875 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 12 Apr 2017 12:38:42 +0200 Subject: [PATCH 132/556] Fixed issue #45, visualization now shows when created --- src/containers/project.js | 79 ++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 2440bb4..2ea79d2 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -15,7 +15,7 @@ import AppDispatcher from '../app-dispatcher'; import ProjectStore from '../stores/project-store'; import VisualizationStore from '../stores/visualization-store'; -import Table from '../components/table'; +import CustomTable from '../components/table'; import TableColumn from '../components/table-column'; import NewVisualzationDialog from '../components/dialog/new-visualization'; import EditVisualizationDialog from '../components/dialog/edit-visualization'; @@ -25,66 +25,70 @@ class Visualizations extends Component { return [ ProjectStore, VisualizationStore ]; } - static calculateState(prevState) { + static calculateState(prevState, props) { + + let currentProjects = ProjectStore.getState(); + let currentVisualizations = VisualizationStore.getState(); + if (prevState) { + var projectUpdate = prevState.project; + + // Compare content of the visualizations array, reload projects if changed + if (JSON.stringify(prevState.visualizations) !== JSON.stringify(currentVisualizations)) { + Visualizations.loadProjects(); + } + + // Compare content of the projects array, update visualizations if changed + if (JSON.stringify(prevState.projects) !== JSON.stringify(currentProjects)) { + projectUpdate = Visualizations.findProjectInState(currentProjects, props.params.project); + Visualizations.loadVisualizations(projectUpdate.visualizations); + } + return { - projects: ProjectStore.getState(), - visualizations: VisualizationStore.getState(), + projects: currentProjects, + visualizations: currentVisualizations, newModal: prevState.newModal, deleteModal: prevState.deleteModal, editModal: prevState.editModal, modalData: prevState.modalData, - project: prevState.project, - reload: prevState.reload + project: projectUpdate }; } else { return { - projects: ProjectStore.getState(), - visualizations: VisualizationStore.getState(), + projects: currentProjects, + visualizations: currentVisualizations, newModal: false, deleteModal: false, editModal: false, modalData: {}, - project: {}, - reload: false + project: {} }; } } - componentWillMount() { + static findProjectInState(projects, projectId) { + return projects.find((project) => project._id === projectId); + } + + static loadProjects() { AppDispatcher.dispatch({ type: 'projects/start-load' }); } - componentDidUpdate() { - if (this.state.project._id !== this.props.params.project /*|| this.state.reload*/) { - this.reloadProject(); - - if (this.state.reload) { - this.setState({ reload: false }); - } - } + static loadVisualizations(visualizations) { + AppDispatcher.dispatch({ + type: 'visualizations/start-load', + data: visualizations + }); } - reloadProject() { - // select project by param id - this.state.projects.forEach((project) => { - if (project._id === this.props.params.project) { - // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside - this.setState({ project: JSON.parse(JSON.stringify(project)) }); - - // load visualizations - AppDispatcher.dispatch({ - type: 'visualizations/start-load', - data: project.visualizations - }); - } - }); + componentWillMount() { + Visualizations.loadProjects(); } closeNewModal(data) { @@ -98,7 +102,7 @@ class Visualizations extends Component { }); } - this.setState({ newModal: false, reload: data != null }); + this.setState({ newModal: false }); } confirmDeleteModal() { @@ -124,7 +128,6 @@ class Visualizations extends Component { render() { // get visualizations for this project var visualizations = []; - if (this.state.visualizations && this.state.project.visualizations) { visualizations = this.state.visualizations.filter( (visualization) => this.state.project.visualizations.includes(visualization._id) @@ -137,10 +140,10 @@ class Visualizations extends Component {

    {this.state.project.name}

    - + this.setState({ editModal: true, modalData: visualizations[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalData: visualizations[index] })} /> -
    + @@ -167,4 +170,4 @@ class Visualizations extends Component { } } -export default Container.create(Visualizations); +export default Container.create(Visualizations, {withProps: true}); From bc8bdca83984d302570d0737038ecb42b565b65c Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 12 Apr 2017 14:58:43 +0200 Subject: [PATCH 133/556] Issue #45: fixed visualizations load after redirect from projects --- src/containers/project.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 2ea79d2..5ba98bd 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -29,7 +29,7 @@ class Visualizations extends Component { let currentProjects = ProjectStore.getState(); let currentVisualizations = VisualizationStore.getState(); - + if (prevState) { var projectUpdate = prevState.project; @@ -56,6 +56,13 @@ class Visualizations extends Component { project: projectUpdate }; } else { + + let initialProject = Visualizations.findProjectInState(currentProjects, props.params.project); + // If projects have been loaded already but visualizations not (redirect from Projects page) + if (initialProject && (!currentVisualizations || currentVisualizations.length === 0)) { + Visualizations.loadVisualizations(initialProject.visualizations); + } + return { projects: currentProjects, visualizations: currentVisualizations, @@ -65,7 +72,7 @@ class Visualizations extends Component { editModal: false, modalData: {}, - project: {} + project: initialProject || {} }; } } From a1ac2c4aa66055501966111a8af67e8ffbef8a91 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Apr 2017 08:59:38 +0200 Subject: [PATCH 134/556] Add docker-compose production files --- docker-compose.yml | 24 ++++++++++++++++++++++++ nginx/villas.conf | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 docker-compose.yml create mode 100644 nginx/villas.conf diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..afdd7a7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: "2" + +services: + frontend: + image: nginx:stable + volumes: + - ./nginx:/etc/nginx/conf.d/ + - ./build:/www + links: + - backend + ports: + - "80:80" + - "443:443" + + backend: + image: villasweb-backend + links: + - database + + database: + image: mongo:latest + volumes: + - /opt/database:/data/db + diff --git a/nginx/villas.conf b/nginx/villas.conf new file mode 100644 index 0000000..f3417de --- /dev/null +++ b/nginx/villas.conf @@ -0,0 +1,32 @@ +server { + listen 80 default_server; + server_name VILLASweb; + + # backend location + location /api/ { + proxy_redirect off; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # rewrite url to exclude /api on context broker side + rewrite ^/api/?(.*) /api/v1/$1 break; + + proxy_pass http://backend:4000/; + } + + # frontend location + location / { + root /www; + } + + # error pages + error_page 404 /404.html; + location = /404.html { + root /usr/share/nginx/html; + } + + error_page 500 502 503 504 50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} From d240d5553bea918128471868ef0510790e0d52db Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 10:03:30 +0200 Subject: [PATCH 135/556] Deal with undefined sim models and show notification --- src/components/widget-plot-table.js | 37 ++++++++++++--------- src/components/widget-plot.js | 38 ++++++++++++---------- src/containers/visualization.js | 20 +++++++++--- src/data-managers/notifications-factory.js | 24 ++++++++++++++ 4 files changed, 81 insertions(+), 38 deletions(-) create mode 100644 src/data-managers/notifications-factory.js diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index cbdee75..65de31e 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -58,22 +58,27 @@ class WidgetPlotTable extends Component { return (model.simulator === simulator); }); - // Create checkboxes using the signal indices from simulation model - const preselectedSignals = simulationModel.mapping.reduce( - // 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) { - accum.push( - { - index: signal_index, - name: model_signal.name - } - ) - } - return accum; - }, []); - this.setState({ preselectedSignals: preselectedSignals }); + let preselectedSignals = []; + // Proceed if a simulation model is available + if (simulationModel) { + // Create checkboxes using the signal indices from simulation model + preselectedSignals = simulationModel.mapping.reduce( + // 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) { + accum.push( + { + index: signal_index, + name: model_signal.name + } + ) + } + return accum; + }, []); + } + + this.setState({ preselectedSignals: preselectedSignals }); } updateSignalSelection(signal_index, checked) { diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index df901c9..e0c2662 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -15,25 +15,29 @@ import PlotLegend from './widget-plot/plot-legend'; class WidgetPlot extends Component { render() { - if (this.props.simulation == null) { - return (
    Empty
    ); + + const simulator = this.props.widget.simulator; + const simulation = this.props.simulation; + let legendSignals = []; + let simulatorData = []; + + // Proceed if a simulation with models and a simulator are available + if (simulator && simulation && simulation.models.length > 0) { + + const model = simulation.models.find( (model) => model.simulator === simulator ); + const chosenSignals = this.props.widget.signals; + + simulatorData = this.props.data[simulator]; + + // Query the signals that will be displayed in the legend + legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { + if (chosenSignals.includes(signal_index)) { + accum.push({ index: signal_index, name: model_signal.name }); + } + return accum; + }, []); } - let simulator = this.props.widget.simulator; - let simulation = this.props.simulation; - let model = simulation.models.find( (model) => model.simulator === simulator ); - let chosenSignals = this.props.widget.signals; - - let simulatorData = this.props.data[simulator]; - - // Query the signals that will be displayed in the legend - let legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { - if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: model_signal.name }); - } - return accum; - }, []); - return (

    {this.props.widget.name}

    diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 6085b06..c82d56d 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -22,6 +22,8 @@ import ProjectStore from '../stores/project-store'; import SimulationStore from '../stores/simulation-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 WidgetSlider from '../components/widget-slider'; @@ -138,16 +140,24 @@ class Visualization extends Component { z: 0 }; + let defaultSimulator = null; + + if (this.state.simulation.models && this.state.simulation.models.length === 0) { + NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); + } else { + defaultSimulator = this.state.simulation.models[0].simulator; + } + // set type specific properties if (item.name === 'Value') { - widget.simulator = this.state.simulation.models[0].simulator; + widget.simulator = defaultSimulator; widget.signal = 0; widget.minWidth = 70; widget.minHeight = 20; widget.width = 120; widget.height = 70; } else if (item.name === 'Plot') { - widget.simulator = this.state.simulation.models[0].simulator; + widget.simulator = defaultSimulator; widget.signals = [ 0 ]; widget.time = 60; widget.minWidth = 400; @@ -155,7 +165,7 @@ class Visualization extends Component { widget.width = 400; widget.height = 200; } else if (item.name === 'Table') { - widget.simulator = this.state.simulation.models[0].simulator; + widget.simulator = defaultSimulator; widget.minWidth = 300; widget.minHeight = 200; widget.width = 400; @@ -164,7 +174,7 @@ class Visualization extends Component { widget.minWidth = 70; widget.minHeight = 20; } else if (item.name === 'PlotTable') { - widget.simulator = this.state.simulation.models[0].simulator; + widget.simulator = defaultSimulator; widget.preselectedSignals = []; widget.signals = []; // initialize selected signals widget.minWidth = 400; @@ -194,7 +204,7 @@ class Visualization extends Component { widget.height = 50; widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation } else if (item.name === 'Gauge') { - widget.simulator = this.state.simulation.models[0].simulator; + widget.simulator = defaultSimulator; widget.signal = 0; widget.minWidth = 200; widget.minHeight = 150; diff --git a/src/data-managers/notifications-factory.js b/src/data-managers/notifications-factory.js new file mode 100644 index 0000000..56c095c --- /dev/null +++ b/src/data-managers/notifications-factory.js @@ -0,0 +1,24 @@ +/** + * 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: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +class NotificationsFactory { + + static get NO_SIM_MODEL_AVAILABLE() { + return { + title: 'No simulation model available', + message: 'Consider defining a simulation model in the simulators section.', + level: 'warning' + }; + } + +} + +export default NotificationsFactory; \ No newline at end of file From fe543dee931b8d2131d3b8386932b1772e62dae5 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 10:05:57 +0200 Subject: [PATCH 136/556] Extracted controls in Widget Edit model and included proper message when no sim model is available --- ...-image.js => edit-widget-image-control.js} | 6 +- src/components/dialog/edit-widget-plot.js | 85 ------------------- .../dialog/edit-widget-signals-control.js | 31 ++++--- .../dialog/edit-widget-simulator-control.js | 11 ++- .../dialog/edit-widget-time-control.js | 40 +++++++++ src/components/dialog/edit-widget-value.js | 64 -------------- src/components/dialog/edit-widget.js | 32 ++++--- 7 files changed, 87 insertions(+), 182 deletions(-) rename src/components/dialog/{edit-widget-image.js => edit-widget-image-control.js} (94%) delete mode 100644 src/components/dialog/edit-widget-plot.js create mode 100644 src/components/dialog/edit-widget-time-control.js delete mode 100644 src/components/dialog/edit-widget-value.js diff --git a/src/components/dialog/edit-widget-image.js b/src/components/dialog/edit-widget-image-control.js similarity index 94% rename from src/components/dialog/edit-widget-image.js rename to src/components/dialog/edit-widget-image-control.js index f7b06e4..d484bee 100644 --- a/src/components/dialog/edit-widget-image.js +++ b/src/components/dialog/edit-widget-image-control.js @@ -1,5 +1,5 @@ /** - * File: edit-widget-value.js + * File: edit-widget-image-control.js * Author: Markus Grigull * Date: 04.03.2017 * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC @@ -12,7 +12,7 @@ import { FormGroup, FormControl, ControlLabel, Button } from 'react-bootstrap'; import AppDispatcher from '../../app-dispatcher'; -class EditImageWidget extends Component { +class EditImageWidgetControl extends Component { constructor(props) { super(props); @@ -68,4 +68,4 @@ class EditImageWidget extends Component { } } -export default EditImageWidget; +export default EditImageWidgetControl; diff --git a/src/components/dialog/edit-widget-plot.js b/src/components/dialog/edit-widget-plot.js deleted file mode 100644 index a2371e3..0000000 --- a/src/components/dialog/edit-widget-plot.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * File: edit-widget-plot.js - * Author: Markus Grigull - * Date: 13.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox, HelpBlock } from 'react-bootstrap'; - -class EditPlotWidget extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '', - signals: [], - time: 0 - } - }; - } - - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); - } - - handleSignalChange(e, index) { - var signals = this.state.widget.signals; - - if (e.target.checked) { - // add signal - signals.push(index); - } else { - // remove signal - const pos = signals.indexOf(index); - if (pos > -1) { - signals.splice(pos, 1); - } - } - - this.props.handleChange({ target: { id: 'signals', value: signals } }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - return ( -
    - - Time - this.props.handleChange(e)} /> - Time in seconds - - - Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( - - ))} - - - - Signals - {simulationModel.mapping.map((signal, index) => ( - this.handleSignalChange(e, index)}>{signal.name} - ))} - -
    - ); - } -} - -export default EditPlotWidget; diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index 2842618..a7fcd07 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -8,7 +8,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Checkbox, ControlLabel } from 'react-bootstrap'; +import { FormGroup, Checkbox, ControlLabel, FormControl } from 'react-bootstrap'; class EditWidgetSignalsControl extends Component { constructor(props) { @@ -39,27 +39,32 @@ class EditWidgetSignalsControl extends Component { new_signals = signals.filter( (idx) => idx !== index ); } - this.props.handleChange({ target: { id: 'preselectedSignals', value: new_signals } }); + this.props.handleChange({ target: { id: this.props.controlId, value: new_signals } }); } render() { - // get selected simulation model - var simulationModel = {}; + let signalsToRender = []; if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } + // get selected simulation model + const simulationModel = this.props.simulation.models.find( model => model.simulation === this.state.widget.simulation ); + // If simulation model update the signals to render + signalsToRender = simulationModel? simulationModel.mapping : []; + } + return ( Signals - {simulationModel.mapping.map((signal, index) => ( - this.handleSignalChange(e.target.checked, index)}>{signal.name} - ))} + { + signalsToRender.length === 0 ? ( + No signals available. + ) : ( + signalsToRender.map((signal, index) => ( + this.handleSignalChange(e.target.checked, index)}>{signal.name} + )) + ) + } ); } diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js index baa9679..23de386 100644 --- a/src/components/dialog/edit-widget-simulator-control.js +++ b/src/components/dialog/edit-widget-simulator-control.js @@ -31,10 +31,15 @@ class EditWidgetSimulatorControl extends Component { return ( Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( + this.props.handleChange(e)}> + { + this.props.simulation.models.length === 0? ( + + ) : ( + this.props.simulation.models.map((model, index) => ( - ))} + ))) + } ); diff --git a/src/components/dialog/edit-widget-time-control.js b/src/components/dialog/edit-widget-time-control.js new file mode 100644 index 0000000..5b8e234 --- /dev/null +++ b/src/components/dialog/edit-widget-time-control.js @@ -0,0 +1,40 @@ +/** + * File: edit-widget-time-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 13.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; + +class EditWidgetTimeControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: { + time: 0 + } + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + render() { + + return ( + + Time + this.props.handleChange(e)} /> + Time in seconds + + ); + } +} + +export default EditWidgetTimeControl; diff --git a/src/components/dialog/edit-widget-value.js b/src/components/dialog/edit-widget-value.js deleted file mode 100644 index 7f16a03..0000000 --- a/src/components/dialog/edit-widget-value.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * File: edit-widget-value.js - * Author: Markus Grigull - * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -class EditValueWidget extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '', - signal: 0 - } - }; - } - - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - return ( -
    - - Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( - - ))} - - - - Signal - this.props.handleChange(e)}> - {simulationModel.mapping.map((signal, index) => ( - - ))} - - -
    - ); - } -} - -export default EditValueWidget; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index a5a2daa..b90e75c 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -12,10 +12,8 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -import EditValueWidget from './edit-widget-value'; -import EditPlotWidget from './edit-widget-plot'; -import EditTableWidget from './edit-widget-table'; -import EditImageWidget from './edit-widget-image'; +import EditWidgetTimeControl from './edit-widget-time-control'; +import EditImageWidgetControl from './edit-widget-image-control'; import EditWidgetSimulatorControl from './edit-widget-simulator-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; import EditWidgetSignalsControl from './edit-widget-signals-control'; @@ -53,8 +51,6 @@ class EditWidgetDialog extends Component { var update = this.state.temporal; update[e.target.id] = e.target.value; this.setState({ temporal: update }); - - //console.log(this.state.widget); } resetState() { @@ -77,20 +73,29 @@ class EditWidgetDialog extends Component { } render() { - // get widget part - var widgetDialog = null; // Use a list to concatenate the controls according to the widget type var dialogControls = []; if (this.props.widget) { if (this.props.widget.type === 'Value') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />; + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + ) } else if (this.props.widget.type === 'Plot') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + ) } else if (this.props.widget.type === 'Table') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + ) } else if (this.props.widget.type === 'Image') { - widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; + dialogControls.push( + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} /> + ) } else if (this.props.widget.type === 'Gauge') { dialogControls.push( this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, @@ -99,7 +104,7 @@ class EditWidgetDialog extends Component { } else if (this.props.widget.type === 'PlotTable') { dialogControls.push( this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> ) } else if (this.props.widget.type === 'Slider') { dialogControls.push( @@ -117,7 +122,6 @@ class EditWidgetDialog extends Component { { dialogControls } - {widgetDialog} ); From 279dc7b0f2e6690565b409590a87b25876d18836 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 10:24:01 +0200 Subject: [PATCH 137/556] Extracted widget creation to separate factory --- src/components/widget-factory.js | 108 +++++++++++++++++++++++++++++++ src/containers/visualization.js | 79 ++-------------------- 2 files changed, 112 insertions(+), 75 deletions(-) create mode 100644 src/components/widget-factory.js diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js new file mode 100644 index 0000000..0f45052 --- /dev/null +++ b/src/components/widget-factory.js @@ -0,0 +1,108 @@ +/** + * File: widget-factory.js + * Description: A factory to create and pre-configure widgets + * Author: Ricardo Hernandez-Montoya + * Date: 02.03.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import WidgetSlider from './widget-slider'; + +class WidgetFactory { + + static createWidgetOfType(type, position, defaultSimulator = null) { + + let widget = { + name: 'Name', + type: type, + width: 100, + height: 100, + x: position.x, + y: position.y, + z: 0 + }; + + // set type specific properties + switch(type) { + case 'Value': + widget.simulator = defaultSimulator; + widget.signal = 0; + widget.minWidth = 70; + widget.minHeight = 20; + widget.width = 120; + widget.height = 70; + break; + case 'Plot': + widget.simulator = defaultSimulator; + widget.signals = [ 0 ]; + widget.time = 60; + widget.minWidth = 400; + widget.minHeight = 200; + widget.width = 400; + widget.height = 200; + break; + case 'Table': + widget.simulator = defaultSimulator; + widget.minWidth = 300; + widget.minHeight = 200; + widget.width = 400; + widget.height = 200; + break; + case 'Label': + widget.minWidth = 70; + widget.minHeight = 20; + break; + case 'PlotTable': + widget.simulator = defaultSimulator; + widget.preselectedSignals = []; + widget.signals = []; // initialize selected signals + widget.minWidth = 400; + widget.minHeight = 300; + widget.width = 500; + widget.height = 500; + widget.time = 60; + break; + case 'Image': + widget.minWidth = 100; + widget.minHeight = 100; + widget.width = 200; + widget.height = 200; + break; + case 'Button': + widget.minWidth = 100; + widget.minHeight = 50; + widget.width = 100; + widget.height = 100; + break; + case 'NumberInput': + widget.minWidth = 200; + widget.minHeight = 50; + widget.width = 200; + widget.height = 50; + break; + case 'Slider': + widget.minWidth = 380; + widget.minHeight = 30; + widget.width = 400; + widget.height = 50; + widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation + break; + case 'Gauge': + widget.simulator = defaultSimulator; + widget.signal = 0; + widget.minWidth = 200; + widget.minHeight = 150; + widget.width = 200; + widget.height = 150; + break; + default: + widget.width = 100; + widget.height = 100; + } + return widget; + } +} + +export default WidgetFactory; \ No newline at end of file diff --git a/src/containers/visualization.js b/src/containers/visualization.js index c82d56d..7328205 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -12,6 +12,7 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import { ContextMenu, MenuItem } from 'react-contextmenu'; +import WidgetFactory from '../components/widget-factory'; import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; import Widget from './widget'; @@ -25,8 +26,6 @@ import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; -import WidgetSlider from '../components/widget-slider'; - class Visualization extends Component { static getStores() { return [ VisualizationStore, ProjectStore, SimulationStore, FileStore ]; @@ -129,17 +128,8 @@ class Visualization extends Component { } handleDrop(item, position) { - // add new widget - var widget = { - name: 'Name', - type: item.name, - width: 100, - height: 100, - x: position.x, - y: position.y, - z: 0 - }; + let widget = null; let defaultSimulator = null; if (this.state.simulation.models && this.state.simulation.models.length === 0) { @@ -148,69 +138,8 @@ class Visualization extends Component { defaultSimulator = this.state.simulation.models[0].simulator; } - // set type specific properties - if (item.name === 'Value') { - widget.simulator = defaultSimulator; - widget.signal = 0; - widget.minWidth = 70; - widget.minHeight = 20; - widget.width = 120; - widget.height = 70; - } else if (item.name === 'Plot') { - widget.simulator = defaultSimulator; - widget.signals = [ 0 ]; - widget.time = 60; - widget.minWidth = 400; - widget.minHeight = 200; - widget.width = 400; - widget.height = 200; - } else if (item.name === 'Table') { - widget.simulator = defaultSimulator; - widget.minWidth = 300; - widget.minHeight = 200; - widget.width = 400; - widget.height = 200; - } else if (item.name === 'Label') { - widget.minWidth = 70; - widget.minHeight = 20; - } else if (item.name === 'PlotTable') { - widget.simulator = defaultSimulator; - widget.preselectedSignals = []; - widget.signals = []; // initialize selected signals - widget.minWidth = 400; - widget.minHeight = 300; - widget.width = 500; - widget.height = 500; - widget.time = 60 - } else if (item.name === 'Image') { - widget.minWidth = 100; - widget.minHeight = 100; - widget.width = 200; - widget.height = 200; - } else if (item.name === 'Button') { - widget.minWidth = 100; - widget.minHeight = 50; - widget.width = 100; - widget.height = 100; - } else if (item.name === 'NumberInput') { - widget.minWidth = 200; - widget.minHeight = 50; - widget.width = 200; - widget.height = 50; - } else if (item.name === 'Slider') { - widget.minWidth = 380; - widget.minHeight = 30; - widget.width = 400; - widget.height = 50; - widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation - } else if (item.name === 'Gauge') { - widget.simulator = defaultSimulator; - widget.signal = 0; - widget.minWidth = 200; - widget.minHeight = 150; - widget.width = 200; - widget.height = 150; - } + // create new widget + widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulator); var new_widgets = this.state.visualization.widgets; From 00f6739241e950dbffa63b8ea551d209c59ee31b Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 10:39:31 +0200 Subject: [PATCH 138/556] Missing sim model handling in signal edit control --- .../dialog/edit-widget-signal-control.js | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index fd2cd5e..879052b 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -27,24 +27,29 @@ class EditWidgetSignalControl extends Component { } render() { - // get selected simulation model - var simulationModel = {}; + let signalsToRender = []; if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); + // get selected simulation model + const simulationModel = this.props.simulation.models.find( model => model.simulation === this.state.widget.simulation ); + + // If simulation model update the signals to render + signalsToRender = simulationModel? simulationModel.mapping : []; } return ( Signal this.props.handleChange(e)}> - {simulationModel.mapping.map((signal, index) => ( - - ))} + { + signalsToRender.length === 0 ? ( + + ) : ( + signalsToRender.map((signal, index) => ( + + )) + ) + } ); From 0cba63991aa1413de5fffb3fe03893b7caefe385 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Apr 2017 11:12:04 +0200 Subject: [PATCH 139/556] Revert "Merge branch 'additional-widgets' into 'develop'" This reverts merge request !5 --- package.json | 4 +- .../dialog/edit-widget-orientation.js | 61 ---- .../dialog/edit-widget-signal-control.js | 54 ---- .../dialog/edit-widget-signal-type-control.js | 64 ---- .../dialog/edit-widget-signals-control.js | 68 ----- .../dialog/edit-widget-simulator-control.js | 44 --- src/components/dialog/edit-widget.js | 22 +- src/components/widget-button.js | 33 -- src/components/widget-gauge.js | 110 ------- src/components/widget-number-input.js | 69 ----- src/components/widget-plot-table.js | 160 +++++----- src/components/widget-plot.js | 93 ++++-- src/components/widget-plot/plot-legend.js | 31 -- src/components/widget-plot/plot.js | 115 ------- src/components/widget-slider.js | 73 ----- src/components/widget-table.js | 4 +- src/containers/visualization.js | 57 +--- src/containers/widget.js | 30 +- src/styles/widgets.css | 287 ++---------------- 19 files changed, 171 insertions(+), 1208 deletions(-) delete mode 100644 src/components/dialog/edit-widget-orientation.js delete mode 100644 src/components/dialog/edit-widget-signal-control.js delete mode 100644 src/components/dialog/edit-widget-signal-type-control.js delete mode 100644 src/components/dialog/edit-widget-signals-control.js delete mode 100644 src/components/dialog/edit-widget-simulator-control.js delete mode 100644 src/components/widget-button.js delete mode 100644 src/components/widget-gauge.js delete mode 100644 src/components/widget-number-input.js delete mode 100644 src/components/widget-plot/plot-legend.js delete mode 100644 src/components/widget-plot/plot.js delete mode 100644 src/components/widget-slider.js diff --git a/package.json b/package.json index 7d9df16..0116f0a 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,7 @@ "react-notification-system": "^0.2.13", "react-rnd": "^4.2.2", "react-router": "^3.0.2", - "superagent": "^3.5.0", - "gaugeJS": "^1.3.2", - "d3-scale": "^1.0.5" + "superagent": "^3.5.0" }, "devDependencies": { "react-scripts": "0.9.3" diff --git a/src/components/dialog/edit-widget-orientation.js b/src/components/dialog/edit-widget-orientation.js deleted file mode 100644 index 76aa874..0000000 --- a/src/components/dialog/edit-widget-orientation.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * File: edit-widget-orientation.js - * Author: Ricardo Hernandez-Montoya - * Date: 10.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; - -import WidgetSlider from '../widget-slider'; - -class EditWidgetOrientation extends Component { - constructor(props) { - super(props); - - this.state = { - widget: {} - }; - } - - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); - } - - handleOrientationChange(orientation) { - this.props.handleChange({ target: { id: 'orientation', value: orientation } }); - } - - render() { - - // The tag shouldn't be necessary, but it gives height to the row while combining horizontal and vertical forms - return ( - - - - Orientation - - - { - Object.keys(WidgetSlider.OrientationTypes).map( (type) => { - let value = WidgetSlider.OrientationTypes[type].value; - let name = WidgetSlider.OrientationTypes[type].name; - - return ( - this.handleOrientationChange(value)}> - { name } - ) - }) - } - - - - ); - } -} - -export default EditWidgetOrientation; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js deleted file mode 100644 index fd2cd5e..0000000 --- a/src/components/dialog/edit-widget-signal-control.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * File: edit-widget-signal-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -class EditWidgetSignalControl extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '' - } - }; - } - - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - return ( - - Signal - this.props.handleChange(e)}> - {simulationModel.mapping.map((signal, index) => ( - - ))} - - - ); - } -} - -export default EditWidgetSignalControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-signal-type-control.js b/src/components/dialog/edit-widget-signal-type-control.js deleted file mode 100644 index 8978186..0000000 --- a/src/components/dialog/edit-widget-signal-type-control.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * File: edit-widget-signal-type-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -class EditWidgetSignalTypeControl extends Component { - constructor(props) { - super(props); - - this.state = { - widget: {} - }; - } - - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - // Obtain unique signal types with the help of dictionary keys - var signalTypes = Object.keys(simulationModel.mapping.reduce( (collection, signal) => { - var lower = signal.type.toLowerCase(); - collection[lower] = ''; - return collection; - }, {})); - - var capitalize = (str) => { return str.charAt(0).toUpperCase() + str.slice(1); } - - var selectedValue = signalTypes.includes(this.state.widget.signalType) ? this.state.widget.signalType : ''; - - return ( - - Signal type - this.props.handleChange(e)}> - - {signalTypes.map((type, index) => ( - - ))} - - - ); - } -} - -export default EditWidgetSignalTypeControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js deleted file mode 100644 index 2842618..0000000 --- a/src/components/dialog/edit-widget-signals-control.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * File: edit-widget-signals-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, Checkbox, ControlLabel } from 'react-bootstrap'; - -class EditWidgetSignalsControl extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '', - preselectedSignals: [] - } - }; - } - - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); - } - - handleSignalChange(checked, index) { - var signals = this.state.widget.preselectedSignals; - var new_signals; - - if (checked) { - // add signal - new_signals = signals.concat(index); - } else { - // remove signal - new_signals = signals.filter( (idx) => idx !== index ); - } - - this.props.handleChange({ target: { id: 'preselectedSignals', value: new_signals } }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - return ( - - Signals - {simulationModel.mapping.map((signal, index) => ( - this.handleSignalChange(e.target.checked, index)}>{signal.name} - ))} - - ); - } -} - -export default EditWidgetSignalsControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js deleted file mode 100644 index baa9679..0000000 --- a/src/components/dialog/edit-widget-simulator-control.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * File: edit-widget-simulator-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -class EditWidgetSimulatorControl extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '' - } - }; - } - - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); - } - - render() { - - return ( - - Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( - - ))} - - - ); - } -} - -export default EditWidgetSimulatorControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index a5a2daa..2b7a21e 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -16,10 +16,6 @@ import EditValueWidget from './edit-widget-value'; import EditPlotWidget from './edit-widget-plot'; import EditTableWidget from './edit-widget-table'; import EditImageWidget from './edit-widget-image'; -import EditWidgetSimulatorControl from './edit-widget-simulator-control'; -import EditWidgetSignalControl from './edit-widget-signal-control'; -import EditWidgetSignalsControl from './edit-widget-signals-control'; -import EditWidgetOrientation from './edit-widget-orientation'; class EditWidgetDialog extends Component { static propTypes = { @@ -79,8 +75,6 @@ class EditWidgetDialog extends Component { render() { // get widget part var widgetDialog = null; - // Use a list to concatenate the controls according to the widget type - var dialogControls = []; if (this.props.widget) { if (this.props.widget.type === 'Value') { @@ -91,20 +85,6 @@ class EditWidgetDialog extends Component { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; } else if (this.props.widget.type === 'Image') { widgetDialog = this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />; - } else if (this.props.widget.type === 'Gauge') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'PlotTable') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'Slider') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - ) } } @@ -116,7 +96,7 @@ class EditWidgetDialog extends Component { this.handleChange(e)} /> - { dialogControls } + {widgetDialog} diff --git a/src/components/widget-button.js b/src/components/widget-button.js deleted file mode 100644 index 72f33fa..0000000 --- a/src/components/widget-button.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * File: widget-button.js - * Author: Ricardo Hernandez-Montoya - * Date: 29.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; - -class WidgetButton extends Component { - - action(e) { - e.target.blur(); // Remove focus - console.log('Button widget action'); - } - - render() { - return ( -
    - { this.props.editing ? ( - - ) : ( - - ) - } -
    - ); - } -} - -export default WidgetButton; \ No newline at end of file diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js deleted file mode 100644 index a61c3e8..0000000 --- a/src/components/widget-gauge.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * File: widget-gauge.js - * Author: Ricardo Hernandez-Montoya - * Date: 31.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { Gauge } from 'gaugeJS'; - -class WidgetGauge extends Component { - constructor(props) { - super(props); - - this.gaugeCanvas = null; - this.gauge = null; - - this.state = { - value: 0 - }; - } - - staticLabels(widget_height) { - var label_font_size = widget_height * 0.055; // font scaling factor - return { - font: label_font_size + 'px "Helvetica Neue"', - labels: [0.0, 0.1, 0.5, 0.9, 1.0], - color: "#000000", - fractionDigits: 1 - } - } - - computeGaugeOptions(widget_height) { - return { - angle: -0.25, - lineWidth: 0.2, - pointer: { - length: 0.6, - strokeWidth: 0.035 - }, - radiusScale: 0.9, - colorStart: '#6EA2B0', - colorStop: '#6EA2B0', - strokeColor: '#E0E0E0', - highDpiSupport: true, - staticLabels: this.staticLabels(widget_height) - }; - } - - componentDidMount() { - const opts = this.computeGaugeOptions(this.props.widget.height); - this.gauge = new Gauge(this.gaugeCanvas).setOptions(opts); - this.gauge.maxValue = 1; - this.gauge.setMinValue(0); - this.gauge.animationSpeed = 30; - this.gauge.set(this.state.value); - } - - componentWillUpdate() { - // Update labels after possible resize - this.gauge.setOptions({ staticLabels: this.staticLabels(this.props.widget.height) }); - } - - componentDidUpdate() { - // update gauge's value - this.gauge.set(this.state.value); - } - - componentWillReceiveProps(nextProps) { - // update value - const simulator = nextProps.widget.simulator; - - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { - this.setState({ value: 0 }); - return; - } - - // check if value has changed - const signal = nextProps.data[simulator].values[nextProps.widget.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 - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; - if (this.state.value !== new_value) { - this.setState({ value: new_value }); - } - } - - render() { - var componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; - var signalType = null; - - if (this.props.simulation) { - var simulationModel = this.props.simulation.models.filter((model) => model.simulator === this.props.widget.simulator)[0]; - signalType = simulationModel && simulationModel.length > 0? simulationModel.mapping[this.props.widget.signal].type : ''; - } - - return ( -
    -
    { this.props.widget.name }
    - this.gaugeCanvas = node } /> -
    { signalType }
    -
    { this.state.value }
    -
    - ); - } -} - -export default WidgetGauge; diff --git a/src/components/widget-number-input.js b/src/components/widget-number-input.js deleted file mode 100644 index 13061bb..0000000 --- a/src/components/widget-number-input.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * File: widget-number-input.js - * Author: Ricardo Hernandez-Montoya - * Date: 29.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { Form, FormGroup, Col, ControlLabel, FormControl } from 'react-bootstrap'; - -class WidgetNumberInput extends Component { - - static whichValidationStateIs( condition ) { - switch(condition) { - case 'ok': return null; - case 'error': return 'error'; - default: return 'error'; - } - } - - constructor(props) { - super(props); - - this.state = { - value: '', - validationState: WidgetNumberInput.whichValidationStateIs('ok') - }; - } - - validateInput(e) { - if (e.target.value === '' || e.target.value.endsWith('.')) { - this.setState({ - validationState: WidgetNumberInput.whichValidationStateIs('ok'), - value: e.target.value }); - } else { - var num = Number(e.target.value); - if (Number.isNaN(num)) { - this.setState({ validationState: WidgetNumberInput.whichValidationStateIs('error'), - value: e.target.value }); - } else { - this.setState({ - validationState: WidgetNumberInput.whichValidationStateIs('ok'), - value: num }); - } - } - } - - render() { - return ( -
    -
    - - - {this.props.widget.name} - - - this.validateInput(e) } placeholder="Enter value" value={ this.state.value } /> - - - -
    -
    - ); - } -} - -export default WidgetNumberInput; \ No newline at end of file diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index cbdee75..5305ff8 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -8,133 +8,109 @@ **********************************************************************************/ import React, { Component } from 'react'; -import classNames from 'classnames'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { LineChart } from 'rd3'; -import Plot from './widget-plot/plot'; -import PlotLegend from './widget-plot/plot-legend'; +import { ButtonGroup, Button } from 'react-bootstrap'; class WidgetPlotTable extends Component { constructor(props) { super(props); this.state = { - preselectedSignals: [], - signals: [] + size: { w: 0, h: 0 }, + signal: 0, + firstTimestamp: 0, + latestTimestamp: 0, + sequence: null, + rows: [], + values: [] }; } componentWillReceiveProps(nextProps) { + // check data + const simulator = nextProps.widget.simulator; - // Update internal selected signals state with props (different array objects) - if (this.props.widget.signals !== nextProps.widget.signals) { - this.setState( {signals: nextProps.widget.signals}); - } + // plot size + this.setState({ size: { w: this.props.widget.width - 100, h: this.props.widget.height - 20 }}); - // Identify if there was a change in the preselected signals - if (nextProps.simulation && (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.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); - this.setState({ signals: intersection }); - - this.updatePreselectedSignalsState(nextProps); + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + // clear values + this.setState({ values: [], sequence: null, rows: [] }); return; } - } - - // 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(nextProps) { - const simulator = nextProps.widget.simulator; + // check if new data, otherwise skip + if (this.state.sequence >= nextProps.data[simulator].sequence) { + return; + } // get simulation model const simulationModel = nextProps.simulation.models.find((model) => { return (model.simulator === simulator); }); - // Create checkboxes using the signal indices from simulation model - const preselectedSignals = simulationModel.mapping.reduce( - // 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) { - accum.push( - { - index: signal_index, - name: model_signal.name - } - ) - } - return accum; - }, []); - this.setState({ preselectedSignals: preselectedSignals }); - } + // get rows + var rows = []; - 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 ) + simulationModel.mapping.forEach((signal) => { + rows.push({ name: signal.name }) }); - this.props.onWidgetChange(new_widget); - } - render() { - var checkBoxes = []; + // get timestamps + var latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; + var firstTimestamp = latestTimestamp - nextProps.widget.time * 1000; + var firstIndex; - // Data passed to plot - let simulator = this.props.widget.simulator; - let simulatorData = this.props.data[simulator]; - - if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { - // Create checkboxes using the signal indices from simulation model - checkBoxes = this.state.preselectedSignals.map( (signal) => { - var checked = this.state.signals.indexOf(signal.index) > -1; - var chkBxClasses = classNames({ - 'btn': true, - 'btn-default': true, - 'active': checked - }); - return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } - }); + if (nextProps.data[simulator].values[0][0].x < firstTimestamp) { + // find element index representing firstTimestamp + firstIndex = nextProps.data[simulator].values[0].findIndex((value) => { + return value.x >= firstTimestamp; + }); + } else { + firstIndex = 0; + firstTimestamp = nextProps.data[simulator].values[0][0].x; + latestTimestamp = firstTimestamp + nextProps.widget.time * 1000; } - // Prepare an array with the signals to show in the legend - var legendSignals = this.state.preselectedSignals.reduce( (accum, signal, i) => { - if (this.state.signals.includes(signal.index)) { - accum.push({ - index: signal.index, - name: signal.name - }) - } - return accum; - }, []); + // copy all values for each signal in time region + var values = [{ + values: nextProps.data[simulator].values[this.state.signal].slice(firstIndex, nextProps.data[simulator].values[this.state.signal].length - 1) + }]; + this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, rows: rows }); + } + + render() { + console.log("Signal: " + this.state.signal); return ( -
    +

    {this.props.widget.name}

    -
    -
    - { checkBoxes.length > 0 ? ( - - { checkBoxes } - - ) : ( No signal found, select a different signal type. ) +
    + + { this.state.rows.map( (row, index) => ( + + )) } -
    - -
    - -
    + +
    + +
    + {this.state.sequence && + { if (d != null) { return new Date(d.x); } }} + hoverAnimation={false} + circleRadius={0} + domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} + /> + }
    -
    ); diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index df901c9..96de856 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -8,40 +8,81 @@ **********************************************************************************/ import React, { Component } from 'react'; - -import Plot from './widget-plot/plot'; -import PlotLegend from './widget-plot/plot-legend'; +import { LineChart } from 'rd3'; class WidgetPlot extends Component { + constructor(props) { + super(props); + + this.state = { + values: [], + firstTimestamp: 0, + latestTimestamp: 0, + sequence: null + }; + } + + componentWillReceiveProps(nextProps) { + // check data + const simulator = nextProps.widget.simulator; + + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + // clear values + this.setState({ values: [], sequence: null }); + return; + } + + // check if new data, otherwise skip + if (this.state.sequence >= nextProps.data[simulator].sequence) { + return; + } + + // get timestamps + var latestTimestamp = nextProps.data[simulator].values[0][nextProps.data[simulator].values[0].length - 1].x; + var firstTimestamp = latestTimestamp - nextProps.widget.time * 1000; + var firstIndex; + + if (nextProps.data[simulator].values[0][0].x < firstTimestamp) { + // find element index representing firstTimestamp + firstIndex = nextProps.data[simulator].values[0].findIndex((value) => { + return value.x >= firstTimestamp; + }); + } else { + firstIndex = 0; + firstTimestamp = nextProps.data[simulator].values[0][0].x; + latestTimestamp = firstTimestamp + nextProps.widget.time * 1000; + } + + // copy all values for each signal in time region + var values = []; + + nextProps.widget.signals.forEach((signal) => { + values.push({ + values: nextProps.data[simulator].values[signal].slice(firstIndex, nextProps.data[simulator].values[signal].length - 1) + }); + }); + + this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence }); + } render() { - if (this.props.simulation == null) { + if (this.state.sequence == null) { return (
    Empty
    ); } - let simulator = this.props.widget.simulator; - let simulation = this.props.simulation; - let model = simulation.models.find( (model) => model.simulator === simulator ); - let chosenSignals = this.props.widget.signals; - - let simulatorData = this.props.data[simulator]; - - // Query the signals that will be displayed in the legend - let legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { - if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: model_signal.name }); - } - return accum; - }, []); - return ( -
    -

    {this.props.widget.name}

    - -
    - -
    - +
    + { if (d != null) { return new Date(d.x); } }} + hoverAnimation={false} + circleRadius={0} + domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} + />
    ); } diff --git a/src/components/widget-plot/plot-legend.js b/src/components/widget-plot/plot-legend.js deleted file mode 100644 index 3771a5c..0000000 --- a/src/components/widget-plot/plot-legend.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * File: plot-legend.js - * Author: Ricardo Hernandez-Montoya - * Date: 10.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; - -class PlotLegend extends Component { - // constructor(props) { - // super(props); - // } - - render() { - var colorScale = scaleOrdinal(schemeCategory10); - - return ( -
    - { this.props.signals.map( (signal) => -
       {signal.name}
    ) - } -
    - ); - } -} - -export default PlotLegend; \ No newline at end of file diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js deleted file mode 100644 index bb5ff01..0000000 --- a/src/components/widget-plot/plot.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * File: plot.js - * Author: Ricardo Hernandez-Montoya - * Date: 10.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { LineChart } from 'rd3'; -import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; - -class Plot extends Component { - constructor(props) { - super(props); - - this.chartWrapper = null; - - this.state = { - size: { w: 0, h: 0 }, - firstTimestamp: 0, - latestTimestamp: 0, - sequence: null, - values: [] - }; - } - - componentWillReceiveProps(nextProps) { - let nextData = nextProps.simulatorData; - - // handle plot size - const w = this.chartWrapper.offsetWidth - 20; - const h = this.chartWrapper.offsetHeight - 20; - const currentSize = this.state.size; - if (w !== currentSize.w || h !== currentSize.h) { - this.setState({size: { w, h } }); - } - - // Identify simulation reset - if (nextData == null || nextData.length === 0 || nextData.values[0].length === 0) { - // clear values - this.setState({ values: [], sequence: null }); - return; - } - - // check if new data, otherwise skip - if (this.state.sequence >= nextData.sequence) { - return; - } - - this.updatePlotData(nextProps); - - } - - updatePlotData(nextProps) { - let nextData = nextProps.simulatorData; - - // get timestamps - var latestTimestamp = nextData.values[0][nextData.values[0].length - 1].x; - var firstTimestamp = latestTimestamp - nextProps.time * 1000; - var firstIndex; - - if (nextData.values[0][0].x < firstTimestamp) { - // find element index representing firstTimestamp - firstIndex = nextData.values[0].findIndex((value) => { - return value.x >= firstTimestamp; - }); - } else { - firstIndex = 0; - firstTimestamp = nextData.values[0][0].x; - latestTimestamp = firstTimestamp + nextProps.time * 1000; - } - - // copy all values for each signal in time region - var values = []; - nextProps.signals.forEach((signal_index, i, arr) => ( - // Include signal index, useful to relate them to the signal selection - values.push( - { - index: signal_index, - values: nextData.values[signal_index].slice(firstIndex, nextData.values[signal_index].length - 1)}) - )); - - this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextData.sequence }); - } - - render() { - // Make tick count proportional to the plot width using a rough scale ratio - var tickCount = Math.round(this.state.size.w / 80); - - return ( -
    this.chartWrapper = domNode }> - {this.state.sequence && - { if (d != null) { return new Date(d.x); } }} - xAxisTickCount={ tickCount } - hoverAnimation={false} - circleRadius={0} - domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} - /> - } -
    - ); - } - -} - -export default Plot; \ No newline at end of file diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js deleted file mode 100644 index 40f890f..0000000 --- a/src/components/widget-slider.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * File: widget-slider.js - * Author: Ricardo Hernandez-Montoya - * Date: 30.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import classNames from 'classnames'; - -class WidgetSlider extends Component { - - static get OrientationTypes() { - return ({ - HORIZONTAL: {value: 0, name: 'Horizontal'}, - VERTICAL: {value: 1, name: 'Vertical'} - }) - } - - constructor(props) { - super(props); - - this.state = { - value: 50 - }; - } - - valueChanged(e) { - this.setState({ value: e.target.value }); - } - - render() { - let fields = { - 'name': this.props.widget.name, - 'control': this.valueChanged(e) } defaultValue={ this.state.value }/>, - 'value': this.state.value - } - - let vertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; - var widgetClasses = classNames({ - 'slider-widget': true, - 'full': true, - 'vertical': vertical, - 'horizontal': !vertical - }); - - return ( - this.props.widget.orientation === WidgetSlider.OrientationTypes.HORIZONTAL.value? ( -
    -
    - -
    -
    - { fields.control } - { fields.value } -
    -
    - ) : ( -
    -
    - - { fields.value } -
    -
    { fields.control }
    -
    - ) - ); - } -} - -export default WidgetSlider; \ No newline at end of file diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 91e59de..071c084 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -48,7 +48,7 @@ class WidgetTable extends Component { nextProps.data[simulator].values.forEach((signal, index) => { rows.push({ name: simulationModel.mapping[index].name, - value: signal[signal.length - 1].y.toFixed(3) + value: signal[signal.length - 1].y }) }); @@ -57,7 +57,7 @@ class WidgetTable extends Component { render() { return ( -
    +

    {this.props.widget.name}

    diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 6085b06..9d108fa 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -23,8 +23,6 @@ import SimulationStore from '../stores/simulation-store'; import FileStore from '../stores/file-store'; import AppDispatcher from '../app-dispatcher'; -import WidgetSlider from '../components/widget-slider'; - class Visualization extends Component { static getStores() { return [ VisualizationStore, ProjectStore, SimulationStore, FileStore ]; @@ -144,8 +142,6 @@ class Visualization extends Component { widget.signal = 0; widget.minWidth = 70; widget.minHeight = 20; - widget.width = 120; - widget.height = 70; } else if (item.name === 'Plot') { widget.simulator = this.state.simulation.models[0].simulator; widget.signals = [ 0 ]; @@ -165,41 +161,16 @@ class Visualization extends Component { widget.minHeight = 20; } else if (item.name === 'PlotTable') { widget.simulator = this.state.simulation.models[0].simulator; - widget.preselectedSignals = []; - widget.signals = []; // initialize selected signals widget.minWidth = 400; - widget.minHeight = 300; + widget.minHeight = 200; widget.width = 500; - widget.height = 500; + widget.height = 400; widget.time = 60 } else if (item.name === 'Image') { widget.minWidth = 100; widget.minHeight = 100; widget.width = 200; widget.height = 200; - } else if (item.name === 'Button') { - widget.minWidth = 100; - widget.minHeight = 50; - widget.width = 100; - widget.height = 100; - } else if (item.name === 'NumberInput') { - widget.minWidth = 200; - widget.minHeight = 50; - widget.width = 200; - widget.height = 50; - } else if (item.name === 'Slider') { - widget.minWidth = 380; - widget.minHeight = 30; - widget.width = 400; - widget.height = 50; - widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation - } else if (item.name === 'Gauge') { - widget.simulator = this.state.simulation.models[0].simulator; - widget.signal = 0; - widget.minWidth = 200; - widget.minHeight = 150; - widget.width = 200; - widget.height = 150; } var new_widgets = this.state.visualization.widgets; @@ -213,12 +184,7 @@ class Visualization extends Component { this.setState({ visualization: visualization }); } - 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) { + widgetChange(updated_widget, key) { var widgets_update = {}; widgets_update[key] = updated_widget; @@ -227,7 +193,7 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets }); - this.setState({ visualization: visualization }, callback); + this.setState({ visualization: visualization }); } editWidget(e, data) { @@ -260,11 +226,6 @@ class Visualization extends Component { this.setState({ visualization: visualization }); } - stopEditing() { - // Provide the callback so it can be called when state change is applied - this.setState({ editing: false }, this.saveChanges ); - } - saveChanges() { // Transform to a list var visualization = Object.assign({}, this.state.visualization, { @@ -275,6 +236,8 @@ class Visualization extends Component { type: 'visualizations/start-edit', data: visualization }); + + this.setState({ editing: false }); } discardChanges() { @@ -351,7 +314,7 @@ class Visualization extends Component { {this.state.editing ? (
    -
    } 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.grid} /> + this.widgetChange(w, k)} editing={this.state.editing} index={widget_key} grid={this.state.grid} /> ))} diff --git a/src/containers/widget.js b/src/containers/widget.js index 8f17940..7aa540f 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -11,7 +11,6 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { ContextMenuTrigger } from 'react-contextmenu'; import Rnd from 'react-rnd'; -import classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; import SimulatorDataStore from '../stores/simulator-data-store'; @@ -23,10 +22,6 @@ import WidgetTable from '../components/widget-table'; import WidgetLabel from '../components/widget-label'; import WidgetPlotTable from '../components/widget-plot-table'; import WidgetImage from '../components/widget-image'; -import WidgetButton from '../components/widget-button'; -import WidgetNumberInput from '../components/widget-number-input'; -import WidgetSlider from '../components/widget-slider'; -import WidgetGauge from '../components/widget-gauge'; import '../styles/widgets.css'; @@ -118,7 +113,6 @@ class Widget extends Component { // get widget element const widget = this.props.data; - var borderedWidget = false; var element = null; // dummy is passed to widgets to keep updating them while in edit mode @@ -126,34 +120,16 @@ class Widget extends Component { element = } else if (widget.type === 'Plot') { element = - borderedWidget = true; } else if (widget.type === 'Table') { element = } else if (widget.type === 'Label') { element = - borderedWidget = true; } else if (widget.type === 'PlotTable') { - element = this.props.onWidgetStatusChange(w, this.props.index) } /> - borderedWidget = true; + element = } else if (widget.type === 'Image') { element = - borderedWidget = true; - } else if (widget.type === 'Button') { - element = - } else if (widget.type === 'NumberInput') { - element = - } else if (widget.type === 'Slider') { - element = - } else if (widget.type === 'Gauge') { - element = } - let widgetClasses = classNames({ - 'widget': !this.props.editing, - 'editing-widget': this.props.editing, - 'border': borderedWidget - }); - if (this.props.editing) { return ( this.borderWasClicked(event) } onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} onDragStop={(event, ui) => this.dragStop(event, ui)} @@ -177,7 +153,7 @@ class Widget extends Component { ); } else { return ( -
    +
    {element}
    ); diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c8b5678..c6a9c91 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -8,20 +8,14 @@ **********************************************************************************/ .widget { - background-color: #fff; -} - -.border { - border: 1px solid lightgray; + border: 1px solid lightgray; + padding: 3px 6px; + background-color: #fff; } .editing-widget { - background-color: #fff; -} - -.editing-widget:not(.border):hover { - outline: 1px solid lightgray; - outline-offset: -10px; + border: 1px solid lightgray; + background-color: #fff; } /* Area to trigger the context menu */ @@ -102,15 +96,21 @@ right: 7px; } -/* Reset Bootstrap styles to "disable" while editing */ -div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input[disabled], .form-control[disabled], .checkbox.disabled label { - cursor: inherit; - pointer-events: none; +.plot-table-widget .content { + display: -webkit-flex; + display: flex; } -.editing-widget .btn-default.disabled { - background-color: #abcfd8; - border-color: #ccc; +.plot-table-widget .widget-table { + min-width: 100px; + display: flex; + flex-direction: column; + justify-content: center; +} + +/* Reset Bootstrap styles to "disable" while editing */ +.plot-table-widget .widget-table .btn[disabled] { + cursor: inherit; } .btn-default[disabled]:hover { @@ -123,253 +123,8 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input border-color: #adadad; } /* End reset */ - - /* Match Bootstrap's them to VILLAS */ -.widget .btn-default.active { - background-color: #abcfd8; -} - -.widget .btn-default.active:hover, .widget .btn-default.active:hover { - background-color: #89b3bd; -} - -.widget .btn-default:hover { - background-color: #abcfd8; -} -/* End match */ - -/* 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; -} - -.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; -} .plot-table-widget .widget-plot { - -webkit-flex: 1 1 auto; - flex: 1 1 auto; -} -/* End PlotTable Widget */ - -/* Plot Widget */ -.plot-widget { - display: -webkit-flex; - display: flex; - flex-direction: column; -} - -.plot-widget .widget-plot { - -webkit-flex: 1 1 auto; - flex: 1 1 auto; -} -/* End Plot Widget */ - -/* Plots */ -.chart-wrapper { - height: 100%; - width: 100%; -} - -.plot-legend { - display: -webkit-flex; - display: flex; - flex-wrap: wrap; - justify-content: space-around; - margin-bottom: 5px; -} - -.signal-legend { - font-size: 0.8em; - font-weight: 700; - overflow-x: hidden; -} - -.legend-color { - height: 50%; - display: inline-block; - vertical-align: middle; -} - -/* End Plots */ - -/*.single-value-widget { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 95%; - height: 95%; -}*/ - -.single-value-widget { - width: 100%; - height: 100%; - display: flex; - justify-content: center; - align-items: center; -} - -.single-value-widget > * { - width: 50%; - float: left; - margin: 5px; - font-size: 1vw; -} - -/* Button widget styling */ -.button-widget button { - border-radius: 25px; - border-style: double; - border-width: 5px; - overflow-x: hidden; -} - -.button-widget button:hover { - border-style: double; -} -/* End button widget styling */ - -.full { - width: 100%; - height: 100%; -} - -/* Number input widget */ -div[class*="-widget"] label { - cursor: inherit; -} -/* End number input widget */ - -/* Slider widget */ -.slider-widget.vertical input[type="range"] { - position: absolute; - top: 40%; - left: 50%; - transform: rotate(270deg); - /*margin-left: 20px;*/ - width: 150px; -} - -input[type=range]::-moz-range-thumb { - background: #ffffff; -} - -input[type=range]::-webkit-slider-thumb { - background: #ffffff; -} - -input[type=range]::-ms-thumb { - background: #ffffff; -} - -.slider-widget.horizontal div { - width: 50%; - display: inline-block; - text-align: center; - vertical-align: top; -} - -.slider-widget.horizontal span { - display: block; - margin: 5px; -} - -.slider-widget.vertical div { - width: 50%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-around; -} - -.slider-widget span { - font-size: 1.5em; - font-weight: 600; -} -/* End slider widget */ - -/* Gauge widget */ -.gauge-widget { - width: 100%; - height: 100%; -} - -.gauge-widget canvas { - width: 100%; - height: 90%; -} - -.gauge-name { - height: 10%; - width: 100%; - text-align: center; - font-weight: bold; -} - -.gauge-unit { - position: absolute; - width: 100%; - font-size: 1.0em; - bottom: 25%; - text-align: center; -} - -.gauge-value { - position: absolute; - width: 100%; - font-weight: bold; - font-size: 1.5em; - bottom: 10%; - text-align: center; -} -/* End gauge widget */ \ No newline at end of file + -webkit-flex: 1 0 auto; + flex: 1 0 auto; +} \ No newline at end of file From 6c28a1a77b43a23cdfbaa56fa4bf3d82c052503e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 13:42:26 +0200 Subject: [PATCH 140/556] outline-offset as Firefox-specific --- src/styles/widgets.css | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c8b5678..df4619e 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -19,9 +19,15 @@ background-color: #fff; } +/* Firefox-specific rules */ +@-moz-document url-prefix() { + .editing-widget:not(.border):hover { + outline-offset: -10px; + } +} + .editing-widget:not(.border):hover { outline: 1px solid lightgray; - outline-offset: -10px; } /* Area to trigger the context menu */ From ff77a43dedfec8477dd2f614bd3156199bd4b2d9 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 13:45:43 +0200 Subject: [PATCH 141/556] Missing classes --- src/components/widget-label.js | 4 +++- src/components/widget-value.js | 5 +++-- src/styles/widgets.css | 9 --------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/components/widget-label.js b/src/components/widget-label.js index 2c29650..0347778 100644 --- a/src/components/widget-label.js +++ b/src/components/widget-label.js @@ -12,7 +12,9 @@ import React, { Component } from 'react'; class WidgetLabel extends Component { render() { return ( -

    {this.props.widget.name}

    +
    +

    {this.props.widget.name}

    +
    ); } } diff --git a/src/components/widget-value.js b/src/components/widget-value.js index c096695..0eb7a9d 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -35,9 +35,10 @@ class WidgetValue extends Component { } render() { + var value_to_render = Number(this.state.value); return ( -
    - {this.props.widget.name}: {this.state.value} +
    + {this.props.widget.name} { Number.isNaN(value_to_render)? NaN : value_to_render.toFixed(3) }
    ); } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index df4619e..e69fae9 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -248,15 +248,6 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input /* End Plots */ -/*.single-value-widget { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 95%; - height: 95%; -}*/ - .single-value-widget { width: 100%; height: 100%; From be0fa587ab6f3fa3523f5e20050d2fdaa37234bd Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 14:39:01 +0200 Subject: [PATCH 142/556] Meaningful hint --- src/components/widget-plot-table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index cbdee75..a985221 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -126,7 +126,7 @@ class WidgetPlotTable extends Component { { checkBoxes } - ) : ( No signal found, select a different signal type. ) + ) : ( No signal has been pre-selected. ) }
    From e980245be59fd923e24acf396f1d9b90666ccadd Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 14:39:32 +0200 Subject: [PATCH 143/556] No overflow --- 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 e69fae9..0a4f286 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -237,7 +237,7 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input .signal-legend { font-size: 0.8em; font-weight: 700; - overflow-x: hidden; + overflow: hidden; } .legend-color { From fed600d2e90db083fe354951cdc54f2f9e4afc4b Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 13 Apr 2017 15:46:54 +0200 Subject: [PATCH 144/556] Dropped use of height percentage in column-oriented flex child (not supported by Chrome) --- src/styles/widgets.css | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 0a4f286..c449bf6 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -200,11 +200,6 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input .plot-table-widget input[type="checkbox"] { display: none; } - -.plot-table-widget .widget-plot { - -webkit-flex: 1 1 auto; - flex: 1 1 auto; -} /* End PlotTable Widget */ /* Plot Widget */ @@ -213,16 +208,17 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input display: flex; flex-direction: column; } - -.plot-widget .widget-plot { - -webkit-flex: 1 1 auto; - flex: 1 1 auto; -} /* End Plot Widget */ /* Plots */ +/* The plot container, in order to avoid 100% height/width */ +.widget-plot { + display: flex; + -webkit-flex: 1 1 auto; + flex: 1 1 auto; +} + .chart-wrapper { - height: 100%; width: 100%; } From 7eed1cdc54c537ee08a12c00d4d355c14a1c1f54 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 18 Apr 2017 14:03:33 +0200 Subject: [PATCH 145/556] let visualization area expand and shrink with new widgets --- src/containers/visualization.js | 68 ++++++++++++++++++++++++--------- src/styles/app.css | 18 ++++----- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 6085b06..813dae5 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -50,11 +50,13 @@ class Visualization extends Component { editModal: prevState.editModal || false, modalData: prevState.modalData || null, modalIndex: prevState.modalIndex || null, - + + maxWidgetHeight: prevState.maxWidgetHeight || 0, + dropZoneHeight: prevState.dropZoneHeight || 0, last_widget_key: prevState.last_widget_key || 0 }; } - + componentWillMount() { AppDispatcher.dispatch({ type: 'visualizations/start-load' @@ -116,6 +118,8 @@ class Visualization extends Component { widgets: tempVisualization.widgets? this.transformToWidgetsDict(tempVisualization.widgets) : {} }); + this.computeHeightWithWidgets(visualization.widgets); + this.setState({ visualization: visualization, project: null }); AppDispatcher.dispatch({ @@ -210,6 +214,8 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets }); + + this.increaseHeightWithWidget(widget); this.setState({ visualization: visualization }); } @@ -227,9 +233,48 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { 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.setState({ visualization: visualization }, callback); } + /* + * 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 + 40 + }); + } + /* + * 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(e, data) { this.setState({ editModal: true, modalData: this.state.visualization.widgets[data.key], modalIndex: data.key }); } @@ -324,25 +369,10 @@ class Visualization extends Component { } render() { - // calculate widget area height - var height = 0; - var current_widgets = this.state.visualization.widgets; - if (current_widgets) { - Object.keys(current_widgets).forEach( (widget_key) => { - var widget = current_widgets[widget_key]; - if (widget.y + widget.height > height) { - height = widget.y + widget.height; - } - }); - - // add padding - height += 40; - } - return ( -
    +
    @@ -383,7 +413,7 @@ class Visualization extends Component {
    } - this.handleDrop(item, position)} editing={this.state.editing}> + 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.grid} /> diff --git a/src/styles/app.css b/src/styles/app.css index f1972a0..a22bcaa 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -47,8 +47,7 @@ body { .app-footer { width: 100%; height: 60px; - position: absolute; - bottom: 0px; + float: right; padding-top: 20px; text-align: center; @@ -57,14 +56,12 @@ body { } .app-content { - position: absolute; - bottom: 0px; - top: 60px; - right: 0px; - left: 200px; - min-height: 400px; + display: flex; + float: right; + min-height: calc(100vh - 140px); + width: calc(100% - 220px); - margin: 20px 20px 60px 20px; + margin: 20px 20px 0px 20px; padding: 15px 20px; background-color: #fff; @@ -207,7 +204,8 @@ body { } .section { - height: 100%; + min-height: 100%; + width: 100%; } .section-header div { From 8e08dcf4e781496adea45687bdc8b8bc9d2abca4 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 18 Apr 2017 14:04:47 +0200 Subject: [PATCH 146/556] Update sections with css layout --- src/containers/project.js | 2 +- src/containers/projects.js | 2 +- src/containers/simulation.js | 2 +- src/containers/simulations.js | 2 +- src/containers/simulators.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 910eebe..48c42ba 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -136,7 +136,7 @@ class Visualizations extends Component { } return ( -
    +

    {this.state.project.name}

    diff --git a/src/containers/projects.js b/src/containers/projects.js index 4e6a4b6..84931f0 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -90,7 +90,7 @@ class Projects extends Component { render() { return ( -
    +

    Projects

    diff --git a/src/containers/simulation.js b/src/containers/simulation.js index b6f6c97..75c5877 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -119,7 +119,7 @@ class Simulation extends Component { render() { return ( -
    +

    {this.state.simulation.name}

    diff --git a/src/containers/simulations.js b/src/containers/simulations.js index dd80a71..f21c3cd 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -100,7 +100,7 @@ class Simulations extends Component { render() { return ( -
    +

    Simulations

    diff --git a/src/containers/simulators.js b/src/containers/simulators.js index a913f73..620ecc1 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -84,7 +84,7 @@ class Simulators extends Component { render() { return ( -
    +

    Simulators

    From 94bb086d5674de15b5a4971ff7062994c25b36d2 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 18 Apr 2017 16:20:01 +0200 Subject: [PATCH 147/556] more consisting widget sizes (handle overflow) --- src/styles/widgets.css | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c449bf6..6c8987a 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -9,6 +9,7 @@ .widget { background-color: #fff; + overflow: auto; } .border { @@ -37,7 +38,7 @@ position: absolute; top: 0px; left: 0px; - padding: 3px 6px; + overflow: auto; } .react-contextmenu { @@ -281,6 +282,10 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input div[class*="-widget"] label { cursor: inherit; } + +.number-input-widget .form-horizontal .form-group { + margin: 0px; +} /* End number input widget */ /* Slider widget */ @@ -339,7 +344,7 @@ input[type=range]::-ms-thumb { .gauge-widget canvas { width: 100%; - height: 90%; + height: 87%; } .gauge-name { From 3c60a4800c4fb68bda620b5c1e6627ac4084e3b4 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 19 Apr 2017 09:12:16 +0200 Subject: [PATCH 148/556] Allow locking aspect ratio (gauge) --- src/containers/visualization.js | 5 +++-- src/containers/widget.js | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 813dae5..ec9dc1e 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -200,10 +200,11 @@ class Visualization extends Component { } else if (item.name === 'Gauge') { widget.simulator = this.state.simulation.models[0].simulator; widget.signal = 0; - widget.minWidth = 200; + widget.minWidth = 150; widget.minHeight = 150; widget.width = 200; - widget.height = 150; + widget.height = 200; + widget.lockedAspectRatio = true; } var new_widgets = this.state.visualization.widgets; diff --git a/src/containers/widget.js b/src/containers/widget.js index 8f17940..d8c9e00 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -161,6 +161,7 @@ class Widget extends Component { initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} minWidth={ widget.minWidth } minHeight={ widget.minHeight } + lockAspectRatio={ widget.lockedAspectRatio } bounds={'parent'} className={ widgetClasses } onResizeStart={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } From 02011d6067389a372412e574371658eecfabb803 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 19 Apr 2017 15:46:23 +0200 Subject: [PATCH 149/556] Included slider library. Slider adapts to orientation changes --- package.json | 3 +- src/components/widget-slider.js | 63 +++++++++++++++------- src/containers/visualization.js | 7 ++- src/containers/widget.js | 2 +- src/styles/widgets.css | 92 ++++++++++++++++++++------------- 5 files changed, 108 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 7d9df16..1e6f8b1 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "react-router": "^3.0.2", "superagent": "^3.5.0", "gaugeJS": "^1.3.2", - "d3-scale": "^1.0.5" + "d3-scale": "^1.0.5", + "rc-slider": "^7.0.1" }, "devDependencies": { "react-scripts": "0.9.3" diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index 40f890f..2ea720c 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -9,6 +9,8 @@ import React, { Component } from 'react'; import classNames from 'classnames'; +import Slider from 'rc-slider'; +import 'rc-slider/assets/index.css'; class WidgetSlider extends Component { @@ -27,43 +29,68 @@ class WidgetSlider extends Component { }; } - valueChanged(e) { - this.setState({ value: e.target.value }); + componentWillReceiveProps(nextProps) { + // Update value + if (nextProps.widget.value && this.state.value !== nextProps.widget.value) { + this.setState({ value: nextProps.widget.value }) + } + // Check if the orientation changed, update the size if it did + if (this.props.widget.orientation !== nextProps.widget.orientation) { + let baseWidget = nextProps.widget; + // Exchange dimensions and constraints + let newWidget = Object.assign({}, baseWidget, { + width: baseWidget.height, + height: baseWidget.width, + minWidth: baseWidget.minHeight, + minHeight: baseWidget.minWidth, + maxWidth: baseWidget.maxHeight, + maxHeight: baseWidget.maxWidth + }); + nextProps.onWidgetChange(newWidget); + } + } + + valueIsChanging(newValue) { + this.setState({ value: newValue }); + } + + valueChanged(newValue) { + // Enable to propagate action + // let newWidget = Object.assign({}, this.props.widget, { + // value: newValue + // }); + // this.props.onWidgetChange(newWidget); } render() { + + let isVertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; + let fields = { 'name': this.props.widget.name, - 'control': this.valueChanged(e) } defaultValue={ this.state.value }/>, + 'control': this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, 'value': this.state.value } - let vertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; var widgetClasses = classNames({ 'slider-widget': true, 'full': true, - 'vertical': vertical, - 'horizontal': !vertical + 'vertical': isVertical, + 'horizontal': !isVertical }); return ( this.props.widget.orientation === WidgetSlider.OrientationTypes.HORIZONTAL.value? (
    -
    - -
    -
    - { fields.control } - { fields.value } -
    + +
    { fields.control }
    + { fields.value }
    ) : (
    -
    - - { fields.value } -
    -
    { fields.control }
    + + { fields.control } + { fields.value }
    ) ); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index ec9dc1e..84be870 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -192,8 +192,11 @@ class Visualization extends Component { widget.width = 200; widget.height = 50; } else if (item.name === 'Slider') { - widget.minWidth = 380; - widget.minHeight = 30; + // Set dimensions and constraints as Horizontal + widget.minWidth = 150; + widget.minHeight = 50; + widget.maxHeight = 51; + widget.maxWidth = 1000; widget.width = 400; widget.height = 50; widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation diff --git a/src/containers/widget.js b/src/containers/widget.js index d8c9e00..1b55f94 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -143,7 +143,7 @@ class Widget extends Component { } else if (widget.type === 'NumberInput') { element = } else if (widget.type === 'Slider') { - element = + element = this.props.onWidgetStatusChange(w, this.props.index) } /> } else if (widget.type === 'Gauge') { element = } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 6c8987a..aa57d12 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -288,52 +288,70 @@ div[class*="-widget"] label { } /* End number input widget */ -/* Slider widget */ -.slider-widget.vertical input[type="range"] { - position: absolute; - top: 40%; - left: 50%; - transform: rotate(270deg); - /*margin-left: 20px;*/ - width: 150px; -} - -input[type=range]::-moz-range-thumb { - background: #ffffff; -} - -input[type=range]::-webkit-slider-thumb { - background: #ffffff; -} - -input[type=range]::-ms-thumb { - background: #ffffff; -} - -.slider-widget.horizontal div { - width: 50%; - display: inline-block; - text-align: center; - vertical-align: top; -} - -.slider-widget.horizontal span { - display: block; - margin: 5px; -} - -.slider-widget.vertical div { - width: 50%; +/* Begin Slider widget */ +.slider-widget { display: flex; - flex-direction: column; align-items: center; justify-content: space-around; } +.slider-widget label { + flex: 0 0 auto; + text-align: center; +} + .slider-widget span { + text-align: center; font-size: 1.5em; font-weight: 600; } + +.slider-widget.horizontal .slider { + flex: 1 1 auto; +} + +.slider-widget.horizontal span { + flex: 0 0 50pt; +} + +.slider-widget.horizontal label { + padding-right: 10px; +} + +.slider-widget.vertical { + flex-direction: column; +} + +.slider-widget.vertical span { + padding-top: 10px; +} + +.slider-widget.vertical label { + padding-bottom: 10px; +} + +/* Begin Slider customization */ +.rc-slider-track { + background-color: #6EA2B0; +} + +.rc-slider-handle, .rc-slider-handle:hover { + border-color: #6EA2B0; +} + +.rc-slider-disabled { + background-color: inherit; +} + +.rc-slider-disabled .rc-slider-handle { + cursor: inherit; +} + +.rc-slider-disabled .rc-slider-handle:hover { + border-color:#ccc; +} +/* End Slider customization */ + /* End slider widget */ /* Gauge widget */ From 3859aa887bff2bb98262e427bee977709c93431a Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 19 Apr 2017 16:04:28 +0200 Subject: [PATCH 150/556] Center label widget content --- src/styles/widgets.css | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index aa57d12..04dd7f3 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -388,4 +388,10 @@ div[class*="-widget"] label { bottom: 10%; text-align: center; } -/* End gauge widget */ \ No newline at end of file +/* End gauge widget */ + +/* Begin label widget */ +.label-widget { + text-align: center; +} +/* End label widget */ \ No newline at end of file From 67d0e159bf1323e88116b790511ff9f83443fa39 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 19 Apr 2017 16:14:42 +0200 Subject: [PATCH 151/556] Center content in table widget --- src/components/widget-table.js | 2 +- src/styles/widgets.css | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 91e59de..e8862f3 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -57,7 +57,7 @@ class WidgetTable extends Component { render() { return ( -
    +

    {this.props.widget.name}

    diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 04dd7f3..8752db5 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -394,4 +394,10 @@ div[class*="-widget"] label { .label-widget { text-align: center; } -/* End label widget */ \ No newline at end of file +/* End label widget */ + +/* Begin table widget */ +.table-widget td, .table-widget th { + text-align: center; +} +/* End table widget*/ \ No newline at end of file From d163d93cd05fd9a7669eb3b185f12006f1d36ff9 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 20 Apr 2017 15:06:17 +0200 Subject: [PATCH 152/556] Gauge: restrict updates to value changes, gauge updated directly. --- src/components/widget-gauge.js | 29 +++++++++++++++++++---------- src/containers/widget.js | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index a61c3e8..b4365fe 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -23,7 +23,7 @@ class WidgetGauge extends Component { } staticLabels(widget_height) { - var label_font_size = widget_height * 0.055; // font scaling factor + let label_font_size = Math.floor(widget_height * 0.055); // font scaling factor, integer for performance return { font: label_font_size + 'px "Helvetica Neue"', labels: [0.0, 0.1, 0.5, 0.9, 1.0], @@ -58,17 +58,18 @@ class WidgetGauge extends Component { this.gauge.set(this.state.value); } - componentWillUpdate() { - // Update labels after possible resize - this.gauge.setOptions({ staticLabels: this.staticLabels(this.props.widget.height) }); + shouldComponentUpdate(nextProps, nextState) { + + // Check if size changed, resize labels if it did (the canvas itself is scaled with css) + if (this.props.widget.height !== nextProps.widget.height) { + this.updateAfterResize(nextProps.widget.height); + } + + // signal component update only if the value changed + return this.state.value !== nextState.value; } - componentDidUpdate() { - // update gauge's value - this.gauge.set(this.state.value); - } - - componentWillReceiveProps(nextProps) { + componentWillReceiveProps(nextProps) { // update value const simulator = nextProps.widget.simulator; @@ -84,9 +85,17 @@ class WidgetGauge extends Component { const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; if (this.state.value !== new_value) { this.setState({ value: new_value }); + + // update gauge's value + this.gauge.set(new_value); } } + updateAfterResize(newHeight) { + // Update labels after resize + this.gauge.setOptions({ staticLabels: this.staticLabels(newHeight) }); + } + render() { var componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; var signalType = null; diff --git a/src/containers/widget.js b/src/containers/widget.js index 1b55f94..89323b1 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -77,7 +77,7 @@ class Widget extends Component { resizeStop(direction, styleSize, clientSize, delta) { // update widget - var widget = this.props.data; + let widget = Object.assign({}, this.props.data); // resize depends on direction if (direction === 'left' || direction === 'topLeft' || direction === 'bottomLeft') { From fe1c9248367acec218da535c4dad5b18010af3b5 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 20 Apr 2017 16:30:12 +0200 Subject: [PATCH 153/556] correct highlight in selected plot table widget buttons --- 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 8752db5..b327871 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -115,7 +115,7 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input pointer-events: none; } -.editing-widget .btn-default.disabled { +.editing-widget .btn-default.active { background-color: #abcfd8; border-color: #ccc; } From 3be7fdcd35a829fb2d331b5952a840c374904166 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 21 Apr 2017 11:54:41 +0200 Subject: [PATCH 154/556] Initial blank plot and allocate fixed initial height to legend (avoid resizing) --- src/components/widget-plot/plot.js | 59 +++++++++++++++++++++--------- src/styles/widgets.css | 5 +++ 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index bb5ff01..cb9aba8 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -17,13 +17,26 @@ class Plot extends Component { this.chartWrapper = null; - this.state = { - size: { w: 0, h: 0 }, - firstTimestamp: 0, - latestTimestamp: 0, - sequence: null, - values: [] - }; + // Initialize plot size and data + this.state = Object.assign( + { size: { w: 0, h: 0 } }, + this.getPlotInitData(true) + ); + } + + // Get an object with 'invisible' init data for the last minute. + // Include start/end timestamps if required. + getPlotInitData(withRangeTimestamps = false) { + + const initSecondTime = Date.now(); + const initFirstTime = initSecondTime - 1000 * 60; // Decrease 1 min + const values = [{ values: [{x: initFirstTime, y: 0}], strokeWidth: 0 }]; + + let output = withRangeTimestamps? + { sequence: 0, values: values, firstTimestamp: initFirstTime, latestTimestamp: initSecondTime, } : + { sequence: 0, values: values }; + + return output; } componentWillReceiveProps(nextProps) { @@ -37,22 +50,34 @@ class Plot extends Component { this.setState({size: { w, h } }); } + // If signals were cleared, clear the plot (triggers a new state) + if (this.signalsWereJustCleared(nextProps)) { this.clearPlot(); return; } + + // If no signals have been selected, just leave + if (nextProps.signals == null || nextProps.signals.length === 0) { return; } + // Identify simulation reset - if (nextData == null || nextData.length === 0 || nextData.values[0].length === 0) { - // clear values - this.setState({ values: [], sequence: null }); - return; - } + if (nextData == null || nextData.length === 0 || nextData.values[0].length === 0) { this.clearPlot(); return; } // check if new data, otherwise skip - if (this.state.sequence >= nextData.sequence) { - return; - } - + if (this.state.sequence >= nextData.sequence) { return; } + this.updatePlotData(nextProps); } + signalsWereJustCleared(nextProps) { + + return this.props.signals && + nextProps.signals && + this.props.signals.length > 0 && + nextProps.signals.length === 0; + } + + clearPlot() { + this.setState( this.getPlotInitData(false) ); + } + updatePlotData(nextProps) { let nextData = nextProps.simulatorData; @@ -91,7 +116,7 @@ class Plot extends Component { return (
    this.chartWrapper = domNode }> - {this.state.sequence && + {this.state.sequence != null && Date: Fri, 21 Apr 2017 15:10:36 +0200 Subject: [PATCH 155/556] fixed signals control generic controlId --- src/components/dialog/edit-widget-signals-control.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index a7fcd07..b84d930 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -16,8 +16,7 @@ class EditWidgetSignalsControl extends Component { this.state = { widget: { - simulator: '', - preselectedSignals: [] + simulator: '' } }; } @@ -28,7 +27,7 @@ class EditWidgetSignalsControl extends Component { } handleSignalChange(checked, index) { - var signals = this.state.widget.preselectedSignals; + var signals = this.state.widget[this.props.controlId]; var new_signals; if (checked) { @@ -57,11 +56,11 @@ class EditWidgetSignalsControl extends Component { Signals { - signalsToRender.length === 0 ? ( + 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} )) ) } From dd068b919d08d89a68f29b33803360d0d6541b2e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 21 Apr 2017 16:13:07 +0200 Subject: [PATCH 156/556] Plots' Y-axis label can be edited --- .../dialog/edit-widget-text-control.js | 39 +++++++++++++++++++ src/components/dialog/edit-widget.js | 7 +++- src/components/widget-factory.js | 2 + src/components/widget-plot-table.js | 2 +- src/components/widget-plot.js | 2 +- src/components/widget-plot/plot.js | 1 + src/styles/widgets.css | 1 + 7 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/components/dialog/edit-widget-text-control.js diff --git a/src/components/dialog/edit-widget-text-control.js b/src/components/dialog/edit-widget-text-control.js new file mode 100644 index 0000000..d4196b4 --- /dev/null +++ b/src/components/dialog/edit-widget-text-control.js @@ -0,0 +1,39 @@ +/** + * File: edit-widget-text-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 21.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +class EditWidgetTextControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + + return ( + + { this.props.label } + this.props.handleChange(e)} /> + + + ); + } +} + +export default EditWidgetTextControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index b90e75c..a7fc542 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -12,6 +12,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; +import EditWidgetTextControl from './edit-widget-text-control'; import EditWidgetTimeControl from './edit-widget-time-control'; import EditImageWidgetControl from './edit-widget-image-control'; import EditWidgetSimulatorControl from './edit-widget-simulator-control'; @@ -86,7 +87,8 @@ class EditWidgetDialog extends Component { dialogControls.push( this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />, this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.handleChange(e)} /> ) } else if (this.props.widget.type === 'Table') { dialogControls.push( @@ -104,7 +106,8 @@ class EditWidgetDialog extends Component { } else if (this.props.widget.type === 'PlotTable') { dialogControls.push( this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, + this.handleChange(e)} /> ) } else if (this.props.widget.type === 'Slider') { dialogControls.push( diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 0f45052..b22faa3 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -37,6 +37,7 @@ class WidgetFactory { case 'Plot': widget.simulator = defaultSimulator; widget.signals = [ 0 ]; + widget.ylabel = ''; widget.time = 60; widget.minWidth = 400; widget.minHeight = 200; @@ -58,6 +59,7 @@ class WidgetFactory { widget.simulator = defaultSimulator; widget.preselectedSignals = []; widget.signals = []; // initialize selected signals + widget.ylabel = ''; widget.minWidth = 400; widget.minHeight = 300; widget.width = 500; diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 4041c8f..43eaf03 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -136,7 +136,7 @@ class WidgetPlotTable extends Component {
    - +
    diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index e0c2662..1c05d58 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -43,7 +43,7 @@ class WidgetPlot extends Component {

    {this.props.widget.name}

    - +
    diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index cb9aba8..6bae9d0 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -126,6 +126,7 @@ class Plot extends Component { gridHorizontal={true} xAccessor={(d) => { if (d != null) { return new Date(d.x); } }} xAxisTickCount={ tickCount } + yAxisLabel={ this.props.yAxisLabel } hoverAnimation={false} circleRadius={0} domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} diff --git a/src/styles/widgets.css b/src/styles/widgets.css index b031497..93c40e4 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -221,6 +221,7 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input .chart-wrapper { width: 100%; + padding-left: 10px; } .plot-legend { From 9d229a828ce48314f81a475d7fd82472fbf9ec80 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 24 Apr 2017 14:41:23 +0200 Subject: [PATCH 157/556] Button color selection --- .../dialog/edit-widget-color-control.js | 70 +++++++++++++++++++ src/components/dialog/edit-widget.js | 6 ++ src/components/widget-button.js | 15 +++- src/components/widget-factory.js | 2 + src/styles/widgets.css | 37 +++++++++- 5 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/components/dialog/edit-widget-color-control.js diff --git a/src/components/dialog/edit-widget-color-control.js b/src/components/dialog/edit-widget-color-control.js new file mode 100644 index 0000000..1b50f44 --- /dev/null +++ b/src/components/dialog/edit-widget-color-control.js @@ -0,0 +1,70 @@ +/** + * File: edit-widget-color-control.js + * Author: Ricardo Hernandez-Montoya + * Date: 24.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; +import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; +import classNames from 'classnames'; +import { scaleOrdinal, schemeCategory20 } from 'd3-scale'; + +class EditWidgetColorControl extends Component { + + static get ColorPalette() { + let colorCount = 0; + const colors = []; + const colorScale = scaleOrdinal(schemeCategory20); + while (colorCount < 20) { colors.push(colorScale(colorCount)); colorCount++; } + colors.unshift('#000', '#FFF'); // include black and white + + return colors; + } + + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + + return ( + + +
    + { this.props.label } + + + { + EditWidgetColorControl.ColorPalette.map( (color, idx ) => { + let colorStyle = { + background: color, + borderColor: color + }; + + let checkedClass = classNames({ + 'checked': idx === this.state.widget[this.props.controlId] + }); + + return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) + } + ) + } + + + ) + } +} + +export default EditWidgetColorControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index a7fc542..d23c3a5 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -13,6 +13,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; import EditWidgetTextControl from './edit-widget-text-control'; +import EditWidgetColorControl from './edit-widget-color-control'; import EditWidgetTimeControl from './edit-widget-time-control'; import EditImageWidgetControl from './edit-widget-image-control'; import EditWidgetSimulatorControl from './edit-widget-simulator-control'; @@ -113,6 +114,11 @@ class EditWidgetDialog extends Component { dialogControls.push( this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, ) + } else if (this.props.widget.type === 'Button') { + dialogControls.push( + this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} />, + this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} /> + ) } } diff --git a/src/components/widget-button.js b/src/components/widget-button.js index 72f33fa..98ced0d 100644 --- a/src/components/widget-button.js +++ b/src/components/widget-button.js @@ -9,6 +9,8 @@ import React, { Component } from 'react'; +import EditWidgetColorControl from './dialog/edit-widget-color-control'; + class WidgetButton extends Component { action(e) { @@ -17,12 +19,21 @@ class WidgetButton extends Component { } render() { + + let colors = EditWidgetColorControl.ColorPalette; + + let colorStyle = { + background: colors[this.props.widget.background_color], + color: colors[this.props.widget.font_color], + borderColor: colors[this.props.widget.font_color] + } + return (
    { this.props.editing ? ( - + ) : ( - + ) }
    diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index b22faa3..6414180 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -77,6 +77,8 @@ class WidgetFactory { widget.minHeight = 50; widget.width = 100; widget.height = 100; + widget.background_color = 1; + widget.font_color = 0; break; case 'NumberInput': widget.minWidth = 200; diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 93c40e4..394b3d0 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -145,6 +145,39 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input } /* End match */ +/* Begin edit menu: Colors */ +.color-control input[type="radio"] { + display: none; +} + +.color-control .radio-inline.checked { + border-color: #000 !important; +} + +.color-control .radio-inline { + height: 24px; + flex: 1 1 auto; + border: 2px solid; + /* Reset bootstrap padding */ + padding-left: 0px; +} + +.color-control .radio-inline + .radio-inline { + /* Reset bootstrap margin */ + margin-left: 0px; +} + +.color-control .radio-inline:hover { + border-color: #444 !important; +} + +.color-control div[class*="colors-column-"] { + display: flex; + padding: 2px 20px; +} + +/* End edit menu: Colors */ + /* PlotTable widget */ .plot-table-widget, .plot-widget, .value-widget, .image-widget, .label-widget { width: 100%; @@ -270,8 +303,10 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input .button-widget button { border-radius: 25px; border-style: double; - border-width: 5px; + border-width: 4px; overflow-x: hidden; + font-weight: 500; + font-size: 1.2em; } .button-widget button:hover { From 1ded5755d8c4a8799d38180e8300db74c51aaac2 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 25 Apr 2017 14:31:28 +0200 Subject: [PATCH 158/556] Box to group widgets --- src/components/dialog/edit-widget.js | 4 ++++ src/components/widget-box.js | 33 ++++++++++++++++++++++++++++ src/components/widget-factory.js | 8 +++++++ src/containers/visualization.js | 1 + src/containers/widget.js | 3 +++ src/styles/widgets.css | 10 ++++++++- 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/components/widget-box.js diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index d23c3a5..696675b 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -119,6 +119,10 @@ class EditWidgetDialog extends Component { this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} />, this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} /> ) + } else if (this.props.widget.type === 'Box') { + dialogControls.push( + this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} /> + ) } } diff --git a/src/components/widget-box.js b/src/components/widget-box.js new file mode 100644 index 0000000..b917b65 --- /dev/null +++ b/src/components/widget-box.js @@ -0,0 +1,33 @@ +/** + * File: widget-box.js + * Author: Ricardo Hernandez-Montoya + * Date: 25.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component } from 'react'; + +import EditWidgetColorControl from './dialog/edit-widget-color-control'; + +class WidgetBox extends Component { + render() { + + let colors = EditWidgetColorControl.ColorPalette; + + let colorStyle = { + borderColor: colors[this.props.widget.border_color] + } + + return ( +
    +
    + { } +
    +
    + ); + } +} + +export default WidgetBox; diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 6414180..59c49d6 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -101,6 +101,14 @@ class WidgetFactory { widget.width = 200; widget.height = 150; break; + case 'Box': + widget.minWidth = 50; + widget.minHeight = 50; + widget.width = 100; + widget.height = 100; + widget.border_color = 0; + widget.z = 0; + break; default: widget.width = 100; widget.height = 100; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 7766c05..8490f95 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -349,6 +349,7 @@ class Visualization extends Component { + } diff --git a/src/containers/widget.js b/src/containers/widget.js index 89323b1..b72311c 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -27,6 +27,7 @@ import WidgetButton from '../components/widget-button'; import WidgetNumberInput from '../components/widget-number-input'; import WidgetSlider from '../components/widget-slider'; import WidgetGauge from '../components/widget-gauge'; +import WidgetBox from '../components/widget-box'; import '../styles/widgets.css'; @@ -146,6 +147,8 @@ class Widget extends Component { element = this.props.onWidgetStatusChange(w, this.props.index) } /> } else if (widget.type === 'Gauge') { element = + } else if (widget.type === 'Box') { + element = } let widgetClasses = classNames({ diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 394b3d0..19ce5f4 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -441,4 +441,12 @@ div[class*="-widget"] label { .table-widget td, .table-widget th { text-align: center; } -/* End table widget*/ \ No newline at end of file +/* End table widget*/ + +/* Begin box widget */ +.box-widget .border { + width: 100%; + height: 100%; + border: 2px solid; +} +/* End box widget */ \ No newline at end of file From fdacc5544cbfb42786016cba733d7c1ff0b62453 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 25 Apr 2017 15:30:19 +0200 Subject: [PATCH 159/556] added logo to README --- README.md | 2 +- doc/{villasweb.png => pictures/villas_web.png} | Bin doc/{villasweb.svg => pictures/villas_web.svg} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename doc/{villasweb.png => pictures/villas_web.png} (100%) rename doc/{villasweb.svg => pictures/villas_web.svg} (100%) diff --git a/README.md b/README.md index e90dd27..1814d28 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# VILLASweb +# VILLASweb ## Description diff --git a/doc/villasweb.png b/doc/pictures/villas_web.png similarity index 100% rename from doc/villasweb.png rename to doc/pictures/villas_web.png diff --git a/doc/villasweb.svg b/doc/pictures/villas_web.svg similarity index 100% rename from doc/villasweb.svg rename to doc/pictures/villas_web.svg From e7660ceace55c5d3c209f3963f4c965b54bec59e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 25 Apr 2017 15:41:20 +0200 Subject: [PATCH 160/556] Place new widgets always on top of the existing ones --- src/components/dropzone.js | 13 +++++++++++++ src/components/widget-factory.js | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/dropzone.js b/src/components/dropzone.js index 18815e2..dea4398 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -19,6 +19,19 @@ const dropzoneTarget = { position.x -= dropzoneRect.left; position.y -= dropzoneRect.top; + // Z-Index is one more the top most children + let foundZ = props.children.reduce( (maxZ, currentChildren) => { + // 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; + } + } + return maxZ; + }, 0); + position.z = foundZ >= 100? foundZ : ++foundZ; + props.onDrop(monitor.getItem(), position); } }; diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 59c49d6..364562a 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -21,7 +21,7 @@ class WidgetFactory { height: 100, x: position.x, y: position.y, - z: 0 + z: position.z }; // set type specific properties From 6e130accc15aecb2ae9e456d0ae4b55c52f907b0 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 25 Apr 2017 15:47:30 +0200 Subject: [PATCH 161/556] center number input widget vertically --- src/styles/widgets.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 19ce5f4..8745a2c 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -324,6 +324,12 @@ div[class*="-widget"] label { cursor: inherit; } +.number-input-widget { + display: flex; + flex-direction: column; + justify-content: center; +} + .number-input-widget .form-horizontal .form-group { margin: 0px; } From d5e015c1d3ce9a0efb4790fd719f9166b204a3da Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 25 Apr 2017 18:14:29 +0200 Subject: [PATCH 162/556] Issue #44 proper start and stop simulator running detection --- src/stores/simulator-store.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 69303b3..34fabfa 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -20,8 +20,18 @@ class SimulatorStore extends ArrayStore { var simulator; switch (action.type) { + + case 'simulators/added': + SimulatorsDataManager.startRunningDetection(action.data); + + return super.reduce(state, action); + + case 'simulators/removed': + SimulatorsDataManager.stopRunningDetection(action.original); + + return super.reduce(state, action); + case 'simulators/loaded': - //case 'simulators/is-running': // get simulator running state if (Array.isArray(action.data)) { action.data.forEach((simulator) => { @@ -35,12 +45,10 @@ class SimulatorStore extends ArrayStore { case 'simulators/running': // check if simulator running state changed - simulator = state.find(element => { - return element._id === action.simulator._id; - }); + simulator = state.find(element => element._id === action.simulator._id ); // only update if state changed - if (simulator.running == null || simulator.running !== action.simulator.running) { + if (simulator && simulator.running !== action.simulator.running) { state = this.updateElements(state, [ action.simulator ]); } From 584a9e68d42fd95d2cc369d52caf20b269399821 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 26 Apr 2017 09:58:39 +0200 Subject: [PATCH 163/556] added copyright, license and contact info to README --- README.md | 34 ++++++++++++++++++++++++++++++++++ doc/pictures/eonerc_logo.png | Bin 0 -> 9348 bytes 2 files changed, 34 insertions(+) create mode 100644 doc/pictures/eonerc_logo.png diff --git a/README.md b/README.md index 1814d28..d05a9a5 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,37 @@ Additional libraries are used, for a complete list see package.json. To start the website locally run `npm start`. This will open a local webserver serving the _frontend_. To make the website work, you still need to start at least the VILLASweb-backend (See repository for information). +## Copyright + +2017, Institute for Automation of Complex Power Systems, EONERC + +## License + +This project is released under the terms of the [GPL version 3](COPYING.md). + +``` +This program 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 +any later version. + +This program 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 this program. If not, see . +``` + +For other licensing options please consult [Prof. Antonello Monti](mailto:amonti@eonerc.rwth-aachen.de). + +## Contact + +[![EONERC ACS Logo](doc/pictures/eonerc_logo.png)](http://www.acs.eonerc.rwth-aachen.de) + + - Markus Grigull + +[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) +[RWTH University Aachen, Germany](http://www.rwth-aachen.de) \ No newline at end of file diff --git a/doc/pictures/eonerc_logo.png b/doc/pictures/eonerc_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..81c3ad0caac94c8c04735b3033d67082d95028ea GIT binary patch literal 9348 zcmV-~BzxP5P)T{00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3=seT3=sjpjCYy<000McNliru-Ub;B8Yf#$=BWSxAOJ~3 zK~#9!?VWji6!rc8pYPcOxx@?Q@;1w*;*kYJ$R-gjWHwmZD*g8Nt@^E6@fHP-R&A-( zsvLr1ThVH34{fDdTe7pDgd`gj4I33Gh)nQ80|75ot|U93-ygFZb|q=RmX#Wg3BXz-r*-gnK*&xDrq)%Dn;1cBI`5 zoS&wxSAb_6Y1aY;?KI|x#m4{IAQYkgn^`rYmb0Mo-`dAOQ3Mdd045qlhfFEbF&{K)`gA`IqCJ{z%vLJ6-CY z0{9Y=I_tVV-Y|@(fo^RW?=0XKfbOUdph4I5%Us4}l!zqWi)a>bQ#(B{S-=Y}=>@=b z?bN4cgpE?&5xJ(F`m-816bO57pbv1#9@a4p_!&?EEJ%~@hc1MDek?r|zUM;N!&@k` zuW`K#VV?|Knx@R#PQo6q6cP%3FLsU1FmK+xTQ9xz(uQ;$5s@2WA4(@q2cAts^b>(6 zTuvPe9IKQ%Q$%ht4C7&4*Y8T~wj=*?;7*r%@_>t7(tiLP(Z=z9JXL*$Va%xNGHChK z!c!8*#Cb2GTIM~^AcH2{0el4P0RGuR-brn&yA$xkv+h`M&<)zlBE+OyS9I&vt$0RR zZA;aRNs)fW=bwKrDJ1L5MC6H9cJofdFn-oi$52EjCX#i^X?Nxw%^-s$91m=WO<&XD z=etq&&zDadd$5jMx(h3wQrI`0I^>*m6<1YN1s-0q*-6&fz@J^R{}Xr^sCGH`n^?K_ zLQ1|>N?qMrwM0k5XTS&T&~6X+A=Vm!I$+y=zqyJn8UAb+^alLEyTG6nd5#4}_qwU9 zv~EseYwH~X^gnV^+1jsW7alZ&Wf;cUj-*wtZ+Znp(nE!H)a5UrG2DI&L|IG=48#s%+oJ8SXe z{C)=pVXql^4&HF&7p;(P_6bbCPrTts(n8Z|;mC&A3!K4$jV-_z3D5lrE#&__wod%T zGn^RcY#(v!W)$GD6(wyG_eCZUxuywhqP!FtiNN@^UAKh&~jBT;w_n)v;MqOis zdu%8a>RD7&^jQk&GO4^}Sr3TFZxfQn(R^L&a%Vk>WIZ>cP<6(=BH|?M!hJ;8jk>O{ zZpFtf-RX&w^ZPA6U{oRlUwgY<+jo+61_u=$2TqM0Cj!y}84C~r(k+%1Vp}A%1((O_ zPK95@$T{&iqlG#@0M2wNv%eOslL%Kts$AN>`1Y4SO;vta;*UTe@H@x(euiN<7xh_U*Cq>`3 zJAU`-V9#Z(Lju3_u9DgeVP}v*BI;%|86}jY$+iu6u!X8_-i_w(=^(>!9JV=R;&Eha z3r{Um1cO1RGQJ@Y2yAi^wu{e=~DB5m~dNtk6x}@_*Pi z^;ZH{Dy8mf;~4GhS$Cy~Bu+i9d8oK=>!gnM#`5nB;jC9yv|IZ%1w+XxUzTCBLklOS zIrlN}Ew)olI;Wm1+t}ujZUnZUq0&gDtt0G0AruNFEf`|ku%qkx5{JGv+c1m)x~{+H zl$@P}{fFB3;hi;M$4q2g0txpJX{J@$-np=>Ssw#|zzeOsoRbX0_?u%^V$s~mB^5lu zV9-nIMaLb1K;S)>^zKTjxxjs~-xrpamS&9}J-V^O6ZToJtia6oU4`PJc4)q9PWiHC z2JJN?&pt+FW&HuwE}o80>%Z?p-|}LqN1V? zMWmU8ZCTciJsgiCf&aHBbyaGQT&DK~Pb0F6oVF-m!Cm zPY<-glTKYx^;-e>_rL$04fJ=YCc+MB`*H_i&jgsgs1B*GZf5SM>-x%=Wc;OJ7+XoO za#2c+1LmYqiEQuSLzhzE8#{LFCc`jHz#CVKq$2E$4m*QG4MzjNZGo(7X|88}poMzf z;)sM>D09Gh(P*6y2Vh27Em>Jv&D1(8SFQ{LOt07o%`HU=;{Qy#uopDz1 zNqImTGW@zvFcUj&NGg1H<81#sDbyrwi6PPjmA7)BxKotEPGTG#c9clSmF0)cM~!>A%=ldhDy7MH+$9g48uEjSNv z`5TjHdtjZt0y95XycN|BPsi#{*zEDb>?)`bxtvTC$ia2JZ2AJZ|plp%y#=5s_l0)Jsk) z5v5djd&06y#<_R=Sr~>){X^FDy8C1L?>Xcb97vl$e{8! z+O>TrS!ZxCLck6w8cLJtaGErvkne(+83l=OGMRWV>)?%2h>ziHDhos2wT)g|DqmJ$6mtSrH z2~q+*GlZSNA&-r-MghEryD45A=K&`kf9vZ_37hBSgKfF6p^Z)ci{>uU2PC?7(nupA zTi7}$=aHPrvK~mmJuQ|62nK`0T<$@t@P{Wme%E%?v7K4A5fOPRU7il5!;a+U;;XK1 zxAxyHIIrE+G8ybwJb)dQFQt_I$*l7yrYQG#8{3)&{PI8_u*0*W{K+u-)7-*kmaglr zF;Wb}XmD_i-zD4mx~?yEDSINe15Oh}vp#9xJsmTIedytF+=JoAaXs)mm-OG^ zvM7`W+kk&#Z#I0uqK9nViOYhcQmQ-!S%a-cN=MkAj2SZ~orKzC?iPbr*Yyt!!zgj6 zW=>K{mB)zLt)9}NqM|kJID9Rd>CUY96t*sZDivX8bl4djy0|71S8t?4v+$`oHyHr; zx236Gw^o8};&(u!bCyJDt}ose2n0S)Q>>zeYRl6KaU#u}PC}v350p~hr}ev2ZL%!u zqIihbj*7|o{m^y2G?gTtA?yqe7Q`jA`V>cV@5U#602{GQ^-`7VhaDHY2{m(cuot~b z)09hUvu;*iTvDt_lfRMlUYP0HN+r>y%db+5qm`megV*cLbLmT3Q%7Cbm!#=`6j(g1 zw9d8c)G~!qsw~#mrgD~LjSU0>4Z5zM3Oqz=$F?Z&sIKe1)^_u$gb=OH{-lzA8&iyP z{caqMF7>5qcdkqMonrcZ?PYuXj5i#)%9&{TeNWT&aFu%n-f$%2Ak#khNlaC+PlIgr zykiNUO-o)L>2*sbb&uw?xvt}Gu3*z+`7P$_JGqS7nYKWB+@x|g%`RwjTfHZ~%Eq}Z z2Cz&Dqu1+}3hExs-)}c?M%gB&6dvb#&M*wob$ze%%p;|Bd|i1QQ>WUm?Scgh1~xV} zp5XC#`YNS92iEJlzC2F+Qwt?7ol8+sQM3NcEZ@ZBf?d}zbMYo7U(o!To?P$+*Ni=S z?_EcE9k&(i+E-!j{8}cC>)Y|((siSTrTx9XVfuX;!frppe)&)z1j8^~pTAHjl$1WR zY-5}24hDm*dbXWy?ak}x2$+_z3t%u99BdfIrNLlud@vY1WB&a4hqXta9y82V=gkmQ z28WD>34szu=UyR0%2X( zXH0+NYi>WUhx5aAk%-Iz2BfIxUEnrd*B2-JTG`f6oHhn+zN9Sd4akcuB#EAtVJM#Yg9KaMsGW7uOx^17f> zN>a4tth+O?*x8;^>bw+Wos%FC#*Z@WU|7=DBP%Nlm-?KC2YZ8nalmxLFt!c;yt4oA ztG-F>*L@=LN*b~T7=#_uWM+b;i8$IvcAbY8-da@C!qZ0nV|rK<^rLjUWMX9je{c-R?akiouy7>1#*?lR1nQrL5M>sXH+ z_A`#&De{eQA^g=TT&|DNb^Xh9jmGwVbYg|B>$f{pF@FV|WH-E|q~r*iZ?-&7*Y$hj zAF6=g*;cpRU;Ee55_Qz>s;FVjZ!LOhn+zN zhmu-k56Bv9yK^U*4t2@r+%@3MGFET=N_HEYWn@t!a;~gId+_wIkDr3 zXf)cmH~Tp^qOdH>%}e&mDTRH(JuJulaSzRmN+g2}4sKKc`3Vy7Wg9!^{N<|A1KM0s zG#V|{v}Q8i@ZbHY-{Sy}ELe|bt!#__dSBp3$L|kuMEi^N>4u5<10S2ccr%kOu=U49 zMMYKE-l$GB$6o8)MBCM)&M=HJlFctKkEuqS@o7HPb-ihZl98}8$l&0{N?>h*WI1tn z$Qq!yxcF0=yHYoKyWKYS1aMh!6p?g9Nn-TR%XV2kDNb$ ze%Ep1#%J3fPhClS`7lcBg{%-kaFRI%Ym(?2x0Am3s zS-${`&~<$-z~ubn2m}J3VsHDFE++K}z_W&7e0=h@H6!=+ebIG2?IswOWj!!;s%n|A z*A*lOVNy31rk;xcra!k?9UqN4bJzL2p{^Y={l3iGw3lG!os;}~!PDkN{w(Kozh7c_S)aqnh#ta3Wd7NEZg<5*kGOeridH` z{Jn+pCy2-r!!W+LANrbV$D>ejaq*Y&NQ6x)5!3H00}{<%-Z`zjDkO#V3U$)8c8~%4L{--&5Fz=<$z)@`fYr z&e&#tu8xv>v4h=w1sL9NWJX7L!)o$;ekI)K4M!%V%eU&hA%gOBGyT5bV{fmvQj^AO z%%O!Fz01nl)aL3@LuBxh70S%>iMKMMGCX&1z~k{e6OBgaCP>BCDy4RJW8k-eLg?0P)nAx?-=n7A_rj^AZ%#1teBFV3)9<_8 z8;(r3X;^vyZiecGN@=6|S5`IM!1qQCkpW9qq$P#2f&vQ5%lGB8+z(jj4M(QF>mPb# z7S?~vyxc9TM*E){KXq2xje!-(*7Nb-&h*`eC=W>5mnxE*%i&$5^Uf&WfcinU#Wf9@ zmTM``!`@|OSH$zQc5~ywOI9e;@2m5MBfXsMwC4uN8SELxj2Y8t7{(&t!kAQiEe;EW zHej)Xu;Wu~ry5~VOBE@l3|-gP??xY%>AIdISjMhzbmF^h7{>5Kv$&Y8Gh@b#smInK z-yaMHFA$Nx0DWE5JyU^I`{JJ5ta|}!4Z~OmBr41;UDscCE0g7-;h<0DN&wDX_8z9+ z_q-Ac6np{T4M%P<{l1+w`M%!DUi*C!xc8$x-{YvA+w0TuPqvk0gg#)&3T66pFY<<~ zUtR0Z%@<^#G|FGHj?Uip&6nRw7p?1I%G!Fp>GyT@D4A2=Is5DEo!h%wc+OGc`B0QK zF1w-e$*+&^uDaB1zXCW8coD_12o1m~-f(1If@j};B8(V6 zbrt|ebdxJhzwa~={*qG>Sre;gFk=0%2Kkt9D# zCV$e^pmp_zmp%4DK>?@4K4QM=YD~XxCNRYtu6_xiCV%LXoQlX2(?3+a;brQGu3T&S zef^a1bpMLThwqTM@~f~ zVipYcU}-m){@kNA&GUQdSyk8Y<*>uFMr)`RwN^z%8{fY&^2ZDMAOPPVQsCtNz=5|j(h=JJT0eg zUd_~F2iwyH&$)~58QZ6yVHiuX_1uXV6`N7)OE|4)QabBsfcD;~b5CBImwWo!ymL=C z^M^UNQaHYUMPyx0MUr$ikND2!LNY01j;or*HRZYTHjwRyR*sfxT{`h9;B zq!{R;veY*xm%L6l>C{z8<3_OFLDZ{JQR~_EZ6^zDFz}qH=pR7kSXx6?m%8m+fWxr^ z!Wam*q45Q9vFRUL^j<-3ocjLNSijY6@40$g-==baUl9wYZ~A>7fkXv)PATTE_4|Bl z^L;spssQaZgifa4cb~Vc3e)d<-X0Tq7P!^)`>ykbmtp#S&nhKnDAXDhx0!jq>tf?J zyGvu^LM03l=x6$KFG8e3;6s!;&-4%db?jq0uqOZ3w*|=pYh;bzH|Lb*GY%bPHGP{EM#vH>iRwW!C#mO4r zp0RzHRZ)v&SwBuO1CMr;ha(Hf)->&I`+w0;)?bP3(Y7`}w=asXT*|Fiihh8J0&is` zWcq#6%{JG|lQ#j*5R z9#5wmK~(@7z2V4MJ3aR@;1O>)@>tENb5Zavn)WMidF1`I`MD2^;*kO6)uDC%q1`Ri zw}W0^<2DKSKhy8K2Pgrq_J$*6HTk|VO7XTgyzE&3v%q(?So~5f9#+D-UMG4N_4w;^ zuK=tY={wQ_-5ZV^0q}wUtVVp47)aJV-d8MKDG$nuviQmAKK`hODAsW$25z4TIQ>OQy}c*$ECc`+u{ z->5WxhRAimkv*&mPYS)q~(U`KfVA#VsOBKd15CefA)v6ZfHgUlktH?$+`rd-ymr0m_kC+A>-!e!D3Auz z?^}={B2~r+ZZ@{t=?X0C7=#r~l9Q()aY3d}PWjtgTsl_;Fp!6+Q9cXz_%G{``hFz1 z;L5yt)cAb^6%1>-2Cz^>EDx3k*2T#>QDRfsoitR^3~c~#hUxc>jMWhpD7BPWBC2V} z>I_-$HEeK@i!5BY@R+4bzw^1nVqkb{r_pgtuhk4wqPjz%a_G}t~2w8o(Zhf zvMo+qR1NS0wY}jd(j~iTaj}2pTc4QuzJDv*(B19Rt!Sm)w=_mQz$c>A6FHUDNp4Q2 zKR3y;r2mr0d#2yFRV*uL`hDGjm%QP~g9%w4G5x+Dp}3|IPl{bhRkk-={kZA(O)&kw zN#1Z|w!nu9UiF3}H#>9ZgsW!*v&}r8PZRAGOL2ylAocIknGfp;)&y@jax{QB%6A&V zv=o=U?aib6XvYodWqsS@7|#4pn`V>$L3yqOe(4zSkAN4w;YgAj?0ch!bxWxuYiLkb zmM77@_hSXG^$$mqB>S~_L;GjAbss2ZMHVWhMkg_GW8<``Q>AHv%`l8hTqNw0mg>Ge zzc;`uhGAIjfe*&4MRibLz1Tt6ZiL>N>(vdz_$*D9ddsqmgxz0SLexR9M@6I2H7+qw zrrmN;-=;0krWE$YFpS^2)VF}-?b6y^CE~GF8OnpmPC;$i-mtmW^!r}YqWr`XeuPqC zK`vAcd~W)EPXc%Mk1XG5=J}GQ;4*LCb*A4J1y@PdBC3YgDjHt{yjM6}29&+28azCf9kr#@ zLE$&QPB$1iQSxg%G?;n5S92U@dZ>lI2;^8bT)u@miB62E9y{ts}1o?D8 zW#miK@7rPehyFrP&swNHn#kbI+Bbjd8SU1mreNrCma>jQ@hq?|Mf3L^eMa9`8lvjz z&R>1i-}L*2feN>D1Ir2ukZAoKO6s?oeqTfEML7?l$XgNlj_LO`n*QAXiX{=Hso|j2 zS!otgPJ8|BZ%n_h&-;E~PE_dR$?h~gT3`RI>CauSP-`@$6)My_%AP7_u$N(3)*nS= znuFA?Gz{Y`Y^#gYfnpaO@?&ji<{9AX-R6P}eIZ(^1T9vQt)khP@FbGOuaPYpk+2k96W` zlr~-o*G4TSiKshc=}$WHJ*##`8*(Zl8-!?orExlSdWir41O-V%K~$9mb5Y83%$M>p zLLDLoK+X9>Aj>L6FcfkYVhvQ5y3F+Z)PS-#6~N%K$hRPifj_5sWLAN^4)Aejr4;I1 zG=5~yF&mFYFWT0V4LPIHLxF7#67hjT!5;*%7$#W$PfD zP*`5h_QoySqDXh_*uuX6x_K)i-+6cRd7`k60U4__{wT;9R;TDPwKLiP{LL{C30_xf zToh)a@SeKp^=-zX+MjKiasLs4l9UAX-j0?O0+e+sdF=gxT@wiE_wUJK3uoEku@-R+_-U{ zb)@Gb%Wca4{srf7>f*?C?_FTq!5`L;z4nBqORoZ0Gjf;trFTi>Q{bufBSvt-(xq|Y zc@>iFc2|uUfj7MLVP`w*3Wjl7dDUGt{-NZAm&Nnl7eC*So&CX}(yA+(>1*McxM`c| z_dSYYp0_d*+@&`0IaaLI@J6`DZ2-I#Z@nJZ*GOqK*gHh8c>jWP_+pE;(^tJ~eB$y% ze|tf0I)LNaoBCdxn;TCvfW*)H<7UASyyZ!18#`}h=|BoL80sNGs7^BpyfCl059vh z{=J7^+032aIkv^jv8|}8VgZ+W>;*mcMQ(cEv17+Jw9^o-0*+786_u2nr0e?Kp-`xs zQtFo0RHBrc7zhNO>}b!2Yw)L27uz%D0gG)SiW3sRz}K43rW4P{k?3S`y32Wh)5@!2 zI^kum`399%rR?}A<>f5@ZXta6%>%$=rr&pMY$|jVu{g74p6?oj>wpD=!jZ4i>e5n- zLApGtt{tFn8YdHP`HB{AOro>U>8q0M_S-^`srqM+;X6s!I=C{q&*%U3KX!lLOub=9 zhOGB4CQJ~fmVJO;c*^y`U~rCz+>E`0OTU;zxCuMP^Lt9ECjx=Mvd0&F!i^U;k@fQ= z$8?UQXzEJ98NVRD#rSjwH++_Y)MkjtTP~;mo1)EEfUny)BwJ&DX9GLawK1!_4sFNV zKeH@rd4hbUG)?<1@K{k%(WH`+k{Oz&-G=Stb4rXaK8ua%hd@;{8vWh4apQI-TxXSt yBnq4!5&1Ype`k Date: Wed, 26 Apr 2017 10:51:27 +0200 Subject: [PATCH 164/556] Deals with issues #44 and #50 --- src/stores/simulator-store.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 34fabfa..9f430ef 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -31,6 +31,18 @@ class SimulatorStore extends ArrayStore { return super.reduce(state, action); + case 'simulators/start-edit': + // An update will be requested, stop the 'runningDetection' already + SimulatorsDataManager.stopRunningDetection(action.data); + + return super.reduce(state, action); + + case 'simulators/edited': + // The update was done, resume the 'runningDetection' + SimulatorsDataManager.startRunningDetection(action.data); + + return super.reduce(state, action); + case 'simulators/loaded': // get simulator running state if (Array.isArray(action.data)) { @@ -47,7 +59,7 @@ class SimulatorStore extends ArrayStore { // check if simulator running state changed simulator = state.find(element => element._id === action.simulator._id ); - // only update if state changed + // is this simulator still in the state? update it only if state changed if (simulator && simulator.running !== action.simulator.running) { state = this.updateElements(state, [ action.simulator ]); } From 14e75c0fa0c78fa5306062aced69b4e5a3eca1ea Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 26 Apr 2017 12:11:21 +0200 Subject: [PATCH 165/556] Very basic single passing test --- src/{App.test.js => Header.test.js} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/{App.test.js => Header.test.js} (65%) diff --git a/src/App.test.js b/src/Header.test.js similarity index 65% rename from src/App.test.js rename to src/Header.test.js index b84af98..db2da16 100644 --- a/src/App.test.js +++ b/src/Header.test.js @@ -1,8 +1,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import App from './App'; +import Header from './components/header'; it('renders without crashing', () => { const div = document.createElement('div'); - ReactDOM.render(, div); + ReactDOM.render(
    , div); }); From 706e8f0c253cc882f763a77a083415cc2fc7a8d6 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 26 Apr 2017 12:13:15 +0200 Subject: [PATCH 166/556] ci config with basic test stage --- .gitlab-ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..2a00fb2 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,7 @@ +stages: +- test + +test_job: + stage: test + script: + - npm test \ No newline at end of file From 583a713696be1dfe124ffb52398bf04cbc977263 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 26 Apr 2017 12:23:38 +0200 Subject: [PATCH 167/556] define runner's environment docker image --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2a00fb2..2be3363 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,9 @@ +image: node:7.9.0 + stages: - test test_job: stage: test script: - - npm test \ No newline at end of file + - npm test From 056925ae26459103901b6bd9f8fbf3af09fef9fd Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 26 Apr 2017 12:29:38 +0200 Subject: [PATCH 168/556] missing environment initialization --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2be3363..ff31eb2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,8 @@ image: node:7.9.0 +before_script: + - npm install + stages: - test From 7912eaaef99c0b18213afbdcd8362a5b6846a234 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 13:46:38 +0200 Subject: [PATCH 169/556] separate build and test stages using docker images --- .gitlab-ci.yml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ff31eb2..e083eaa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,12 +1,24 @@ -image: node:7.9.0 +image: docker before_script: - - npm install +- mkdir build +- mkdir node_modules + +cache: + paths: + - build + - node_modules stages: +- build - test +build_job: + stage: build + script: + - docker run -v .:/usr/src/app node:7.9.0 npm install /usr/src/app + test_job: stage: test script: - - npm test + - docker run -v .:/usr/src/app node:7.9.0 npm test /usr/src/app From c88e675961da9cef4efd795465b021fccdbbb3c7 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 13:57:39 +0200 Subject: [PATCH 170/556] dind executor? --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e083eaa..0d0bbca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,10 @@ image: docker +services: +- docker:dind + before_script: +- docker info - mkdir build - mkdir node_modules From 8364138cfa87e99b2dfa03bd7daadd3899ef0cf0 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 14:03:53 +0200 Subject: [PATCH 171/556] overlayfs driver --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0d0bbca..16a58a3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,8 @@ image: docker +variables: + DOCKER_DRIVER: overlay + services: - docker:dind From 29e3dc750209ac03d87f664cc401f55c86ee43f2 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 14:06:46 +0200 Subject: [PATCH 172/556] revoke overlayfs driver --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 16a58a3..0d0bbca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,5 @@ image: docker -variables: - DOCKER_DRIVER: overlay - services: - docker:dind From c7b98368818d773a6818b28a6db5e0c509c5f733 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 14:10:31 +0200 Subject: [PATCH 173/556] Use slim node images --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0d0bbca..753f1c3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,9 +20,9 @@ stages: build_job: stage: build script: - - docker run -v .:/usr/src/app node:7.9.0 npm install /usr/src/app + - docker run -v .:/usr/src/app node:7.9.0-slim npm install /usr/src/app test_job: stage: test script: - - docker run -v .:/usr/src/app node:7.9.0 npm test /usr/src/app + - docker run -v .:/usr/src/app node:7.9.0-slim npm test /usr/src/app From 6a33dc33c07fbce247837fe865b722063b29f1a1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Apr 2017 14:41:44 +0200 Subject: [PATCH 174/556] Add GPLv3 License --- COPYING.md | 675 ++++++++++++++++++ src/api/rest-api.js | 20 +- src/api/websocket-api.js | 20 +- src/app-dispatcher.js | 20 +- src/components/dialog/dialog.js | 20 +- src/components/dialog/edit-project.js | 20 +- .../dialog/edit-simulation-model.js | 22 +- src/components/dialog/edit-simulation.js | 20 +- src/components/dialog/edit-simulator.js | 20 +- src/components/dialog/edit-visualization.js | 20 +- src/components/dialog/edit-widget-image.js | 20 +- src/components/dialog/edit-widget-plot.js | 20 +- src/components/dialog/edit-widget-table.js | 20 +- src/components/dialog/edit-widget-value.js | 20 +- src/components/dialog/edit-widget.js | 20 +- src/components/dialog/new-project.js | 20 +- src/components/dialog/new-simulation-model.js | 22 +- src/components/dialog/new-simulation.js | 20 +- src/components/dialog/new-simulator.js | 20 +- src/components/dialog/new-visualization.js | 20 +- src/components/dropzone.js | 20 +- src/components/footer.js | 20 +- src/components/header.js | 20 +- src/components/login-form.js | 20 +- src/components/menu-sidebar.js | 20 +- src/components/table-column.js | 20 +- src/components/table.js | 20 +- src/components/toolbox-item.js | 20 +- src/components/widget-image.js | 20 +- src/components/widget-label.js | 20 +- src/components/widget-plot-table.js | 22 +- src/components/widget-plot.js | 20 +- src/components/widget-table.js | 20 +- src/components/widget-value.js | 20 +- src/containers/app.js | 22 +- src/containers/home.js | 20 +- src/containers/login.js | 20 +- src/containers/logout.js | 20 +- src/containers/project.js | 26 +- src/containers/projects.js | 20 +- src/containers/simulation.js | 20 +- src/containers/simulations.js | 20 +- src/containers/simulators.js | 20 +- src/containers/visualization.js | 30 +- src/containers/widget.js | 28 +- src/data-managers/files-data-manager.js | 20 +- .../notifications-data-manager.js | 20 +- src/data-managers/projects-data-manager.js | 20 +- src/data-managers/rest-data-manager.js | 20 +- src/data-managers/simulations-data-manager.js | 20 +- .../simulator-data-data-manager.js | 20 +- src/data-managers/simulators-data-manager.js | 20 +- src/data-managers/users-data-manager.js | 20 +- .../visualizations-data-manager.js | 20 +- src/index.js | 20 +- src/router.js | 20 +- src/stores/array-store.js | 20 +- src/stores/file-store.js | 20 +- src/stores/project-store.js | 20 +- src/stores/simulation-store.js | 20 +- src/stores/simulator-data-store.js | 20 +- src/stores/simulator-store.js | 24 +- src/stores/user-store.js | 20 +- src/stores/villas-store.js | 20 +- src/stores/visualization-store.js | 20 +- src/styles/app.css | 22 +- src/styles/index.css | 21 + src/styles/widgets.css | 24 +- 68 files changed, 1773 insertions(+), 285 deletions(-) create mode 100644 COPYING.md diff --git a/COPYING.md b/COPYING.md new file mode 100644 index 0000000..5f8b06f --- /dev/null +++ b/COPYING.md @@ -0,0 +1,675 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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. + + This program 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 this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . diff --git a/src/api/rest-api.js b/src/api/rest-api.js index be14376..66e8211 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -2,10 +2,22 @@ * File: rest-api.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 request from 'superagent/lib/client'; import Promise from 'es6-promise'; diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index c5cad2c..ff866e2 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -2,10 +2,22 @@ * File: websocket-api.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 . + ******************************************************************************/ class WebsocketAPI { addSocket(endpoint, callbacks) { diff --git a/src/app-dispatcher.js b/src/app-dispatcher.js index 52ba2af..ee54eb5 100644 --- a/src/app-dispatcher.js +++ b/src/app-dispatcher.js @@ -2,10 +2,22 @@ * File: app-dispatcher.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { Dispatcher } from 'flux'; diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index e3c774d..b0dff93 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -2,10 +2,22 @@ * File: dialog.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { Modal, Button } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-project.js b/src/components/dialog/edit-project.js index b4facfb..74391f5 100644 --- a/src/components/dialog/edit-project.js +++ b/src/components/dialog/edit-project.js @@ -2,10 +2,22 @@ * File: edit-project.js * Author: Markus Grigull * Date: 07.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index e51380c..3de81dd 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -2,10 +2,22 @@ * File: edit-simulation-model.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; @@ -58,7 +70,7 @@ class EditSimulationModelDialog extends Component { this.setState({ [e.target.id]: e.target.value }); } - + handleMappingChange(event, row, column) { var mapping = this.state.mapping; diff --git a/src/components/dialog/edit-simulation.js b/src/components/dialog/edit-simulation.js index af9dfa4..b12699c 100644 --- a/src/components/dialog/edit-simulation.js +++ b/src/components/dialog/edit-simulation.js @@ -2,10 +2,22 @@ * File: new-simulation.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index 2ed14fb..1fdcc09 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -2,10 +2,22 @@ * File: new-simulator.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-visualization.js b/src/components/dialog/edit-visualization.js index e31f96a..d9520d4 100644 --- a/src/components/dialog/edit-visualization.js +++ b/src/components/dialog/edit-visualization.js @@ -2,10 +2,22 @@ * File: new-visualization.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-widget-image.js b/src/components/dialog/edit-widget-image.js index f7b06e4..20f61e7 100644 --- a/src/components/dialog/edit-widget-image.js +++ b/src/components/dialog/edit-widget-image.js @@ -2,10 +2,22 @@ * File: edit-widget-value.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, ControlLabel, Button } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-widget-plot.js b/src/components/dialog/edit-widget-plot.js index a2371e3..9ff53a2 100644 --- a/src/components/dialog/edit-widget-plot.js +++ b/src/components/dialog/edit-widget-plot.js @@ -2,10 +2,22 @@ * File: edit-widget-plot.js * Author: Markus Grigull * Date: 13.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, ControlLabel, Checkbox, HelpBlock } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-widget-table.js b/src/components/dialog/edit-widget-table.js index 0388ebd..05b17c2 100644 --- a/src/components/dialog/edit-widget-table.js +++ b/src/components/dialog/edit-widget-table.js @@ -2,10 +2,22 @@ * File: edit-widget-table.js * Author: Markus Grigull * Date: 14.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-widget-value.js b/src/components/dialog/edit-widget-value.js index 7f16a03..7061fc9 100644 --- a/src/components/dialog/edit-widget-value.js +++ b/src/components/dialog/edit-widget-value.js @@ -2,10 +2,22 @@ * File: edit-widget-value.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 2b7a21e..561d387 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -2,10 +2,22 @@ * File: edit-widget.js * Author: Markus Grigull * Date: 08.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/new-project.js b/src/components/dialog/new-project.js index ae08024..02c1550 100644 --- a/src/components/dialog/new-project.js +++ b/src/components/dialog/new-project.js @@ -2,10 +2,22 @@ * File: new-project.js * Author: Markus Grigull * Date: 07.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index e8cf8aa..5789e51 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -2,10 +2,22 @@ * File: new-simulation-model.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; @@ -74,7 +86,7 @@ class NewSimulationModelDialog extends Component { resetState() { this.setState({ name: '', - simulator: this.props.simulators[0] != null ? this.props.simulators[0]._id : '', + simulator: this.props.simulators[0] != null ? this.props.simulators[0]._id : '', length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); diff --git a/src/components/dialog/new-simulation.js b/src/components/dialog/new-simulation.js index 617f00b..e0d6313 100644 --- a/src/components/dialog/new-simulation.js +++ b/src/components/dialog/new-simulation.js @@ -2,10 +2,22 @@ * File: new-simulation.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 7726e85..395cf9e 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -2,10 +2,22 @@ * File: new-simulator.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dialog/new-visualization.js b/src/components/dialog/new-visualization.js index 06b3c73..5d04baf 100644 --- a/src/components/dialog/new-visualization.js +++ b/src/components/dialog/new-visualization.js @@ -2,10 +2,22 @@ * File: new-visualization.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; diff --git a/src/components/dropzone.js b/src/components/dropzone.js index 18815e2..2c3172c 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -2,10 +2,22 @@ * File: dropzone.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { DropTarget } from 'react-dnd'; diff --git a/src/components/footer.js b/src/components/footer.js index 77b7136..31d29ed 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -2,10 +2,22 @@ * File: footer.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/components/header.js b/src/components/header.js index b246f9d..2268cb5 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -2,10 +2,22 @@ * File: header.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/components/login-form.js b/src/components/login-form.js index e4e329f..62840d4 100644 --- a/src/components/login-form.js +++ b/src/components/login-form.js @@ -2,10 +2,22 @@ * File: login-form.js * Author: Markus Grigull * Date: 15.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { Form, Button, FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 12ed741..120065d 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -2,10 +2,22 @@ * File: menu-sidebar.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { Link } from 'react-router'; diff --git a/src/components/table-column.js b/src/components/table-column.js index 634910d..2867754 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -2,10 +2,22 @@ * File: table-column.js * Author: Markus Grigull * Date: 06.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/components/table.js b/src/components/table.js index 26bec32..f0b94d1 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -2,10 +2,22 @@ * File: table.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { Table, Button, Glyphicon, FormControl, Label } from 'react-bootstrap'; diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js index 4cc0144..8d253f3 100644 --- a/src/components/toolbox-item.js +++ b/src/components/toolbox-item.js @@ -2,10 +2,22 @@ * File: toolbox-item.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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, PropTypes } from 'react'; import { DragSource } from 'react-dnd'; diff --git a/src/components/widget-image.js b/src/components/widget-image.js index c04a4a1..aeb9642 100644 --- a/src/components/widget-image.js +++ b/src/components/widget-image.js @@ -2,10 +2,22 @@ * File: widget-image.js * Author: Markus Grigull * Date: 14.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/components/widget-label.js b/src/components/widget-label.js index 2c29650..d9cd5cc 100644 --- a/src/components/widget-label.js +++ b/src/components/widget-label.js @@ -2,10 +2,22 @@ * File: widget-label.js * Author: Markus Grigull * Date: 14.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 5305ff8..71ea8bf 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -2,10 +2,22 @@ * File: widget-plot-table.js * Author: Markus Grigull * Date: 15.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { LineChart } from 'rd3'; @@ -80,7 +92,7 @@ class WidgetPlotTable extends Component { this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextProps.data[simulator].sequence, rows: rows }); } - + render() { console.log("Signal: " + this.state.signal); return ( diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 96de856..aa455a6 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -2,10 +2,22 @@ * File: widget-plot.js * Author: Markus Grigull * Date: 08.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { LineChart } from 'rd3'; diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 071c084..9de95d7 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -2,10 +2,22 @@ * File: widget-table.js * Author: Markus Grigull * Date: 14.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/components/widget-value.js b/src/components/widget-value.js index c096695..f4b9ac4 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -2,10 +2,22 @@ * File: widget-value.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/app.js b/src/containers/app.js index 61f4d16..4e90442 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -2,10 +2,22 @@ * File: app.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; @@ -108,7 +120,7 @@ class App extends Component { localStorage.setItem('token', ''); this.props.router.push('/login'); - + return; } diff --git a/src/containers/home.js b/src/containers/home.js index ae74541..22e6782 100644 --- a/src/containers/home.js +++ b/src/containers/home.js @@ -2,10 +2,22 @@ * File: home.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/login.js b/src/containers/login.js index 9453900..d568bc7 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -2,10 +2,22 @@ * File: login.js * Author: Markus Grigull * Date: 15.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/logout.js b/src/containers/logout.js index 91dc617..5e246bb 100644 --- a/src/containers/logout.js +++ b/src/containers/logout.js @@ -2,10 +2,22 @@ * File: logout.js * Author: Markus Grigull * Date: 15.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/project.js b/src/containers/project.js index 5ba98bd..988dbdf 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -2,10 +2,22 @@ * File: project.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; @@ -29,7 +41,7 @@ class Visualizations extends Component { let currentProjects = ProjectStore.getState(); let currentVisualizations = VisualizationStore.getState(); - + if (prevState) { var projectUpdate = prevState.project; @@ -62,7 +74,7 @@ class Visualizations extends Component { if (initialProject && (!currentVisualizations || currentVisualizations.length === 0)) { Visualizations.loadVisualizations(initialProject.visualizations); } - + return { projects: currentProjects, visualizations: currentVisualizations, @@ -136,7 +148,7 @@ class Visualizations extends Component { // get visualizations for this project var visualizations = []; if (this.state.visualizations && this.state.project.visualizations) { - visualizations = this.state.visualizations.filter( + visualizations = this.state.visualizations.filter( (visualization) => this.state.project.visualizations.includes(visualization._id) ).sort( (visA, visB) => visA.name.localeCompare(visB.name) diff --git a/src/containers/projects.js b/src/containers/projects.js index 4e6a4b6..e04d34f 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -2,10 +2,22 @@ * File: projects.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/simulation.js b/src/containers/simulation.js index b6f6c97..20f17bd 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -2,10 +2,22 @@ * File: simulation.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/simulations.js b/src/containers/simulations.js index dd80a71..62ef433 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -2,10 +2,22 @@ * File: simulations.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/simulators.js b/src/containers/simulators.js index a913f73..489aac4 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -2,10 +2,22 @@ * File: simulators.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 9d108fa..3f9ea9c 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -2,10 +2,22 @@ * File: visualization.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; @@ -87,7 +99,7 @@ class Visualization extends Component { }); } } - + getNewWidgetKey() { // Increase the counter and update the state return this.state.last_widget_key++; @@ -185,7 +197,7 @@ class Visualization extends Component { } widgetChange(updated_widget, key) { - + var widgets_update = {}; widgets_update[key] = updated_widget; var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); @@ -205,7 +217,7 @@ class Visualization extends Component { // save changes temporarily var widgets_update = {}; widgets_update[this.state.modalIndex] = data; - + var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); var visualization = Object.assign({}, this.state.visualization, { @@ -227,7 +239,7 @@ class Visualization extends Component { } saveChanges() { - // Transform to a list + // Transform to a list var visualization = Object.assign({}, this.state.visualization, { widgets: this.transformToWidgetsList(this.state.visualization.widgets) }); @@ -349,7 +361,7 @@ class Visualization extends Component { ))} - {current_widgets != null && + {current_widgets != null && Object.keys(current_widgets).map( (widget_key) => ( this.editWidget(e, data)}>Edit diff --git a/src/containers/widget.js b/src/containers/widget.js index 7aa540f..e14a47b 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -2,10 +2,22 @@ * File: widget.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; @@ -100,8 +112,8 @@ class Widget extends Component { } render() { - - + + //console.log('render widget ' + this.props.data.z + this.props.data.type); @@ -129,7 +141,7 @@ class Widget extends Component { } else if (widget.type === 'Image') { element = } - + if (this.props.editing) { return ( this.borderWasClicked(event) } + onResizeStart={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} onDragStop={(event, ui) => this.dragStop(event, ui)} moveGrid={grid} diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js index 385c778..5f7e1c0 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/data-managers/files-data-manager.js @@ -2,10 +2,22 @@ * File: files-data-manager.js * Author: Markus Grigull * Date: 16.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/data-managers/notifications-data-manager.js b/src/data-managers/notifications-data-manager.js index b5798bb..f463fcd 100644 --- a/src/data-managers/notifications-data-manager.js +++ b/src/data-managers/notifications-data-manager.js @@ -2,10 +2,22 @@ * File: notifications-data-manager.js * Author: Markus Grigull * Date: 21.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 . + ******************************************************************************/ class NotificationsDataManager { _notificationSystem = null; diff --git a/src/data-managers/projects-data-manager.js b/src/data-managers/projects-data-manager.js index a85801d..e1b8167 100644 --- a/src/data-managers/projects-data-manager.js +++ b/src/data-managers/projects-data-manager.js @@ -2,10 +2,22 @@ * File: projects-data-manager.js * Author: Markus Grigull * Date: 07.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 655815c..10fb65a 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -2,10 +2,22 @@ * File: rest-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index d5a606e..d5756cb 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -2,10 +2,22 @@ * File: simulation-data-manager.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 57dc126..d311af4 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -2,10 +2,22 @@ * File: simulator-data-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 WebsocketAPI from '../api/websocket-api'; import AppDispatcher from '../app-dispatcher'; diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index f9c2c97..9bee488 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -2,10 +2,22 @@ * File: simulators-data-manager.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index 7ba1723..711c68d 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -2,10 +2,22 @@ * File: users-data-manager.js * Author: Markus Grigull * Date: 15.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/data-managers/visualizations-data-manager.js b/src/data-managers/visualizations-data-manager.js index 10210bc..b141880 100644 --- a/src/data-managers/visualizations-data-manager.js +++ b/src/data-managers/visualizations-data-manager.js @@ -2,10 +2,22 @@ * File: visualizations-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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'; diff --git a/src/index.js b/src/index.js index c7cccd4..a853c12 100644 --- a/src/index.js +++ b/src/index.js @@ -2,10 +2,22 @@ * File: index.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 ReactDOM from 'react-dom'; diff --git a/src/router.js b/src/router.js index aff704e..a74a7eb 100644 --- a/src/router.js +++ b/src/router.js @@ -2,10 +2,22 @@ * File: router.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { Router, Route, hashHistory } from 'react-router'; diff --git a/src/stores/array-store.js b/src/stores/array-store.js index 20c006b..9ff162e 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -2,10 +2,22 @@ * File: array-store.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { ReduceStore } from 'flux/utils'; diff --git a/src/stores/file-store.js b/src/stores/file-store.js index 57bf1c9..104d16b 100644 --- a/src/stores/file-store.js +++ b/src/stores/file-store.js @@ -2,10 +2,22 @@ * File: file-store.js * Author: Markus Grigull * Date: 16.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 './array-store'; import FilesDataManager from '../data-managers/files-data-manager'; diff --git a/src/stores/project-store.js b/src/stores/project-store.js index 405820f..0df9380 100644 --- a/src/stores/project-store.js +++ b/src/stores/project-store.js @@ -2,10 +2,22 @@ * File: project-store.js * Author: Markus Grigull * Date: 07.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 './array-store'; import ProjectsDataManager from '../data-managers/projects-data-manager'; diff --git a/src/stores/simulation-store.js b/src/stores/simulation-store.js index 89854f5..87f4676 100644 --- a/src/stores/simulation-store.js +++ b/src/stores/simulation-store.js @@ -2,10 +2,22 @@ * File: simulation-store.js * Author: Markus Grigull * Date: 04.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 './array-store'; import SimulationsDataManager from '../data-managers/simulations-data-manager'; diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 741c339..d52ac1d 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -2,10 +2,22 @@ * File: simulator-data-store.js * Author: Markus Grigull * Date: 03.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { ReduceStore } from 'flux/utils'; diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 9f430ef..4f8d6bd 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -2,10 +2,22 @@ * File: villas-store.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 './array-store'; import SimulatorsDataManager from '../data-managers/simulators-data-manager'; @@ -28,7 +40,7 @@ class SimulatorStore extends ArrayStore { case 'simulators/removed': SimulatorsDataManager.stopRunningDetection(action.original); - + return super.reduce(state, action); case 'simulators/start-edit': @@ -40,7 +52,7 @@ class SimulatorStore extends ArrayStore { case 'simulators/edited': // The update was done, resume the 'runningDetection' SimulatorsDataManager.startRunningDetection(action.data); - + return super.reduce(state, action); case 'simulators/loaded': diff --git a/src/stores/user-store.js b/src/stores/user-store.js index c3467d2..37fc363 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -2,10 +2,22 @@ * File: user-store.js * Author: Markus Grigull * Date: 15.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { ReduceStore } from 'flux/utils'; diff --git a/src/stores/villas-store.js b/src/stores/villas-store.js index 3fc05bf..b553101 100644 --- a/src/stores/villas-store.js +++ b/src/stores/villas-store.js @@ -2,10 +2,22 @@ * File: villas-store.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 { ReduceStore } from 'flux/utils'; diff --git a/src/stores/visualization-store.js b/src/stores/visualization-store.js index 5b5c83f..ba69682 100644 --- a/src/stores/visualization-store.js +++ b/src/stores/visualization-store.js @@ -2,10 +2,22 @@ * File: visualization-store.js * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 './array-store'; import VisualizationsDataManager from '../data-managers/visualizations-data-manager'; diff --git a/src/styles/app.css b/src/styles/app.css index f1972a0..f5a12fd 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -2,10 +2,22 @@ * File: app.css * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 . + ******************************************************************************/ /** * Application container @@ -236,4 +248,4 @@ body { .section-header .glyphicon { font-size: 0.8em; -} \ No newline at end of file +} diff --git a/src/styles/index.css b/src/styles/index.css index 830576d..dde0352 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -1,3 +1,24 @@ +/** + * 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 + * 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 . + ******************************************************************************/ + * { margin: 0; padding: 0; diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c6a9c91..dcf9957 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -2,10 +2,22 @@ * File: widgets.css * Author: Markus Grigull * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * + * 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 . + ******************************************************************************/ .widget { border: 1px solid lightgray; @@ -123,8 +135,8 @@ border-color: #adadad; } /* End reset */ - + .plot-table-widget .widget-plot { -webkit-flex: 1 0 auto; flex: 1 0 auto; -} \ No newline at end of file +} From 7f2b5735312fd2aeac8705567e5e50a709b7637e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 15:36:54 +0200 Subject: [PATCH 175/556] fixed run command parameters --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 753f1c3..293406e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,9 +20,9 @@ stages: build_job: stage: build script: - - docker run -v .:/usr/src/app node:7.9.0-slim npm install /usr/src/app + - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/build:/usr/src/app/build -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm run build' test_job: stage: test script: - - docker run -v .:/usr/src/app node:7.9.0-slim npm test /usr/src/app + - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm test' From 2b801167c74b2e50bb35d39b9a7f407c99bb8f95 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 16:44:16 +0200 Subject: [PATCH 176/556] Set backend endpoint from ENV --- src/data-managers/rest-data-manager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 655815c..0d5508e 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -9,8 +9,8 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; - -const API_URL = 'http://localhost:4000/api/v1'; +const backend = process.env.REACT_APP_BACKEND || 'ghvillas.westeurope.cloudapp.azure.com:4000' +const API_URL = 'http://' + backend + '/api/v1'; class RestDataManager { constructor(type, url, keyFilter) { From e201f9086709b5302f096d36a792c6bcda1d74c2 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 16:46:31 +0200 Subject: [PATCH 177/556] backend as module; frontend as Docker image; deployment configuration --- .gitlab-ci.yml | 16 +++++++++++++--- .gitmodules | 4 ++++ docker-compose.yml | 13 ++++++++----- nginx/Dockerfile | 10 ++++++++++ 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 .gitmodules create mode 100644 nginx/Dockerfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 293406e..5306991 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,17 +5,16 @@ services: before_script: - docker info -- mkdir build -- mkdir node_modules +- mkdir -p build cache: paths: - build - - node_modules stages: - build - test +- deploy build_job: stage: build @@ -26,3 +25,14 @@ test_job: stage: test script: - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm test' + +deploy_review: + stage: deploy + environment: review + script: + - echo $DEPLOYMENT_CACERT > ~/.docker/ca.pem + - echo $DEPLOYMENT_CLIENT_CERT > ~/.docker/cert.pem + - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem + - docker-compose build + - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST down + - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST up \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..cbc88dc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "VILLASweb-backend"] + path = VILLASweb-backend + url = VILLASframework/VILLASweb-backend.git + branch = docker-names diff --git a/docker-compose.yml b/docker-compose.yml index afdd7a7..75cf6cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,10 +2,9 @@ version: "2" services: frontend: - image: nginx:stable - volumes: - - ./nginx:/etc/nginx/conf.d/ - - ./build:/www + build: + context: . + dockerfile: nginx/Dockerfile links: - backend ports: @@ -13,12 +12,16 @@ services: - "443:443" backend: - image: villasweb-backend + build: VILLASweb-backend links: - database + ports: + - "4000:4000" database: image: mongo:latest volumes: - /opt/database:/data/db + ports: + - "27017:27017" diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 0000000..3b31184 --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,10 @@ +FROM nginx:stable + +# Copy frontend files and make them accesible to nginx +RUN mkdir /www +COPY ./build /www +RUN chown nginx:nginx -R /www +RUN chmod -R 0755 /www + +# Copy nginx configuration +COPY ./nginx/villas.conf /etc/nginx/conf.d/default.conf From b7d9783d6ba96d4f2bb582c47a27040038330005 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 17:12:29 +0200 Subject: [PATCH 178/556] avoid running tests in watch mode --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5306991..c3bb846 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -24,7 +24,7 @@ build_job: test_job: stage: test script: - - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm test' + - docker run --rm -e CI=true -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm test' deploy_review: stage: deploy From dc7a2320fbef79129429d05034310268ac4661d6 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 17:23:38 +0200 Subject: [PATCH 179/556] create directory first --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c3bb846..ceeb6e1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,6 +30,7 @@ deploy_review: stage: deploy environment: review script: + - mkdir -p ~/.docker - echo $DEPLOYMENT_CACERT > ~/.docker/ca.pem - echo $DEPLOYMENT_CLIENT_CERT > ~/.docker/cert.pem - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem From 9fdbc619fe3437aa7dbb86944ed7154a741d9d26 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 17:26:56 +0200 Subject: [PATCH 180/556] gitmodule relative url --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index cbc88dc..955a1d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "VILLASweb-backend"] path = VILLASweb-backend - url = VILLASframework/VILLASweb-backend.git + url = ../../VILLASframework/VILLASweb-backend.git branch = docker-names From c36202c2589b978967e68c474a5dfa679a154b03 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 17:33:13 +0200 Subject: [PATCH 181/556] missing submodule strategy variable --- .gitlab-ci.yml | 3 +++ VILLASweb-backend | 1 + 2 files changed, 4 insertions(+) create mode 160000 VILLASweb-backend diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ceeb6e1..0becc04 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,8 @@ image: docker +variables: + GIT_SUBMODULE_STRATEGY: normal + services: - docker:dind diff --git a/VILLASweb-backend b/VILLASweb-backend new file mode 160000 index 0000000..9610f8b --- /dev/null +++ b/VILLASweb-backend @@ -0,0 +1 @@ +Subproject commit 9610f8bc9e5eaf35fc53f97c64ecd16b04f55b5b From 89fd344bf2435b37854c7d788ef07e9256880af0 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 17:44:07 +0200 Subject: [PATCH 182/556] Specify docker runner through tags --- .gitlab-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0becc04..82b3cd1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,11 +23,15 @@ build_job: stage: build script: - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/build:/usr/src/app/build -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm run build' + tags: + - docker test_job: stage: test script: - docker run --rm -e CI=true -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm test' + tags: + - docker deploy_review: stage: deploy @@ -39,4 +43,6 @@ deploy_review: - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem - docker-compose build - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST down - - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST up \ No newline at end of file + - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST up + tags: + - docker From 89bd3b7eb03aa4dd48643a723c355971aaf1a976 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 18:09:38 +0200 Subject: [PATCH 183/556] attempt to install docker-compose --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82b3cd1..41277a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,9 @@ services: - docker:dind before_script: -- docker info +- docker version +- apk add --no-cache py-pip +- pip install docker-compose - mkdir -p build cache: From 0beb5e676a024cb4cfc94bf0dfa4b847898c6587 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 27 Apr 2017 18:34:46 +0200 Subject: [PATCH 184/556] Reduced image size --- nginx/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 3b31184..f5d6b65 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,4 +1,4 @@ -FROM nginx:stable +FROM nginx:stable-alpine # Copy frontend files and make them accesible to nginx RUN mkdir /www From 80e90ef20e3c99e22ee9db348521b0d80297176d Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 28 Apr 2017 09:22:00 +0200 Subject: [PATCH 185/556] changed submodule branch to docker-names --- VILLASweb-backend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VILLASweb-backend b/VILLASweb-backend index 9610f8b..8184b91 160000 --- a/VILLASweb-backend +++ b/VILLASweb-backend @@ -1 +1 @@ -Subproject commit 9610f8bc9e5eaf35fc53f97c64ecd16b04f55b5b +Subproject commit 8184b91f013f25887a129fd95354da3cc5796244 From ffb3fc884fb0caaaae5362182b15c6d0d177865e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 28 Apr 2017 09:38:30 +0200 Subject: [PATCH 186/556] correct docker-compose options --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 41277a8..5b85ab9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -44,7 +44,7 @@ deploy_review: - echo $DEPLOYMENT_CLIENT_CERT > ~/.docker/cert.pem - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem - docker-compose build - - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST down - - docker-compose -d --tlsverify -H=$DEPLOYMENT_HOST up + - docker-compose --tlsverify -H=$DEPLOYMENT_HOST down + - docker-compose --tlsverify -H=$DEPLOYMENT_HOST up -d tags: - docker From 5d70a737737d63c0767e6db95e14f0a00834ac39 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 28 Apr 2017 11:43:15 +0200 Subject: [PATCH 187/556] issues #42 and #43 --- src/api/rest-api.js | 37 +++++++++++++++++++++++++++++++++++-- src/stores/user-store.js | 18 ++++++++++++------ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/api/rest-api.js b/src/api/rest-api.js index 66e8211..6a79598 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -21,6 +21,36 @@ 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', + message: 'The server could not be reached. Please try again later.', + level: 'error' + }; + +const REQUEST_TIMEOUT_NOTIFICATION = { + title: 'Request timeout', + message: 'Request timed out. Please try again later.', + level: 'error' + }; + +// 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; + + // 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); + } + return result; +} class RestAPI { get(url, token) { @@ -43,14 +73,17 @@ class RestAPI { post(url, body, token) { return new Promise(function (resolve, reject) { - var req = request.post(url).send(body); + 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.end(function (error, res) { if (res == null || res.status !== 200) { + + error.handled = isNetworkError(error); + reject(error); } else { resolve(JSON.parse(res.text)); diff --git a/src/stores/user-store.js b/src/stores/user-store.js index 37fc363..aeed56f 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -67,12 +67,18 @@ class UserStore extends ReduceStore { return Object.assign({}, state, { currentUser: null, token: null }); case 'users/login-error': - // server offline - NotificationsDataManager.addNotification({ - title: 'Server offline', - message: 'The server is offline. Please try again later.', - level: 'error' - }); + + if (action.error && !action.error.handled) { + // If it was an error and hasn't been handled, the credentials must have been wrong. + const WRONG_CREDENTIALS_NOTIFICATION = { + title: 'Incorrect credentials', + message: 'Please modify and try again.', + level: 'error' + } + NotificationsDataManager.addNotification(WRONG_CREDENTIALS_NOTIFICATION); + + } + return state; default: From 560713e90184e1cf37de56ed34acbdf6de84cff1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Apr 2017 17:39:44 +0200 Subject: [PATCH 188/556] Add backend environment support Add proxy for development --- docker-compose.yml | 7 ++++--- nginx/villas.conf | 6 +++--- package.json | 1 + src/data-managers/rest-data-manager.js | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index afdd7a7..1f3a63e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,9 +16,10 @@ services: image: villasweb-backend links: - database + environment: + - NODE_ENV=production database: image: mongo:latest - volumes: - - /opt/database:/data/db - +# volumes: +# - /opt/database:/data/db diff --git a/nginx/villas.conf b/nginx/villas.conf index f3417de..7fd9ee9 100644 --- a/nginx/villas.conf +++ b/nginx/villas.conf @@ -7,10 +7,10 @@ server { proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - + # rewrite url to exclude /api on context broker side - rewrite ^/api/?(.*) /api/v1/$1 break; - + rewrite ^/api/?(.*) /api/$1 break; + proxy_pass http://backend:4000/; } diff --git a/package.json b/package.json index 0116f0a..81c7ea6 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "villasweb-frontend", "version": "0.1.0", "private": true, + "proxy": "http://localhost:4000", "dependencies": { "bootstrap": "^3.3.7", "classnames": "^2.2.5", diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 10fb65a..f4fd82f 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 = 'http://localhost:4000/api/v1'; +const API_URL = '/api/v1'; class RestDataManager { constructor(type, url, keyFilter) { From 2fbd71f28f62aaf63a30ad85ef72902ceb3b354e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 28 Apr 2017 12:37:16 +0200 Subject: [PATCH 189/556] Add automated react build to docker-compose --- .dockerignore | 4 ++++ Dockerfile | 10 ++++++++++ docker-compose.yml | 21 +++++++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..84eb9b1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +node_modules/ +nginx/ +doc/ +build/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b014976 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM node:latest + +RUN mkdir /react +RUN mkdir /result + +VOLUME /result + +WORKDIR /react + +CMD npm install && npm run build && cp -R /react/build/* /result/ diff --git a/docker-compose.yml b/docker-compose.yml index 1f3a63e..c41ab1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,23 @@ version: "2" services: - frontend: + webserver: image: nginx:stable volumes: - ./nginx:/etc/nginx/conf.d/ - - ./build:/www + - website-volume:/www links: - backend ports: - "80:80" - "443:443" + restart: always + + frontend: + build: . + volumes: + - ./:/react + - website-volume:/result backend: image: villasweb-backend @@ -18,8 +25,14 @@ services: - database environment: - NODE_ENV=production + restart: always database: image: mongo:latest -# volumes: -# - /opt/database:/data/db + volumes: + - data-volume:/data/db + restart: always + +volumes: + data-volume: + website-volume: From b2728b31be7e3432789bfb325767f4cdb4bc8380 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 28 Apr 2017 12:53:01 +0200 Subject: [PATCH 190/556] Fix for mongodb on linux --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index c41ab1f..579c30b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,6 +32,7 @@ services: volumes: - data-volume:/data/db restart: always + user: mongodb volumes: data-volume: From b580c0ba1292ff75b768c98b8a461a3848f6de1e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 28 Apr 2017 13:03:53 +0200 Subject: [PATCH 191/556] explicitely set docker-compose env variables --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5b85ab9..fe21e3b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -43,8 +43,9 @@ deploy_review: - echo $DEPLOYMENT_CACERT > ~/.docker/ca.pem - echo $DEPLOYMENT_CLIENT_CERT > ~/.docker/cert.pem - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem + - export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 - docker-compose build - - docker-compose --tlsverify -H=$DEPLOYMENT_HOST down - - docker-compose --tlsverify -H=$DEPLOYMENT_HOST up -d + - docker-compose -H=$DEPLOYMENT_HOST --verbose down + - docker-compose -H=$DEPLOYMENT_HOST --verbose up -d tags: - docker From 0d0e2dc118016232b39ef3d95b99fc1fbcf412a5 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 28 Apr 2017 13:30:31 +0200 Subject: [PATCH 192/556] Set env variables after building images --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fe21e3b..0e675f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -43,8 +43,8 @@ deploy_review: - echo $DEPLOYMENT_CACERT > ~/.docker/ca.pem - echo $DEPLOYMENT_CLIENT_CERT > ~/.docker/cert.pem - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem - - export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 - docker-compose build + - export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 - docker-compose -H=$DEPLOYMENT_HOST --verbose down - docker-compose -H=$DEPLOYMENT_HOST --verbose up -d tags: From 18cff1701a527c7ba104f16b66a4949262291612 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 28 Apr 2017 14:31:20 +0200 Subject: [PATCH 193/556] is variable available? --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e675f1..98f57e5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,6 +7,7 @@ services: - docker:dind before_script: +- echo $DEPLOYMENT_HOST - docker version - apk add --no-cache py-pip - pip install docker-compose From 56f49da1bb014c68ad25947b2c230b1db5c38694 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 2 May 2017 11:38:48 +0200 Subject: [PATCH 194/556] Issue #56: tab jump in tables --- src/components/table.js | 70 +++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/src/components/table.js b/src/components/table.js index f0b94d1..f0798c5 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -29,6 +29,7 @@ class CustomTable extends Component { constructor(props) { super(props); + this.activeInput = null; this.state = { rows: [], editCell: [ -1, -1 ] @@ -125,6 +126,23 @@ class CustomTable extends Component { this.setState({ rows: rows }); } + componentDidUpdate() { + // A cell will not be selected at initial render, hence no need to call this in 'componentDidMount' + if (this.activeInput) { + this.activeInput.focus(); + } + } + + onCellFocus(index) { + // When a cell focus is detected, update the current state in order to uncover the input element + this.setState({ editCell: [ index.cell, index.row ]}); + } + + cellLostFocus() { + // Reset cell selection state + this.setState({ editCell: [ -1, -1 ] }); + } + render() { // get children var children = this.props.children; @@ -140,23 +158,41 @@ class CustomTable extends Component {
    - {this.state.rows.map((row, rowIndex) => ( - - {row.map((cell, cellIndex) => ( - - ))} - - ))} + { + this.state.rows.map((row, rowIndex) => ( + + { + row.map((cell, cellIndex) => { + + let isCellInlineEditable = children[cellIndex].props.inlineEditable === true; + + let tabIndex = isCellInlineEditable? 0 : -1; + + let evtHdls = isCellInlineEditable ? { + onCellClick: (event) => this.onClick(event, rowIndex, cellIndex), + onCellFocus: () => this.onCellFocus({cell: cellIndex, row: rowIndex}), + onCellBlur: () => this.cellLostFocus() + } : { + onCellClick: () => {}, + onCellFocus: () => {}, + onCellBlur: () => {} + }; + + return () + }) + } + )) + }
    this.onClick(event, rowIndex, cellIndex) : () => {}}> - {(this.state.editCell[0] === cellIndex && this.state.editCell[1] === rowIndex ) ? ( - children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} /> - ) : ( - - {cell.map((element, elementIndex) => ( - {element} - ))} - - )} -
    + {(this.state.editCell[0] === cellIndex && this.state.editCell[1] === rowIndex ) ? ( + children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} inputRef={ref => { this.activeInput = ref; }} /> + ) : ( + + {cell.map((element, elementIndex) => ( + {element} + ))} + + )} +
    ); From 80bd1f102eb39c7ec026af4fa14992b0986fa443 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 2 May 2017 14:23:09 +0200 Subject: [PATCH 195/556] list users --- src/components/menu-sidebar.js | 1 + src/containers/users.js | 136 ++++++++++++++++++++++++ src/data-managers/users-data-manager.js | 14 +++ src/router.js | 3 + src/stores/user-store.js | 14 +++ 5 files changed, 168 insertions(+) create mode 100644 src/containers/users.js diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 120065d..1782304 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -33,6 +33,7 @@ class SidebarMenu extends Component {
  • Projects
  • Simulations
  • Simulators
  • +
  • User Management
  • Logout
  • diff --git a/src/containers/users.js b/src/containers/users.js new file mode 100644 index 0000000..531f112 --- /dev/null +++ b/src/containers/users.js @@ -0,0 +1,136 @@ +/** + * 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 + * 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, Modal, Glyphicon } from 'react-bootstrap'; + +import AppDispatcher from '../app-dispatcher'; +import UserStore from '../stores/user-store'; + +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewProjectDialog from '../components/dialog/new-project'; +import EditProjectDialog from '../components/dialog/edit-project'; + +class Projects extends Component { + static getStores() { + return [ UserStore ]; + } + + static calculateState() { + return { + users: UserStore.getState().users, + + newModal: false, + editModal: false, + deleteModal: false, + modalData: {} + }; + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'users/start-load' + }); + } + + // closeNewModal(data) { + // this.setState({ newModal: false }); + + // if (data) { + // AppDispatcher.dispatch({ + // type: 'projects/start-add', + // data: data + // }); + // } + // } + + // confirmDeleteModal() { + // this.setState({ deleteModal: false }); + + // AppDispatcher.dispatch({ + // type: 'projects/start-remove', + // data: this.state.modalData + // }); + // } + + // closeEditModal(data) { + // this.setState({ editModal: false }); + + // if (data) { + // AppDispatcher.dispatch({ + // type: 'projects/start-edit', + // data: data + // }); + // } + // } + + // 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; + // } + + render() { + + this.state.users.map( (user) => console.log('User: %o', user)); + + return ( +
    +

    Users

    + + + + + this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> +
    + + {/* + + this.closeNewModal(data)} simulations={this.state.simulations} /> + + this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> + + + + Delete Project + + + + Are you sure you want to delete the project '{this.state.modalData.name}'? + + + + + + + */} +
    + ); + } +} + +export default Container.create(Projects); diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index 711c68d..08c3138 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -55,6 +55,20 @@ class UsersDataManager extends RestDataManager { }); }); } + + getUsers(token) { + RestAPI.get(this.makeURL('/users'), token).then(response => { + AppDispatcher.dispatch({ + type: 'users/users-loaded', + users: response.users + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'users/users-load-error', + error: error + }); + }); + } } export default new UsersDataManager(); diff --git a/src/router.js b/src/router.js index a74a7eb..85bbe78 100644 --- a/src/router.js +++ b/src/router.js @@ -30,6 +30,7 @@ import Simulators from './containers/simulators'; import Visualization from './containers/visualization'; import Simulations from './containers/simulations'; import Simulation from './containers/simulation'; +import Users from './containers/users'; import Login from './containers/login'; import Logout from './containers/logout'; @@ -50,6 +51,8 @@ class Root extends Component { + + diff --git a/src/stores/user-store.js b/src/stores/user-store.js index aeed56f..9acf4d2 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -80,6 +80,20 @@ class UserStore extends ReduceStore { } return state; + + case 'users/start-load': + console.log('Sending request'); + UsersDataManager.getUsers(state.token); + + return state; + + case 'users/users-loaded': + + return Object.assign({}, state, { users: action.users }); + + case 'users/users-load-error': + // Users couldn't be loaded. Keep same state + return state; default: return state; From 6a4c31baef0570900242468dc42c9d6df45608dc Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 2 May 2017 16:29:11 +0200 Subject: [PATCH 196/556] List users reusing array-store --- src/containers/users.js | 43 ++++++++++++----------- src/data-managers/users-data-manager.js | 6 ++-- src/stores/user-store.js | 16 +-------- src/stores/users-store.js | 45 +++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 src/stores/users-store.js diff --git a/src/containers/users.js b/src/containers/users.js index 531f112..b8773be 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -25,20 +25,33 @@ import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import UserStore from '../stores/user-store'; +import UsersStore from '../stores/users-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -import NewProjectDialog from '../components/dialog/new-project'; -import EditProjectDialog from '../components/dialog/edit-project'; +// import NewUserDialog from '../components/dialog/new-user'; +// import EditUserDialog from '../components/dialog/edit-user'; -class Projects extends Component { +class Users extends Component { static getStores() { - return [ UserStore ]; + return [ UserStore, UsersStore ]; } - static calculateState() { + static calculateState(prevState, props) { + + let tokenState = UserStore.getState().token; + + // If there is a token available and this method was called as a result of loading users + if (!prevState && tokenState) { + AppDispatcher.dispatch({ + type: 'users/start-load', + token: tokenState + }); + } + return { - users: UserStore.getState().users, + token: tokenState, + users: UsersStore.getState(), newModal: false, editModal: false, @@ -47,18 +60,12 @@ class Projects extends Component { }; } - componentWillMount() { - AppDispatcher.dispatch({ - type: 'users/start-load' - }); - } - // closeNewModal(data) { // this.setState({ newModal: false }); // if (data) { // AppDispatcher.dispatch({ - // type: 'projects/start-add', + // type: 'users/start-add', // data: data // }); // } @@ -95,8 +102,6 @@ class Projects extends Component { // } render() { - - this.state.users.map( (user) => console.log('User: %o', user)); return (
    @@ -108,11 +113,11 @@ class Projects extends Component { this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> - {/* + - this.closeNewModal(data)} simulations={this.state.simulations} /> + {/* this.closeNewModal(data)} />*/} - this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> + {/* this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> @@ -133,4 +138,4 @@ class Projects extends Component { } } -export default Container.create(Projects); +export default Container.create(Users); diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index 08c3138..b20c3c2 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -59,12 +59,12 @@ class UsersDataManager extends RestDataManager { getUsers(token) { RestAPI.get(this.makeURL('/users'), token).then(response => { AppDispatcher.dispatch({ - type: 'users/users-loaded', - users: response.users + type: 'users/loaded', + data: response.users }); }).catch(error => { AppDispatcher.dispatch({ - type: 'users/users-load-error', + type: 'users/load-error', error: error }); }); diff --git a/src/stores/user-store.js b/src/stores/user-store.js index 9acf4d2..0c3a70a 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -79,21 +79,7 @@ class UserStore extends ReduceStore { } - return state; - - case 'users/start-load': - console.log('Sending request'); - UsersDataManager.getUsers(state.token); - - return state; - - case 'users/users-loaded': - - return Object.assign({}, state, { users: action.users }); - - case 'users/users-load-error': - // Users couldn't be loaded. Keep same state - return state; + return state; default: return state; diff --git a/src/stores/users-store.js b/src/stores/users-store.js new file mode 100644 index 0000000..3eb1595 --- /dev/null +++ b/src/stores/users-store.js @@ -0,0 +1,45 @@ +/** + * 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 + * 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 './array-store'; +import UsersDataManager from '../data-managers/users-data-manager'; + +class UsersStore extends ArrayStore { + constructor() { + super('users', UsersDataManager); + } + + reduce(state, action) { + switch (action.type) { + + // Override ArrayStore's start-load to pass token + case 'users/start-load': + UsersDataManager.getUsers(action.token); + return state; + + default: + return super.reduce(state, action); + } + } + +} + +export default new UsersStore(); From 1a54ae09a21183a2fea3ee11ee9f11c9eeabad3e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 2 May 2017 17:26:47 +0200 Subject: [PATCH 197/556] Allow optional token inclusion in REST API calls --- src/data-managers/rest-data-manager.js | 18 +++++++++--------- src/data-managers/users-data-manager.js | 15 +-------------- src/stores/array-store.js | 11 ++++++----- src/stores/users-store.js | 5 ----- 4 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index f4fd82f..99dbd04 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -51,10 +51,10 @@ class RestDataManager { return object; } - load(id) { + load(id, token = null) { if (id != null) { // load single object - RestAPI.get(this.makeURL(this.url + '/' + id)).then(response => { + RestAPI.get(this.makeURL(this.url + '/' + id), token).then(response => { const data = this.filterKeys(response[this.type]); AppDispatcher.dispatch({ @@ -69,7 +69,7 @@ class RestDataManager { }); } else { // load all objects - RestAPI.get(this.makeURL(this.url)).then(response => { + RestAPI.get(this.makeURL(this.url), token).then(response => { const data = response[this.type + 's'].map(element => { return this.filterKeys(element); }); @@ -87,11 +87,11 @@ class RestDataManager { } } - add(object) { + add(object, token = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.post(this.makeURL(this.url), obj).then(response => { + RestAPI.post(this.makeURL(this.url), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', data: response[this.type] @@ -104,8 +104,8 @@ class RestDataManager { }); } - remove(object) { - RestAPI.delete(this.makeURL(this.url + '/' + object._id)).then(response => { + 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], @@ -119,11 +119,11 @@ class RestDataManager { }); } - update(object) { + update(object, token = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.put(this.makeURL(this.url + '/' + object._id), obj).then(response => { + RestAPI.put(this.makeURL(this.url + '/' + object._id, token), obj).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index b20c3c2..bd60534 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -55,20 +55,7 @@ class UsersDataManager extends RestDataManager { }); }); } - - getUsers(token) { - RestAPI.get(this.makeURL('/users'), token).then(response => { - AppDispatcher.dispatch({ - type: 'users/loaded', - data: response.users - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'users/load-error', - error: error - }); - }); - } + } export default new UsersDataManager(); diff --git a/src/stores/array-store.js b/src/stores/array-store.js index 9ff162e..b7cfbee 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -69,10 +69,10 @@ class ArrayStore extends ReduceStore { case this.type + '/start-load': if (Array.isArray(action.data)) { action.data.forEach((id) => { - this.dataManager.load(id); + this.dataManager.load(id, action.token); }); } else { - this.dataManager.load(action.data); + this.dataManager.load(action.data, action.token); } return state; @@ -88,18 +88,19 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/start-add': - this.dataManager.add(action.data); + this.dataManager.add(action.data, action.token); return state; case this.type + '/added': return this.updateElements(state, [action.data]); case this.type + '/add-error': + console.log('something happened'); // TODO: Add error message return state; case this.type + '/start-remove': - this.dataManager.remove(action.data); + this.dataManager.remove(action.data, action.token); return state; case this.type + '/removed': @@ -112,7 +113,7 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/start-edit': - this.dataManager.update(action.data); + this.dataManager.update(action.data, action.token); return state; case this.type + '/edited': diff --git a/src/stores/users-store.js b/src/stores/users-store.js index 3eb1595..0b38e69 100644 --- a/src/stores/users-store.js +++ b/src/stores/users-store.js @@ -30,11 +30,6 @@ class UsersStore extends ArrayStore { reduce(state, action) { switch (action.type) { - // Override ArrayStore's start-load to pass token - case 'users/start-load': - UsersDataManager.getUsers(action.token); - return state; - default: return super.reduce(state, action); } From a4ea7af42933f62faca799e25ad68fecad379516 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 2 May 2017 17:27:04 +0200 Subject: [PATCH 198/556] add users with fixed password --- src/components/dialog/new-user.js | 101 ++++++++++++++++++++++++++++++ src/containers/users.js | 35 ++++++----- 2 files changed, 120 insertions(+), 16 deletions(-) create mode 100644 src/components/dialog/new-user.js diff --git a/src/components/dialog/new-user.js b/src/components/dialog/new-user.js new file mode 100644 index 0000000..60f845d --- /dev/null +++ b/src/components/dialog/new-user.js @@ -0,0 +1,101 @@ +/** + * 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 + * 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, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewUserDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + username: '', + role: 'admin', + password: '1234' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ + username: '', + role: 'admin', + password: '1234' + }); + } + + validateForm(target) { + // check all controls + var username = true; + + if (this.state.username === '') { + username = false; + } + + this.valid = username; + + // return state to control + if (target === 'username') return username ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Username + this.handleChange(e)} /> + + + + Simulation + this.handleChange(e)}> + + + + +
    +
    + ); + } +} + +export default NewUserDialog; diff --git a/src/containers/users.js b/src/containers/users.js index b8773be..4ab17eb 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -21,7 +21,8 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +// import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import UserStore from '../stores/user-store'; @@ -29,7 +30,7 @@ import UsersStore from '../stores/users-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -// import NewUserDialog from '../components/dialog/new-user'; +import NewUserDialog from '../components/dialog/new-user'; // import EditUserDialog from '../components/dialog/edit-user'; class Users extends Component { @@ -60,16 +61,17 @@ class Users extends Component { }; } - // closeNewModal(data) { - // this.setState({ newModal: false }); + closeNewModal(data) { + this.setState({ newModal: false }); - // if (data) { - // AppDispatcher.dispatch({ - // type: 'users/start-add', - // data: data - // }); - // } - // } + if (data) { + AppDispatcher.dispatch({ + type: 'users/start-add', + data: data, + token: this.state.token + }); + } + } // confirmDeleteModal() { // this.setState({ deleteModal: false }); @@ -85,8 +87,9 @@ class Users extends Component { // if (data) { // AppDispatcher.dispatch({ - // type: 'projects/start-edit', - // data: data + // type: 'users/start-edit', + // data: data, + // token: this.state.token // }); // } // } @@ -115,11 +118,11 @@ class Users extends Component { - {/* this.closeNewModal(data)} />*/} + this.closeNewModal(data)} /> - {/* this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> + {/* this.closeEditModal(data)} project={this.state.modalData} />*/} - + {/* Delete Project From fbe3576892cbd95bbe723688e4d5d5ac19ced423 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 2 May 2017 18:21:47 +0200 Subject: [PATCH 199/556] use new API of VILLASnode to detect running simulators --- src/data-managers/simulators-data-manager.js | 22 +++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index 9bee488..f9dfaa6 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -26,20 +26,26 @@ import AppDispatcher from '../app-dispatcher'; function isRunning(simulator) { // get path to nodes.json and simulator name var path = simulator.endpoint.substring(0, simulator.endpoint.lastIndexOf('/')); - path += '/nodes.json'; - var name = simulator.endpoint.substring(simulator.endpoint.lastIndexOf('/') + 1); + var url = 'http://' + path + '/api/v1'; + var body = { + action: 'nodes', + id: '1234' /// @todo use random generated id + }; + // send request - RestAPI.get('http://' + path).then(response => { + RestAPI.post(url, body).then(response => { // check if simulator is running simulator.running = false; - response.forEach(sim => { - if (sim.name === name) { - simulator.running = true; - } - }); + if (response.id == body.id) { + response.response.forEach(sim => { + if (sim.name === name) { + simulator.running = true; + } + }); + } AppDispatcher.dispatch({ type: 'simulators/running', From 56fbaca6802893b18118978cd952360ee87c2b05 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 2 May 2017 18:22:41 +0200 Subject: [PATCH 200/556] remove endian flag from websocket packets --- src/data-managers/simulator-data-data-manager.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index d311af4..22f443b 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -90,23 +90,20 @@ class SimulatorDataDataManager { // parse incoming message into usable data var data = new DataView(blob); - let OFFSET_ENDIAN = 1; let OFFSET_TYPE = 2; let OFFSET_VERSION = 4; var bits = data.getUint8(0); - var endian = (bits >> OFFSET_ENDIAN) & 0x1 ? 0 : 1; - var length = data.getUint16(0x02, endian); + var length = data.getUint16(0x02, 1); var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); return { - endian: endian, version: (bits >> OFFSET_VERSION) & 0xF, type: (bits >> OFFSET_TYPE) & 0x3, length: length, - sequence: data.getUint32(0x04, endian), - timestamp: data.getUint32(0x08, endian) * 1e3 + data.getUint32(0x0C, endian) * 1e-6, + sequence: data.getUint32(0x04, 1), + timestamp: data.getUint32(0x08, 1) * 1e3 + data.getUint32(0x0C, 1) * 1e-6, values: values }; } From 9ec1d54a9389ba029512161cfd4ac6e85587c9be Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 2 May 2017 18:26:04 +0200 Subject: [PATCH 201/556] add note about default user and password --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d05a9a5..172ff40 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ Additional libraries are used, for a complete list see package.json. To start the website locally run `npm start`. This will open a local webserver serving the _frontend_. To make the website work, you still need to start at least the VILLASweb-backend (See repository for information). +The default user and password are configured in the `config.js` file of the _backend_. By default they are: __admin__ / __admin__. + ## Copyright 2017, Institute for Automation of Complex Power Systems, EONERC @@ -55,4 +57,4 @@ For other licensing options please consult [Prof. Antonello Monti](mailto:amonti [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) -[RWTH University Aachen, Germany](http://www.rwth-aachen.de) \ No newline at end of file +[RWTH University Aachen, Germany](http://www.rwth-aachen.de) From 8f6e1fc4399e09581781e08d55d6f24a4b478e89 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 11:05:22 +0200 Subject: [PATCH 202/556] User edit and remove --- src/components/dialog/edit-user.js | 104 +++++++++++++++++++++++++ src/containers/users.js | 60 ++++++-------- src/data-managers/rest-data-manager.js | 2 +- 3 files changed, 130 insertions(+), 36 deletions(-) create mode 100644 src/components/dialog/edit-user.js diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js new file mode 100644 index 0000000..9485c29 --- /dev/null +++ b/src/components/dialog/edit-user.js @@ -0,0 +1,104 @@ +/** + * 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, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class EditUserDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + user: PropTypes.object.isRequired + }; + + valid: true; + + constructor(props) { + super(props); + + this.state = { + username: '', + role: '', + _id: '' + } + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ + username: this.props.user.username, + role: this.props.user.role, + _id: this.props.user._id + }); + } + + validateForm(target) { + // check all controls + var username = true; + + if (this.state.username === '') { + username = false; + } + + this.valid = username; + + // return state to control + if (target === 'username') return username ? "success" : "error"; + + return "success"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Username + this.handleChange(e)} /> + + + + Simulation + this.handleChange(e)}> + + + + +
    +
    + ); + } +} + +export default EditUserDialog; diff --git a/src/containers/users.js b/src/containers/users.js index 4ab17eb..b1f573f 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -21,8 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -// import { Button, Modal, Glyphicon } from 'react-bootstrap'; -import { Button, Glyphicon } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import UserStore from '../stores/user-store'; @@ -31,7 +30,7 @@ import UsersStore from '../stores/users-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewUserDialog from '../components/dialog/new-user'; -// import EditUserDialog from '../components/dialog/edit-user'; +import EditUserDialog from '../components/dialog/edit-user'; class Users extends Component { static getStores() { @@ -73,36 +72,27 @@ class Users extends Component { } } - // confirmDeleteModal() { - // this.setState({ deleteModal: false }); + confirmDeleteModal() { + this.setState({ deleteModal: false }); - // AppDispatcher.dispatch({ - // type: 'projects/start-remove', - // data: this.state.modalData - // }); - // } + AppDispatcher.dispatch({ + type: 'users/start-remove', + data: this.state.modalData, + token: this.state.token + }); + } - // closeEditModal(data) { - // this.setState({ editModal: false }); + closeEditModal(data) { + this.setState({ editModal: false }); - // if (data) { - // AppDispatcher.dispatch({ - // type: 'users/start-edit', - // data: data, - // token: this.state.token - // }); - // } - // } - - // 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; - // } + if (data) { + AppDispatcher.dispatch({ + type: 'users/start-edit', + data: data, + token: this.state.token + }); + } + } render() { @@ -120,22 +110,22 @@ class Users extends Component { this.closeNewModal(data)} /> - {/* this.closeEditModal(data)} project={this.state.modalData} />*/} + this.closeEditModal(data)} user={this.state.modalData} /> - {/* + - Delete Project + Delete user - Are you sure you want to delete the project '{this.state.modalData.name}'? + Are you sure you want to delete the user '{this.state.modalData.username}'? - */} +
    ); } diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 99dbd04..2ae0a46 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -123,7 +123,7 @@ class RestDataManager { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.put(this.makeURL(this.url + '/' + object._id, token), obj).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] From 703fa92d2fb9142599f5952db999e90cdd339949 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 11:26:11 +0200 Subject: [PATCH 203/556] include user e-mail --- src/components/dialog/edit-user.js | 9 ++++++++- src/components/dialog/new-user.js | 9 ++++++++- src/containers/users.js | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js index 9485c29..a779725 100644 --- a/src/components/dialog/edit-user.js +++ b/src/components/dialog/edit-user.js @@ -38,6 +38,7 @@ class EditUserDialog extends Component { this.state = { username: '', + mail: '', role: '', _id: '' } @@ -58,6 +59,7 @@ class EditUserDialog extends Component { resetState() { this.setState({ username: this.props.user.username, + mail: this.props.user.mail, role: this.props.user.role, _id: this.props.user._id }); @@ -88,8 +90,13 @@ class EditUserDialog extends Component { this.handleChange(e)} /> + + E-mail + this.handleChange(e)} /> + + - Simulation + Role this.handleChange(e)}> diff --git a/src/components/dialog/new-user.js b/src/components/dialog/new-user.js index 60f845d..690f17d 100644 --- a/src/components/dialog/new-user.js +++ b/src/components/dialog/new-user.js @@ -37,6 +37,7 @@ class NewUserDialog extends Component { this.state = { username: '', + mail: '', role: 'admin', password: '1234' }; @@ -57,6 +58,7 @@ class NewUserDialog extends Component { resetState() { this.setState({ username: '', + mail: '', role: 'admin', password: '1234' }); @@ -85,8 +87,13 @@ class NewUserDialog extends Component { this.handleChange(e)} /> + + E-mail + this.handleChange(e)} /> + + - Simulation + Role this.handleChange(e)}> diff --git a/src/containers/users.js b/src/containers/users.js index b1f573f..91f720c 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -101,7 +101,8 @@ class Users extends Component {

    Users

    - + + this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} />
    From 8fb0166059b61eeb1fe52d8b16352224409f8876 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 11:44:08 +0200 Subject: [PATCH 204/556] human names and consisting roles with back-end --- src/components/dialog/edit-user.js | 5 +++-- src/components/dialog/new-user.js | 5 +++-- src/containers/users.js | 8 +++++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js index a779725..c8bb203 100644 --- a/src/components/dialog/edit-user.js +++ b/src/components/dialog/edit-user.js @@ -98,8 +98,9 @@ class EditUserDialog extends Component { Role this.handleChange(e)}> - - + + + diff --git a/src/components/dialog/new-user.js b/src/components/dialog/new-user.js index 690f17d..f666e31 100644 --- a/src/components/dialog/new-user.js +++ b/src/components/dialog/new-user.js @@ -95,8 +95,9 @@ class NewUserDialog extends Component { Role this.handleChange(e)}> - - + + + diff --git a/src/containers/users.js b/src/containers/users.js index 91f720c..288c4f4 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -94,6 +94,12 @@ class Users extends Component { } } + 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] : ''; + } + render() { return ( @@ -103,7 +109,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 d218c1854d466bcd8db80de9c0ee42f4dd5daba8 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 12:46:53 +0200 Subject: [PATCH 205/556] hide user management section for non-admins --- src/components/menu-sidebar.js | 4 +++- src/containers/app.js | 6 ++++-- src/data-managers/users-data-manager.js | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 1782304..882ab56 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -33,7 +33,9 @@ class SidebarMenu extends Component {
  • Projects
  • Simulations
  • Simulators
  • -
  • User Management
  • + { this.props.currentRole === 'admin' ? +
  • User Management
  • : '' + }
  • Logout
  • diff --git a/src/containers/app.js b/src/containers/app.js index 4e90442..9e6eaf0 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -76,9 +76,11 @@ class App extends Component { } } + let currentUser = UserStore.getState().currentUser; + return { simulations: SimulationStore.getState(), - currentUser: UserStore.getState().currentUser, + currentRole: currentUser? currentUser.role : '', token: UserStore.getState().token, runningSimulators: simulators @@ -183,7 +185,7 @@ class App extends Component {
    - +
    {children} diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index bd60534..f5db8f8 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -46,7 +46,7 @@ class UsersDataManager extends RestDataManager { RestAPI.get(this.makeURL('/users/me'), token).then(response => { AppDispatcher.dispatch({ type: 'users/current-user', - user: response + user: response.user }); }).catch(error => { AppDispatcher.dispatch({ From 39c8a2518a14f659fabafaa6e3563ceefa45880e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 15:58:58 +0200 Subject: [PATCH 206/556] sidebar menu items no wrap and grow --- src/components/menu-sidebar.js | 12 ++++----- src/containers/app.js | 10 ++++--- src/styles/app.css | 49 +++++++++++++++++++++++++--------- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 882ab56..152644a 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -29,14 +29,14 @@ class SidebarMenu extends Component {

    Menu

      -
    • Home
    • -
    • Projects
    • -
    • Simulations
    • -
    • Simulators
    • +
    • Home
    • +
    • Projects
    • +
    • Simulations
    • +
    • Simulators
    • { this.props.currentRole === 'admin' ? -
    • User Management
    • : '' +
    • User Management
    • : '' } -
    • Logout
    • +
    • Logout
    ); diff --git a/src/containers/app.js b/src/containers/app.js index 9e6eaf0..2af248e 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -77,7 +77,7 @@ class App extends Component { } let currentUser = UserStore.getState().currentUser; - + return { simulations: SimulationStore.getState(), currentRole: currentUser? currentUser.role : '', @@ -185,10 +185,12 @@ class App extends Component {
    - -
    - {children} +
    + +
    + {children} +
    diff --git a/src/styles/app.css b/src/styles/app.css index f5a12fd..d02e36f 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -41,7 +41,6 @@ body { .app-header { width: 100%; height: 60px; - padding: 10px 0 0 0; color: #527984; @@ -50,7 +49,6 @@ body { .app-header h1 { width: 100%; - margin: 0; text-align: center; @@ -68,15 +66,27 @@ body { clear: both; } -.app-content { +.app-body { + /* Let sidebar grow and content occupy rest of the space */ + display: flex; position: absolute; - bottom: 0px; top: 60px; + bottom: 60px; right: 0px; - left: 200px; - min-height: 400px; + left: 0px; - margin: 20px 20px 60px 20px; + padding: 15px 5px 0px 5px; +} + +.app-body div { + margin-left: 7px; + margin-right: 7px; +} + +.app-content { + flex: 1 1 auto; + min-height: 400px; + height: 100%; padding: 15px 20px; background-color: #fff; @@ -88,11 +98,7 @@ body { * Menus */ .menu-sidebar { - float: left; - - width: 160px; - - margin: 20px 0 0 20px; + display: inline-table; padding: 20px 25px 20px 25px; background-color: #fff; @@ -102,18 +108,35 @@ body { .menu-sidebar a { color: #4d4d4d; + text-decoration:none; +} + +.menu-sidebar a:hover, .menu-sidebar a:focus { + text-decoration:none; } .active { font-weight: bold; + /*text-decoration:none;*/ } .menu-sidebar ul { padding-top: 10px; - list-style: none; + white-space: nowrap; } +.menu-sidebar a::after { + /* Trick to make menu items to be as wide as in bold */ + display:block; + content:attr(title); + font-weight:bold; + height:1px; + color:transparent; + overflow:hidden; + visibility:hidden; + margin-bottom:-1px; +} /** * Login form */ From 1c20d0c87ddf00ac346389cdcfb9ec96a4c51d56 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 17:30:00 +0200 Subject: [PATCH 207/556] add/edit user simple validation --- src/components/dialog/edit-user.js | 3 +-- src/components/dialog/new-user.js | 32 ++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js index c8bb203..594492a 100644 --- a/src/components/dialog/edit-user.js +++ b/src/components/dialog/edit-user.js @@ -90,10 +90,9 @@ class EditUserDialog extends Component { this.handleChange(e)} /> - + E-mail this.handleChange(e)} /> - Role diff --git a/src/components/dialog/new-user.js b/src/components/dialog/new-user.js index f666e31..fd01f99 100644 --- a/src/components/dialog/new-user.js +++ b/src/components/dialog/new-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component, PropTypes } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; import Dialog from './dialog'; @@ -39,7 +39,7 @@ class NewUserDialog extends Component { username: '', mail: '', role: 'admin', - password: '1234' + password: '' }; } @@ -60,22 +60,26 @@ class NewUserDialog extends Component { username: '', mail: '', role: 'admin', - password: '1234' + password: '' }); } validateForm(target) { // check all controls - var username = true; + let username = this.state.username !== '' && this.state.username.length >= 3; + let password = this.state.password !== ''; - if (this.state.username === '') { - username = false; - } - - this.valid = username; + this.valid = username && password; // return state to control - if (target === 'username') return username ? "success" : "error"; + switch(target) { + case 'username': + return username ? "success" : "error"; + case 'password': + return password ? "success" : "error"; + default: + return "success"; + } } render() { @@ -86,12 +90,18 @@ class NewUserDialog extends Component { Username this.handleChange(e)} /> + Min 3 characters. - + E-mail this.handleChange(e)} /> + + Password + this.handleChange(e)} /> + + Role this.handleChange(e)}> From 059512333fc4bb12a7930eb2184d23d0b3e17c4e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 3 May 2017 17:30:40 +0200 Subject: [PATCH 208/556] handle taken usernames add/edit user --- src/stores/array-store.js | 1 - src/stores/users-store.js | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/stores/array-store.js b/src/stores/array-store.js index b7cfbee..ccd9689 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -95,7 +95,6 @@ class ArrayStore extends ReduceStore { return this.updateElements(state, [action.data]); case this.type + '/add-error': - console.log('something happened'); // TODO: Add error message return state; diff --git a/src/stores/users-store.js b/src/stores/users-store.js index 0b38e69..e42b1ed 100644 --- a/src/stores/users-store.js +++ b/src/stores/users-store.js @@ -21,6 +21,7 @@ import ArrayStore from './array-store'; import UsersDataManager from '../data-managers/users-data-manager'; +import NotificationsDataManager from '../data-managers/notifications-data-manager'; class UsersStore extends ArrayStore { constructor() { @@ -30,6 +31,32 @@ class UsersStore extends ArrayStore { reduce(state, action) { switch (action.type) { + case this.type + '/add-error': + if (action.error && !action.error.handled && action.error.response) { + // If it was an error and hasn't been handled, user could not be added + const USER_ADD_ERROR_NOTIFICATION = { + title: 'Failed to add new user', + message: action.error.response.body.message, + level: 'error' + } + NotificationsDataManager.addNotification(USER_ADD_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); + + case this.type + '/edit-error': + if (action.error && !action.error.handled && action.error.response) { + // If it was an error and hasn't been handled, user couldn't not be updated + const USER_EDIT_ERROR_NOTIFICATION = { + title: 'Failed to edit user', + message: action.error.response.body.message, + level: 'error' + } + NotificationsDataManager.addNotification(USER_EDIT_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); + default: return super.reduce(state, action); } From 2340850b40667a21c3f7a474457627bcc6ecbdfc Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 5 May 2017 09:07:22 +0200 Subject: [PATCH 209/556] adapt layout to previous changes --- src/styles/app.css | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/styles/app.css b/src/styles/app.css index 4029992..41b2bbb 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -57,6 +57,7 @@ body { .app-footer { width: 100%; height: 60px; + /* Float below body */ float: right; padding-top: 20px; @@ -68,24 +69,21 @@ body { .app-body { /* Let sidebar grow and content occupy rest of the space */ display: flex; - position: absolute; - top: 60px; - bottom: 60px; - right: 0px; - left: 0px; + float: right; + width: 100%; + /* Fit between header and footer */ + min-height: calc(100vh - 140px); padding: 15px 5px 0px 5px; } -.app-body div { +.app-body > div { margin-left: 7px; margin-right: 7px; } .app-content { flex: 1 1 auto; - min-height: 400px; - height: 100%; padding: 15px 20px; background-color: #fff; From fa09f9eef75547fe09630ca092b7c79bed5e1d4d Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 5 May 2017 09:08:43 +0200 Subject: [PATCH 210/556] removed commented rules --- src/styles/app.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/styles/app.css b/src/styles/app.css index 41b2bbb..33b3280 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -114,7 +114,6 @@ body { .active { font-weight: bold; - /*text-decoration:none;*/ } .menu-sidebar ul { From a4884bd0fba029bfbf66fe8438e5d3efdd9b90c1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 5 May 2017 09:42:39 +0200 Subject: [PATCH 211/556] issue #60: site's title --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index aab5e3b..2775a2d 100644 --- a/public/index.html +++ b/public/index.html @@ -13,7 +13,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + VILLASweb
    From e2be97dcd382a69c76eab322eac8cded1719fcae Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 10:55:21 +0200 Subject: [PATCH 212/556] default edit image option and no images msg --- .../dialog/edit-widget-image-control.js | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-image-control.js b/src/components/dialog/edit-widget-image-control.js index 199a331..56ae8f0 100644 --- a/src/components/dialog/edit-widget-image-control.js +++ b/src/components/dialog/edit-widget-image-control.js @@ -49,11 +49,12 @@ class EditImageWidgetControl extends Component { formData.append(key, this.state.fileList[key]); } } - + // upload files AppDispatcher.dispatch({ type: 'files/start-upload', - data: formData + data: formData, + token: this.props.sessionToken }); } @@ -63,9 +64,18 @@ class EditImageWidgetControl extends Component { Image this.props.handleChange(e)}> - {this.props.files.map((file, index) => ( - - ))} + { + this.props.files.length === 0? ( + + ) : ( + this.props.files.reduce( (entries, file, index) => { + entries.push(); + return entries; + }, [ + + ]) + ) + } From e0c5ffbd8fb158959ee46a18c14244232af1df5c Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 12:24:52 +0200 Subject: [PATCH 213/556] authenticated upload --- src/components/dialog/edit-widget.js | 3 ++- src/containers/visualization.js | 6 ++++-- src/data-managers/files-data-manager.js | 11 +++++++---- src/stores/file-store.js | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index a6a1523..eeabba3 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -35,6 +35,7 @@ import EditWidgetOrientation from './edit-widget-orientation'; class EditWidgetDialog extends Component { static propTypes = { + sessionToken: PropTypes.string.isRequired, show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired }; @@ -109,7 +110,7 @@ class EditWidgetDialog extends Component { ) } else if (this.props.widget.type === 'Image') { dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} /> ) } else if (this.props.widget.type === 'Gauge') { dialogControls.push( diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 00fc336..a526df3 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -30,6 +30,7 @@ import Dropzone from '../components/dropzone'; import Widget from './widget'; import EditWidget from '../components/dialog/edit-widget'; +import UserStore from '../stores/user-store'; import VisualizationStore from '../stores/visualization-store'; import ProjectStore from '../stores/project-store'; import SimulationStore from '../stores/simulation-store'; @@ -40,7 +41,7 @@ import NotificationsFactory from '../data-managers/notifications-factory'; class Visualization extends Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, FileStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; } static calculateState(prevState) { @@ -49,6 +50,7 @@ class Visualization extends Component { } return { + sessionToken: UserStore.getState().token, visualizations: VisualizationStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), @@ -384,7 +386,7 @@ class Visualization extends Component { ))} - this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} files={this.state.files} /> + this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} files={this.state.files} />
    ); diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js index 5f7e1c0..f5edb37 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/data-managers/files-data-manager.js @@ -28,13 +28,16 @@ class FilesDataManager extends RestDataManager { super('file', '/files'); } - upload(file) { - RestAPI.upload(this.makeURL('/upload'), file).then(response => { + upload(file, token = null) { + RestAPI.upload(this.makeURL('/upload'), file, token).then(response => { AppDispatcher.dispatch({ type: 'files/uploaded' }); - - console.log(response); + // Trigger a files reload + AppDispatcher.dispatch({ + type: 'files/start-load', + token: token + }); }).catch(error => { AppDispatcher.dispatch({ type: 'files/upload-error', diff --git a/src/stores/file-store.js b/src/stores/file-store.js index 104d16b..09266dd 100644 --- a/src/stores/file-store.js +++ b/src/stores/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); + FilesDataManager.upload(action.data, action.token); return state; case 'files/uploaded': From e395b65fc17547c5c8a416ae7033e1d2628c0bb1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 12:27:36 +0200 Subject: [PATCH 214/556] fixed imaged widget, load image by id --- src/components/widget-image.js | 40 +++++++++++++++------------------- src/config.js | 6 +++++ 2 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 src/config.js diff --git a/src/components/widget-image.js b/src/components/widget-image.js index aeb9642..2bbba8c 100644 --- a/src/components/widget-image.js +++ b/src/components/widget-image.js @@ -21,37 +21,33 @@ import React, { Component } from 'react'; -const API_URL = 'http://localhost:4000/'; +import AppDispatcher from '../app-dispatcher'; +import config from '../config'; class WidgetImage extends Component { - constructor(props) { - super(props); - - this.state = { - file: null - }; - } componentWillReceiveProps(nextProps) { - // check if file is set - if (nextProps.widget.file == null) { - this.setState({ file: null }); - return; - } - // get file by id - nextProps.files.forEach(file => { - if (file._id === nextProps.widget.file) { - this.setState({ file: file }); - } - }); + // Query the image referenced by the widget (public request, no token required) + let widgetFile = nextProps.widget.file; + if (widgetFile && !nextProps.files.find( file => file._id === widgetFile ) ) { + + AppDispatcher.dispatch({ + type: 'files/start-load', + data: widgetFile + }); + + } } render() { + + let file = this.props.files.find( (file) => file._id === this.props.widget.file ); + return ( -
    - {this.state.file && - {this.state.file.name} +
    + {file && + {file.name} e.preventDefault() } /> }
    ); diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000..4ade8ce --- /dev/null +++ b/src/config.js @@ -0,0 +1,6 @@ + +const config = { + publicPathBase: 'public/' +} + +export default config \ No newline at end of file From 503560dbbee562b66da28ac67eb73e0c3d48f3a7 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 12:28:16 +0200 Subject: [PATCH 215/556] authenticated (all) files query --- src/containers/widget.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 1f61e9b..18e3d12 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -26,6 +26,7 @@ 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 FileStore from '../stores/file-store'; @@ -45,12 +46,16 @@ import '../styles/widgets.css'; class Widget extends Component { static getStores() { - return [ SimulatorDataStore, FileStore ]; + return [ SimulatorDataStore, FileStore, UserStore ]; } static calculateState(prevState) { + + let tokenState = UserStore.getState().token; + if (prevState) { return { + sessionToken: tokenState, simulatorData: SimulatorDataStore.getState(), files: FileStore.getState(), @@ -58,6 +63,7 @@ class Widget extends Component { } } else { return { + sessionToken: tokenState, simulatorData: SimulatorDataStore.getState(), files: FileStore.getState(), @@ -72,11 +78,15 @@ class Widget extends Component { // Reference to the context menu element this.contextMenuTriggerViaDraggable = null; } - + componentWillMount() { - AppDispatcher.dispatch({ - type: 'files/start-load' - }); + // If loading for the first time + if (this.state.sessionToken) { + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); + } } dragStop(event, ui) { @@ -150,7 +160,6 @@ class Widget extends Component { borderedWidget = true; } else if (widget.type === 'Image') { element = - borderedWidget = true; } else if (widget.type === 'Button') { element = } else if (widget.type === 'NumberInput') { From b076db8b7b72833d62081212f91110ccc051de35 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 23 May 2017 10:50:03 +0200 Subject: [PATCH 216/556] fixed simulator property --- src/components/dialog/edit-widget-signal-control.js | 2 +- src/components/dialog/edit-widget-signals-control.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index 879052b..b31dab6 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -31,7 +31,7 @@ class EditWidgetSignalControl extends Component { if (this.props.simulation) { // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulation === this.state.widget.simulation ); + const simulationModel = this.props.simulation.models.find( model => model.simulator === this.state.widget.simulator ); // If simulation model update the signals to render signalsToRender = simulationModel? simulationModel.mapping : []; diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index b84d930..8bd9bb9 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -46,7 +46,7 @@ class EditWidgetSignalsControl extends Component { if (this.props.simulation) { // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulation === this.state.widget.simulation ); + const simulationModel = this.props.simulation.models.find( model => model.simulator === this.state.widget.simulator ); // If simulation model update the signals to render signalsToRender = simulationModel? simulationModel.mapping : []; From 72ffd6cd96641aa1356ae795f75364a8e6bf5c56 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 23 May 2017 10:50:30 +0200 Subject: [PATCH 217/556] refactoring: extracted control creation --- .../dialog/edit-widget-control-creator.js | 90 +++++++++++++++++++ src/components/dialog/edit-widget.js | 83 +++++------------ 2 files changed, 112 insertions(+), 61 deletions(-) create mode 100644 src/components/dialog/edit-widget-control-creator.js diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js new file mode 100644 index 0000000..9b430e0 --- /dev/null +++ b/src/components/dialog/edit-widget-control-creator.js @@ -0,0 +1,90 @@ + + +import React from 'react'; + +import EditWidgetTextControl from './edit-widget-text-control'; +import EditWidgetColorControl from './edit-widget-color-control'; +import EditWidgetTimeControl from './edit-widget-time-control'; +import EditImageWidgetControl from './edit-widget-image-control'; +import EditWidgetSimulatorControl from './edit-widget-simulator-control'; +import EditWidgetSignalControl from './edit-widget-signal-control'; +import EditWidgetSignalsControl from './edit-widget-signals-control'; +import EditWidgetOrientation from './edit-widget-orientation'; + +export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, handleChange) { + // Use a list to concatenate the controls according to the widget type + var dialogControls = []; + + switch(widgetType) { + case 'Value': { + let valueBoundOnChange = (e) => { + handleChange([e, {target: {id: 'signal', value: 0}}]); + } + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + ) + } + break; + case 'Plot': { + let plotBoundOnChange = (e) => { + handleChange([e, {target: {id: 'signals', value: []}}]); + } + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => plotBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />) + } + break; + case 'Table': { + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) + } + break; + case 'Image': { + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) + } + break; + case 'Gauge': { + let gaugeBoundOnChange = (e) => { + handleChange([e, {target: {id: 'signal', value: ''}}]); + } + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) + } + break; + case 'PlotTable': { + let plotTableBoundOnChange = (e) => { + handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); + } + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => plotTableBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />) + } + break; + case 'Slider': { + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) + } + break; + case 'Button': { + dialogControls.push( + validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} handleChange={(e) => handleChange(e)} />) + } + break; + case 'Box': { + dialogControls.push( + validateForm(id)} handleChange={(e) => handleChange(e)} />) + } + break; + default: + console.log('Non-valid widget type'); + } + + return dialogControls; +} \ No newline at end of file diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index eeabba3..8c2277f 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -24,14 +24,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -import EditWidgetTextControl from './edit-widget-text-control'; -import EditWidgetColorControl from './edit-widget-color-control'; -import EditWidgetTimeControl from './edit-widget-time-control'; -import EditImageWidgetControl from './edit-widget-image-control'; -import EditWidgetSimulatorControl from './edit-widget-simulator-control'; -import EditWidgetSignalControl from './edit-widget-signal-control'; -import EditWidgetSignalsControl from './edit-widget-signals-control'; -import EditWidgetOrientation from './edit-widget-orientation'; +import createControls from './edit-widget-control-creator'; class EditWidgetDialog extends Component { static propTypes = { @@ -62,10 +55,16 @@ class EditWidgetDialog extends Component { } } - handleChange(e, index) { - var update = this.state.temporal; - update[e.target.id] = e.target.value; - this.setState({ temporal: update }); + handleChange(e) { + 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; return changesObject }, {}); + this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); + } else { + let changeObject = {}; + changeObject[e.target.id] = e.target.value; + this.setState({ temporal: Object.assign({}, this.state.temporal, changeObject ) }); + } } resetState() { @@ -88,55 +87,17 @@ class EditWidgetDialog extends Component { } render() { - // Use a list to concatenate the controls according to the widget type - var dialogControls = []; - + + let controls = null; if (this.props.widget) { - if (this.props.widget.type === 'Value') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'Plot') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'Table') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'Image') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} /> - ) - } else if (this.props.widget.type === 'Gauge') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'PlotTable') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - this.handleChange(e)} /> - ) - } else if (this.props.widget.type === 'Slider') { - dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e) => this.handleChange(e)} />, - ) - } else if (this.props.widget.type === 'Button') { - dialogControls.push( - this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} />, - this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} /> - ) - } else if (this.props.widget.type === 'Box') { - dialogControls.push( - this.validateForm(id)} handleChange={(e, index) => this.handleChange(e, index)} /> - ) - } + controls = createControls( + this.props.widget.type, + this.state.temporal, + this.props.sessionToken, + this.props.files, + (id) => this.validateForm(id), + this.props.simulation, + (e) => this.handleChange(e)); } return ( @@ -147,7 +108,7 @@ class EditWidgetDialog extends Component { this.handleChange(e)} /> - { dialogControls } + { controls || '' } ); From 0e7ce1aff064a6753557dca5a32dc107e1d1e1c1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 23 May 2017 10:57:28 +0200 Subject: [PATCH 218/556] removed unused js module --- .../dialog/edit-widget-signal-type-control.js | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 src/components/dialog/edit-widget-signal-type-control.js diff --git a/src/components/dialog/edit-widget-signal-type-control.js b/src/components/dialog/edit-widget-signal-type-control.js deleted file mode 100644 index 8978186..0000000 --- a/src/components/dialog/edit-widget-signal-type-control.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * File: edit-widget-signal-type-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -class EditWidgetSignalTypeControl extends Component { - constructor(props) { - super(props); - - this.state = { - widget: {} - }; - } - - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - // Obtain unique signal types with the help of dictionary keys - var signalTypes = Object.keys(simulationModel.mapping.reduce( (collection, signal) => { - var lower = signal.type.toLowerCase(); - collection[lower] = ''; - return collection; - }, {})); - - var capitalize = (str) => { return str.charAt(0).toUpperCase() + str.slice(1); } - - var selectedValue = signalTypes.includes(this.state.widget.signalType) ? this.state.widget.signalType : ''; - - return ( - - Signal type - this.props.handleChange(e)}> - - {signalTypes.map((type, index) => ( - - ))} - - - ); - } -} - -export default EditWidgetSignalTypeControl; \ No newline at end of file From 2a5c164ace4d88f7671f01ba31d45bb36ea32ca1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 23 May 2017 10:59:01 +0200 Subject: [PATCH 219/556] updated licenses in edit control modules --- .../dialog/edit-widget-control-creator.js | 21 ++++++++++++++++++- .../dialog/edit-widget-orientation.js | 18 +++++++++++++--- .../dialog/edit-widget-signal-control.js | 18 +++++++++++++--- .../dialog/edit-widget-signals-control.js | 18 +++++++++++++--- .../dialog/edit-widget-simulator-control.js | 18 +++++++++++++--- .../dialog/edit-widget-text-control.js | 18 +++++++++++++--- .../dialog/edit-widget-time-control.js | 18 +++++++++++++--- 7 files changed, 110 insertions(+), 19 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 9b430e0..455ca2f 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -1,4 +1,23 @@ - +/** + * 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 + * 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'; diff --git a/src/components/dialog/edit-widget-orientation.js b/src/components/dialog/edit-widget-orientation.js index 76aa874..9f3e67f 100644 --- a/src/components/dialog/edit-widget-orientation.js +++ b/src/components/dialog/edit-widget-orientation.js @@ -2,9 +2,21 @@ * File: edit-widget-orientation.js * Author: Ricardo Hernandez-Montoya * Date: 10.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * 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'; diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index b31dab6..623b416 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -2,9 +2,21 @@ * File: edit-widget-signal-control.js * Author: Ricardo Hernandez-Montoya * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * 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'; diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index 8bd9bb9..76b832b 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -2,9 +2,21 @@ * File: edit-widget-signals-control.js * Author: Ricardo Hernandez-Montoya * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * 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'; diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js index 23de386..48186ef 100644 --- a/src/components/dialog/edit-widget-simulator-control.js +++ b/src/components/dialog/edit-widget-simulator-control.js @@ -2,9 +2,21 @@ * File: edit-widget-simulator-control.js * Author: Ricardo Hernandez-Montoya * Date: 03.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * 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'; diff --git a/src/components/dialog/edit-widget-text-control.js b/src/components/dialog/edit-widget-text-control.js index d4196b4..b9eef66 100644 --- a/src/components/dialog/edit-widget-text-control.js +++ b/src/components/dialog/edit-widget-text-control.js @@ -2,9 +2,21 @@ * File: edit-widget-text-control.js * Author: Ricardo Hernandez-Montoya * Date: 21.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * 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'; diff --git a/src/components/dialog/edit-widget-time-control.js b/src/components/dialog/edit-widget-time-control.js index 5b8e234..8f6434d 100644 --- a/src/components/dialog/edit-widget-time-control.js +++ b/src/components/dialog/edit-widget-time-control.js @@ -2,9 +2,21 @@ * File: edit-widget-time-control.js * Author: Ricardo Hernandez-Montoya * Date: 13.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * 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'; From ea119f52e08ad8eeaa4f04ea929e6408ea53c218 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 23 May 2017 12:57:48 +0200 Subject: [PATCH 220/556] test edit control creator --- .../dialog/edit-widget-control-creator.js | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/__tests__/components/dialog/edit-widget-control-creator.js diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js new file mode 100644 index 0000000..fea0b2a --- /dev/null +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -0,0 +1,42 @@ + +import { expect } from 'chai'; + +import createControls from '../../../components/dialog/edit-widget-control-creator'; +import EditWidgetTextControl from '../../../components/dialog/edit-widget-text-control'; +import EditWidgetColorControl from '../../../components/dialog/edit-widget-color-control'; +import EditWidgetTimeControl from '../../../components/dialog/edit-widget-time-control'; +import EditImageWidgetControl from '../../../components/dialog/edit-widget-image-control'; +import EditWidgetSimulatorControl from '../../../components/dialog/edit-widget-simulator-control'; +import EditWidgetSignalControl from '../../../components/dialog/edit-widget-signal-control'; +import EditWidgetSignalsControl from '../../../components/dialog/edit-widget-signals-control'; +import EditWidgetOrientation from '../../../components/dialog/edit-widget-orientation'; + +describe('edit widget control creator', () => { + it('should not return null', () => { + let controls = createControls('Value', null, null, null, null, null, null); + expect(controls).to.be.defined; + }); + + var runs = [ + { args: { widgetType: 'Value' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Plot' }, result: { controlNumber: 4, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, + { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, + { args: { widgetType: 'Image' }, result: { controlNumber: 1, controlTypes: [EditImageWidgetControl] } }, + { args: { widgetType: 'Gauge' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'PlotTable' }, result: { controlNumber: 3, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, + { args: { widgetType: 'Slider' }, result: { controlNumber: 1, controlTypes: [EditWidgetOrientation] } }, + { args: { widgetType: 'Button' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl] } }, + { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, + ]; + + runs.forEach( (run) => { + let itMsg = run.args.widgetType + ' widget edit model should have correct controls'; + it(itMsg, () => { + let controls = createControls(run.args.widgetType, null, null, null, null, null, null); + + expect(controls).to.have.lengthOf(run.result.controlNumber); + + controls.forEach( (control) => expect(control.type).to.be.oneOf(run.result.controlTypes)) + }); + }); +}); \ No newline at end of file From 125e936e26e1200e1d4815158ada842981e60433 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 23 May 2017 12:59:13 +0200 Subject: [PATCH 221/556] chai dependency for tests --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8977188..aa1e73c 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "rc-slider": "^7.0.1" }, "devDependencies": { + "chai": "^3.5.0", "react-scripts": "0.9.3" }, "scripts": { From ec7efbd11c35f6e66818623bd65d8798399a5d42 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 24 May 2017 14:41:47 +0200 Subject: [PATCH 222/556] removed unused code --- src/components/dialog/edit-widget-plot.js | 97 ---------------------- src/components/dialog/edit-widget-table.js | 56 ------------- src/components/dialog/edit-widget-value.js | 76 ----------------- 3 files changed, 229 deletions(-) delete mode 100644 src/components/dialog/edit-widget-plot.js delete mode 100644 src/components/dialog/edit-widget-table.js delete mode 100644 src/components/dialog/edit-widget-value.js diff --git a/src/components/dialog/edit-widget-plot.js b/src/components/dialog/edit-widget-plot.js deleted file mode 100644 index 9ff53a2..0000000 --- a/src/components/dialog/edit-widget-plot.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * File: edit-widget-plot.js - * Author: Markus Grigull - * Date: 13.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 { FormGroup, FormControl, ControlLabel, Checkbox, HelpBlock } from 'react-bootstrap'; - -class EditPlotWidget extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '', - signals: [], - time: 0 - } - }; - } - - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); - } - - handleSignalChange(e, index) { - var signals = this.state.widget.signals; - - if (e.target.checked) { - // add signal - signals.push(index); - } else { - // remove signal - const pos = signals.indexOf(index); - if (pos > -1) { - signals.splice(pos, 1); - } - } - - this.props.handleChange({ target: { id: 'signals', value: signals } }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - return ( -
    - - Time - this.props.handleChange(e)} /> - Time in seconds - - - Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( - - ))} - - - - Signals - {simulationModel.mapping.map((signal, index) => ( - this.handleSignalChange(e, index)}>{signal.name} - ))} - -
    - ); - } -} - -export default EditPlotWidget; diff --git a/src/components/dialog/edit-widget-table.js b/src/components/dialog/edit-widget-table.js deleted file mode 100644 index 05b17c2..0000000 --- a/src/components/dialog/edit-widget-table.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * File: edit-widget-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 - * 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, ControlLabel } from 'react-bootstrap'; - - class EditTableWidget extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '' - } - }; - } - - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); - } - - render() { - return ( -
    - - Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( - - ))} - - -
    - ); - } - } - - export default EditTableWidget; diff --git a/src/components/dialog/edit-widget-value.js b/src/components/dialog/edit-widget-value.js deleted file mode 100644 index 7061fc9..0000000 --- a/src/components/dialog/edit-widget-value.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * File: edit-widget-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 - * 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, ControlLabel } from 'react-bootstrap'; - -class EditValueWidget extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - simulator: '', - signal: 0 - } - }; - } - - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); - } - - render() { - // get selected simulation model - var simulationModel = {}; - - if (this.props.simulation) { - this.props.simulation.models.forEach((model) => { - if (model.simulation === this.state.widget.simulation) { - simulationModel = model; - } - }); - } - - return ( -
    - - Simulator - this.props.handleChange(e)}> - {this.props.simulation.models.map((model, index) => ( - - ))} - - - - Signal - this.props.handleChange(e)}> - {simulationModel.mapping.map((signal, index) => ( - - ))} - - -
    - ); - } -} - -export default EditValueWidget; From 9105c3fbaea8195a008a7329710cc88384004dd1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 31 May 2017 10:14:28 +0200 Subject: [PATCH 223/556] set specific docker image and docker-compose versions --- .gitlab-ci.yml | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 98f57e5..e3c24f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,16 +1,13 @@ -image: docker +image: docker:17 variables: GIT_SUBMODULE_STRATEGY: normal + DOCKER_COMPOSE_VERSION: 1.13.0 services: - docker:dind before_script: -- echo $DEPLOYMENT_HOST -- docker version -- apk add --no-cache py-pip -- pip install docker-compose - mkdir -p build cache: @@ -41,12 +38,14 @@ deploy_review: environment: review script: - mkdir -p ~/.docker - - echo $DEPLOYMENT_CACERT > ~/.docker/ca.pem - - echo $DEPLOYMENT_CLIENT_CERT > ~/.docker/cert.pem - - echo $DEPLOYMENT_CLIENT_KEY > ~/.docker/key.pem + - echo "$DEPLOYMENT_CACERT" > ~/.docker/ca.pem + - echo "$DEPLOYMENT_CLIENT_CERT" > ~/.docker/cert.pem + - echo "$DEPLOYMENT_CLIENT_KEY" > ~/.docker/key.pem + - apk add --no-cache py-pip + - pip install docker-compose==$DOCKER_COMPOSE_VERSION - docker-compose build - - export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 - - docker-compose -H=$DEPLOYMENT_HOST --verbose down - - docker-compose -H=$DEPLOYMENT_HOST --verbose up -d + - export DOCKER_HOST=$DEPLOYMENT_HOST && export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 + - docker-compose --verbose down + - docker-compose --verbose up -d tags: - docker From ee9924e0238c6c371d6d706f065248676c0bbeeb Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 31 May 2017 11:23:07 +0200 Subject: [PATCH 224/556] point to backend's develop branch --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 955a1d6..4cab793 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "VILLASweb-backend"] path = VILLASweb-backend url = ../../VILLASframework/VILLASweb-backend.git - branch = docker-names + branch = develop From 013a0b21229e9b8615d09eca3eec39518bfe251f Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 31 May 2017 11:24:01 +0200 Subject: [PATCH 225/556] backend production env, database user, unbind db's ports to host --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 75cf6cf..684f66c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,13 +15,13 @@ services: build: VILLASweb-backend links: - database + environment: + - NODE_ENV=production ports: - "4000:4000" database: image: mongo:latest + user: mongodb volumes: - /opt/database:/data/db - ports: - - "27017:27017" - From bbfdc3acbb8b557ee541ac50d11334d40fb73c55 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 31 May 2017 14:29:42 +0200 Subject: [PATCH 226/556] pass proxy as environment variable --- package.json | 1 - src/data-managers/rest-data-manager.js | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index aa1e73c..a8cc8a2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,6 @@ "name": "villasweb-frontend", "version": "0.1.0", "private": true, - "proxy": "http://localhost:4000", "dependencies": { "bootstrap": "^3.3.7", "classnames": "^2.2.5", diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 6ebe72d..6cff9b6 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -21,7 +21,9 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; -const API_URL = '/api/v1'; + +const PROXY = process.env.REACT_APP_HTTP_PROXY || "http://localhost:4000"; +const API_URL = PROXY + '/api/v1'; class RestDataManager { constructor(type, url, keyFilter) { From 342e137560db8943710d3ec80acc64241f9ab4ef Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 1 Jun 2017 08:35:04 +0200 Subject: [PATCH 227/556] pass HTTP_PROXY environment to app --- docker-compose.yml | 2 ++ src/data-managers/rest-data-manager.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 13dd4c2..32fffde 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,8 @@ services: dockerfile: nginx/Dockerfile links: - backend + environment: + - REACT_APP_HTTP_PROXY ports: - "80:80" - "443:443" diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 6cff9b6..51560a2 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -22,8 +22,8 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; -const PROXY = process.env.REACT_APP_HTTP_PROXY || "http://localhost:4000"; -const API_URL = PROXY + '/api/v1'; +const HOST = process.env.REACT_APP_HTTP_PROXY || ""; +const API_URL = HOST + '/api/v1'; class RestDataManager { constructor(type, url, keyFilter) { From c75ac09aa99b4b6247bf0a31489ab12edab68058 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 1 Jun 2017 11:19:38 +0200 Subject: [PATCH 228/556] include build directory and nginx in docker build --- .dockerignore | 2 -- nginx/Dockerfile | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.dockerignore b/.dockerignore index 84eb9b1..a51ea8a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,2 @@ node_modules/ -nginx/ doc/ -build/ diff --git a/nginx/Dockerfile b/nginx/Dockerfile index f5d6b65..6902568 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -2,9 +2,9 @@ FROM nginx:stable-alpine # Copy frontend files and make them accesible to nginx RUN mkdir /www -COPY ./build /www +COPY build /www RUN chown nginx:nginx -R /www RUN chmod -R 0755 /www # Copy nginx configuration -COPY ./nginx/villas.conf /etc/nginx/conf.d/default.conf +COPY nginx/villas.conf /etc/nginx/conf.d/default.conf From bcd3f32003805235cf34c4e5f1ff8593e0dee1e2 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 1 Jun 2017 11:21:03 +0200 Subject: [PATCH 229/556] use artifacts instead of cache --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e3c24f1..2b14a66 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,10 +10,6 @@ services: before_script: - mkdir -p build -cache: - paths: - - build - stages: - build - test @@ -23,6 +19,10 @@ build_job: stage: build script: - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/build:/usr/src/app/build -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm run build' + artifacts: + paths: + - build/ + expire_in: 1 week tags: - docker From 7ac2d95aa7d58b538d57e4c071de16ddd9dcf50e Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 1 Jun 2017 14:11:20 +0200 Subject: [PATCH 230/556] yaml correction --- .gitlab-ci.yml | 6 +++--- CoSiFrontEnd | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 160000 CoSiFrontEnd diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2b14a66..60198a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,9 +20,9 @@ build_job: script: - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/build:/usr/src/app/build -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm run build' artifacts: - paths: - - build/ - expire_in: 1 week + paths: + - build/ + expire_in: 1 week tags: - docker diff --git a/CoSiFrontEnd b/CoSiFrontEnd new file mode 160000 index 0000000..ceb9949 --- /dev/null +++ b/CoSiFrontEnd @@ -0,0 +1 @@ +Subproject commit ceb99497b2839a7978b497b34c760553a63d5e9b From 64c7f9f6f3c13e82a17bb1028849a650369555f4 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Thu, 1 Jun 2017 14:19:19 +0200 Subject: [PATCH 231/556] CoSiFrontEnd doesn't belong here --- CoSiFrontEnd | 1 - 1 file changed, 1 deletion(-) delete mode 160000 CoSiFrontEnd diff --git a/CoSiFrontEnd b/CoSiFrontEnd deleted file mode 160000 index ceb9949..0000000 --- a/CoSiFrontEnd +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ceb99497b2839a7978b497b34c760553a63d5e9b From 5c8cc7cc8e3e77fa80578336bb72768ae4fa1a46 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 2 Jun 2017 17:14:20 +0200 Subject: [PATCH 232/556] deploy only the development branch (review) --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 60198a2..179e421 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,5 +47,7 @@ deploy_review: - export DOCKER_HOST=$DEPLOYMENT_HOST && export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 - docker-compose --verbose down - docker-compose --verbose up -d + only: + - develop tags: - docker From 86a6bac55eb15a2c2de4e40099875e7e827ce4ee Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 27 Jun 2017 09:58:10 +0200 Subject: [PATCH 233/556] Add node component --- package.json | 9 +-- src/components/node-tree.js | 75 +++++++++++++++++++++++++ src/containers/simulators.js | 18 ++++-- src/data-managers/nodes-data-manager.js | 24 ++++++++ src/data-managers/rest-data-manager.js | 2 +- src/stores/node-store.js | 25 +++++++++ 6 files changed, 142 insertions(+), 11 deletions(-) create mode 100644 src/components/node-tree.js create mode 100644 src/data-managers/nodes-data-manager.js create mode 100644 src/stores/node-store.js diff --git a/package.json b/package.json index a8cc8a2..3d0b18e 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,12 @@ "dependencies": { "bootstrap": "^3.3.7", "classnames": "^2.2.5", + "d3-scale": "^1.0.5", "es6-promise": "^4.0.5", "flux": "^3.1.2", + "gaugeJS": "^1.3.2", "immutable": "^3.8.1", + "rc-slider": "^7.0.1", "rd3": "^0.7.4", "react": "^15.4.2", "react-bootstrap": "^0.30.7", @@ -19,10 +22,8 @@ "react-notification-system": "^0.2.13", "react-rnd": "^4.2.2", "react-router": "^3.0.2", - "superagent": "^3.5.0", - "gaugeJS": "^1.3.2", - "d3-scale": "^1.0.5", - "rc-slider": "^7.0.1" + "react-sortable-tree": "^0.1.19", + "superagent": "^3.5.0" }, "devDependencies": { "chai": "^3.5.0", diff --git a/src/components/node-tree.js b/src/components/node-tree.js new file mode 100644 index 0000000..6ef02b7 --- /dev/null +++ b/src/components/node-tree.js @@ -0,0 +1,75 @@ +/** + * File: node-tree.js + * Author: Markus Grigull + * Date: 26.06.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 SortableTree from 'react-sortable-tree'; +import { Button, Glyphicon } from 'react-bootstrap'; + +class NodeTree extends React.Component { + constructor(props) { + super(props); + + this.state = { + treeData: [ + { title: 'Chicken', subtitle: 'localhost:5000', children: [ { title: 'Egg' } ], expanded: true }, + { title: 'Cow', subtitle: 'localhost:5001', children: [ { title: 'Milk' }, { title: 'Cheese' }], expanded: true }, + ] + }; + } + + canNodeDrag(node, path) { + return (node.parentNode != null); + } + + canNodeDrop(node, prevPath) { + return (node.nextParent != null); + } + + generateNodeProps(rowInfo) { + var buttons = []; + + if (rowInfo.parentNode == null) { + buttons.push() + } + + buttons.push(); + + return { + buttons: buttons + }; + } + + render() { + return ( + this.setState({ treeData }) } + style={{ height: 400 }} + maxDepth='2' + canDrag={ (node, path) => this.canNodeDrag(node, path) } + canDrop={ (node, prevPath) => this.canNodeDrop(node, prevPath) } + generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo) } + /> + ); + } +} + +export default NodeTree; diff --git a/src/containers/simulators.js b/src/containers/simulators.js index e9a2af8..8a9c01e 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -24,21 +24,23 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; -import SimulatorStore from '../stores/simulator-store'; +//import SimulatorStore from '../stores/simulator-store'; +import NodeStore from '../stores/node-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; +import NodeTree from '../components/node-tree'; class Simulators extends Component { static getStores() { - return [ SimulatorStore ]; + return [ NodeStore ]; } static calculateState() { return { - simulators: SimulatorStore.getState(), + nodes: NodeStore.getState(), newModal: false, deleteModal: false, @@ -49,7 +51,7 @@ class Simulators extends Component { componentWillMount() { AppDispatcher.dispatch({ - type: 'simulators/start-load' + type: 'nodes/start-load' }); } @@ -99,7 +101,11 @@ class Simulators extends Component {

    Simulators

    - + + + + + {/*
    this.labelStyle(value)} labelModifier={(value) => this.labelModifier(value)} /> this.setState({ editModal: true, modalSimulator: this.state.simulators[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index] })} /> @@ -124,7 +130,7 @@ class Simulators extends Component { - + */} ); } diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js new file mode 100644 index 0000000..a253ac9 --- /dev/null +++ b/src/data-managers/nodes-data-manager.js @@ -0,0 +1,24 @@ +/** + * File: nodes-data-manager.js + * Author: Markus Grigull + * Date: 26.06.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 './rest-data-manager'; + +export default new RestDataManager('node', '/nodes'); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 51560a2..749cdcd 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 HOST = process.env.REACT_APP_HTTP_PROXY || ""; +const HOST = process.env.REACT_APP_HTTP_PROXY || "http://localhost:4000"; const API_URL = HOST + '/api/v1'; class RestDataManager { diff --git a/src/stores/node-store.js b/src/stores/node-store.js new file mode 100644 index 0000000..8945885 --- /dev/null +++ b/src/stores/node-store.js @@ -0,0 +1,25 @@ +/** + * File: node-store.js + * Author: Markus Grigull + * Date: 26.06.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 './array-store'; +import NodesDataManager from '../data-managers/nodes-data-manager'; + +export default new ArrayStore('nodes', NodesDataManager); From 1b3fb818729736a2b24c8074910b31035f4a9fde Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 00:37:37 +0200 Subject: [PATCH 234/556] move git submodule of backend --- .gitmodules | 6 +++--- backend | 1 + docker-compose.yml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) create mode 160000 backend diff --git a/.gitmodules b/.gitmodules index 4cab793..86004f4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ -[submodule "VILLASweb-backend"] - path = VILLASweb-backend - url = ../../VILLASframework/VILLASweb-backend.git +[submodule "backend"] + path = backend + url = git@git.rwth-aachen.de:VILLASframework/VILLASweb-backend.git branch = develop diff --git a/backend b/backend new file mode 160000 index 0000000..22e594a --- /dev/null +++ b/backend @@ -0,0 +1 @@ +Subproject commit 22e594a848798a79f0ab90e6e0a6ff2fe3d91e8b diff --git a/docker-compose.yml b/docker-compose.yml index 32fffde..1cb4c64 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: restart: always backend: - build: VILLASweb-backend + build: backend links: - database environment: From e685d4d87276952f1d8d953db2dd40466d1e42bd Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 00:39:01 +0200 Subject: [PATCH 235/556] use a docker volume for mongodb persistence not every docker installation can mount /opt/database --- docker-compose.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1cb4c64..7b6f5d6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,9 @@ version: "2" +volumes: + database: + driver: local + services: frontend: build: @@ -28,6 +32,6 @@ services: image: mongo:latest user: mongodb volumes: - - /opt/database:/data/db + - database:/data/db restart: always - user: mongodb + user: mongodb \ No newline at end of file From 6af5fa43468bc5e0f90fbeb17cd1fb4f8e3c1851 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 00:39:45 +0200 Subject: [PATCH 236/556] add RabbitMQ broker as a new service to our docker compose --- docker-compose.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7b6f5d6..fdf2c4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,7 @@ services: build: backend links: - database + - broker environment: - NODE_ENV=production ports: @@ -34,4 +35,13 @@ services: volumes: - database:/data/db restart: always - user: mongodb \ No newline at end of file + user: mongodb + + broker: + image: rabbitmq:management + environment: + - RABBITMQ_DEFAULT_USER=villas + - RABBITMQ_DEFAULT_PASS=s3c0sim4! + ports: + - "8080:15672" + - "5672:5672" \ No newline at end of file From 38863ee166247966407bf7be1636476a945908d6 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 02:42:43 +0200 Subject: [PATCH 237/556] start VILLASnode services and use frontend to proxy WebSocket endpoint --- Dockerfile | 16 ++++----- VILLASweb-backend | 1 - docker-compose.yml | 49 +++++++++++++++++++++++---- {nginx => etc/nginx}/villas.conf | 7 ++++ etc/node/websocket.conf | 57 ++++++++++++++++++++++++++++++++ nginx/Dockerfile | 10 ------ 6 files changed, 114 insertions(+), 26 deletions(-) delete mode 160000 VILLASweb-backend rename {nginx => etc/nginx}/villas.conf (79%) create mode 100644 etc/node/websocket.conf delete mode 100644 nginx/Dockerfile diff --git a/Dockerfile b/Dockerfile index b014976..c88afc6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ -FROM node:latest +FROM nginx:stable-alpine -RUN mkdir /react -RUN mkdir /result +# Copy frontend files and make them accesible to nginx +RUN mkdir /www +COPY build /www +RUN chown nginx:nginx -R /www +RUN chmod -R 0755 /www -VOLUME /result - -WORKDIR /react - -CMD npm install && npm run build && cp -R /react/build/* /result/ +# Copy nginx configuration +COPY etc/nginx/villas.conf /etc/nginx/conf.d/default.conf diff --git a/VILLASweb-backend b/VILLASweb-backend deleted file mode 160000 index 8184b91..0000000 --- a/VILLASweb-backend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8184b91f013f25887a129fd95354da3cc5796244 diff --git a/docker-compose.yml b/docker-compose.yml index fdf2c4a..9bc0d4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,31 +4,35 @@ volumes: database: driver: local +networks: + villas: + services: + # The VILLASweb frontend frontend: build: context: . - dockerfile: nginx/Dockerfile - links: - - backend environment: - REACT_APP_HTTP_PROXY ports: - "80:80" - "443:443" restart: always + networks: + villas: + # The VILLASweb backend backend: build: backend - links: - - database - - broker environment: - NODE_ENV=production ports: - "4000:4000" restart: always + networks: + villas: + # The MongoDB database for the VILLASweb backend database: image: mongo:latest user: mongodb @@ -36,7 +40,10 @@ services: - database:/data/db restart: always user: mongodb + networks: + villas: + # AMQP broker for VILLAScontroller broker: image: rabbitmq:management environment: @@ -44,4 +51,32 @@ services: - RABBITMQ_DEFAULT_PASS=s3c0sim4! ports: - "8080:15672" - - "5672:5672" \ No newline at end of file + - "5672:5672" + networks: + villas: + + # VILLASnode, the gateway between UDP and WebSocket traffic + node: + image: villas/node:latest + privileged: true + command: [ "node", "/etc/villas/node/websocket.conf" ] + expose: + - "12000/udp" + ports: + - "8081:80/tcp" + volumes: + - "./etc/node/:/etc/villas/node/" + networks: + villas: + + # Generate random data and send it via UDP to the 'node' service + signal: + image: villas/node:latest + privileged: true + entrypoint: bash + command: [ "-c", "villas signal mixed -v4 | villas pipe -x /etc/villas/node/websocket.conf udp_1"] + volumes: + - "./etc/node/:/etc/villas/node/" + stop_signal: SIGINT + networks: + villas: \ No newline at end of file diff --git a/nginx/villas.conf b/etc/nginx/villas.conf similarity index 79% rename from nginx/villas.conf rename to etc/nginx/villas.conf index 7fd9ee9..58872f4 100644 --- a/nginx/villas.conf +++ b/etc/nginx/villas.conf @@ -13,6 +13,13 @@ server { proxy_pass http://backend:4000/; } + + location /ws/ { + proxy_pass http://node/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } # frontend location location / { diff --git a/etc/node/websocket.conf b/etc/node/websocket.conf new file mode 100644 index 0000000..3a16599 --- /dev/null +++ b/etc/node/websocket.conf @@ -0,0 +1,57 @@ +/** Example configuration file for VILLASnode. + * + * The syntax of this file is similar to JSON. + * A detailed description of the format can be found here: + * http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files + * + * @author Steffen Vogel + * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program 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 + * any later version. + * + * This program 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 this program. If not, see . + *********************************************************************************/ + +nodes = { + ws_1 = { + type = "websocket", + description = "Demo Channel", + #vectorize = 10, + source = { + simulator = "OP5600", + location = "ACS lab" + }, + series = ( + { label = "Random walk", unit = "V" }, + { label = "Sine", unit = "A" }, + { label = "Rect", unit = "Var"}, + { label = "Ramp", unit = "°C" } + ) + }, + udp_1 = { + type = "socket", + layer = "udp", + + remote = "signal:12001" + local = "node:12000" + }, +}; + + +############ List of paths ############ + +paths = ( + { in = "udp_1", out = "ws_1", reverse = true } +); diff --git a/nginx/Dockerfile b/nginx/Dockerfile deleted file mode 100644 index 6902568..0000000 --- a/nginx/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM nginx:stable-alpine - -# Copy frontend files and make them accesible to nginx -RUN mkdir /www -COPY build /www -RUN chown nginx:nginx -R /www -RUN chmod -R 0755 /www - -# Copy nginx configuration -COPY nginx/villas.conf /etc/nginx/conf.d/default.conf From b4dce489fa2092e5771d613c1a0fbc80d9a557dc Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 02:43:24 +0200 Subject: [PATCH 238/556] fix: simulators always appear offline --- src/data-managers/simulators-data-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index 535f1e2..f2eec0d 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -41,7 +41,7 @@ function isRunning(simulator) { if (response.id === body.id) { response.response.forEach(sim => { - if (sim.name === name) { + if (sim.name === simulator.name) { simulator.running = true; } }); From 3a988506bfb8e6b65f4fc23a4c1bb07d3ce9a9f2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 02:44:27 +0200 Subject: [PATCH 239/556] fix: npm gave some deprecation warnings --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a8cc8a2..fd55078 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,9 @@ "superagent": "^3.5.0", "gaugeJS": "^1.3.2", "d3-scale": "^1.0.5", - "rc-slider": "^7.0.1" + "rc-slider": "^7.0.1", + "prop-types": "^15.0.0", + "d3": "^3.5.0" }, "devDependencies": { "chai": "^3.5.0", From dfa5259156d43f46c2705ea3a7e66ae2fe4dfd9a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 02:44:57 +0200 Subject: [PATCH 240/556] add react-script proxy support --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fd55078..2b98174 100644 --- a/package.json +++ b/package.json @@ -35,5 +35,6 @@ "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" - } + }, + "proxy": "http://localhost:4000" } From 830c8715a0969a5ac88cd141a21a692c1eb70e1b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 02:46:24 +0200 Subject: [PATCH 241/556] added note about docker usage --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 172ff40..dceeb9e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,15 @@ Additional libraries are used, for a complete list see package.json. ## Quick start +We recommend Docker to get started quickly: + +```bash +$ git clone --recursive git@git.rwth-aachen.de:VILLASframework/VILLASweb.git +$ npm install +$ npm build +$ docker-compose up +``` + To start the website locally run `npm start`. This will open a local webserver serving the _frontend_. To make the website work, you still need to start at least the VILLASweb-backend (See repository for information). The default user and password are configured in the `config.js` file of the _backend_. By default they are: __admin__ / __admin__. From 5640b01bbf3f300396845b6f578dcf48698c9844 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 09:00:45 +0200 Subject: [PATCH 242/556] fix URL of git submodule in order to fix GitLab-CI --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 86004f4..7aee965 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "backend"] path = backend - url = git@git.rwth-aachen.de:VILLASframework/VILLASweb-backend.git + url = ../VILLASweb-backend.git branch = develop From 2b2052e2035bf30805db35a8baf61ae6a5583c91 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 12:10:19 +0200 Subject: [PATCH 243/556] add some sample data and a script to save / restore it --- .gitlab-ci.yml | 1 + README.md | 5 +++-- VILLAS.archive | Bin 0 -> 1326 bytes docker-compose.yml | 2 ++ sample-data.sh | 25 +++++++++++++++++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 VILLAS.archive create mode 100755 sample-data.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 179e421..bc32ecc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ image: docker:17 variables: GIT_SUBMODULE_STRATEGY: normal DOCKER_COMPOSE_VERSION: 1.13.0 + DOCKER_DRIVER: overlay services: - docker:dind diff --git a/README.md b/README.md index dceeb9e..793013d 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,13 @@ $ git clone --recursive git@git.rwth-aachen.de:VILLASframework/VILLASweb.git $ npm install $ npm build $ docker-compose up +$ ./sample-data.sh import ``` -To start the website locally run `npm start`. This will open a local webserver serving the _frontend_. To make the website work, you still need to start at least the VILLASweb-backend (See repository for information). - The default user and password are configured in the `config.js` file of the _backend_. By default they are: __admin__ / __admin__. +For development you can use `npm start` to spawn a local webserver. + ## Copyright 2017, Institute for Automation of Complex Power Systems, EONERC diff --git a/VILLAS.archive b/VILLAS.archive new file mode 100644 index 0000000000000000000000000000000000000000..0167f76ca8f8e1eca2bbe7fc582e8f9d130bf0ac GIT binary patch literal 1326 zcmV+}1=0E+iwFP!32ul0|FoA|Xk1kn$NzIO>GZ~z`D{=`l;IfgWthyFOnMm*8hg{y zn@Nb)qT|k--I?8-%Xls`xe#q1tO!N=VnNVKDIx_Q1by-S%4?X~upzkP6q0!UYEtKvHjwY+l0HVj(vm~FX80#F*% zahYw2hkQwUopO791AviSF*gduvuz_-PXTb`3tZ-g^l7m+^}?Y;V-rw9N7xF$ zWu|Ws=~pqSM|9#5oB*((+I6w6mKGMXDzkJtOI@{eVnJ=Fr9xJnp>t|!K`k>~EoqBc z)gmTUOZ>U4W>vmVl}>XJC+gy>i%7d{o(BNHmDLdk05q8E6NAm)NBP?NQpWvsg5Fyl zl&8aYsT1YvY zq5ab8+P8#tWXA&V%70QuwsT){K3W}c6M(v7pQ05niudyR;rlOXRYH{KC_|~ts|@@~5m)%Mc~HPd@ILNa4)bf#@q~ZGbE$)UeW40uIv@)+m26T#W+sP`bvjp zDUy>5;h}l`=hM6zf0Bo0Qx6eUT3P6A9Z9a<_ppiC~~yJ=2;EN*L0nTh^dZORw9^@wrTJ%qzQW&6wOnl#ht|?+R} zX-b7mu^LKtoYBE{v4j^hsXx)y-!r%r|MBfB-z`4%+0(+tvk&_tq?_{Vf%1trfBo{u zaSZ(M#s8J|Zv(NJ=q9tE)QRghZAS<9H&h@)`O%>%->lb081b~jlerxuW0Tt(M|b9& z;L-VbdviMv7R-a*V!Z literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml index 9bc0d4a..d89820c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,6 +38,8 @@ services: user: mongodb volumes: - database:/data/db + expose: + - "27017" restart: always user: mongodb networks: diff --git a/sample-data.sh b/sample-data.sh new file mode 100755 index 0000000..b0e4aec --- /dev/null +++ b/sample-data.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +DIR=$(basename $(pwd)) + +ACTION=${1:-import} +CONTAINER=${2:-${DIR}_database_1} +NETWORK=${4:-${DIR}_villas} +DATABASE=${3:-VILLAS} + +DOCKEROPTS="--interactive --tty --rm --network ${NETWORK} --volume $(pwd):/tmp" + +case ${ACTION} in + import) + docker run ${DOCKEROPTS} mongo:latest bash -c 'mongorestore --verbose --host '${CONTAINER}' --gzip --archive=/tmp/'${DATABASE}'.archive' + ;; + + save) + docker run ${DOCKEROPTS} mongo:latest bash -c 'mongodump --verbose --host '${CONTAINER}' --db '${DATABASE}' --gzip --archive=/tmp/'${DATABASE}'.archive' + ;; + + *) + echo "Usage: $0 (import|save) [MONGODB_CONTAINER [DATABASE [NETWORK]]]" + ;; +esac + From f7979ab25022a11411528324ff06075bd95865ca Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 12:18:37 +0200 Subject: [PATCH 244/556] simplified GitLab-CI config --- .gitlab-ci.yml | 75 ++++++++++++-------- src/data-managers/simulators-data-manager.js | 1 - 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bc32ecc..743b78d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,54 +1,73 @@ -image: docker:17 - variables: GIT_SUBMODULE_STRATEGY: normal - DOCKER_COMPOSE_VERSION: 1.13.0 DOCKER_DRIVER: overlay + DOCKER_CERT_PATH + CI: "true" -services: -- docker:dind - -before_script: -- mkdir -p build +cache: + untracked: true + key: "$CI_PROJECT_ID" + paths: + - node_modules/ + - _site/vendor/ + - .bundled/ + - .yarn stages: -- build -- test -- deploy + - build + - test + - deploy build_job: stage: build + before_script: + - mkdir -p build script: - - docker run --rm -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/build:/usr/src/app/build -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm run build' + - npm install + - npm run build + image: node:7.9.0-slim artifacts: paths: - - build/ + - build/ + - node_modules/ expire_in: 1 week tags: - - docker + - docker test_job: stage: test script: - - docker run --rm -e CI=true -v $(pwd)/package.json:/usr/src/app/package.json -v $(pwd)/public:/usr/src/app/public -v $(pwd)/src:/usr/src/app/src -w /usr/src/app node:7.9.0-slim bash -c 'npm install; npm test' + - npm test + image: node:7.9.0-slim + dependencies: + - build_job tags: - - docker + - docker deploy_review: stage: deploy environment: review + variables: + COMPOSE_TLS_VERSION: "TLSv1_2" + DOCKER_HOST: "$DEPLOYMENT_HOST" + DOCKER_TLS_VERIFY: "1" + DOCKER_CERT_PATH: "certs" + before_script: + - apk add --no-cache py-pip + - pip install docker-compose==1.13.0 + - mkdir -p $DOCKER_CERT_PATH + - echo "$DEPLOYMENT_CACERT" > $DOCKER_CERT_PATH/ca.pem + - echo "$DEPLOYMENT_CLIENT_CERT" > $DOCKER_CERT_PATH/cert.pem + - echo "$DEPLOYMENT_CLIENT_KEY" > $DOCKER_CERT_PATH/key.pem + - docker info script: - - mkdir -p ~/.docker - - echo "$DEPLOYMENT_CACERT" > ~/.docker/ca.pem - - echo "$DEPLOYMENT_CLIENT_CERT" > ~/.docker/cert.pem - - echo "$DEPLOYMENT_CLIENT_KEY" > ~/.docker/key.pem - - apk add --no-cache py-pip - - pip install docker-compose==$DOCKER_COMPOSE_VERSION - - docker-compose build - - export DOCKER_HOST=$DEPLOYMENT_HOST && export DOCKER_TLS_VERIFY=1 && export DOCKER_CERT_PATH=~/.docker && export COMPOSE_TLS_VERSION=TLSv1_2 - - docker-compose --verbose down - - docker-compose --verbose up -d + - docker-compose build + - docker-compose --verbose down + - docker-compose --verbose up -d + image: docker:17 + dependencies: + - build_job only: - - develop + - develop tags: - - docker + - docker diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index f2eec0d..23dbe7b 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -26,7 +26,6 @@ import AppDispatcher from '../app-dispatcher'; function isRunning(simulator) { // get path to nodes.json and simulator name var path = simulator.endpoint.substring(0, simulator.endpoint.lastIndexOf('/')); - var name = simulator.endpoint.substring(simulator.endpoint.lastIndexOf('/') + 1); var url = 'http://' + path + '/api/v1'; var body = { From 01f3b2d8ac8402c6b22a131fdbcc51104a279295 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:06:28 +0200 Subject: [PATCH 245/556] fix: invalid dialog title (closes #69) --- src/components/dialog/new-project.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dialog/new-project.js b/src/components/dialog/new-project.js index 02c1550..d61d53a 100644 --- a/src/components/dialog/new-project.js +++ b/src/components/dialog/new-project.js @@ -83,7 +83,7 @@ class NewProjectDialog extends Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    Name From 01f79aea93dda3af16661e4d14d59914c6fdc815 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:07:06 +0200 Subject: [PATCH 246/556] fix: make dialog buttons upper / lower case spelling consistent (closes #70) --- src/components/dialog/edit-project.js | 2 +- src/components/dialog/edit-simulation.js | 2 +- src/components/dialog/edit-simulator.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dialog/edit-project.js b/src/components/dialog/edit-project.js index 74391f5..d1fe9b4 100644 --- a/src/components/dialog/edit-project.js +++ b/src/components/dialog/edit-project.js @@ -82,7 +82,7 @@ class EditProjectDialog extends 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/components/dialog/edit-simulation.js b/src/components/dialog/edit-simulation.js index b12699c..95860a0 100644 --- a/src/components/dialog/edit-simulation.js +++ b/src/components/dialog/edit-simulation.js @@ -79,7 +79,7 @@ class EditSimulationDialog extends 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/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index 1fdcc09..3f7f64e 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -85,7 +85,7 @@ class EditSimulatorDialog extends Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name From efd1c26e1944ecada2dbd15604d9029af2a91496 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:07:57 +0200 Subject: [PATCH 247/556] fix GitLab-CI --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 743b78d..81b578b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,5 @@ variables: GIT_SUBMODULE_STRATEGY: normal - DOCKER_DRIVER: overlay - DOCKER_CERT_PATH CI: "true" cache: @@ -29,7 +27,6 @@ build_job: artifacts: paths: - build/ - - node_modules/ expire_in: 1 week tags: - docker From 1ad7441caa8db86ebda3181283bce90306166779 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:19:10 +0200 Subject: [PATCH 248/556] fix: more inconsistencies (#70) --- src/components/dialog/edit-user.js | 2 +- src/components/dialog/edit-visualization.js | 2 +- src/components/dialog/edit-widget.js | 2 +- src/components/dialog/new-visualization.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js index 594492a..1720a3b 100644 --- a/src/components/dialog/edit-user.js +++ b/src/components/dialog/edit-user.js @@ -83,7 +83,7 @@ class EditUserDialog extends Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Username diff --git a/src/components/dialog/edit-visualization.js b/src/components/dialog/edit-visualization.js index d9520d4..8524bce 100644 --- a/src/components/dialog/edit-visualization.js +++ b/src/components/dialog/edit-visualization.js @@ -79,7 +79,7 @@ class EditVisualizationDialog extends 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/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 8c2277f..cd036ca 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -101,7 +101,7 @@ class EditWidgetDialog extends Component { } return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name diff --git a/src/components/dialog/new-visualization.js b/src/components/dialog/new-visualization.js index 5d04baf..a735b04 100644 --- a/src/components/dialog/new-visualization.js +++ b/src/components/dialog/new-visualization.js @@ -74,7 +74,7 @@ class NewVisualzationDialog extends Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name From d6019fe07a4dd078ac7128ced122bfba58c32308 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:23:53 +0200 Subject: [PATCH 249/556] fix GitLab-CI deployment --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 81b578b..e905fd2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -56,11 +56,11 @@ deploy_review: - echo "$DEPLOYMENT_CACERT" > $DOCKER_CERT_PATH/ca.pem - echo "$DEPLOYMENT_CLIENT_CERT" > $DOCKER_CERT_PATH/cert.pem - echo "$DEPLOYMENT_CLIENT_KEY" > $DOCKER_CERT_PATH/key.pem + - docker --version + - docker-compose --version - docker info script: - - docker-compose build - - docker-compose --verbose down - - docker-compose --verbose up -d + - docker-compose up -d --force-recreate --build image: docker:17 dependencies: - build_job From 0191f814865b23a000f29808124b5335306bc771 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:28:50 +0200 Subject: [PATCH 250/556] fix docker-compose file --- docker-compose.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d89820c..68683b1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,7 +61,9 @@ services: node: image: villas/node:latest privileged: true - command: [ "node", "/etc/villas/node/websocket.conf" ] + command: + - "node" + - "/etc/villas/node/websocket.conf" expose: - "12000/udp" ports: @@ -76,7 +78,9 @@ services: image: villas/node:latest privileged: true entrypoint: bash - command: [ "-c", "villas signal mixed -v4 | villas pipe -x /etc/villas/node/websocket.conf udp_1"] + command: + - "-c" + - "villas signal mixed -v4 | villas pipe -x /etc/villas/node/websocket.conf udp_1" volumes: - "./etc/node/:/etc/villas/node/" stop_signal: SIGINT From 7dfed9e632b895250be94182145aca8047217131 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 28 Jun 2017 13:38:38 +0200 Subject: [PATCH 251/556] try newer docker-compose --- .gitlab-ci.yml | 2 +- docker-compose.yml | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e905fd2..8c1e0f4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -51,7 +51,7 @@ deploy_review: DOCKER_CERT_PATH: "certs" before_script: - apk add --no-cache py-pip - - pip install docker-compose==1.13.0 + - pip install docker-compose - mkdir -p $DOCKER_CERT_PATH - echo "$DEPLOYMENT_CACERT" > $DOCKER_CERT_PATH/ca.pem - echo "$DEPLOYMENT_CLIENT_CERT" > $DOCKER_CERT_PATH/cert.pem diff --git a/docker-compose.yml b/docker-compose.yml index 68683b1..3cf77bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,8 +49,8 @@ services: broker: image: rabbitmq:management environment: - - RABBITMQ_DEFAULT_USER=villas - - RABBITMQ_DEFAULT_PASS=s3c0sim4! + RABBITMQ_DEFAULT_USER: "villas" + RABBITMQ_DEFAULT_PASS: "s3c0sim4!" ports: - "8080:15672" - "5672:5672" @@ -61,9 +61,7 @@ services: node: image: villas/node:latest privileged: true - command: - - "node" - - "/etc/villas/node/websocket.conf" + command: node /etc/villas/node/websocket.conf expose: - "12000/udp" ports: @@ -78,11 +76,8 @@ services: image: villas/node:latest privileged: true entrypoint: bash - command: - - "-c" - - "villas signal mixed -v4 | villas pipe -x /etc/villas/node/websocket.conf udp_1" + command: -c 'villas signal mixed -v4 | villas pipe -x /etc/villas/node/websocket.conf udp_1' volumes: - "./etc/node/:/etc/villas/node/" - stop_signal: SIGINT networks: villas: \ No newline at end of file From 95be14cef7e36c985cede378ab2a7b6f62b53cd6 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 30 Jun 2017 10:37:15 +0200 Subject: [PATCH 252/556] Docker upgrade --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8c1e0f4..760ecba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,6 +52,7 @@ deploy_review: before_script: - apk add --no-cache py-pip - pip install docker-compose + - pip install -U docker==2.4.2 - mkdir -p $DOCKER_CERT_PATH - echo "$DEPLOYMENT_CACERT" > $DOCKER_CERT_PATH/ca.pem - echo "$DEPLOYMENT_CLIENT_CERT" > $DOCKER_CERT_PATH/cert.pem @@ -64,7 +65,5 @@ deploy_review: image: docker:17 dependencies: - build_job - only: - - develop tags: - docker From 266573f45661ef358aeea289ad5a0b670d83f255 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 30 Jun 2017 10:58:14 +0200 Subject: [PATCH 253/556] pip upgrade, install specific docker-compose version --- .gitlab-ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 760ecba..f485b78 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,7 @@ variables: GIT_SUBMODULE_STRATEGY: normal + DOCKER_COMPOSE_VERSION: 1.14.0 + PY_DOCKER_VERSION: 2.4.2 CI: "true" cache: @@ -51,8 +53,9 @@ deploy_review: DOCKER_CERT_PATH: "certs" before_script: - apk add --no-cache py-pip - - pip install docker-compose - - pip install -U docker==2.4.2 + - pip install --upgrade pip + - pip install docker-compose==$DOCKER_COMPOSE_VERSION + - pip install -U docker==$PY_DOCKER_VERSION - mkdir -p $DOCKER_CERT_PATH - echo "$DEPLOYMENT_CACERT" > $DOCKER_CERT_PATH/ca.pem - echo "$DEPLOYMENT_CLIENT_CERT" > $DOCKER_CERT_PATH/cert.pem From 003ab30cab726d508f9776c8a97f05b740cf78c6 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Fri, 30 Jun 2017 12:03:37 +0200 Subject: [PATCH 254/556] deploy only on develop branch --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f485b78..170624c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -45,6 +45,8 @@ test_job: deploy_review: stage: deploy + only: + - develop environment: review variables: COMPOSE_TLS_VERSION: "TLSv1_2" From cf83d4d969d9690cf7a8e088286e30bf990a4372 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 6 Jul 2017 11:41:26 +0200 Subject: [PATCH 255/556] Add node dialogs and backend --- src/components/dialog/edit-node.js | 98 ++++++++++++++++++++++++++++++ src/components/dialog/new-node.js | 97 +++++++++++++++++++++++++++++ src/components/node-tree.js | 24 ++++++-- src/containers/simulators.js | 89 +++++++++++++-------------- 4 files changed, 256 insertions(+), 52 deletions(-) create mode 100644 src/components/dialog/edit-node.js create mode 100644 src/components/dialog/new-node.js diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js new file mode 100644 index 0000000..da72a4a --- /dev/null +++ b/src/components/dialog/edit-node.js @@ -0,0 +1,98 @@ +/** + * File: edit-node.js + * Author: Markus Grigull + * Date: 06.07.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, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewNodeDialog extends React.Component { + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '', + config: {}, + simulators: [], + _id: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + 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.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id }); + } + + validateForm(target) { + // check all controls + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + + + + ); + } +} + +export default NewNodeDialog; diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js new file mode 100644 index 0000000..ae89a35 --- /dev/null +++ b/src/components/dialog/new-node.js @@ -0,0 +1,97 @@ +/** + * File: new-node.js + * Author: Markus Grigull + * Date: 06.07.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, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewNodeDialog extends React.Component { + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '', + config: {}, + simulators: [] + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', endpoint: '', config: {}, simulators: [] }); + } + + validateForm(target) { + // check all controls + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + + +
    + ); + } +} + +export default NewNodeDialog; diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 6ef02b7..ea79d6c 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -28,10 +28,7 @@ class NodeTree extends React.Component { super(props); this.state = { - treeData: [ - { title: 'Chicken', subtitle: 'localhost:5000', children: [ { title: 'Egg' } ], expanded: true }, - { title: 'Cow', subtitle: 'localhost:5001', children: [ { title: 'Milk' }, { title: 'Cheese' }], expanded: true }, - ] + treeData: [] }; } @@ -50,20 +47,35 @@ class NodeTree extends React.Component { buttons.push() } - buttons.push(); + buttons.push(); + buttons.push(); return { buttons: buttons }; } + componentWillReceiveProps(nextProps) { + // compare if data changed + if (this.props.data == null || this.props.data !== nextProps.data) { + // generate new state + var treeData = []; + + nextProps.data.forEach((node) => { + treeData.push({ title: node.name, subtitle: node.endpoint, id: node._id }); + }); + + this.setState({ treeData }); + } + } + render() { return ( this.setState({ treeData }) } style={{ height: 400 }} - maxDepth='2' + maxDepth={ 2 } canDrag={ (node, path) => this.canNodeDrag(node, path) } canDrop={ (node, prevPath) => this.canNodeDrop(node, prevPath) } generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo) } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 8a9c01e..a6024c5 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -27,10 +27,8 @@ import AppDispatcher from '../app-dispatcher'; //import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewSimulatorDialog from '../components/dialog/new-simulator'; -import EditSimulatorDialog from '../components/dialog/edit-simulator'; +import NewNodeDialog from '../components/dialog/new-node'; +import EditNodeDialog from '../components/dialog/edit-node'; import NodeTree from '../components/node-tree'; class Simulators extends Component { @@ -45,7 +43,7 @@ class Simulators extends Component { newModal: false, deleteModal: false, editModal: false, - modalSimulator: {} + modalData: {} }; } @@ -56,81 +54,80 @@ class Simulators extends Component { } closeNewModal(data) { - this.setState({ newModal : false }); + this.setState({ newModal: false }); if (data) { AppDispatcher.dispatch({ - type: 'simulators/start-add', + type: 'nodes/start-add', data: data }); } } + showEditModal(data) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ editModal: true, modalData: node }); + } + + closeEditModal(data) { + this.setState({ editModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: data + }); + } + } + + showDeleteModal(data) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ deleteModal: true, modalData: node }); + } + confirmDeleteModal() { this.setState({ deleteModal: false }); AppDispatcher.dispatch({ - type: 'simulators/start-remove', - data: this.state.modalSimulator + type: 'nodes/start-remove', + data: this.state.modalData }); } - closeEditModal(data) { - this.setState({ editModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'simulators/start-edit', - data: data - }); - } - } - - labelStyle(value) { - if (value === true) return 'success'; - else return 'warning'; - } - - labelModifier(value) { - if (value === true) return 'Running'; - else return 'Not running'; - } - render() { return (

    Simulators

    - + - + this.showDeleteModal(node)} onEdit={(node) => this.showEditModal(node)} /> - {/*
    - this.labelStyle(value)} labelModifier={(value) => this.labelModifier(value)} /> - - this.setState({ editModal: true, modalSimulator: this.state.simulators[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index] })} /> -
    - - - - this.closeNewModal(data)} /> - - this.closeEditModal(data)} simulator={this.state.modalSimulator} /> + this.closeNewModal(data)} /> + this.closeEditModal(data)} /> - Delete Simulator + Delete Node - Are you sure you want to delete the simulator '{this.state.modalSimulator.name}'? + Are you sure you want to delete the node '{this.state.modalData.name}'? - */} +
    ); } From c5e4642797d30460bb9156b8242e329de31c118d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 7 Jul 2017 10:25:07 +0200 Subject: [PATCH 256/556] Add simulators to nodes --- src/components/dialog/new-simulator.js | 18 +----- src/components/node-tree.js | 18 ++++-- src/containers/simulators.js | 89 ++++++++++++++++++++------ 3 files changed, 85 insertions(+), 40 deletions(-) diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 395cf9e..8e22e3d 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -36,8 +36,7 @@ class NewSimulatorDialog extends Component { super(props); this.state = { - name: '', - endpoint: '' + name: '' }; } @@ -54,27 +53,21 @@ class NewSimulatorDialog extends Component { } resetState() { - this.setState({ name: '', endpoint: '' }); + this.setState({ name: '' }); } validateForm(target) { // check all controls - var endpoint = true; var name = true; if (this.state.name === '') { name = false; } - if (this.state.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; + this.valid = name; // return state to control if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; } render() { @@ -86,11 +79,6 @@ class NewSimulatorDialog extends Component { this.handleChange(e)} /> - - Endpoint - this.handleChange(e)} /> - - ); diff --git a/src/components/node-tree.js b/src/components/node-tree.js index ea79d6c..1cf8226 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -44,11 +44,15 @@ class NodeTree extends React.Component { var buttons = []; if (rowInfo.parentNode == null) { - buttons.push() + buttons.push(); + buttons.push(); + buttons.push(); + } else { + buttons.push(); + buttons.push(); } - buttons.push(); - buttons.push(); + console.log(rowInfo); return { buttons: buttons @@ -62,7 +66,13 @@ class NodeTree extends React.Component { var treeData = []; nextProps.data.forEach((node) => { - treeData.push({ title: node.name, subtitle: node.endpoint, id: node._id }); + var parent = { title: node.name, subtitle: node.endpoint, id: node._id, children: [], expanded: true }; + + node.simulators.forEach((simulator) => { + parent.children.push({ title: simulator.name }); + }); + + treeData.push(parent); }); this.setState({ treeData }); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index a6024c5..8fd4a53 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -24,11 +24,11 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; -//import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; import NewNodeDialog from '../components/dialog/new-node'; import EditNodeDialog from '../components/dialog/edit-node'; +import NewSimulatorDialog from '../components/dialog/new-simulator'; import NodeTree from '../components/node-tree'; class Simulators extends Component { @@ -40,10 +40,16 @@ class Simulators extends Component { return { nodes: NodeStore.getState(), - newModal: false, - deleteModal: false, - editModal: false, - modalData: {} + newNodeModal: false, + deleteNodeModal: false, + editNodeModal: false, + + addSimulatorModal: false, + editSimulatorModal: false, + deleteSimulatorModal: false, + + modalData: {}, + modalIndex: 0 }; } @@ -53,8 +59,8 @@ class Simulators extends Component { }); } - closeNewModal(data) { - this.setState({ newModal: false }); + closeNewNodeModal(data) { + this.setState({ newNodeModal: false }); if (data) { AppDispatcher.dispatch({ @@ -64,17 +70,17 @@ class Simulators extends Component { } } - showEditModal(data) { + showEditNodeModal(data) { // find node with id var node = this.state.nodes.find((element) => { return element._id === data.id; }); - this.setState({ editModal: true, modalData: node }); + this.setState({ editNodeModal: true, modalData: node }); } - closeEditModal(data) { - this.setState({ editModal: false }); + closeEditNodeModal(data) { + this.setState({ editNodeModal: false }); if (data) { AppDispatcher.dispatch({ @@ -84,16 +90,16 @@ class Simulators extends Component { } } - showDeleteModal(data) { + showDeleteNodeModal(data) { // find node with id var node = this.state.nodes.find((element) => { return element._id === data.id; }); - this.setState({ deleteModal: true, modalData: node }); + this.setState({ deleteNodeModal: true, modalData: node }); } - confirmDeleteModal() { + confirmDeleteNodeModal() { this.setState({ deleteModal: false }); AppDispatcher.dispatch({ @@ -102,30 +108,71 @@ class Simulators extends Component { }); } + showAddSimulatorModal(data) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ addSimulatorModal: true, modalData: node }); + } + + closeAddSimulatorModal(data) { + this.setState({ addSimulatorModal: false }); + + if (data) { + var node = this.state.modalData; + node.simulators.push(data); + + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + } + } + render() { return (

    Simulators

    - + - this.showDeleteModal(node)} onEdit={(node) => this.showEditModal(node)} /> + this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(index) => this.onSimulatorEdit(index)} onSimulatorDelete={(index) => this.onSimulatorDelete(index)} /> - this.closeNewModal(data)} /> - this.closeEditModal(data)} /> + this.closeNewNodeModal(data)} /> + this.closeEditNodeModal(data)} /> + this.closeAddSimulatorModal(data)} /> - + Delete Node Are you sure you want to delete the node '{this.state.modalData.name}'? +
    + This will delete all simulators assigned to this node.
    - - + + + +
    + + + + Delete Simulator + + + + {/*Are you sure you want to delete the simulator '{this.state.modalData.simulators[this.state.modalIndex].name}'?*/} + + + + +
    From 3e55659854d7af112245b755c472c960c441e0a2 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 8 Jul 2017 00:23:01 +0200 Subject: [PATCH 257/556] Add simulator editing and moving --- src/components/dialog/edit-simulator.js | 21 ++------ src/components/node-tree.js | 70 +++++++++++++++++-------- src/containers/simulators.js | 67 +++++++++++++++++++++-- 3 files changed, 116 insertions(+), 42 deletions(-) diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index 1fdcc09..ef8082a 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -37,9 +37,7 @@ class EditSimulatorDialog extends Component { super(props); this.state = { - name: '', - endpoint: '', - _id: '' + name: '' }; } @@ -57,30 +55,22 @@ class EditSimulatorDialog extends Component { resetState() { this.setState({ - name: this.props.simulator.name, - endpoint: this.props.simulator.endpoint, - _id: this.props.simulator._id + name: this.props.simulator.name }); } validateForm(target) { // check all controls - var endpoint = true; var name = true; if (this.state.name === '') { name = false; } - if (this.state.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; + this.valid = name; // return state to control if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; } render() { @@ -92,11 +82,6 @@ class EditSimulatorDialog extends Component { this.handleChange(e)} /> - - Endpoint - this.handleChange(e)} /> - - ); diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 1cf8226..1e60038 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -48,47 +48,75 @@ class NodeTree extends React.Component { buttons.push(); buttons.push(); } else { - buttons.push(); - buttons.push(); - } + // get child index + var index = rowInfo.path[1] - rowInfo.path[0] - 1; - console.log(rowInfo); + buttons.push(); + buttons.push(); + } return { buttons: buttons }; } + nodesToTreeData(nodes) { + var treeData = []; + + nodes.forEach((node) => { + var parent = { title: node.name, subtitle: node.endpoint, id: node._id, config: node.config, children: [], expanded: true }; + + node.simulators.forEach((simulator) => { + parent.children.push({ title: simulator.name }); + }); + + treeData.push(parent); + }); + + return treeData; + } + + treeDataToNodes(treeData) { + var nodes = []; + + treeData.forEach((data) => { + var node = { name: data.title, endpoint: data.subtitle, _id: data.id, config: data.config, simulators: [] }; + + data.children.forEach((child) => { + node.simulators.push({ name: child.title }); + }); + + nodes.push(node); + }); + + return nodes; + } + componentWillReceiveProps(nextProps) { // compare if data changed if (this.props.data == null || this.props.data !== nextProps.data) { // generate new state - var treeData = []; - - nextProps.data.forEach((node) => { - var parent = { title: node.name, subtitle: node.endpoint, id: node._id, children: [], expanded: true }; - - node.simulators.forEach((simulator) => { - parent.children.push({ title: simulator.name }); - }); - - treeData.push(parent); - }); - + var treeData = this.nodesToTreeData(nextProps.data); this.setState({ treeData }); } } + onDataChange(treeData) { + this.setState({ treeData }); + + this.props.onDataChange(this.treeDataToNodes(treeData)) + } + render() { return ( this.setState({ treeData }) } + treeData={this.state.treeData} + onChange={(treeData) => this.onDataChange(treeData)} style={{ height: 400 }} maxDepth={ 2 } - canDrag={ (node, path) => this.canNodeDrag(node, path) } - canDrop={ (node, prevPath) => this.canNodeDrop(node, prevPath) } - generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo) } + canDrag={(node, path) => this.canNodeDrag(node, path)} + canDrop={(node, prevPath) => this.canNodeDrop(node, prevPath)} + generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo)} /> ); } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 8fd4a53..fd6c450 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -29,6 +29,7 @@ import NodeStore from '../stores/node-store'; import NewNodeDialog from '../components/dialog/new-node'; import EditNodeDialog from '../components/dialog/edit-node'; import NewSimulatorDialog from '../components/dialog/new-simulator'; +import EditSimulatorDialog from '../components/dialog/edit-simulator'; import NodeTree from '../components/node-tree'; class Simulators extends Component { @@ -49,7 +50,8 @@ class Simulators extends Component { deleteSimulatorModal: false, modalData: {}, - modalIndex: 0 + modalIndex: 0, + modalName: '' }; } @@ -131,6 +133,61 @@ class Simulators extends Component { } } + showEditSimulatorModal(data, index) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ editSimulatorModal: true, modalData: node, modalIndex: index }); + } + + closeEditSimulatorModal(data) { + this.setState({ editSimulatorModal: false }); + + if (data) { + var node = this.state.modalData; + node.simulators[this.state.modalIndex] = data; + + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + } + } + + showDeleteSimulatorModal(data, index) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ deleteSimulatorModal: true, modalData: node, modalIndex: index, modalName: data.children[index].title }); + } + + confirmDeleteSimulatorModal() { + this.setState({ deleteSimulatorModal: false }); + + // remove simulator + var node = this.state.modalData; + node.simulators.splice(this.state.modalIndex); + + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + } + + onTreeDataChange(nodes) { + // update all at once + nodes.forEach((node) => { + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + }); + } + render() { return (
    @@ -138,12 +195,16 @@ class Simulators extends Component { - this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(index) => this.onSimulatorEdit(index)} onSimulatorDelete={(index) => this.onSimulatorDelete(index)} /> + this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> this.closeNewNodeModal(data)} /> this.closeEditNodeModal(data)} /> this.closeAddSimulatorModal(data)} /> + {this.state.editSimulatorModal && + this.closeEditSimulatorModal(data)} /> + } + Delete Node @@ -167,7 +228,7 @@ class Simulators extends Component { - {/*Are you sure you want to delete the simulator '{this.state.modalData.simulators[this.state.modalIndex].name}'?*/} + Are you sure you want to delete the simulator '{this.state.modalName}'? From 46bcb2fc21355929f9cc1907a10c4136816b4cfb Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 8 Jul 2017 12:37:13 +0200 Subject: [PATCH 258/556] Start simulator ID fetching --- src/containers/app.js | 7 ++--- src/data-managers/nodes-data-manager.js | 34 ++++++++++++++++++++++++- src/stores/node-store.js | 26 ++++++++++++++++++- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index 2af248e..14d02cc 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -28,6 +28,7 @@ import NotificationSystem from 'react-notification-system'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; import SimulatorStore from '../stores/simulator-store'; +import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -40,7 +41,7 @@ import '../styles/app.css'; class App extends Component { static getStores() { - return [ SimulationStore, SimulatorStore, UserStore ]; + return [ SimulationStore, NodeStore, UserStore ]; } static calculateState(prevState) { @@ -164,12 +165,12 @@ class App extends Component { }); if (simulator != null) { - AppDispatcher.dispatch({ + /*AppDispatcher.dispatch({ type: 'simulatorData/open', identifier: simulator._id, endpoint: simulator.endpoint, signals: data.signals - }); + });*/ } } diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index a253ac9..ab04da9 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -20,5 +20,37 @@ ******************************************************************************/ import RestDataManager from './rest-data-manager'; +import RestAPI from '../api/rest-api'; -export default new RestDataManager('node', '/nodes'); +class NodesDataManager extends RestDataManager { + constructor() { + super('node', '/nodes'); + } + + getSimulators(node) { + RestAPI.post('http://' + node.endpoint + '/api/v1', { + action: 'nodes', + id: node._id + }).then(response => { + // assign IDs to simulators + response.response.forEach(element => { + if (element.type === "websocket") { + // add the (villas-node) node ID to the simulator + node.simulators = node.simulators.map(simulator => { + if (simulator.name === element.name) { + simulator.id = element.id; + } + + return simulator; + }); + } + }); + + console.log(node); + }).catch(error => { + console.warn(error); + }); + } +} + +export default new NodesDataManager(); diff --git a/src/stores/node-store.js b/src/stores/node-store.js index 8945885..d7d6112 100644 --- a/src/stores/node-store.js +++ b/src/stores/node-store.js @@ -22,4 +22,28 @@ import ArrayStore from './array-store'; import NodesDataManager from '../data-managers/nodes-data-manager'; -export default new ArrayStore('nodes', NodesDataManager); +class NodeStore extends ArrayStore { + constructor() { + super('nodes', NodesDataManager); + } + + reduce(state, action) { + switch(action.type) { + case 'nodes/loaded': + if (Array.isArray(action.data)) { + action.data.forEach(node => { + NodesDataManager.getSimulators(node); + }); + } else { + NodesDataManager.getSimulators(action.data); + } + + return super.reduce(state, action); + + default: + return super.reduce(state, action); + } + } +} + +export default new NodeStore(); From 5252d07e9ee587c5ca99741576aec9b068655ebb Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 8 Jul 2017 14:57:52 +0200 Subject: [PATCH 259/556] use new signal node-type to simplify demo setup --- docker-compose.yml | 17 +--------- etc/node/websocket-demo.conf | 60 ++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 etc/node/websocket-demo.conf diff --git a/docker-compose.yml b/docker-compose.yml index 3cf77bf..58f4b4e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,22 +61,7 @@ services: node: image: villas/node:latest privileged: true - command: node /etc/villas/node/websocket.conf - expose: - - "12000/udp" - ports: - - "8081:80/tcp" - volumes: - - "./etc/node/:/etc/villas/node/" - networks: - villas: - - # Generate random data and send it via UDP to the 'node' service - signal: - image: villas/node:latest - privileged: true - entrypoint: bash - command: -c 'villas signal mixed -v4 | villas pipe -x /etc/villas/node/websocket.conf udp_1' + command: node /etc/villas/node/websocket-demo.conf volumes: - "./etc/node/:/etc/villas/node/" networks: diff --git a/etc/node/websocket-demo.conf b/etc/node/websocket-demo.conf new file mode 100644 index 0000000..11dbe01 --- /dev/null +++ b/etc/node/websocket-demo.conf @@ -0,0 +1,60 @@ +/** Example configuration file for VILLASnode. + * + * The syntax of this file is similar to JSON. + * A detailed description of the format can be found here: + * http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files + * + * @author Steffen Vogel + * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program 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 + * any later version. + * + * This program 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 this program. If not, see . + *********************************************************************************/ + +nodes = { + sig_1 = { + type = "signal", + + signal = "mixed", + values = 4, + rate = 25 + }, + ws_1 = { + type = "websocket", + description = "Demo Channel", + vectorize = 10, + source = { + simulator = "OP5600", + location = "ACS lab" + }, + series = ( + { label = "Random walk", unit = "V" }, + { label = "Sine", unit = "A" }, + { label = "Rect", unit = "Var"}, + { label = "Ramp", unit = "°C" } + ) + } +}; + +############ List of paths ############ + +paths = ( + { + in = "sig_1", + out = "ws_1", + reverse = false + } +); From 89f70f027a86e0b939740893a92c859eed958f2e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 9 Jul 2017 18:14:53 +0200 Subject: [PATCH 260/556] Change simulator selection in simulator model Disable simulator detection for testing --- .../dialog/edit-simulation-model.js | 22 +++++++++----- src/components/dialog/new-simulation-model.js | 21 ++++++++----- src/containers/app.js | 30 ++++++++++--------- src/containers/simulation.js | 24 ++++++--------- src/containers/simulators.js | 5 +++- src/data-managers/nodes-data-manager.js | 15 +++++++--- 6 files changed, 69 insertions(+), 48 deletions(-) diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 3de81dd..de5855d 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -31,7 +31,7 @@ class EditSimulationModelDialog extends Component { show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, data: PropTypes.object.isRequired, - simulators: PropTypes.array.isRequired + nodes: PropTypes.array.isRequired }; valid: false; @@ -41,8 +41,9 @@ class EditSimulationModelDialog extends Component { this.state = { name: '', - simulator: '', - length: 1 + simulator: { node: '', simulator: '' }, + length: 1, + mapping: [{ name: 'Signal', type: 'Type' }] } } @@ -68,7 +69,12 @@ class EditSimulationModelDialog extends Component { } } - this.setState({ [e.target.id]: e.target.value }); + if (e.target.id === 'simulator') { + var value = e.target.value.split("/"); + this.setState({ simulator: { node: value[0], simulator: value[1] } }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } handleMappingChange(event, row, column) { @@ -124,9 +130,11 @@ class EditSimulationModelDialog extends Component { Simulator - this.handleChange(e)}> - {this.props.simulators.map(simulator => ( - + this.handleChange(e)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) ))} diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 5789e51..0acc38d 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -30,7 +30,7 @@ class NewSimulationModelDialog extends Component { static propTypes = { show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, - simulators: PropTypes.array.isRequired + nodes: PropTypes.array.isRequired }; valid: false; @@ -40,7 +40,7 @@ class NewSimulationModelDialog extends Component { this.state = { name: '', - simulator: '', + simulator: { node: '', simulator: '' }, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }; @@ -68,7 +68,12 @@ class NewSimulationModelDialog extends Component { } } - this.setState({ [e.target.id]: e.target.value }); + if (e.target.id === 'simulator') { + var value = e.target.value.split("/"); + this.setState({ simulator: { node: value[0], simulator: value[1] } }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } handleMappingChange(event, row, column) { @@ -86,7 +91,7 @@ class NewSimulationModelDialog extends Component { resetState() { this.setState({ name: '', - simulator: this.props.simulators[0] != null ? this.props.simulators[0]._id : '', + simulator: { node: this.props.nodes[0] ? this.props.nodes[0].name : '', simulator: this.props.nodes[0].simulators[0] ? this.props.nodes[0].simulators[0].name : '' }, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); @@ -130,9 +135,11 @@ class NewSimulationModelDialog extends Component { Simulator - this.handleChange(e)}> - {this.props.simulators.map(simulator => ( - + this.handleChange(e)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) ))} diff --git a/src/containers/app.js b/src/containers/app.js index 14d02cc..adc5f05 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -27,7 +27,7 @@ import NotificationSystem from 'react-notification-system'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; +//import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -41,12 +41,12 @@ import '../styles/app.css'; class App extends Component { static getStores() { - return [ SimulationStore, NodeStore, UserStore ]; + return [ NodeStore, UserStore, SimulationStore ]; } static calculateState(prevState) { // get list of running simulators - var simulators = SimulatorStore.getState().filter(simulator => { + /*var simulators = SimulatorStore.getState().filter(simulator => { return simulator.running === true; }); @@ -75,16 +75,16 @@ class App extends Component { if (equal) { simulators = prevState.runningSimulators; } - } + }*/ let currentUser = UserStore.getState().currentUser; return { - simulations: SimulationStore.getState(), + nodes: NodeStore.getState(), currentRole: currentUser? currentUser.role : '', - token: UserStore.getState().token, + token: UserStore.getState().token/*, - runningSimulators: simulators + runningSimulators: simulators*/ }; } @@ -104,7 +104,7 @@ class App extends Component { // load all simulators and simulations to fetch simulation data AppDispatcher.dispatch({ - type: 'simulators/start-load' + type: 'nodes/start-load' }); AppDispatcher.dispatch({ @@ -136,7 +136,9 @@ class App extends Component { } requiredSimulatorsBySimulations() { - var simulators = []; + return []; + + /*var simulators = []; this.state.simulations.forEach((simulation) => { simulation.models.forEach((simulationModel) => { @@ -155,24 +157,24 @@ class App extends Component { }); }); - return simulators; + return simulators;*/ } - connectSimulator(state, data) { + /*connectSimulator(state, data) { // get simulator object const simulator = state.runningSimulators.find(element => { return element._id === data.simulator; }); if (simulator != null) { - /*AppDispatcher.dispatch({ + AppDispatcher.dispatch({ type: 'simulatorData/open', identifier: simulator._id, endpoint: simulator.endpoint, signals: data.signals - });*/ + }); } - } + }*/ render() { // get children diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 59e37c5..52f5649 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; +import NodeStore from '../stores/node-store'; import AppDispatcher from '../app-dispatcher'; import Table from '../components/table'; @@ -34,13 +34,13 @@ import EditSimulationModelDialog from '../components/dialog/edit-simulation-mode class Simulation extends Component { static getStores() { - return [ SimulationStore, SimulatorStore ]; + return [ SimulationStore, NodeStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), - simulators: SimulatorStore.getState(), + nodes: NodeStore.getState(), newModal: false, deleteModal: false, @@ -58,7 +58,7 @@ class Simulation extends Component { }); AppDispatcher.dispatch({ - type: 'simulators/start-load' + type: 'nodes/start-load' }); } @@ -119,14 +119,8 @@ class Simulation extends Component { } } - getSimulatorName(id) { - for (var i = 0; i < this.state.simulators.length; i++) { - if (this.state.simulators[i]._id === id) { - return this.state.simulators[i].name; - } - } - - return id; + getSimulatorName(simulator) { + return simulator.node + '/' + simulator.simulator; } render() { @@ -136,16 +130,16 @@ class Simulation extends Component { - this.getSimulatorName(id)} /> + this.getSimulatorName(simulator)} /> this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} />
    - this.closeNewModal(data)} simulators={this.state.simulators} /> + this.closeNewModal(data)} nodes={this.state.nodes} /> - this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> + this.closeEditModal(data)} data={this.state.modalData} nodes={this.state.nodes} /> diff --git a/src/containers/simulators.js b/src/containers/simulators.js index fd6c450..acaf5ad 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -193,7 +193,10 @@ class Simulators extends Component {

    Simulators

    - + + +
    + Hint: Node names must be unique. Simulator names must be unique on a node. this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index ab04da9..af68fc1 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -21,6 +21,7 @@ import RestDataManager from './rest-data-manager'; import RestAPI from '../api/rest-api'; +import AppDispatcher from '../app-dispatcher'; class NodesDataManager extends RestDataManager { constructor() { @@ -28,7 +29,7 @@ class NodesDataManager extends RestDataManager { } getSimulators(node) { - RestAPI.post('http://' + node.endpoint + '/api/v1', { + /*RestAPI.post('http://' + node.endpoint + '/api/v1', { action: 'nodes', id: node._id }).then(response => { @@ -46,10 +47,16 @@ class NodesDataManager extends RestDataManager { } }); - console.log(node); + AppDispatcher.dispatch({ + type: 'nodes/edited', + data: node + }); }).catch(error => { - console.warn(error); - }); + AppDispatcher.dispatch({ + type: 'nodes/edit-error', + error: error + }); + });*/ } } From a3d35ab5fc1a6ae40f77fae060ea95d44ac9d1b8 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 11 Jul 2017 15:17:28 +0200 Subject: [PATCH 261/556] Change simulator data to node based --- src/containers/app.js | 67 +++++++++---------- src/data-managers/nodes-data-manager.js | 10 ++- .../simulator-data-data-manager.js | 33 ++++----- src/stores/node-store.js | 1 + src/stores/simulator-data-store.js | 36 ++++++---- 5 files changed, 79 insertions(+), 68 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index adc5f05..70bbe67 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -27,7 +27,6 @@ import NotificationSystem from 'react-notification-system'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; -//import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -81,6 +80,7 @@ class App extends Component { return { nodes: NodeStore.getState(), + simulations: SimulationStore.getState(), currentRole: currentUser? currentUser.role : '', token: UserStore.getState().token/*, @@ -127,53 +127,46 @@ class App extends Component { return; } - // open connection to each required simulator - const requiredSimulators = this.requiredSimulatorsBySimulations(); + // open connection to each node + /*const requiredNodes = this.requiredNodesBySimulations(); - requiredSimulators.forEach(simulator => { - this.connectSimulator(nextState, simulator); - }); + requiredNodes.forEach(node => { + AppDispatcher.dispatch({ + type: 'simulatorData/open', + identifier: simulator._id, + endpoint: node.endpoint, + signals: data.signals + }); + });*/ } - requiredSimulatorsBySimulations() { - return []; + /*requiredNodesBySimulations() { + var nodes = {}; - /*var simulators = []; - - this.state.simulations.forEach((simulation) => { - simulation.models.forEach((simulationModel) => { - // add simulator to list if not already part of - const index = simulators.findIndex((element) => { - return element.simulator === simulationModel.simulator; + this.state.simulations.forEach(simulation => { + simulation.models.forEach(model => { + // get ID for node + var node = this.state.nodes.find(element => { + return element.name === model.simulator.node; }); - if (index === -1) { - simulators.push({ simulator: simulationModel.simulator, signals: simulationModel.length }); - } else { - if (simulators[index].length < simulationModel.length) { - simulators[index].length = simulationModel.length; + // add empty node if not existing + if (node !== undefined) { + if (nodes[node._id] == null) { + nodes[node._id] = { simulators: [] } } + + // get simulator id + var simulator = node.simulators.find(simulator => { + return simulator.name === model.simulator.simulator; + }); + + nodes[node._id].simulators.push({ id: simulator.id, signals: model.length }); } }); }); - return simulators;*/ - } - - /*connectSimulator(state, data) { - // get simulator object - const simulator = state.runningSimulators.find(element => { - return element._id === data.simulator; - }); - - if (simulator != null) { - AppDispatcher.dispatch({ - type: 'simulatorData/open', - identifier: simulator._id, - endpoint: simulator.endpoint, - signals: data.signals - }); - } + return nodes; }*/ render() { diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index af68fc1..12e4014 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -29,7 +29,7 @@ class NodesDataManager extends RestDataManager { } getSimulators(node) { - /*RestAPI.post('http://' + node.endpoint + '/api/v1', { + RestAPI.post('http://' + node.endpoint + '/api/v1', { action: 'nodes', id: node._id }).then(response => { @@ -51,12 +51,18 @@ class NodesDataManager extends RestDataManager { type: 'nodes/edited', data: node }); + + AppDispatcher.dispatch({ + type: 'simulatorData/open', + node: node, + endpoint: node.endpoint, + }); }).catch(error => { AppDispatcher.dispatch({ type: 'nodes/edit-error', error: error }); - });*/ + }); } } diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 22f443b..666ea5e 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -27,21 +27,21 @@ class SimulatorDataDataManager { this._sockets = {}; } - open(endpoint, identifier, signals) { + open(endpoint, node) { // pass signals to onOpen callback - if (this._sockets[identifier] != null) { - if (this._sockets[identifier].url !== WebsocketAPI.getURL(endpoint)) { + if (this._sockets[node._id] != null) { + if (this._sockets[node._id].url !== WebsocketAPI.getURL(endpoint)) { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } else { // set flag if a socket to this simulator was already create before - if (this._sockets[identifier] === null) { - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + if (this._sockets[node._id] === null) { + this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } else { - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } } @@ -56,33 +56,32 @@ class SimulatorDataDataManager { } } - onOpen(event, identifier, signals, firstOpen) { + onOpen(event, node, firstOpen) { AppDispatcher.dispatch({ type: 'simulatorData/opened', - identifier: identifier, - signals: signals, + node: node, firstOpen: firstOpen }); } - onClose(event, identifier) { + onClose(event, node) { AppDispatcher.dispatch({ type: 'simulatorData/closed', - identifier: identifier, + node: node, notification: (event.code !== 4000) }); // remove from list, keep null reference for flag detection - delete this._sockets[identifier]; + delete this._sockets[node._id]; } - onMessage(event, identifier) { + onMessage(event, node) { var message = this.bufferToMessage(event.data); AppDispatcher.dispatch({ type: 'simulatorData/data-changed', data: message, - identifier: identifier + node: node }); } @@ -95,6 +94,7 @@ class SimulatorDataDataManager { var bits = data.getUint8(0); var length = data.getUint16(0x02, 1); + var id = data.getUint8(1); var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); @@ -104,7 +104,8 @@ class SimulatorDataDataManager { length: length, sequence: data.getUint32(0x04, 1), timestamp: data.getUint32(0x08, 1) * 1e3 + data.getUint32(0x0C, 1) * 1e-6, - values: values + values: values, + id: id }; } } diff --git a/src/stores/node-store.js b/src/stores/node-store.js index d7d6112..aad1df6 100644 --- a/src/stores/node-store.js +++ b/src/stores/node-store.js @@ -30,6 +30,7 @@ class NodeStore extends ArrayStore { reduce(state, action) { switch(action.type) { case 'nodes/loaded': + // get simulator IDs if (Array.isArray(action.data)) { action.data.forEach(node => { NodesDataManager.getSimulators(node); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index d52ac1d..457768c 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -40,48 +40,58 @@ class SimulationDataStore extends ReduceStore { switch (action.type) { case 'simulatorData/open': - SimulatorDataDataManager.open(action.endpoint, action.identifier, action.signals); + SimulatorDataDataManager.open(action.endpoint, action.node); return state; case 'simulatorData/opened': // create entry for simulator - state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; + /*state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; for (i = 0; i < action.signals; i++) { state[action.identifier].values.push([]); - } + }*/ + + state[action.node._id] = {}; + + action.node.simulators.forEach(simulator => { + state[action.node._id][simulator.id] = { sequence: -1, values: [] }; + }); return state; case 'simulatorData/data-changed': // only add data, if newer than current - if (state[action.identifier].sequence < action.data.sequence) { + if (state[action.node._id][action.data.id].sequence < action.data.sequence) { // add data to simulator - for (i = 0; i < state[action.identifier].signals; i++) { - state[action.identifier].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); + for (i = 0; i < action.data.length; i++) { + while (state[action.node._id][action.data.id].values.length < i + 1) { + state[action.node._id][action.data.id].values.push([]); + } + + state[action.node._id][action.data.id].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); // erase old values - if (state[action.identifier].values[i].length > MAX_VALUES) { - const pos = state[action.identifier].values[i].length - MAX_VALUES; - state[action.identifier].values[i].splice(0, pos); + if (state[action.node._id][action.data.id].values[i].length > MAX_VALUES) { + const pos = state[action.node._id][action.data.id].values[i].length - MAX_VALUES; + state[action.node._id][action.data.id].values[i].splice(0, pos); } } // update metadata - state[action.identifier].timestamp = action.data.timestamp; - state[action.identifier].sequence = action.data.sequence; + state[action.node._id][action.data.id].timestamp = action.data.timestamp; + state[action.node._id][action.data.id].sequence = action.data.sequence; // explicit call to prevent array copy this.__emitChange(); } else { - console.log('same sequence ' + state[action.identifier].sequence + ' ' + action.data.sequence); + console.log('same sequence ' + state[action.node._id][action.data.id].sequence + ' ' + action.data.sequence); } return state; case 'simulatorData/closed': // close and delete socket - if (state[action.identifier] != null) { + if (state[action.node] != null) { // delete data //delete state[action.identifier]; //state[action.identifier] = null; From b7156f5325ba0d0ec1b8fe7619c79ee29affb172 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 11 Jul 2017 19:46:45 +0200 Subject: [PATCH 262/556] Change widget value to new simulator data --- .../dialog/edit-widget-signal-control.js | 8 ++++---- .../dialog/edit-widget-simulator-control.js | 13 ++++++------- src/components/dialog/edit-widget.js | 15 ++++++++++++--- src/components/dialog/new-simulation-model.js | 9 +++++---- src/components/widget-value.js | 9 ++++++--- src/containers/simulation.js | 10 +++++++++- src/containers/visualization.js | 19 ++++++++++--------- src/stores/simulator-data-store.js | 6 ------ 8 files changed, 52 insertions(+), 37 deletions(-) diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index 623b416..98d9b06 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -28,7 +28,7 @@ class EditWidgetSignalControl extends Component { this.state = { widget: { - simulator: '' + simulator: {} } }; } @@ -43,10 +43,10 @@ class EditWidgetSignalControl extends Component { if (this.props.simulation) { // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulator === this.state.widget.simulator ); + const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); // If simulation model update the signals to render - signalsToRender = simulationModel? simulationModel.mapping : []; + signalsToRender = simulationModel ? simulationModel.mapping : []; } return ( @@ -68,4 +68,4 @@ class EditWidgetSignalControl extends Component { } } -export default EditWidgetSignalControl; \ No newline at end of file +export default EditWidgetSignalControl; diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js index 48186ef..ec4cec5 100644 --- a/src/components/dialog/edit-widget-simulator-control.js +++ b/src/components/dialog/edit-widget-simulator-control.js @@ -28,7 +28,7 @@ class EditWidgetSimulatorControl extends Component { this.state = { widget: { - simulator: '' + simulator: {} } }; } @@ -39,17 +39,16 @@ class EditWidgetSimulatorControl extends Component { } render() { - return ( - Simulator - this.props.handleChange(e)}> + Simulation Model + this.props.handleChange(e)}> { this.props.simulation.models.length === 0? ( - + ) : ( this.props.simulation.models.map((model, index) => ( - + ))) } @@ -58,4 +57,4 @@ class EditWidgetSimulatorControl extends Component { } } -export default EditWidgetSimulatorControl; \ No newline at end of file +export default EditWidgetSimulatorControl; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 8c2277f..e3d56ed 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -41,7 +41,7 @@ class EditWidgetDialog extends Component { this.state = { temporal: { name: '', - simulator: '', + simulator: {}, signal: 0 } }; @@ -58,7 +58,16 @@ class EditWidgetDialog extends Component { handleChange(e) { 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; return changesObject }, {}); + let changes = e.reduce( (changesObject, event) => { + if (event.target.id === 'simulator') { + changesObject[event.target.id] = JSON.parse(event.target.value); + } else { + changesObject[event.target.id] = event.target.value; + } + + return changesObject; + }, {}); + this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } else { let changeObject = {}; @@ -87,7 +96,7 @@ class EditWidgetDialog extends Component { } render() { - + let controls = null; if (this.props.widget) { controls = createControls( diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 0acc38d..8ae219c 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -48,6 +48,7 @@ class NewSimulationModelDialog extends Component { onClose(canceled) { if (canceled === false) { + console.log(this.state); this.props.onClose(this.state); } else { this.props.onClose(); @@ -69,8 +70,8 @@ class NewSimulationModelDialog extends Component { } if (e.target.id === 'simulator') { - var value = e.target.value.split("/"); - this.setState({ simulator: { node: value[0], simulator: value[1] } }); + console.log(e.target.value); + this.setState({ simulator: JSON.parse(e.target.value) }); } else { this.setState({ [e.target.id]: e.target.value }); } @@ -91,7 +92,7 @@ class NewSimulationModelDialog extends Component { resetState() { this.setState({ name: '', - simulator: { node: this.props.nodes[0] ? this.props.nodes[0].name : '', simulator: this.props.nodes[0].simulators[0] ? this.props.nodes[0].simulators[0].name : '' }, + simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); @@ -138,7 +139,7 @@ class NewSimulationModelDialog extends Component { this.handleChange(e)}> {this.props.nodes.map(node => ( node.simulators.map((simulator, index) => ( - + )) ))} diff --git a/src/components/widget-value.js b/src/components/widget-value.js index eeceeed..f3451aa 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -32,15 +32,18 @@ class WidgetValue extends Component { componentWillReceiveProps(nextProps) { // update value - const simulator = nextProps.widget.simulator; + const simulator = nextProps.widget.simulator.simulator; + const node = nextProps.widget.simulator.node; - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { + //console.log(nextProps.widget.simulator); + + if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].values == null) { this.setState({ value: '' }); return; } // check if value has changed - const signal = nextProps.data[simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; if (this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 52f5649..0aff4bf 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -120,7 +120,15 @@ class Simulation extends Component { } getSimulatorName(simulator) { - return simulator.node + '/' + simulator.simulator; + var name = "undefined"; + + this.state.nodes.forEach(node => { + if (node._id === simulator.node) { + name = node.name + '/' + node.simulators[simulator.simulator].name; + } + }); + + return name; } render() { diff --git a/src/containers/visualization.js b/src/containers/visualization.js index a526df3..66c5403 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -65,13 +65,13 @@ class Visualization extends Component { editModal: prevState.editModal || false, modalData: prevState.modalData || null, modalIndex: prevState.modalIndex || null, - + maxWidgetHeight: prevState.maxWidgetHeight || 0, dropZoneHeight: prevState.dropZoneHeight || 0, last_widget_key: prevState.last_widget_key || 0 }; } - + componentWillMount() { AppDispatcher.dispatch({ type: 'visualizations/start-load' @@ -154,6 +154,7 @@ class Visualization extends Component { NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); } else { defaultSimulator = this.state.simulation.models[0].simulator; + console.log(defaultSimulator); } // create new widget @@ -167,7 +168,7 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets }); - + this.increaseHeightWithWidget(widget); this.setState({ visualization: visualization }); } @@ -185,7 +186,7 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { 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); @@ -201,12 +202,12 @@ class Visualization extends Component { 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, + this.setState({ + maxWidgetHeight: maxHeight, dropZoneHeight: maxHeight + 40 }); } @@ -219,8 +220,8 @@ class Visualization extends Component { let thisWidgetHeight = widget.y + widget.height; if (thisWidgetHeight > this.state.maxWidgetHeight) { increased = true; - this.setState({ - maxWidgetHeight: thisWidgetHeight, + this.setState({ + maxWidgetHeight: thisWidgetHeight, dropZoneHeight: thisWidgetHeight + 40 }); } diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 457768c..a6bf05c 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -45,12 +45,6 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/opened': // create entry for simulator - /*state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; - - for (i = 0; i < action.signals; i++) { - state[action.identifier].values.push([]); - }*/ - state[action.node._id] = {}; action.node.simulators.forEach(simulator => { From f66d75aede30715203d44214c6fa7fcf0bc49728 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 11 Jul 2017 21:09:19 +0200 Subject: [PATCH 263/556] Change widget table data --- src/components/dialog/edit-widget.js | 7 ++++++- src/components/widget-table.js | 12 ++++++------ src/components/widget-value.js | 2 +- src/containers/visualization.js | 3 +-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index e3d56ed..a795fc2 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -71,7 +71,12 @@ class EditWidgetDialog extends Component { this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } else { let changeObject = {}; - changeObject[e.target.id] = e.target.value; + if (e.target.id === 'simulator') { + changeObject[e.target.id] = JSON.parse(e.target.value); + } else { + changeObject[e.target.id] = e.target.value; + } + this.setState({ temporal: Object.assign({}, this.state.temporal, changeObject ) }); } } diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 9c48a00..44d3966 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -38,33 +38,33 @@ class WidgetTable extends Component { // check data const simulator = nextProps.widget.simulator; - if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator.node][simulator.simulator] == null || nextProps.data[simulator.node][simulator.simulator].length === 0 || nextProps.data[simulator.node][simulator.simulator].values.length === 0 || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { // clear values this.setState({ rows: [], sequence: null }); return; } // check if new data, otherwise skip - if (this.state.sequence >= nextProps.data[simulator].sequence) { + /*if (this.state.sequence >= nextProps.data[simulator.node][simulator.simulator].sequence) { return; - } + }*/ // get simulation model const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator === simulator); + return (model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); }); // get rows var rows = []; - nextProps.data[simulator].values.forEach((signal, index) => { + nextProps.data[simulator.node][simulator.simulator].values.forEach((signal, index) => { rows.push({ name: simulationModel.mapping[index].name, value: signal[signal.length - 1].y.toFixed(3) }) }); - this.setState({ rows: rows, sequence: nextProps.data[simulator].sequence }); + this.setState({ rows: rows, sequence: nextProps.data[simulator.node][simulator.simulator].sequence }); } render() { diff --git a/src/components/widget-value.js b/src/components/widget-value.js index f3451aa..fdbb04b 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -44,7 +44,7 @@ class WidgetValue extends Component { // check if value has changed const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; - if (this.state.value !== signal[signal.length - 1].y) { + if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 66c5403..425f394 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -154,7 +154,6 @@ class Visualization extends Component { NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); } else { defaultSimulator = this.state.simulation.models[0].simulator; - console.log(defaultSimulator); } // create new widget @@ -236,7 +235,7 @@ class Visualization extends Component { if (data) { // save changes temporarily var widgets_update = {}; - widgets_update[this.state.modalIndex] = data; + widgets_update[this.state.modalIndex] = data; var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); From 9f3145aedf535eaa232098ee74d66f7874749000 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 11:22:52 +0200 Subject: [PATCH 264/556] Update plot widget to new simulator connection --- src/components/dialog/edit-widget-signals-control.js | 8 ++++---- src/components/widget-plot.js | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index 76b832b..c52b928 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -28,7 +28,7 @@ class EditWidgetSignalsControl extends Component { this.state = { widget: { - simulator: '' + simulator: {} } }; } @@ -58,12 +58,12 @@ class EditWidgetSignalsControl extends Component { if (this.props.simulation) { // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulator === this.state.widget.simulator ); + const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); // If simulation model update the signals to render signalsToRender = simulationModel? simulationModel.mapping : []; } - + return ( Signals @@ -81,4 +81,4 @@ class EditWidgetSignalsControl extends Component { } } -export default EditWidgetSignalsControl; \ No newline at end of file +export default EditWidgetSignalsControl; diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index ff0b1b1..c02aa97 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -27,7 +27,6 @@ import PlotLegend from './widget-plot/plot-legend'; class WidgetPlot extends Component { render() { - const simulator = this.props.widget.simulator; const simulation = this.props.simulation; let legendSignals = []; @@ -36,10 +35,10 @@ class WidgetPlot extends Component { // Proceed if a simulation with models and a simulator are available if (simulator && simulation && simulation.models.length > 0) { - const model = simulation.models.find( (model) => model.simulator === simulator ); + const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); const chosenSignals = this.props.widget.signals; - simulatorData = this.props.data[simulator]; + simulatorData = this.props.data[simulator.node][simulator.simulator]; // Query the signals that will be displayed in the legend legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { @@ -53,7 +52,7 @@ class WidgetPlot extends Component { return (

    {this.props.widget.name}

    - +
    From 98eda9ced9cd2e7c2a24b65d7ee0569d390c7782 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 12:20:44 +0200 Subject: [PATCH 265/556] Update table plot to new simulator connection --- src/components/widget-plot-table.js | 51 ++++++++++++++++------------- src/components/widget-plot/plot.js | 22 ++++++------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 0507b3f..7862a05 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -45,7 +45,7 @@ class WidgetPlotTable extends Component { // Identify if there was a change in the preselected signals if (nextProps.simulation && (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.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); @@ -54,20 +54,19 @@ class WidgetPlotTable extends Component { this.updatePreselectedSignalsState(nextProps); return; } - } // 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(nextProps) { const simulator = nextProps.widget.simulator; // get simulation model const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator === simulator); + return (model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); }); let preselectedSignals = []; @@ -89,13 +88,13 @@ class WidgetPlotTable extends Component { return accum; }, []); } - + this.setState({ preselectedSignals: preselectedSignals }); } updateSignalSelection(signal_index, checked) { // Update the selected signals and propagate to parent component - var new_widget = Object.assign({}, this.props.widget, { + var new_widget = Object.assign({}, this.props.widget, { signals: checked? this.state.signals.concat(signal_index) : this.state.signals.filter( (idx) => idx !== signal_index ) }); this.props.onWidgetChange(new_widget); @@ -106,31 +105,37 @@ class WidgetPlotTable extends Component { // Data passed to plot let simulator = this.props.widget.simulator; - let simulatorData = this.props.data[simulator]; + let simulatorData = []; + + if (this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null) { + simulatorData = this.props.data[simulator.node][simulator.simulator]; + } if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { // Create checkboxes using the signal indices from simulation model checkBoxes = this.state.preselectedSignals.map( (signal) => { - var checked = this.state.signals.indexOf(signal.index) > -1; - var chkBxClasses = classNames({ - 'btn': true, - 'btn-default': true, - 'active': checked - }); - return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } - }); + var checked = this.state.signals.indexOf(signal.index) > -1; + var chkBxClasses = classNames({ + 'btn': true, + 'btn-default': true, + 'active': checked + }); + return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } + }); } // Prepare an array with the signals to show in the legend var legendSignals = this.state.preselectedSignals.reduce( (accum, signal, i) => { - if (this.state.signals.includes(signal.index)) { - accum.push({ - index: signal.index, - name: signal.name - }) - } - return accum; - }, []); + if (this.state.signals.includes(signal.index)) { + accum.push({ + index: signal.index, + name: signal.name + }); + } + return accum; + }, []); + + return (
    diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 6bae9d0..7b0c3aa 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -14,7 +14,7 @@ import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; class Plot extends Component { constructor(props) { super(props); - + this.chartWrapper = null; // Initialize plot size and data @@ -24,7 +24,7 @@ class Plot extends Component { ); } - // Get an object with 'invisible' init data for the last minute. + // Get an object with 'invisible' init data for the last minute. // Include start/end timestamps if required. getPlotInitData(withRangeTimestamps = false) { @@ -32,8 +32,8 @@ class Plot extends Component { const initFirstTime = initSecondTime - 1000 * 60; // Decrease 1 min const values = [{ values: [{x: initFirstTime, y: 0}], strokeWidth: 0 }]; - let output = withRangeTimestamps? - { sequence: 0, values: values, firstTimestamp: initFirstTime, latestTimestamp: initSecondTime, } : + let output = withRangeTimestamps? + { sequence: 0, values: values, firstTimestamp: initFirstTime, latestTimestamp: initSecondTime, } : { sequence: 0, values: values }; return output; @@ -58,19 +58,19 @@ class Plot extends Component { // Identify simulation reset if (nextData == null || nextData.length === 0 || nextData.values[0].length === 0) { this.clearPlot(); return; } - + // check if new data, otherwise skip if (this.state.sequence >= nextData.sequence) { return; } - + this.updatePlotData(nextProps); } signalsWereJustCleared(nextProps) { - return this.props.signals && - nextProps.signals && - this.props.signals.length > 0 && + return this.props.signals && + nextProps.signals && + this.props.signals.length > 0 && nextProps.signals.length === 0; } @@ -102,7 +102,7 @@ class Plot extends Component { nextProps.signals.forEach((signal_index, i, arr) => ( // Include signal index, useful to relate them to the signal selection values.push( - { + { index: signal_index, values: nextData.values[signal_index].slice(firstIndex, nextData.values[signal_index].length - 1)}) )); @@ -138,4 +138,4 @@ class Plot extends Component { } -export default Plot; \ No newline at end of file +export default Plot; From fdc95601b1c01145465f022e1516311a844e8f68 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 12:25:09 +0200 Subject: [PATCH 266/556] Update gauge to new simulator connection --- src/components/widget-gauge.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index b4365fe..6f5ac06 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -69,23 +69,23 @@ class WidgetGauge extends Component { return this.state.value !== nextState.value; } - componentWillReceiveProps(nextProps) { + componentWillReceiveProps(nextProps) { // update value const simulator = nextProps.widget.simulator; - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { + if (nextProps.data == null || nextProps.data[simulator.node][simulator.simulator] == null || nextProps.data[simulator.node][simulator.simulator].values == null) { this.setState({ value: 0 }); return; } // check if value has changed - const signal = nextProps.data[simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[simulator.node][simulator.simulator].values[nextProps.widget.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 - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; + const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; if (this.state.value !== new_value) { this.setState({ value: new_value }); - + // update gauge's value this.gauge.set(new_value); } @@ -101,7 +101,7 @@ class WidgetGauge extends Component { var signalType = null; if (this.props.simulation) { - var simulationModel = this.props.simulation.models.filter((model) => model.simulator === this.props.widget.simulator)[0]; + var simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; signalType = simulationModel && simulationModel.length > 0? simulationModel.mapping[this.props.widget.signal].type : ''; } From e390776480228419a9abae6a68148760ce5e1e09 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 12:50:38 +0200 Subject: [PATCH 267/556] Fix gauge signal data --- src/components/widget-gauge.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 6f5ac06..800f043 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -82,12 +82,14 @@ class WidgetGauge extends Component { const signal = nextProps.data[simulator.node][simulator.simulator].values[nextProps.widget.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 - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; - if (this.state.value !== new_value) { - this.setState({ value: new_value }); + if (signal != null) { + const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; + if (this.state.value !== new_value) { + this.setState({ value: new_value }); - // update gauge's value - this.gauge.set(new_value); + // update gauge's value + this.gauge.set(new_value); + } } } @@ -102,7 +104,7 @@ class WidgetGauge extends Component { if (this.props.simulation) { var simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; - signalType = simulationModel && simulationModel.length > 0? simulationModel.mapping[this.props.widget.signal].type : ''; + signalType = (simulationModel != null && simulationModel.length > 0) ? simulationModel.mapping[this.props.widget.signal].type : ''; } return ( From 47570d74d0a764a7802bd67658feb3a5d64829c2 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 11:39:16 +0200 Subject: [PATCH 268/556] Ensure unique node and simulator names in dialogs Node names are checked to be unique in dialogs Simulator names are checked to be unique in dialogs on one node --- src/components/dialog/edit-node.js | 4 ++-- src/components/dialog/edit-simulator.js | 2 +- src/components/dialog/new-node.js | 4 ++-- src/components/dialog/new-simulator.js | 2 +- src/containers/simulators.js | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js index da72a4a..b6475c3 100644 --- a/src/components/dialog/edit-node.js +++ b/src/components/dialog/edit-node.js @@ -60,11 +60,11 @@ class NewNodeDialog extends React.Component { var endpoint = true; var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.nodes.find(node => node._id !== this.state._id && node.name === this.state.name) !== undefined) { name = false; } - if (this.state.endpoint === '') { + if (this.state.endpoint === '' || this.props.nodes.find(node => node._id !== this.state._id && node.endpoint === this.state.endpoint) !== undefined) { endpoint = false; } diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index ef8082a..159b45c 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -63,7 +63,7 @@ class EditSimulatorDialog extends Component { // check all controls var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.node.simulators.find(simulator => this.props.simulator.name !== this.state.name && simulator.name === this.state.name) !== undefined) { name = false; } diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index ae89a35..44afa9d 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -59,11 +59,11 @@ class NewNodeDialog extends React.Component { var endpoint = true; var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.nodes.find(node => node.name === this.state.name) !== undefined) { name = false; } - if (this.state.endpoint === '') { + if (this.state.endpoint === '' || this.props.nodes.find(node => node.endpoint === this.state.endpoint) !== undefined) { endpoint = false; } diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 8e22e3d..f4c293d 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -60,7 +60,7 @@ class NewSimulatorDialog extends Component { // check all controls var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.node.simulators.find(simulator => simulator.name === this.state.name) !== undefined) { name = false; } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index acaf5ad..3e258a6 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -200,12 +200,12 @@ class Simulators extends Component { this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> - this.closeNewNodeModal(data)} /> - this.closeEditNodeModal(data)} /> - this.closeAddSimulatorModal(data)} /> + this.closeNewNodeModal(data)} nodes={this.state.nodes} /> + this.closeEditNodeModal(data)} nodes={this.state.nodes} /> + this.closeAddSimulatorModal(data)} node={this.state.modalData}/> {this.state.editSimulatorModal && - this.closeEditSimulatorModal(data)} /> + this.closeEditSimulatorModal(data)} node={this.state.modalData} /> } From 5f6417d695654cf63ec7c5024173001452d0b08a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 11:46:48 +0200 Subject: [PATCH 269/556] Discard unrequested data --- src/stores/simulator-data-store.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index a6bf05c..5f5a829 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -54,6 +54,11 @@ class SimulationDataStore extends ReduceStore { return state; case 'simulatorData/data-changed': + // check if data is required, otherwise discard + if (state[action.node._id] == null || state[action.data.id] == null) { + return state; + } + // only add data, if newer than current if (state[action.node._id][action.data.id].sequence < action.data.sequence) { // add data to simulator From cfb760fac8429ccbb0ec4cd9e43b776f47ce24d9 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 12:04:59 +0200 Subject: [PATCH 270/556] Display simulator status in tree-view Remove unneeded files anymore --- src/components/node-tree.js | 2 +- src/data-managers/simulators-data-manager.js | 107 ---------------- src/stores/simulator-store.js | 128 ------------------- 3 files changed, 1 insertion(+), 236 deletions(-) delete mode 100644 src/data-managers/simulators-data-manager.js delete mode 100644 src/stores/simulator-store.js diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 1e60038..24c1be3 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -67,7 +67,7 @@ class NodeTree extends React.Component { var parent = { title: node.name, subtitle: node.endpoint, id: node._id, config: node.config, children: [], expanded: true }; node.simulators.forEach((simulator) => { - parent.children.push({ title: simulator.name }); + parent.children.push({ title: simulator.name, subtitle: simulator.id != null ? 'Online' : 'Offline' }); }); treeData.push(parent); diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js deleted file mode 100644 index 535f1e2..0000000 --- a/src/data-managers/simulators-data-manager.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * File: simulators-data-manager.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 RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; - -function isRunning(simulator) { - // get path to nodes.json and simulator name - var path = simulator.endpoint.substring(0, simulator.endpoint.lastIndexOf('/')); - var name = simulator.endpoint.substring(simulator.endpoint.lastIndexOf('/') + 1); - - var url = 'http://' + path + '/api/v1'; - var body = { - action: 'nodes', - id: '1234' /// @todo use random generated id - }; - - // send request - RestAPI.post(url, body).then(response => { - // check if simulator is running - simulator.running = false; - - if (response.id === body.id) { - response.response.forEach(sim => { - if (sim.name === name) { - simulator.running = true; - } - }); - } - - AppDispatcher.dispatch({ - type: 'simulators/running', - simulator: simulator, - running: simulator.running - }); - }).catch(error => { - simulator.running = false; - - AppDispatcher.dispatch({ - type: 'simulators/running', - simulator: simulator, - running: simulator.running - }); - }); -} - -class SimulatorsDataManager extends RestDataManager { - constructor() { - super('simulator', '/simulators', [ '_id', 'name', 'endpoint' ]); - - this._timers = []; - } - - startRunningDetection(obj) { - const simulator = JSON.parse(JSON.stringify(obj)); - - // check if timer is already running - const index = this._timers.findIndex(timer => { - return timer.simulator === simulator._id; - }); - - if (index !== -1) { - return; - } - - // do first request for fast response time - isRunning(simulator); - - // start new timer - const timerID = setInterval(isRunning, 5000, simulator); - this._timers.push({ id: timerID, simulator: simulator._id }); - } - - stopRunningDetection(simulator) { - // remove timer - const index = this._timers.findIndex(timer => { - return timer.simulator === simulator._id; - }); - - if (index !== -1) { - // stop timer and delete from list - clearInterval(this._timers[index].id); - this._timers.splice(index, 1); - } - } -} - -export default new SimulatorsDataManager(); diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js deleted file mode 100644 index 4f8d6bd..0000000 --- a/src/stores/simulator-store.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * File: villas-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 - * 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 './array-store'; -import SimulatorsDataManager from '../data-managers/simulators-data-manager'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; - -class SimulatorStore extends ArrayStore { - constructor() { - super('simulators', SimulatorsDataManager); - } - - reduce(state, action) { - var simulator; - - switch (action.type) { - - case 'simulators/added': - SimulatorsDataManager.startRunningDetection(action.data); - - return super.reduce(state, action); - - case 'simulators/removed': - SimulatorsDataManager.stopRunningDetection(action.original); - - return super.reduce(state, action); - - case 'simulators/start-edit': - // An update will be requested, stop the 'runningDetection' already - SimulatorsDataManager.stopRunningDetection(action.data); - - return super.reduce(state, action); - - case 'simulators/edited': - // The update was done, resume the 'runningDetection' - SimulatorsDataManager.startRunningDetection(action.data); - - return super.reduce(state, action); - - case 'simulators/loaded': - // get simulator running state - if (Array.isArray(action.data)) { - action.data.forEach((simulator) => { - SimulatorsDataManager.startRunningDetection(simulator); - }); - } else { - SimulatorsDataManager.startRunningDetection(action.data); - } - - return super.reduce(state, action); - - case 'simulators/running': - // check if simulator running state changed - simulator = state.find(element => element._id === action.simulator._id ); - - // is this simulator still in the state? update it only if state changed - if (simulator && simulator.running !== action.simulator.running) { - state = this.updateElements(state, [ action.simulator ]); - } - - return state; - - case 'simulatorData/opened': - // get simulator - simulator = state.find(element => { - return element._id === action.identifier; - }); - - if (action.firstOpen === false) { - NotificationsDataManager.addNotification({ - title: 'Simulator online', - message: 'Simulator \'' + simulator.name + '\' went online.', - level: 'info' - }); - } - - // restart requesting again - SimulatorsDataManager.stopRunningDetection(simulator); - - return state; - - case 'simulatorData/closed': - // get simulator - simulator = state.find(element => { - return element._id === action.identifier; - }); - - // update running state - simulator.running = false; - - if (action.notification) { - NotificationsDataManager.addNotification({ - title: 'Simulator offline', - message: 'Simulator \'' + simulator.name + '\' went offline.', - level: 'info' - }); - - // restart requesting again - SimulatorsDataManager.startRunningDetection(simulator); - } - - return this.updateElements(state, [ simulator ]); - - default: - return super.reduce(state, action); - } - } -} - -export default new SimulatorStore(); From 6b1a8ca776a4b80944c6b4914ca5339c4ad823da Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 27 Jun 2017 09:58:10 +0200 Subject: [PATCH 271/556] Add node component --- package.json | 11 ++-- src/components/node-tree.js | 75 +++++++++++++++++++++++++ src/containers/simulators.js | 18 ++++-- src/data-managers/nodes-data-manager.js | 24 ++++++++ src/data-managers/rest-data-manager.js | 2 +- src/stores/node-store.js | 25 +++++++++ 6 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 src/components/node-tree.js create mode 100644 src/data-managers/nodes-data-manager.js create mode 100644 src/stores/node-store.js diff --git a/package.json b/package.json index 2b98174..c423476 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,12 @@ "dependencies": { "bootstrap": "^3.3.7", "classnames": "^2.2.5", + "d3-scale": "^1.0.5", "es6-promise": "^4.0.5", "flux": "^3.1.2", + "gaugeJS": "^1.3.2", "immutable": "^3.8.1", + "rc-slider": "^7.0.1", "rd3": "^0.7.4", "react": "^15.4.2", "react-bootstrap": "^0.30.7", @@ -19,12 +22,8 @@ "react-notification-system": "^0.2.13", "react-rnd": "^4.2.2", "react-router": "^3.0.2", - "superagent": "^3.5.0", - "gaugeJS": "^1.3.2", - "d3-scale": "^1.0.5", - "rc-slider": "^7.0.1", - "prop-types": "^15.0.0", - "d3": "^3.5.0" + "react-sortable-tree": "^0.1.19", + "superagent": "^3.5.0" }, "devDependencies": { "chai": "^3.5.0", diff --git a/src/components/node-tree.js b/src/components/node-tree.js new file mode 100644 index 0000000..6ef02b7 --- /dev/null +++ b/src/components/node-tree.js @@ -0,0 +1,75 @@ +/** + * File: node-tree.js + * Author: Markus Grigull + * Date: 26.06.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 SortableTree from 'react-sortable-tree'; +import { Button, Glyphicon } from 'react-bootstrap'; + +class NodeTree extends React.Component { + constructor(props) { + super(props); + + this.state = { + treeData: [ + { title: 'Chicken', subtitle: 'localhost:5000', children: [ { title: 'Egg' } ], expanded: true }, + { title: 'Cow', subtitle: 'localhost:5001', children: [ { title: 'Milk' }, { title: 'Cheese' }], expanded: true }, + ] + }; + } + + canNodeDrag(node, path) { + return (node.parentNode != null); + } + + canNodeDrop(node, prevPath) { + return (node.nextParent != null); + } + + generateNodeProps(rowInfo) { + var buttons = []; + + if (rowInfo.parentNode == null) { + buttons.push() + } + + buttons.push(); + + return { + buttons: buttons + }; + } + + render() { + return ( + this.setState({ treeData }) } + style={{ height: 400 }} + maxDepth='2' + canDrag={ (node, path) => this.canNodeDrag(node, path) } + canDrop={ (node, prevPath) => this.canNodeDrop(node, prevPath) } + generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo) } + /> + ); + } +} + +export default NodeTree; diff --git a/src/containers/simulators.js b/src/containers/simulators.js index e9a2af8..8a9c01e 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -24,21 +24,23 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; -import SimulatorStore from '../stores/simulator-store'; +//import SimulatorStore from '../stores/simulator-store'; +import NodeStore from '../stores/node-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; +import NodeTree from '../components/node-tree'; class Simulators extends Component { static getStores() { - return [ SimulatorStore ]; + return [ NodeStore ]; } static calculateState() { return { - simulators: SimulatorStore.getState(), + nodes: NodeStore.getState(), newModal: false, deleteModal: false, @@ -49,7 +51,7 @@ class Simulators extends Component { componentWillMount() { AppDispatcher.dispatch({ - type: 'simulators/start-load' + type: 'nodes/start-load' }); } @@ -99,7 +101,11 @@ class Simulators extends Component {

    Simulators

    - + + + + + {/*
    this.labelStyle(value)} labelModifier={(value) => this.labelModifier(value)} /> this.setState({ editModal: true, modalSimulator: this.state.simulators[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index] })} /> @@ -124,7 +130,7 @@ class Simulators extends Component { - + */} ); } diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js new file mode 100644 index 0000000..a253ac9 --- /dev/null +++ b/src/data-managers/nodes-data-manager.js @@ -0,0 +1,24 @@ +/** + * File: nodes-data-manager.js + * Author: Markus Grigull + * Date: 26.06.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 './rest-data-manager'; + +export default new RestDataManager('node', '/nodes'); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 51560a2..749cdcd 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 HOST = process.env.REACT_APP_HTTP_PROXY || ""; +const HOST = process.env.REACT_APP_HTTP_PROXY || "http://localhost:4000"; const API_URL = HOST + '/api/v1'; class RestDataManager { diff --git a/src/stores/node-store.js b/src/stores/node-store.js new file mode 100644 index 0000000..8945885 --- /dev/null +++ b/src/stores/node-store.js @@ -0,0 +1,25 @@ +/** + * File: node-store.js + * Author: Markus Grigull + * Date: 26.06.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 './array-store'; +import NodesDataManager from '../data-managers/nodes-data-manager'; + +export default new ArrayStore('nodes', NodesDataManager); From 232e972657ebaf322b232807fc349d1082fcd216 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 6 Jul 2017 11:41:26 +0200 Subject: [PATCH 272/556] Add node dialogs and backend --- src/components/dialog/edit-node.js | 98 ++++++++++++++++++++++++++++++ src/components/dialog/new-node.js | 97 +++++++++++++++++++++++++++++ src/components/node-tree.js | 24 ++++++-- src/containers/simulators.js | 89 +++++++++++++-------------- 4 files changed, 256 insertions(+), 52 deletions(-) create mode 100644 src/components/dialog/edit-node.js create mode 100644 src/components/dialog/new-node.js diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js new file mode 100644 index 0000000..da72a4a --- /dev/null +++ b/src/components/dialog/edit-node.js @@ -0,0 +1,98 @@ +/** + * File: edit-node.js + * Author: Markus Grigull + * Date: 06.07.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, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewNodeDialog extends React.Component { + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '', + config: {}, + simulators: [], + _id: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + 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.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id }); + } + + validateForm(target) { + // check all controls + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + + +
    + ); + } +} + +export default NewNodeDialog; diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js new file mode 100644 index 0000000..ae89a35 --- /dev/null +++ b/src/components/dialog/new-node.js @@ -0,0 +1,97 @@ +/** + * File: new-node.js + * Author: Markus Grigull + * Date: 06.07.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, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class NewNodeDialog extends React.Component { + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '', + config: {}, + simulators: [] + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', endpoint: '', config: {}, simulators: [] }); + } + + validateForm(target) { + // check all controls + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + + +
    + ); + } +} + +export default NewNodeDialog; diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 6ef02b7..ea79d6c 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -28,10 +28,7 @@ class NodeTree extends React.Component { super(props); this.state = { - treeData: [ - { title: 'Chicken', subtitle: 'localhost:5000', children: [ { title: 'Egg' } ], expanded: true }, - { title: 'Cow', subtitle: 'localhost:5001', children: [ { title: 'Milk' }, { title: 'Cheese' }], expanded: true }, - ] + treeData: [] }; } @@ -50,20 +47,35 @@ class NodeTree extends React.Component { buttons.push() } - buttons.push(); + buttons.push(); + buttons.push(); return { buttons: buttons }; } + componentWillReceiveProps(nextProps) { + // compare if data changed + if (this.props.data == null || this.props.data !== nextProps.data) { + // generate new state + var treeData = []; + + nextProps.data.forEach((node) => { + treeData.push({ title: node.name, subtitle: node.endpoint, id: node._id }); + }); + + this.setState({ treeData }); + } + } + render() { return ( this.setState({ treeData }) } style={{ height: 400 }} - maxDepth='2' + maxDepth={ 2 } canDrag={ (node, path) => this.canNodeDrag(node, path) } canDrop={ (node, prevPath) => this.canNodeDrop(node, prevPath) } generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo) } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 8a9c01e..a6024c5 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -27,10 +27,8 @@ import AppDispatcher from '../app-dispatcher'; //import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewSimulatorDialog from '../components/dialog/new-simulator'; -import EditSimulatorDialog from '../components/dialog/edit-simulator'; +import NewNodeDialog from '../components/dialog/new-node'; +import EditNodeDialog from '../components/dialog/edit-node'; import NodeTree from '../components/node-tree'; class Simulators extends Component { @@ -45,7 +43,7 @@ class Simulators extends Component { newModal: false, deleteModal: false, editModal: false, - modalSimulator: {} + modalData: {} }; } @@ -56,81 +54,80 @@ class Simulators extends Component { } closeNewModal(data) { - this.setState({ newModal : false }); + this.setState({ newModal: false }); if (data) { AppDispatcher.dispatch({ - type: 'simulators/start-add', + type: 'nodes/start-add', data: data }); } } + showEditModal(data) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ editModal: true, modalData: node }); + } + + closeEditModal(data) { + this.setState({ editModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: data + }); + } + } + + showDeleteModal(data) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ deleteModal: true, modalData: node }); + } + confirmDeleteModal() { this.setState({ deleteModal: false }); AppDispatcher.dispatch({ - type: 'simulators/start-remove', - data: this.state.modalSimulator + type: 'nodes/start-remove', + data: this.state.modalData }); } - closeEditModal(data) { - this.setState({ editModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'simulators/start-edit', - data: data - }); - } - } - - labelStyle(value) { - if (value === true) return 'success'; - else return 'warning'; - } - - labelModifier(value) { - if (value === true) return 'Running'; - else return 'Not running'; - } - render() { return (

    Simulators

    - + - + this.showDeleteModal(node)} onEdit={(node) => this.showEditModal(node)} /> - {/*
    - this.labelStyle(value)} labelModifier={(value) => this.labelModifier(value)} /> - - this.setState({ editModal: true, modalSimulator: this.state.simulators[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index] })} /> -
    - - - - this.closeNewModal(data)} /> - - this.closeEditModal(data)} simulator={this.state.modalSimulator} /> + this.closeNewModal(data)} /> + this.closeEditModal(data)} /> - Delete Simulator + Delete Node - Are you sure you want to delete the simulator '{this.state.modalSimulator.name}'? + Are you sure you want to delete the node '{this.state.modalData.name}'? - */} +
    ); } From 7beeb78722fc4705507f1fde8963db93e010d7c5 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 7 Jul 2017 10:25:07 +0200 Subject: [PATCH 273/556] Add simulators to nodes --- src/components/dialog/new-simulator.js | 18 +----- src/components/node-tree.js | 18 ++++-- src/containers/simulators.js | 89 ++++++++++++++++++++------ 3 files changed, 85 insertions(+), 40 deletions(-) diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 395cf9e..8e22e3d 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -36,8 +36,7 @@ class NewSimulatorDialog extends Component { super(props); this.state = { - name: '', - endpoint: '' + name: '' }; } @@ -54,27 +53,21 @@ class NewSimulatorDialog extends Component { } resetState() { - this.setState({ name: '', endpoint: '' }); + this.setState({ name: '' }); } validateForm(target) { // check all controls - var endpoint = true; var name = true; if (this.state.name === '') { name = false; } - if (this.state.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; + this.valid = name; // return state to control if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; } render() { @@ -86,11 +79,6 @@ class NewSimulatorDialog extends Component { this.handleChange(e)} /> - - Endpoint - this.handleChange(e)} /> - - ); diff --git a/src/components/node-tree.js b/src/components/node-tree.js index ea79d6c..1cf8226 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -44,11 +44,15 @@ class NodeTree extends React.Component { var buttons = []; if (rowInfo.parentNode == null) { - buttons.push() + buttons.push(); + buttons.push(); + buttons.push(); + } else { + buttons.push(); + buttons.push(); } - buttons.push(); - buttons.push(); + console.log(rowInfo); return { buttons: buttons @@ -62,7 +66,13 @@ class NodeTree extends React.Component { var treeData = []; nextProps.data.forEach((node) => { - treeData.push({ title: node.name, subtitle: node.endpoint, id: node._id }); + var parent = { title: node.name, subtitle: node.endpoint, id: node._id, children: [], expanded: true }; + + node.simulators.forEach((simulator) => { + parent.children.push({ title: simulator.name }); + }); + + treeData.push(parent); }); this.setState({ treeData }); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index a6024c5..8fd4a53 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -24,11 +24,11 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; -//import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; import NewNodeDialog from '../components/dialog/new-node'; import EditNodeDialog from '../components/dialog/edit-node'; +import NewSimulatorDialog from '../components/dialog/new-simulator'; import NodeTree from '../components/node-tree'; class Simulators extends Component { @@ -40,10 +40,16 @@ class Simulators extends Component { return { nodes: NodeStore.getState(), - newModal: false, - deleteModal: false, - editModal: false, - modalData: {} + newNodeModal: false, + deleteNodeModal: false, + editNodeModal: false, + + addSimulatorModal: false, + editSimulatorModal: false, + deleteSimulatorModal: false, + + modalData: {}, + modalIndex: 0 }; } @@ -53,8 +59,8 @@ class Simulators extends Component { }); } - closeNewModal(data) { - this.setState({ newModal: false }); + closeNewNodeModal(data) { + this.setState({ newNodeModal: false }); if (data) { AppDispatcher.dispatch({ @@ -64,17 +70,17 @@ class Simulators extends Component { } } - showEditModal(data) { + showEditNodeModal(data) { // find node with id var node = this.state.nodes.find((element) => { return element._id === data.id; }); - this.setState({ editModal: true, modalData: node }); + this.setState({ editNodeModal: true, modalData: node }); } - closeEditModal(data) { - this.setState({ editModal: false }); + closeEditNodeModal(data) { + this.setState({ editNodeModal: false }); if (data) { AppDispatcher.dispatch({ @@ -84,16 +90,16 @@ class Simulators extends Component { } } - showDeleteModal(data) { + showDeleteNodeModal(data) { // find node with id var node = this.state.nodes.find((element) => { return element._id === data.id; }); - this.setState({ deleteModal: true, modalData: node }); + this.setState({ deleteNodeModal: true, modalData: node }); } - confirmDeleteModal() { + confirmDeleteNodeModal() { this.setState({ deleteModal: false }); AppDispatcher.dispatch({ @@ -102,30 +108,71 @@ class Simulators extends Component { }); } + showAddSimulatorModal(data) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ addSimulatorModal: true, modalData: node }); + } + + closeAddSimulatorModal(data) { + this.setState({ addSimulatorModal: false }); + + if (data) { + var node = this.state.modalData; + node.simulators.push(data); + + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + } + } + render() { return (

    Simulators

    - + - this.showDeleteModal(node)} onEdit={(node) => this.showEditModal(node)} /> + this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(index) => this.onSimulatorEdit(index)} onSimulatorDelete={(index) => this.onSimulatorDelete(index)} /> - this.closeNewModal(data)} /> - this.closeEditModal(data)} /> + this.closeNewNodeModal(data)} /> + this.closeEditNodeModal(data)} /> + this.closeAddSimulatorModal(data)} /> - + Delete Node Are you sure you want to delete the node '{this.state.modalData.name}'? +
    + This will delete all simulators assigned to this node.
    - - + + + +
    + + + + Delete Simulator + + + + {/*Are you sure you want to delete the simulator '{this.state.modalData.simulators[this.state.modalIndex].name}'?*/} + + + + +
    From 984d40134f651512cf76d535ac3329d63c8106fd Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 8 Jul 2017 00:23:01 +0200 Subject: [PATCH 274/556] Add simulator editing and moving --- src/components/dialog/edit-simulator.js | 21 ++------ src/components/node-tree.js | 70 +++++++++++++++++-------- src/containers/simulators.js | 67 +++++++++++++++++++++-- 3 files changed, 116 insertions(+), 42 deletions(-) diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index 3f7f64e..6469b89 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -37,9 +37,7 @@ class EditSimulatorDialog extends Component { super(props); this.state = { - name: '', - endpoint: '', - _id: '' + name: '' }; } @@ -57,30 +55,22 @@ class EditSimulatorDialog extends Component { resetState() { this.setState({ - name: this.props.simulator.name, - endpoint: this.props.simulator.endpoint, - _id: this.props.simulator._id + name: this.props.simulator.name }); } validateForm(target) { // check all controls - var endpoint = true; var name = true; if (this.state.name === '') { name = false; } - if (this.state.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; + this.valid = name; // return state to control if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; } render() { @@ -92,11 +82,6 @@ class EditSimulatorDialog extends Component { this.handleChange(e)} /> - - Endpoint - this.handleChange(e)} /> - - ); diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 1cf8226..1e60038 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -48,47 +48,75 @@ class NodeTree extends React.Component { buttons.push(); buttons.push(); } else { - buttons.push(); - buttons.push(); - } + // get child index + var index = rowInfo.path[1] - rowInfo.path[0] - 1; - console.log(rowInfo); + buttons.push(); + buttons.push(); + } return { buttons: buttons }; } + nodesToTreeData(nodes) { + var treeData = []; + + nodes.forEach((node) => { + var parent = { title: node.name, subtitle: node.endpoint, id: node._id, config: node.config, children: [], expanded: true }; + + node.simulators.forEach((simulator) => { + parent.children.push({ title: simulator.name }); + }); + + treeData.push(parent); + }); + + return treeData; + } + + treeDataToNodes(treeData) { + var nodes = []; + + treeData.forEach((data) => { + var node = { name: data.title, endpoint: data.subtitle, _id: data.id, config: data.config, simulators: [] }; + + data.children.forEach((child) => { + node.simulators.push({ name: child.title }); + }); + + nodes.push(node); + }); + + return nodes; + } + componentWillReceiveProps(nextProps) { // compare if data changed if (this.props.data == null || this.props.data !== nextProps.data) { // generate new state - var treeData = []; - - nextProps.data.forEach((node) => { - var parent = { title: node.name, subtitle: node.endpoint, id: node._id, children: [], expanded: true }; - - node.simulators.forEach((simulator) => { - parent.children.push({ title: simulator.name }); - }); - - treeData.push(parent); - }); - + var treeData = this.nodesToTreeData(nextProps.data); this.setState({ treeData }); } } + onDataChange(treeData) { + this.setState({ treeData }); + + this.props.onDataChange(this.treeDataToNodes(treeData)) + } + render() { return ( this.setState({ treeData }) } + treeData={this.state.treeData} + onChange={(treeData) => this.onDataChange(treeData)} style={{ height: 400 }} maxDepth={ 2 } - canDrag={ (node, path) => this.canNodeDrag(node, path) } - canDrop={ (node, prevPath) => this.canNodeDrop(node, prevPath) } - generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo) } + canDrag={(node, path) => this.canNodeDrag(node, path)} + canDrop={(node, prevPath) => this.canNodeDrop(node, prevPath)} + generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo)} /> ); } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 8fd4a53..fd6c450 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -29,6 +29,7 @@ import NodeStore from '../stores/node-store'; import NewNodeDialog from '../components/dialog/new-node'; import EditNodeDialog from '../components/dialog/edit-node'; import NewSimulatorDialog from '../components/dialog/new-simulator'; +import EditSimulatorDialog from '../components/dialog/edit-simulator'; import NodeTree from '../components/node-tree'; class Simulators extends Component { @@ -49,7 +50,8 @@ class Simulators extends Component { deleteSimulatorModal: false, modalData: {}, - modalIndex: 0 + modalIndex: 0, + modalName: '' }; } @@ -131,6 +133,61 @@ class Simulators extends Component { } } + showEditSimulatorModal(data, index) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ editSimulatorModal: true, modalData: node, modalIndex: index }); + } + + closeEditSimulatorModal(data) { + this.setState({ editSimulatorModal: false }); + + if (data) { + var node = this.state.modalData; + node.simulators[this.state.modalIndex] = data; + + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + } + } + + showDeleteSimulatorModal(data, index) { + // find node with id + var node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + this.setState({ deleteSimulatorModal: true, modalData: node, modalIndex: index, modalName: data.children[index].title }); + } + + confirmDeleteSimulatorModal() { + this.setState({ deleteSimulatorModal: false }); + + // remove simulator + var node = this.state.modalData; + node.simulators.splice(this.state.modalIndex); + + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + } + + onTreeDataChange(nodes) { + // update all at once + nodes.forEach((node) => { + AppDispatcher.dispatch({ + type: 'nodes/start-edit', + data: node + }); + }); + } + render() { return (
    @@ -138,12 +195,16 @@ class Simulators extends Component { - this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(index) => this.onSimulatorEdit(index)} onSimulatorDelete={(index) => this.onSimulatorDelete(index)} /> + this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> this.closeNewNodeModal(data)} /> this.closeEditNodeModal(data)} /> this.closeAddSimulatorModal(data)} /> + {this.state.editSimulatorModal && + this.closeEditSimulatorModal(data)} /> + } + Delete Node @@ -167,7 +228,7 @@ class Simulators extends Component { - {/*Are you sure you want to delete the simulator '{this.state.modalData.simulators[this.state.modalIndex].name}'?*/} + Are you sure you want to delete the simulator '{this.state.modalName}'? From e7bc53b37469de9b1c575869531fe68510e8ac0e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 8 Jul 2017 12:37:13 +0200 Subject: [PATCH 275/556] Start simulator ID fetching --- src/containers/app.js | 7 ++--- src/data-managers/nodes-data-manager.js | 34 ++++++++++++++++++++++++- src/stores/node-store.js | 26 ++++++++++++++++++- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index 2af248e..14d02cc 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -28,6 +28,7 @@ import NotificationSystem from 'react-notification-system'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; import SimulatorStore from '../stores/simulator-store'; +import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -40,7 +41,7 @@ import '../styles/app.css'; class App extends Component { static getStores() { - return [ SimulationStore, SimulatorStore, UserStore ]; + return [ SimulationStore, NodeStore, UserStore ]; } static calculateState(prevState) { @@ -164,12 +165,12 @@ class App extends Component { }); if (simulator != null) { - AppDispatcher.dispatch({ + /*AppDispatcher.dispatch({ type: 'simulatorData/open', identifier: simulator._id, endpoint: simulator.endpoint, signals: data.signals - }); + });*/ } } diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index a253ac9..ab04da9 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -20,5 +20,37 @@ ******************************************************************************/ import RestDataManager from './rest-data-manager'; +import RestAPI from '../api/rest-api'; -export default new RestDataManager('node', '/nodes'); +class NodesDataManager extends RestDataManager { + constructor() { + super('node', '/nodes'); + } + + getSimulators(node) { + RestAPI.post('http://' + node.endpoint + '/api/v1', { + action: 'nodes', + id: node._id + }).then(response => { + // assign IDs to simulators + response.response.forEach(element => { + if (element.type === "websocket") { + // add the (villas-node) node ID to the simulator + node.simulators = node.simulators.map(simulator => { + if (simulator.name === element.name) { + simulator.id = element.id; + } + + return simulator; + }); + } + }); + + console.log(node); + }).catch(error => { + console.warn(error); + }); + } +} + +export default new NodesDataManager(); diff --git a/src/stores/node-store.js b/src/stores/node-store.js index 8945885..d7d6112 100644 --- a/src/stores/node-store.js +++ b/src/stores/node-store.js @@ -22,4 +22,28 @@ import ArrayStore from './array-store'; import NodesDataManager from '../data-managers/nodes-data-manager'; -export default new ArrayStore('nodes', NodesDataManager); +class NodeStore extends ArrayStore { + constructor() { + super('nodes', NodesDataManager); + } + + reduce(state, action) { + switch(action.type) { + case 'nodes/loaded': + if (Array.isArray(action.data)) { + action.data.forEach(node => { + NodesDataManager.getSimulators(node); + }); + } else { + NodesDataManager.getSimulators(action.data); + } + + return super.reduce(state, action); + + default: + return super.reduce(state, action); + } + } +} + +export default new NodeStore(); From 3b58073285cc096d40c69120bd8ac9e8c983643d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 9 Jul 2017 18:14:53 +0200 Subject: [PATCH 276/556] Change simulator selection in simulator model Disable simulator detection for testing --- .../dialog/edit-simulation-model.js | 22 +++++++++----- src/components/dialog/new-simulation-model.js | 21 ++++++++----- src/containers/app.js | 30 ++++++++++--------- src/containers/simulation.js | 24 ++++++--------- src/containers/simulators.js | 5 +++- src/data-managers/nodes-data-manager.js | 15 +++++++--- 6 files changed, 69 insertions(+), 48 deletions(-) diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 3de81dd..de5855d 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -31,7 +31,7 @@ class EditSimulationModelDialog extends Component { show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, data: PropTypes.object.isRequired, - simulators: PropTypes.array.isRequired + nodes: PropTypes.array.isRequired }; valid: false; @@ -41,8 +41,9 @@ class EditSimulationModelDialog extends Component { this.state = { name: '', - simulator: '', - length: 1 + simulator: { node: '', simulator: '' }, + length: 1, + mapping: [{ name: 'Signal', type: 'Type' }] } } @@ -68,7 +69,12 @@ class EditSimulationModelDialog extends Component { } } - this.setState({ [e.target.id]: e.target.value }); + if (e.target.id === 'simulator') { + var value = e.target.value.split("/"); + this.setState({ simulator: { node: value[0], simulator: value[1] } }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } handleMappingChange(event, row, column) { @@ -124,9 +130,11 @@ class EditSimulationModelDialog extends Component { Simulator - this.handleChange(e)}> - {this.props.simulators.map(simulator => ( - + this.handleChange(e)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) ))} diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 5789e51..0acc38d 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -30,7 +30,7 @@ class NewSimulationModelDialog extends Component { static propTypes = { show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, - simulators: PropTypes.array.isRequired + nodes: PropTypes.array.isRequired }; valid: false; @@ -40,7 +40,7 @@ class NewSimulationModelDialog extends Component { this.state = { name: '', - simulator: '', + simulator: { node: '', simulator: '' }, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }; @@ -68,7 +68,12 @@ class NewSimulationModelDialog extends Component { } } - this.setState({ [e.target.id]: e.target.value }); + if (e.target.id === 'simulator') { + var value = e.target.value.split("/"); + this.setState({ simulator: { node: value[0], simulator: value[1] } }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } handleMappingChange(event, row, column) { @@ -86,7 +91,7 @@ class NewSimulationModelDialog extends Component { resetState() { this.setState({ name: '', - simulator: this.props.simulators[0] != null ? this.props.simulators[0]._id : '', + simulator: { node: this.props.nodes[0] ? this.props.nodes[0].name : '', simulator: this.props.nodes[0].simulators[0] ? this.props.nodes[0].simulators[0].name : '' }, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); @@ -130,9 +135,11 @@ class NewSimulationModelDialog extends Component { Simulator - this.handleChange(e)}> - {this.props.simulators.map(simulator => ( - + this.handleChange(e)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) ))} diff --git a/src/containers/app.js b/src/containers/app.js index 14d02cc..adc5f05 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -27,7 +27,7 @@ import NotificationSystem from 'react-notification-system'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; +//import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -41,12 +41,12 @@ import '../styles/app.css'; class App extends Component { static getStores() { - return [ SimulationStore, NodeStore, UserStore ]; + return [ NodeStore, UserStore, SimulationStore ]; } static calculateState(prevState) { // get list of running simulators - var simulators = SimulatorStore.getState().filter(simulator => { + /*var simulators = SimulatorStore.getState().filter(simulator => { return simulator.running === true; }); @@ -75,16 +75,16 @@ class App extends Component { if (equal) { simulators = prevState.runningSimulators; } - } + }*/ let currentUser = UserStore.getState().currentUser; return { - simulations: SimulationStore.getState(), + nodes: NodeStore.getState(), currentRole: currentUser? currentUser.role : '', - token: UserStore.getState().token, + token: UserStore.getState().token/*, - runningSimulators: simulators + runningSimulators: simulators*/ }; } @@ -104,7 +104,7 @@ class App extends Component { // load all simulators and simulations to fetch simulation data AppDispatcher.dispatch({ - type: 'simulators/start-load' + type: 'nodes/start-load' }); AppDispatcher.dispatch({ @@ -136,7 +136,9 @@ class App extends Component { } requiredSimulatorsBySimulations() { - var simulators = []; + return []; + + /*var simulators = []; this.state.simulations.forEach((simulation) => { simulation.models.forEach((simulationModel) => { @@ -155,24 +157,24 @@ class App extends Component { }); }); - return simulators; + return simulators;*/ } - connectSimulator(state, data) { + /*connectSimulator(state, data) { // get simulator object const simulator = state.runningSimulators.find(element => { return element._id === data.simulator; }); if (simulator != null) { - /*AppDispatcher.dispatch({ + AppDispatcher.dispatch({ type: 'simulatorData/open', identifier: simulator._id, endpoint: simulator.endpoint, signals: data.signals - });*/ + }); } - } + }*/ render() { // get children diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 59e37c5..52f5649 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; +import NodeStore from '../stores/node-store'; import AppDispatcher from '../app-dispatcher'; import Table from '../components/table'; @@ -34,13 +34,13 @@ import EditSimulationModelDialog from '../components/dialog/edit-simulation-mode class Simulation extends Component { static getStores() { - return [ SimulationStore, SimulatorStore ]; + return [ SimulationStore, NodeStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), - simulators: SimulatorStore.getState(), + nodes: NodeStore.getState(), newModal: false, deleteModal: false, @@ -58,7 +58,7 @@ class Simulation extends Component { }); AppDispatcher.dispatch({ - type: 'simulators/start-load' + type: 'nodes/start-load' }); } @@ -119,14 +119,8 @@ class Simulation extends Component { } } - getSimulatorName(id) { - for (var i = 0; i < this.state.simulators.length; i++) { - if (this.state.simulators[i]._id === id) { - return this.state.simulators[i].name; - } - } - - return id; + getSimulatorName(simulator) { + return simulator.node + '/' + simulator.simulator; } render() { @@ -136,16 +130,16 @@ class Simulation extends Component { - this.getSimulatorName(id)} /> + this.getSimulatorName(simulator)} /> this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} />
    - this.closeNewModal(data)} simulators={this.state.simulators} /> + this.closeNewModal(data)} nodes={this.state.nodes} /> - this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> + this.closeEditModal(data)} data={this.state.modalData} nodes={this.state.nodes} /> diff --git a/src/containers/simulators.js b/src/containers/simulators.js index fd6c450..acaf5ad 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -193,7 +193,10 @@ class Simulators extends Component {

    Simulators

    - + + +
    + Hint: Node names must be unique. Simulator names must be unique on a node. this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index ab04da9..af68fc1 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -21,6 +21,7 @@ import RestDataManager from './rest-data-manager'; import RestAPI from '../api/rest-api'; +import AppDispatcher from '../app-dispatcher'; class NodesDataManager extends RestDataManager { constructor() { @@ -28,7 +29,7 @@ class NodesDataManager extends RestDataManager { } getSimulators(node) { - RestAPI.post('http://' + node.endpoint + '/api/v1', { + /*RestAPI.post('http://' + node.endpoint + '/api/v1', { action: 'nodes', id: node._id }).then(response => { @@ -46,10 +47,16 @@ class NodesDataManager extends RestDataManager { } }); - console.log(node); + AppDispatcher.dispatch({ + type: 'nodes/edited', + data: node + }); }).catch(error => { - console.warn(error); - }); + AppDispatcher.dispatch({ + type: 'nodes/edit-error', + error: error + }); + });*/ } } From 259c512040355060c706737f358a428a696d62bc Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 11 Jul 2017 15:17:28 +0200 Subject: [PATCH 277/556] Change simulator data to node based --- src/containers/app.js | 67 +++++++++---------- src/data-managers/nodes-data-manager.js | 10 ++- .../simulator-data-data-manager.js | 33 ++++----- src/stores/node-store.js | 1 + src/stores/simulator-data-store.js | 36 ++++++---- 5 files changed, 79 insertions(+), 68 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index adc5f05..70bbe67 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -27,7 +27,6 @@ import NotificationSystem from 'react-notification-system'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; -//import SimulatorStore from '../stores/simulator-store'; import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -81,6 +80,7 @@ class App extends Component { return { nodes: NodeStore.getState(), + simulations: SimulationStore.getState(), currentRole: currentUser? currentUser.role : '', token: UserStore.getState().token/*, @@ -127,53 +127,46 @@ class App extends Component { return; } - // open connection to each required simulator - const requiredSimulators = this.requiredSimulatorsBySimulations(); + // open connection to each node + /*const requiredNodes = this.requiredNodesBySimulations(); - requiredSimulators.forEach(simulator => { - this.connectSimulator(nextState, simulator); - }); + requiredNodes.forEach(node => { + AppDispatcher.dispatch({ + type: 'simulatorData/open', + identifier: simulator._id, + endpoint: node.endpoint, + signals: data.signals + }); + });*/ } - requiredSimulatorsBySimulations() { - return []; + /*requiredNodesBySimulations() { + var nodes = {}; - /*var simulators = []; - - this.state.simulations.forEach((simulation) => { - simulation.models.forEach((simulationModel) => { - // add simulator to list if not already part of - const index = simulators.findIndex((element) => { - return element.simulator === simulationModel.simulator; + this.state.simulations.forEach(simulation => { + simulation.models.forEach(model => { + // get ID for node + var node = this.state.nodes.find(element => { + return element.name === model.simulator.node; }); - if (index === -1) { - simulators.push({ simulator: simulationModel.simulator, signals: simulationModel.length }); - } else { - if (simulators[index].length < simulationModel.length) { - simulators[index].length = simulationModel.length; + // add empty node if not existing + if (node !== undefined) { + if (nodes[node._id] == null) { + nodes[node._id] = { simulators: [] } } + + // get simulator id + var simulator = node.simulators.find(simulator => { + return simulator.name === model.simulator.simulator; + }); + + nodes[node._id].simulators.push({ id: simulator.id, signals: model.length }); } }); }); - return simulators;*/ - } - - /*connectSimulator(state, data) { - // get simulator object - const simulator = state.runningSimulators.find(element => { - return element._id === data.simulator; - }); - - if (simulator != null) { - AppDispatcher.dispatch({ - type: 'simulatorData/open', - identifier: simulator._id, - endpoint: simulator.endpoint, - signals: data.signals - }); - } + return nodes; }*/ render() { diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index af68fc1..12e4014 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -29,7 +29,7 @@ class NodesDataManager extends RestDataManager { } getSimulators(node) { - /*RestAPI.post('http://' + node.endpoint + '/api/v1', { + RestAPI.post('http://' + node.endpoint + '/api/v1', { action: 'nodes', id: node._id }).then(response => { @@ -51,12 +51,18 @@ class NodesDataManager extends RestDataManager { type: 'nodes/edited', data: node }); + + AppDispatcher.dispatch({ + type: 'simulatorData/open', + node: node, + endpoint: node.endpoint, + }); }).catch(error => { AppDispatcher.dispatch({ type: 'nodes/edit-error', error: error }); - });*/ + }); } } diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 22f443b..666ea5e 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -27,21 +27,21 @@ class SimulatorDataDataManager { this._sockets = {}; } - open(endpoint, identifier, signals) { + open(endpoint, node) { // pass signals to onOpen callback - if (this._sockets[identifier] != null) { - if (this._sockets[identifier].url !== WebsocketAPI.getURL(endpoint)) { + if (this._sockets[node._id] != null) { + if (this._sockets[node._id].url !== WebsocketAPI.getURL(endpoint)) { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } else { // set flag if a socket to this simulator was already create before - if (this._sockets[identifier] === null) { - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + if (this._sockets[node._id] === null) { + this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } else { - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, signals, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } } @@ -56,33 +56,32 @@ class SimulatorDataDataManager { } } - onOpen(event, identifier, signals, firstOpen) { + onOpen(event, node, firstOpen) { AppDispatcher.dispatch({ type: 'simulatorData/opened', - identifier: identifier, - signals: signals, + node: node, firstOpen: firstOpen }); } - onClose(event, identifier) { + onClose(event, node) { AppDispatcher.dispatch({ type: 'simulatorData/closed', - identifier: identifier, + node: node, notification: (event.code !== 4000) }); // remove from list, keep null reference for flag detection - delete this._sockets[identifier]; + delete this._sockets[node._id]; } - onMessage(event, identifier) { + onMessage(event, node) { var message = this.bufferToMessage(event.data); AppDispatcher.dispatch({ type: 'simulatorData/data-changed', data: message, - identifier: identifier + node: node }); } @@ -95,6 +94,7 @@ class SimulatorDataDataManager { var bits = data.getUint8(0); var length = data.getUint16(0x02, 1); + var id = data.getUint8(1); var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); @@ -104,7 +104,8 @@ class SimulatorDataDataManager { length: length, sequence: data.getUint32(0x04, 1), timestamp: data.getUint32(0x08, 1) * 1e3 + data.getUint32(0x0C, 1) * 1e-6, - values: values + values: values, + id: id }; } } diff --git a/src/stores/node-store.js b/src/stores/node-store.js index d7d6112..aad1df6 100644 --- a/src/stores/node-store.js +++ b/src/stores/node-store.js @@ -30,6 +30,7 @@ class NodeStore extends ArrayStore { reduce(state, action) { switch(action.type) { case 'nodes/loaded': + // get simulator IDs if (Array.isArray(action.data)) { action.data.forEach(node => { NodesDataManager.getSimulators(node); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index d52ac1d..457768c 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -40,48 +40,58 @@ class SimulationDataStore extends ReduceStore { switch (action.type) { case 'simulatorData/open': - SimulatorDataDataManager.open(action.endpoint, action.identifier, action.signals); + SimulatorDataDataManager.open(action.endpoint, action.node); return state; case 'simulatorData/opened': // create entry for simulator - state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; + /*state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; for (i = 0; i < action.signals; i++) { state[action.identifier].values.push([]); - } + }*/ + + state[action.node._id] = {}; + + action.node.simulators.forEach(simulator => { + state[action.node._id][simulator.id] = { sequence: -1, values: [] }; + }); return state; case 'simulatorData/data-changed': // only add data, if newer than current - if (state[action.identifier].sequence < action.data.sequence) { + if (state[action.node._id][action.data.id].sequence < action.data.sequence) { // add data to simulator - for (i = 0; i < state[action.identifier].signals; i++) { - state[action.identifier].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); + for (i = 0; i < action.data.length; i++) { + while (state[action.node._id][action.data.id].values.length < i + 1) { + state[action.node._id][action.data.id].values.push([]); + } + + state[action.node._id][action.data.id].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); // erase old values - if (state[action.identifier].values[i].length > MAX_VALUES) { - const pos = state[action.identifier].values[i].length - MAX_VALUES; - state[action.identifier].values[i].splice(0, pos); + if (state[action.node._id][action.data.id].values[i].length > MAX_VALUES) { + const pos = state[action.node._id][action.data.id].values[i].length - MAX_VALUES; + state[action.node._id][action.data.id].values[i].splice(0, pos); } } // update metadata - state[action.identifier].timestamp = action.data.timestamp; - state[action.identifier].sequence = action.data.sequence; + state[action.node._id][action.data.id].timestamp = action.data.timestamp; + state[action.node._id][action.data.id].sequence = action.data.sequence; // explicit call to prevent array copy this.__emitChange(); } else { - console.log('same sequence ' + state[action.identifier].sequence + ' ' + action.data.sequence); + console.log('same sequence ' + state[action.node._id][action.data.id].sequence + ' ' + action.data.sequence); } return state; case 'simulatorData/closed': // close and delete socket - if (state[action.identifier] != null) { + if (state[action.node] != null) { // delete data //delete state[action.identifier]; //state[action.identifier] = null; From 6a535a53388f852e3ddc16dd04fa6d173a2f200e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 11 Jul 2017 19:46:45 +0200 Subject: [PATCH 278/556] Change widget value to new simulator data --- .../dialog/edit-widget-signal-control.js | 8 ++++---- .../dialog/edit-widget-simulator-control.js | 13 ++++++------- src/components/dialog/edit-widget.js | 15 ++++++++++++--- src/components/dialog/new-simulation-model.js | 9 +++++---- src/components/widget-value.js | 9 ++++++--- src/containers/simulation.js | 10 +++++++++- src/containers/visualization.js | 19 ++++++++++--------- src/stores/simulator-data-store.js | 6 ------ 8 files changed, 52 insertions(+), 37 deletions(-) diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index 623b416..98d9b06 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -28,7 +28,7 @@ class EditWidgetSignalControl extends Component { this.state = { widget: { - simulator: '' + simulator: {} } }; } @@ -43,10 +43,10 @@ class EditWidgetSignalControl extends Component { if (this.props.simulation) { // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulator === this.state.widget.simulator ); + const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); // If simulation model update the signals to render - signalsToRender = simulationModel? simulationModel.mapping : []; + signalsToRender = simulationModel ? simulationModel.mapping : []; } return ( @@ -68,4 +68,4 @@ class EditWidgetSignalControl extends Component { } } -export default EditWidgetSignalControl; \ No newline at end of file +export default EditWidgetSignalControl; diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js index 48186ef..ec4cec5 100644 --- a/src/components/dialog/edit-widget-simulator-control.js +++ b/src/components/dialog/edit-widget-simulator-control.js @@ -28,7 +28,7 @@ class EditWidgetSimulatorControl extends Component { this.state = { widget: { - simulator: '' + simulator: {} } }; } @@ -39,17 +39,16 @@ class EditWidgetSimulatorControl extends Component { } render() { - return ( - Simulator - this.props.handleChange(e)}> + Simulation Model + this.props.handleChange(e)}> { this.props.simulation.models.length === 0? ( - + ) : ( this.props.simulation.models.map((model, index) => ( - + ))) } @@ -58,4 +57,4 @@ class EditWidgetSimulatorControl extends Component { } } -export default EditWidgetSimulatorControl; \ No newline at end of file +export default EditWidgetSimulatorControl; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index cd036ca..24866c3 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -41,7 +41,7 @@ class EditWidgetDialog extends Component { this.state = { temporal: { name: '', - simulator: '', + simulator: {}, signal: 0 } }; @@ -58,7 +58,16 @@ class EditWidgetDialog extends Component { handleChange(e) { 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; return changesObject }, {}); + let changes = e.reduce( (changesObject, event) => { + if (event.target.id === 'simulator') { + changesObject[event.target.id] = JSON.parse(event.target.value); + } else { + changesObject[event.target.id] = event.target.value; + } + + return changesObject; + }, {}); + this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } else { let changeObject = {}; @@ -87,7 +96,7 @@ class EditWidgetDialog extends Component { } render() { - + let controls = null; if (this.props.widget) { controls = createControls( diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 0acc38d..8ae219c 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -48,6 +48,7 @@ class NewSimulationModelDialog extends Component { onClose(canceled) { if (canceled === false) { + console.log(this.state); this.props.onClose(this.state); } else { this.props.onClose(); @@ -69,8 +70,8 @@ class NewSimulationModelDialog extends Component { } if (e.target.id === 'simulator') { - var value = e.target.value.split("/"); - this.setState({ simulator: { node: value[0], simulator: value[1] } }); + console.log(e.target.value); + this.setState({ simulator: JSON.parse(e.target.value) }); } else { this.setState({ [e.target.id]: e.target.value }); } @@ -91,7 +92,7 @@ class NewSimulationModelDialog extends Component { resetState() { this.setState({ name: '', - simulator: { node: this.props.nodes[0] ? this.props.nodes[0].name : '', simulator: this.props.nodes[0].simulators[0] ? this.props.nodes[0].simulators[0].name : '' }, + simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, length: '1', mapping: [ { name: 'Signal', type: 'Type' } ] }); @@ -138,7 +139,7 @@ class NewSimulationModelDialog extends Component { this.handleChange(e)}> {this.props.nodes.map(node => ( node.simulators.map((simulator, index) => ( - + )) ))} diff --git a/src/components/widget-value.js b/src/components/widget-value.js index eeceeed..f3451aa 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -32,15 +32,18 @@ class WidgetValue extends Component { componentWillReceiveProps(nextProps) { // update value - const simulator = nextProps.widget.simulator; + const simulator = nextProps.widget.simulator.simulator; + const node = nextProps.widget.simulator.node; - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { + //console.log(nextProps.widget.simulator); + + if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].values == null) { this.setState({ value: '' }); return; } // check if value has changed - const signal = nextProps.data[simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; if (this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 52f5649..0aff4bf 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -120,7 +120,15 @@ class Simulation extends Component { } getSimulatorName(simulator) { - return simulator.node + '/' + simulator.simulator; + var name = "undefined"; + + this.state.nodes.forEach(node => { + if (node._id === simulator.node) { + name = node.name + '/' + node.simulators[simulator.simulator].name; + } + }); + + return name; } render() { diff --git a/src/containers/visualization.js b/src/containers/visualization.js index a526df3..66c5403 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -65,13 +65,13 @@ class Visualization extends Component { editModal: prevState.editModal || false, modalData: prevState.modalData || null, modalIndex: prevState.modalIndex || null, - + maxWidgetHeight: prevState.maxWidgetHeight || 0, dropZoneHeight: prevState.dropZoneHeight || 0, last_widget_key: prevState.last_widget_key || 0 }; } - + componentWillMount() { AppDispatcher.dispatch({ type: 'visualizations/start-load' @@ -154,6 +154,7 @@ class Visualization extends Component { NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); } else { defaultSimulator = this.state.simulation.models[0].simulator; + console.log(defaultSimulator); } // create new widget @@ -167,7 +168,7 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets }); - + this.increaseHeightWithWidget(widget); this.setState({ visualization: visualization }); } @@ -185,7 +186,7 @@ class Visualization extends Component { var visualization = Object.assign({}, this.state.visualization, { 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); @@ -201,12 +202,12 @@ class Visualization extends Component { 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, + this.setState({ + maxWidgetHeight: maxHeight, dropZoneHeight: maxHeight + 40 }); } @@ -219,8 +220,8 @@ class Visualization extends Component { let thisWidgetHeight = widget.y + widget.height; if (thisWidgetHeight > this.state.maxWidgetHeight) { increased = true; - this.setState({ - maxWidgetHeight: thisWidgetHeight, + this.setState({ + maxWidgetHeight: thisWidgetHeight, dropZoneHeight: thisWidgetHeight + 40 }); } diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 457768c..a6bf05c 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -45,12 +45,6 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/opened': // create entry for simulator - /*state[action.identifier] = { signals: action.signals, values: [], sequence: null, timestamp: null }; - - for (i = 0; i < action.signals; i++) { - state[action.identifier].values.push([]); - }*/ - state[action.node._id] = {}; action.node.simulators.forEach(simulator => { From 101caf15c05fe4441b1646b0247482750ebdb381 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 11 Jul 2017 21:09:19 +0200 Subject: [PATCH 279/556] Change widget table data --- src/components/dialog/edit-widget.js | 7 ++++++- src/components/widget-table.js | 12 ++++++------ src/components/widget-value.js | 2 +- src/containers/visualization.js | 3 +-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 24866c3..398fd5a 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -71,7 +71,12 @@ class EditWidgetDialog extends Component { this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } else { let changeObject = {}; - changeObject[e.target.id] = e.target.value; + if (e.target.id === 'simulator') { + changeObject[e.target.id] = JSON.parse(e.target.value); + } else { + changeObject[e.target.id] = e.target.value; + } + this.setState({ temporal: Object.assign({}, this.state.temporal, changeObject ) }); } } diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 9c48a00..44d3966 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -38,33 +38,33 @@ class WidgetTable extends Component { // check data const simulator = nextProps.widget.simulator; - if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].length === 0 || nextProps.data[simulator].values[0].length === 0) { + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator.node][simulator.simulator] == null || nextProps.data[simulator.node][simulator.simulator].length === 0 || nextProps.data[simulator.node][simulator.simulator].values.length === 0 || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { // clear values this.setState({ rows: [], sequence: null }); return; } // check if new data, otherwise skip - if (this.state.sequence >= nextProps.data[simulator].sequence) { + /*if (this.state.sequence >= nextProps.data[simulator.node][simulator.simulator].sequence) { return; - } + }*/ // get simulation model const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator === simulator); + return (model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); }); // get rows var rows = []; - nextProps.data[simulator].values.forEach((signal, index) => { + nextProps.data[simulator.node][simulator.simulator].values.forEach((signal, index) => { rows.push({ name: simulationModel.mapping[index].name, value: signal[signal.length - 1].y.toFixed(3) }) }); - this.setState({ rows: rows, sequence: nextProps.data[simulator].sequence }); + this.setState({ rows: rows, sequence: nextProps.data[simulator.node][simulator.simulator].sequence }); } render() { diff --git a/src/components/widget-value.js b/src/components/widget-value.js index f3451aa..fdbb04b 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -44,7 +44,7 @@ class WidgetValue extends Component { // check if value has changed const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; - if (this.state.value !== signal[signal.length - 1].y) { + if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 66c5403..425f394 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -154,7 +154,6 @@ class Visualization extends Component { NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); } else { defaultSimulator = this.state.simulation.models[0].simulator; - console.log(defaultSimulator); } // create new widget @@ -236,7 +235,7 @@ class Visualization extends Component { if (data) { // save changes temporarily var widgets_update = {}; - widgets_update[this.state.modalIndex] = data; + widgets_update[this.state.modalIndex] = data; var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); From 36ae2d159e57b1ff2c9aa7eee09d61821fda5e6e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 11:22:52 +0200 Subject: [PATCH 280/556] Update plot widget to new simulator connection --- src/components/dialog/edit-widget-signals-control.js | 8 ++++---- src/components/widget-plot.js | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index 76b832b..c52b928 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -28,7 +28,7 @@ class EditWidgetSignalsControl extends Component { this.state = { widget: { - simulator: '' + simulator: {} } }; } @@ -58,12 +58,12 @@ class EditWidgetSignalsControl extends Component { if (this.props.simulation) { // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulator === this.state.widget.simulator ); + const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); // If simulation model update the signals to render signalsToRender = simulationModel? simulationModel.mapping : []; } - + return ( Signals @@ -81,4 +81,4 @@ class EditWidgetSignalsControl extends Component { } } -export default EditWidgetSignalsControl; \ No newline at end of file +export default EditWidgetSignalsControl; diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index ff0b1b1..c02aa97 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -27,7 +27,6 @@ import PlotLegend from './widget-plot/plot-legend'; class WidgetPlot extends Component { render() { - const simulator = this.props.widget.simulator; const simulation = this.props.simulation; let legendSignals = []; @@ -36,10 +35,10 @@ class WidgetPlot extends Component { // Proceed if a simulation with models and a simulator are available if (simulator && simulation && simulation.models.length > 0) { - const model = simulation.models.find( (model) => model.simulator === simulator ); + const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); const chosenSignals = this.props.widget.signals; - simulatorData = this.props.data[simulator]; + simulatorData = this.props.data[simulator.node][simulator.simulator]; // Query the signals that will be displayed in the legend legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { @@ -53,7 +52,7 @@ class WidgetPlot extends Component { return (

    {this.props.widget.name}

    - +
    From 83aa4f3495a58b1504c6b963bc17c2384d5319cd Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 12:20:44 +0200 Subject: [PATCH 281/556] Update table plot to new simulator connection --- src/components/widget-plot-table.js | 51 ++++++++++++++++------------- src/components/widget-plot/plot.js | 22 ++++++------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 0507b3f..7862a05 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -45,7 +45,7 @@ class WidgetPlotTable extends Component { // Identify if there was a change in the preselected signals if (nextProps.simulation && (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.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); @@ -54,20 +54,19 @@ class WidgetPlotTable extends Component { this.updatePreselectedSignalsState(nextProps); return; } - } // 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(nextProps) { const simulator = nextProps.widget.simulator; // get simulation model const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator === simulator); + return (model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); }); let preselectedSignals = []; @@ -89,13 +88,13 @@ class WidgetPlotTable extends Component { return accum; }, []); } - + this.setState({ preselectedSignals: preselectedSignals }); } updateSignalSelection(signal_index, checked) { // Update the selected signals and propagate to parent component - var new_widget = Object.assign({}, this.props.widget, { + var new_widget = Object.assign({}, this.props.widget, { signals: checked? this.state.signals.concat(signal_index) : this.state.signals.filter( (idx) => idx !== signal_index ) }); this.props.onWidgetChange(new_widget); @@ -106,31 +105,37 @@ class WidgetPlotTable extends Component { // Data passed to plot let simulator = this.props.widget.simulator; - let simulatorData = this.props.data[simulator]; + let simulatorData = []; + + if (this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null) { + simulatorData = this.props.data[simulator.node][simulator.simulator]; + } if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { // Create checkboxes using the signal indices from simulation model checkBoxes = this.state.preselectedSignals.map( (signal) => { - var checked = this.state.signals.indexOf(signal.index) > -1; - var chkBxClasses = classNames({ - 'btn': true, - 'btn-default': true, - 'active': checked - }); - return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } - }); + var checked = this.state.signals.indexOf(signal.index) > -1; + var chkBxClasses = classNames({ + 'btn': true, + 'btn-default': true, + 'active': checked + }); + return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } + }); } // Prepare an array with the signals to show in the legend var legendSignals = this.state.preselectedSignals.reduce( (accum, signal, i) => { - if (this.state.signals.includes(signal.index)) { - accum.push({ - index: signal.index, - name: signal.name - }) - } - return accum; - }, []); + if (this.state.signals.includes(signal.index)) { + accum.push({ + index: signal.index, + name: signal.name + }); + } + return accum; + }, []); + + return (
    diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 6bae9d0..7b0c3aa 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -14,7 +14,7 @@ import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; class Plot extends Component { constructor(props) { super(props); - + this.chartWrapper = null; // Initialize plot size and data @@ -24,7 +24,7 @@ class Plot extends Component { ); } - // Get an object with 'invisible' init data for the last minute. + // Get an object with 'invisible' init data for the last minute. // Include start/end timestamps if required. getPlotInitData(withRangeTimestamps = false) { @@ -32,8 +32,8 @@ class Plot extends Component { const initFirstTime = initSecondTime - 1000 * 60; // Decrease 1 min const values = [{ values: [{x: initFirstTime, y: 0}], strokeWidth: 0 }]; - let output = withRangeTimestamps? - { sequence: 0, values: values, firstTimestamp: initFirstTime, latestTimestamp: initSecondTime, } : + let output = withRangeTimestamps? + { sequence: 0, values: values, firstTimestamp: initFirstTime, latestTimestamp: initSecondTime, } : { sequence: 0, values: values }; return output; @@ -58,19 +58,19 @@ class Plot extends Component { // Identify simulation reset if (nextData == null || nextData.length === 0 || nextData.values[0].length === 0) { this.clearPlot(); return; } - + // check if new data, otherwise skip if (this.state.sequence >= nextData.sequence) { return; } - + this.updatePlotData(nextProps); } signalsWereJustCleared(nextProps) { - return this.props.signals && - nextProps.signals && - this.props.signals.length > 0 && + return this.props.signals && + nextProps.signals && + this.props.signals.length > 0 && nextProps.signals.length === 0; } @@ -102,7 +102,7 @@ class Plot extends Component { nextProps.signals.forEach((signal_index, i, arr) => ( // Include signal index, useful to relate them to the signal selection values.push( - { + { index: signal_index, values: nextData.values[signal_index].slice(firstIndex, nextData.values[signal_index].length - 1)}) )); @@ -138,4 +138,4 @@ class Plot extends Component { } -export default Plot; \ No newline at end of file +export default Plot; From 4b44ab0a809da494da8724ddf26413759803e1ee Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 12:25:09 +0200 Subject: [PATCH 282/556] Update gauge to new simulator connection --- src/components/widget-gauge.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index b4365fe..6f5ac06 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -69,23 +69,23 @@ class WidgetGauge extends Component { return this.state.value !== nextState.value; } - componentWillReceiveProps(nextProps) { + componentWillReceiveProps(nextProps) { // update value const simulator = nextProps.widget.simulator; - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].values == null) { + if (nextProps.data == null || nextProps.data[simulator.node][simulator.simulator] == null || nextProps.data[simulator.node][simulator.simulator].values == null) { this.setState({ value: 0 }); return; } // check if value has changed - const signal = nextProps.data[simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[simulator.node][simulator.simulator].values[nextProps.widget.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 - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; + const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; if (this.state.value !== new_value) { this.setState({ value: new_value }); - + // update gauge's value this.gauge.set(new_value); } @@ -101,7 +101,7 @@ class WidgetGauge extends Component { var signalType = null; if (this.props.simulation) { - var simulationModel = this.props.simulation.models.filter((model) => model.simulator === this.props.widget.simulator)[0]; + var simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; signalType = simulationModel && simulationModel.length > 0? simulationModel.mapping[this.props.widget.signal].type : ''; } From 6d0ad4c2360d971ffe736ddb8ceecabd48d7e670 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 12 Jul 2017 12:50:38 +0200 Subject: [PATCH 283/556] Fix gauge signal data --- src/components/widget-gauge.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 6f5ac06..800f043 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -82,12 +82,14 @@ class WidgetGauge extends Component { const signal = nextProps.data[simulator.node][simulator.simulator].values[nextProps.widget.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 - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; - if (this.state.value !== new_value) { - this.setState({ value: new_value }); + if (signal != null) { + const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; + if (this.state.value !== new_value) { + this.setState({ value: new_value }); - // update gauge's value - this.gauge.set(new_value); + // update gauge's value + this.gauge.set(new_value); + } } } @@ -102,7 +104,7 @@ class WidgetGauge extends Component { if (this.props.simulation) { var simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; - signalType = simulationModel && simulationModel.length > 0? simulationModel.mapping[this.props.widget.signal].type : ''; + signalType = (simulationModel != null && simulationModel.length > 0) ? simulationModel.mapping[this.props.widget.signal].type : ''; } return ( From aceb96ec82dbca79bdd837a1b884d81f6a8c12cd Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 11:39:16 +0200 Subject: [PATCH 284/556] Ensure unique node and simulator names in dialogs Node names are checked to be unique in dialogs Simulator names are checked to be unique in dialogs on one node --- src/components/dialog/edit-node.js | 4 ++-- src/components/dialog/edit-simulator.js | 2 +- src/components/dialog/new-node.js | 4 ++-- src/components/dialog/new-simulator.js | 2 +- src/containers/simulators.js | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js index da72a4a..b6475c3 100644 --- a/src/components/dialog/edit-node.js +++ b/src/components/dialog/edit-node.js @@ -60,11 +60,11 @@ class NewNodeDialog extends React.Component { var endpoint = true; var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.nodes.find(node => node._id !== this.state._id && node.name === this.state.name) !== undefined) { name = false; } - if (this.state.endpoint === '') { + if (this.state.endpoint === '' || this.props.nodes.find(node => node._id !== this.state._id && node.endpoint === this.state.endpoint) !== undefined) { endpoint = false; } diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index 6469b89..f7f6d76 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -63,7 +63,7 @@ class EditSimulatorDialog extends Component { // check all controls var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.node.simulators.find(simulator => this.props.simulator.name !== this.state.name && simulator.name === this.state.name) !== undefined) { name = false; } diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index ae89a35..44afa9d 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -59,11 +59,11 @@ class NewNodeDialog extends React.Component { var endpoint = true; var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.nodes.find(node => node.name === this.state.name) !== undefined) { name = false; } - if (this.state.endpoint === '') { + if (this.state.endpoint === '' || this.props.nodes.find(node => node.endpoint === this.state.endpoint) !== undefined) { endpoint = false; } diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 8e22e3d..f4c293d 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -60,7 +60,7 @@ class NewSimulatorDialog extends Component { // check all controls var name = true; - if (this.state.name === '') { + if (this.state.name === '' || this.props.node.simulators.find(simulator => simulator.name === this.state.name) !== undefined) { name = false; } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index acaf5ad..3e258a6 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -200,12 +200,12 @@ class Simulators extends Component { this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> - this.closeNewNodeModal(data)} /> - this.closeEditNodeModal(data)} /> - this.closeAddSimulatorModal(data)} /> + this.closeNewNodeModal(data)} nodes={this.state.nodes} /> + this.closeEditNodeModal(data)} nodes={this.state.nodes} /> + this.closeAddSimulatorModal(data)} node={this.state.modalData}/> {this.state.editSimulatorModal && - this.closeEditSimulatorModal(data)} /> + this.closeEditSimulatorModal(data)} node={this.state.modalData} /> } From 19dc2e55c38100c7c76f16c2690a6eaab6e88b37 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 11:46:48 +0200 Subject: [PATCH 285/556] Discard unrequested data --- src/stores/simulator-data-store.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index a6bf05c..5f5a829 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -54,6 +54,11 @@ class SimulationDataStore extends ReduceStore { return state; case 'simulatorData/data-changed': + // check if data is required, otherwise discard + if (state[action.node._id] == null || state[action.data.id] == null) { + return state; + } + // only add data, if newer than current if (state[action.node._id][action.data.id].sequence < action.data.sequence) { // add data to simulator From ac19c3c48dbe2754c615bfa618014ae7b05e5f2d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 12:04:59 +0200 Subject: [PATCH 286/556] Display simulator status in tree-view Remove unneeded files anymore --- src/components/node-tree.js | 2 +- src/data-managers/simulators-data-manager.js | 106 --------------- src/stores/simulator-store.js | 128 ------------------- 3 files changed, 1 insertion(+), 235 deletions(-) delete mode 100644 src/data-managers/simulators-data-manager.js delete mode 100644 src/stores/simulator-store.js diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 1e60038..24c1be3 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -67,7 +67,7 @@ class NodeTree extends React.Component { var parent = { title: node.name, subtitle: node.endpoint, id: node._id, config: node.config, children: [], expanded: true }; node.simulators.forEach((simulator) => { - parent.children.push({ title: simulator.name }); + parent.children.push({ title: simulator.name, subtitle: simulator.id != null ? 'Online' : 'Offline' }); }); treeData.push(parent); diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js deleted file mode 100644 index 23dbe7b..0000000 --- a/src/data-managers/simulators-data-manager.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * File: simulators-data-manager.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 RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; - -function isRunning(simulator) { - // get path to nodes.json and simulator name - var path = simulator.endpoint.substring(0, simulator.endpoint.lastIndexOf('/')); - - var url = 'http://' + path + '/api/v1'; - var body = { - action: 'nodes', - id: '1234' /// @todo use random generated id - }; - - // send request - RestAPI.post(url, body).then(response => { - // check if simulator is running - simulator.running = false; - - if (response.id === body.id) { - response.response.forEach(sim => { - if (sim.name === simulator.name) { - simulator.running = true; - } - }); - } - - AppDispatcher.dispatch({ - type: 'simulators/running', - simulator: simulator, - running: simulator.running - }); - }).catch(error => { - simulator.running = false; - - AppDispatcher.dispatch({ - type: 'simulators/running', - simulator: simulator, - running: simulator.running - }); - }); -} - -class SimulatorsDataManager extends RestDataManager { - constructor() { - super('simulator', '/simulators', [ '_id', 'name', 'endpoint' ]); - - this._timers = []; - } - - startRunningDetection(obj) { - const simulator = JSON.parse(JSON.stringify(obj)); - - // check if timer is already running - const index = this._timers.findIndex(timer => { - return timer.simulator === simulator._id; - }); - - if (index !== -1) { - return; - } - - // do first request for fast response time - isRunning(simulator); - - // start new timer - const timerID = setInterval(isRunning, 5000, simulator); - this._timers.push({ id: timerID, simulator: simulator._id }); - } - - stopRunningDetection(simulator) { - // remove timer - const index = this._timers.findIndex(timer => { - return timer.simulator === simulator._id; - }); - - if (index !== -1) { - // stop timer and delete from list - clearInterval(this._timers[index].id); - this._timers.splice(index, 1); - } - } -} - -export default new SimulatorsDataManager(); diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js deleted file mode 100644 index 4f8d6bd..0000000 --- a/src/stores/simulator-store.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * File: villas-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 - * 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 './array-store'; -import SimulatorsDataManager from '../data-managers/simulators-data-manager'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; - -class SimulatorStore extends ArrayStore { - constructor() { - super('simulators', SimulatorsDataManager); - } - - reduce(state, action) { - var simulator; - - switch (action.type) { - - case 'simulators/added': - SimulatorsDataManager.startRunningDetection(action.data); - - return super.reduce(state, action); - - case 'simulators/removed': - SimulatorsDataManager.stopRunningDetection(action.original); - - return super.reduce(state, action); - - case 'simulators/start-edit': - // An update will be requested, stop the 'runningDetection' already - SimulatorsDataManager.stopRunningDetection(action.data); - - return super.reduce(state, action); - - case 'simulators/edited': - // The update was done, resume the 'runningDetection' - SimulatorsDataManager.startRunningDetection(action.data); - - return super.reduce(state, action); - - case 'simulators/loaded': - // get simulator running state - if (Array.isArray(action.data)) { - action.data.forEach((simulator) => { - SimulatorsDataManager.startRunningDetection(simulator); - }); - } else { - SimulatorsDataManager.startRunningDetection(action.data); - } - - return super.reduce(state, action); - - case 'simulators/running': - // check if simulator running state changed - simulator = state.find(element => element._id === action.simulator._id ); - - // is this simulator still in the state? update it only if state changed - if (simulator && simulator.running !== action.simulator.running) { - state = this.updateElements(state, [ action.simulator ]); - } - - return state; - - case 'simulatorData/opened': - // get simulator - simulator = state.find(element => { - return element._id === action.identifier; - }); - - if (action.firstOpen === false) { - NotificationsDataManager.addNotification({ - title: 'Simulator online', - message: 'Simulator \'' + simulator.name + '\' went online.', - level: 'info' - }); - } - - // restart requesting again - SimulatorsDataManager.stopRunningDetection(simulator); - - return state; - - case 'simulatorData/closed': - // get simulator - simulator = state.find(element => { - return element._id === action.identifier; - }); - - // update running state - simulator.running = false; - - if (action.notification) { - NotificationsDataManager.addNotification({ - title: 'Simulator offline', - message: 'Simulator \'' + simulator.name + '\' went offline.', - level: 'info' - }); - - // restart requesting again - SimulatorsDataManager.startRunningDetection(simulator); - } - - return this.updateElements(state, [ simulator ]); - - default: - return super.reduce(state, action); - } - } -} - -export default new SimulatorStore(); From fa9fc617252e81844e60a1294663d2fc8d778fc5 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 13 Jul 2017 17:13:18 +0200 Subject: [PATCH 287/556] Fix simulator data discarding --- src/components/dialog/new-simulation-model.js | 2 -- src/stores/simulator-data-store.js | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 8ae219c..a0af323 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -48,7 +48,6 @@ class NewSimulationModelDialog extends Component { onClose(canceled) { if (canceled === false) { - console.log(this.state); this.props.onClose(this.state); } else { this.props.onClose(); @@ -70,7 +69,6 @@ class NewSimulationModelDialog extends Component { } if (e.target.id === 'simulator') { - console.log(e.target.value); this.setState({ simulator: JSON.parse(e.target.value) }); } else { this.setState({ [e.target.id]: e.target.value }); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 5f5a829..2dd4336 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -55,7 +55,7 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/data-changed': // check if data is required, otherwise discard - if (state[action.node._id] == null || state[action.data.id] == null) { + if (state[action.node._id] == null || state[action.node._id][action.data.id] == null) { return state; } From 355e524348df7e2ba5923d3328e2c43bb3af8a7c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 21 Jul 2017 14:15:09 +0200 Subject: [PATCH 288/556] Fix docker deployment --- docker-compose.yml | 8 ++------ etc/nginx/villas.conf | 8 ++++++-- src/data-managers/rest-data-manager.js | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 58f4b4e..ff25a1a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,10 +10,8 @@ networks: services: # The VILLASweb frontend frontend: - build: + build: context: . - environment: - - REACT_APP_HTTP_PROXY ports: - "80:80" - "443:443" @@ -26,8 +24,6 @@ services: build: backend environment: - NODE_ENV=production - ports: - - "4000:4000" restart: always networks: villas: @@ -65,4 +61,4 @@ services: volumes: - "./etc/node/:/etc/villas/node/" networks: - villas: \ No newline at end of file + villas: diff --git a/etc/nginx/villas.conf b/etc/nginx/villas.conf index 58872f4..4dabe64 100644 --- a/etc/nginx/villas.conf +++ b/etc/nginx/villas.conf @@ -13,8 +13,12 @@ server { proxy_pass http://backend:4000/; } - - location /ws/ { + + location /ws/api/ { + proxy_pass http://node/api/; + } + + location /ws { proxy_pass http://node/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 749cdcd..2ae0a46 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -22,8 +22,7 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; -const HOST = process.env.REACT_APP_HTTP_PROXY || "http://localhost:4000"; -const API_URL = HOST + '/api/v1'; +const API_URL = '/api/v1'; class RestDataManager { constructor(type, url, keyFilter) { From 09bf7f1b38d6e8009e675a924414fa457d13aef4 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 22 Jul 2017 04:03:10 +0200 Subject: [PATCH 289/556] build node application with Docker --- .dockerignore | 1 + Dockerfile | 25 +++++++++++++++++-------- docker-compose.yml | 13 +++++++++++-- etc/nginx/villas.conf | 2 +- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/.dockerignore b/.dockerignore index a51ea8a..4f0a173 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,3 @@ node_modules/ doc/ +npm-debug.log diff --git a/Dockerfile b/Dockerfile index c88afc6..649ea8c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,19 @@ -FROM nginx:stable-alpine +FROM node:8.2 -# Copy frontend files and make them accesible to nginx -RUN mkdir /www -COPY build /www -RUN chown nginx:nginx -R /www -RUN chmod -R 0755 /www +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app -# Copy nginx configuration -COPY etc/nginx/villas.conf /etc/nginx/conf.d/default.conf +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +VOLUME /usr/src/app/build + +# Bundle app source +COPY . /usr/src/app +RUN npm run build + +EXPOSE 80 + +CMD [ "npm", "start" ] diff --git a/docker-compose.yml b/docker-compose.yml index ff25a1a..7dbf6f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,14 +8,23 @@ networks: villas: services: - # The VILLASweb frontend + # Build the frontend with node into a Docker volume + # This container does nothing useful beside providing an + # assets container to the nginx service frontend: build: context: . + command: "/bin/true" + + nginx: + image: nginx:stable-alpine ports: - "80:80" - "443:443" - restart: always + volumes: + - "./etc/nginx/villas.conf:/etc/nginx/conf.d/default.conf" + volumes_from: + - frontend networks: villas: diff --git a/etc/nginx/villas.conf b/etc/nginx/villas.conf index 4dabe64..a745f91 100644 --- a/etc/nginx/villas.conf +++ b/etc/nginx/villas.conf @@ -27,7 +27,7 @@ server { # frontend location location / { - root /www; + root /usr/src/app/build/; } # error pages From 063e91522ffb4ea0a282173a4cf76abf794b1181 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 22 Jul 2017 05:00:32 +0200 Subject: [PATCH 290/556] get rid of bind volumes as they do not work for deployments on remote Docker daemons --- Dockerfile.nginx | 3 +++ Dockerfile.node | 3 +++ docker-compose.yml | 33 +++++++++++++++++---------------- 3 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 Dockerfile.nginx create mode 100644 Dockerfile.node diff --git a/Dockerfile.nginx b/Dockerfile.nginx new file mode 100644 index 0000000..14e8087 --- /dev/null +++ b/Dockerfile.nginx @@ -0,0 +1,3 @@ +FROM nginx:stable-alpine + +COPY etc/nginx/villas.conf /etc/nginx/conf.d/default.conf diff --git a/Dockerfile.node b/Dockerfile.node new file mode 100644 index 0000000..a778e3c --- /dev/null +++ b/Dockerfile.node @@ -0,0 +1,3 @@ +FROM villas/node:latest + +COPY etc/node/*.conf /etc/villas/node/ diff --git a/docker-compose.yml b/docker-compose.yml index 7dbf6f3..6e984cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,12 +17,12 @@ services: command: "/bin/true" nginx: - image: nginx:stable-alpine + build: + context: . + dockerfile: Dockerfile.nginx ports: - "80:80" - "443:443" - volumes: - - "./etc/nginx/villas.conf:/etc/nginx/conf.d/default.conf" volumes_from: - frontend networks: @@ -51,23 +51,24 @@ services: villas: # AMQP broker for VILLAScontroller - broker: - image: rabbitmq:management - environment: - RABBITMQ_DEFAULT_USER: "villas" - RABBITMQ_DEFAULT_PASS: "s3c0sim4!" - ports: - - "8080:15672" - - "5672:5672" - networks: - villas: +# broker: +# image: rabbitmq:management +# environment: +# RABBITMQ_DEFAULT_USER: "villas" +# RABBITMQ_DEFAULT_PASS: "s3c0sim4!" +# ports: +# - "8080:15672" +# - "5672:5672" +# networks: +# villas: # VILLASnode, the gateway between UDP and WebSocket traffic node: - image: villas/node:latest + build: + context: . + dockerfile: Dockerfile.node privileged: true + restart: always command: node /etc/villas/node/websocket-demo.conf - volumes: - - "./etc/node/:/etc/villas/node/" networks: villas: From 76df1a30298e86cf7059a052b176d66800242826 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 22 Jul 2017 11:49:10 +0200 Subject: [PATCH 291/556] delete old docker-compose containers to avoid full disks --- .gitlab-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 170624c..8b20e73 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,7 +66,11 @@ deploy_review: - docker-compose --version - docker info script: - - docker-compose up -d --force-recreate --build + - docker-compose pull + - docker-compose build --no-cache + - docker-compose up -d + after_script: + - docker-compose rm -f image: docker:17 dependencies: - build_job From 2b5c222bc8043748192ec0dd6a30bea386208296 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 25 Jul 2017 14:58:56 +0200 Subject: [PATCH 292/556] Fix simulator data IDs --- src/stores/simulator-data-store.js | 59 ++++++++++++++++-------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 2dd4336..9033fd3 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -47,45 +47,50 @@ class SimulationDataStore extends ReduceStore { // create entry for simulator state[action.node._id] = {}; - action.node.simulators.forEach(simulator => { - state[action.node._id][simulator.id] = { sequence: -1, values: [] }; + action.node.simulators.forEach((simulator, index) => { + state[action.node._id][index] = { sequence: -1, values: [] }; }); return state; case 'simulatorData/data-changed': - // check if data is required, otherwise discard - if (state[action.node._id] == null || state[action.node._id][action.data.id] == null) { - return state; - } + // get index for simulator id + if (state[action.node._id] == null) { + return state; + } - // only add data, if newer than current - if (state[action.node._id][action.data.id].sequence < action.data.sequence) { - // add data to simulator - for (i = 0; i < action.data.length; i++) { - while (state[action.node._id][action.data.id].values.length < i + 1) { - state[action.node._id][action.data.id].values.push([]); - } + let index = action.node.simulators.findIndex(simulator => simulator.id === action.data.id); + if (index === -1 || state[action.node._id][index] == null) { + return state; + } - state[action.node._id][action.data.id].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); - - // erase old values - if (state[action.node._id][action.data.id].values[i].length > MAX_VALUES) { - const pos = state[action.node._id][action.data.id].values[i].length - MAX_VALUES; - state[action.node._id][action.data.id].values[i].splice(0, pos); - } + // only add data, if newer than current + if (state[action.node._id][index].sequence < action.data.sequence) { + // add data to simulator + for (i = 0; i < action.data.length; i++) { + while (state[action.node._id][index].values.length < i + 1) { + state[action.node._id][index].values.push([]); } - // update metadata - state[action.node._id][action.data.id].timestamp = action.data.timestamp; - state[action.node._id][action.data.id].sequence = action.data.sequence; + state[action.node._id][index].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); - // explicit call to prevent array copy - this.__emitChange(); - } else { - console.log('same sequence ' + state[action.node._id][action.data.id].sequence + ' ' + action.data.sequence); + // erase old values + if (state[action.node._id][index].values[i].length > MAX_VALUES) { + const pos = state[action.node._id][index].values[i].length - MAX_VALUES; + state[action.node._id][index].values[i].splice(0, pos); + } } + // update metadata + state[action.node._id][index].timestamp = action.data.timestamp; + state[action.node._id][index].sequence = action.data.sequence; + + // explicit call to prevent array copy + this.__emitChange(); + } else { + console.log('same sequence ' + state[action.node._id][index].sequence + ' ' + action.data.sequence); + } + return state; case 'simulatorData/closed': From 3d4d8d105c612589f13b925b72f0de46a2c335ee Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 26 Jul 2017 10:44:04 +0200 Subject: [PATCH 293/556] Fix new simulation model dialog Update react-bootstrap to newest version --- package.json | 2 +- src/components/dialog/new-simulation-model.js | 2 +- src/components/dialog/new-simulator.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c423476..98e3fa3 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "rc-slider": "^7.0.1", "rd3": "^0.7.4", "react": "^15.4.2", - "react-bootstrap": "^0.30.7", + "react-bootstrap": "^0.31.1", "react-contextmenu": "^2.3.0", "react-d3": "^0.4.0", "react-dnd": "^2.2.4", diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index a0af323..79b3548 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -134,7 +134,7 @@ class NewSimulationModelDialog extends Component { Simulator - this.handleChange(e)}> + this.handleChange(e)}> {this.props.nodes.map(node => ( node.simulators.map((simulator, index) => ( diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index f4c293d..3d9890c 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -60,7 +60,7 @@ class NewSimulatorDialog extends Component { // check all controls var name = true; - if (this.state.name === '' || this.props.node.simulators.find(simulator => simulator.name === this.state.name) !== undefined) { + if (this.state.name === '' || this.props.node.simulators == null || this.props.node.simulators.find(simulator => simulator.name === this.state.name) !== undefined) { name = false; } From 34f13811337df4de6a98d517dc43b96e5c8d1f61 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 26 Jul 2017 10:45:23 +0200 Subject: [PATCH 294/556] Fix various errors in deployment Fix website volume Update backend submodule Remove unneeded open ports --- Dockerfile | 12 +++--------- backend | 2 +- docker-compose.yml | 21 +++++---------------- etc/nginx/villas.conf | 2 +- 4 files changed, 10 insertions(+), 27 deletions(-) diff --git a/Dockerfile b/Dockerfile index 649ea8c..9307e76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,15 +5,9 @@ RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies -COPY package.json /usr/src/app/ -RUN npm install +COPY . /usr/src/app +RUN npm install && npm run build VOLUME /usr/src/app/build -# Bundle app source -COPY . /usr/src/app -RUN npm run build - -EXPOSE 80 - -CMD [ "npm", "start" ] +CMD [ "true" ] diff --git a/backend b/backend index 22e594a..c3bbf18 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 22e594a848798a79f0ab90e6e0a6ff2fe3d91e8b +Subproject commit c3bbf18279b892374c8998a455d57ec8acc92501 diff --git a/docker-compose.yml b/docker-compose.yml index 6e984cf..3ae3f92 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,9 +3,7 @@ version: "2" volumes: database: driver: local - -networks: - villas: + website: services: # Build the frontend with node into a Docker volume @@ -14,7 +12,8 @@ services: frontend: build: context: . - command: "/bin/true" + volumes: + - website:/usr/src/app/build nginx: build: @@ -23,10 +22,8 @@ services: ports: - "80:80" - "443:443" - volumes_from: - - frontend - networks: - villas: + volumes: + - website:/www # The VILLASweb backend backend: @@ -34,8 +31,6 @@ services: environment: - NODE_ENV=production restart: always - networks: - villas: # The MongoDB database for the VILLASweb backend database: @@ -43,12 +38,8 @@ services: user: mongodb volumes: - database:/data/db - expose: - - "27017" restart: always user: mongodb - networks: - villas: # AMQP broker for VILLAScontroller # broker: @@ -70,5 +61,3 @@ services: privileged: true restart: always command: node /etc/villas/node/websocket-demo.conf - networks: - villas: diff --git a/etc/nginx/villas.conf b/etc/nginx/villas.conf index a745f91..4dabe64 100644 --- a/etc/nginx/villas.conf +++ b/etc/nginx/villas.conf @@ -27,7 +27,7 @@ server { # frontend location location / { - root /usr/src/app/build/; + root /www; } # error pages From 50d8f525081fd3922b2d589db0c52b2b91f06515 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 26 Jul 2017 12:16:14 +0200 Subject: [PATCH 295/556] Add production docker-compose --- docker-compose-production.yml | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docker-compose-production.yml diff --git a/docker-compose-production.yml b/docker-compose-production.yml new file mode 100644 index 0000000..2f229e0 --- /dev/null +++ b/docker-compose-production.yml @@ -0,0 +1,61 @@ +version: "2" + +volumes: + database: + driver: local + website: + +services: + # Build the frontend with node into a Docker volume + # This container does nothing useful beside providing an + # assets container to the nginx service + frontend: + image: villas-web + volumes: + - website:/usr/src/app/build + + nginx: + image: nginx:stable-alpine + ports: + - "80:80" + - "443:443" + volumes: + - website:/www + - ./etc/nginx:/etc/nginx/conf.d/ + + # The VILLASweb backend + backend: + image: villas-backend + environment: + - NODE_ENV=production + restart: always + + # The MongoDB database for the VILLASweb backend + database: + image: mongo:latest + user: mongodb + volumes: + - database:/data/db + restart: always + user: mongodb + + # AMQP broker for VILLAScontroller +# broker: +# image: rabbitmq:management +# environment: +# RABBITMQ_DEFAULT_USER: "villas" +# RABBITMQ_DEFAULT_PASS: "s3c0sim4!" +# ports: +# - "8080:15672" +# - "5672:5672" +# networks: +# villas: + + # VILLASnode, the gateway between UDP and WebSocket traffic + node: + image: villas/node + privileged: true + restart: always + command: node /etc/villas/node/websocket-demo.conf + volumes: + - ./etc/node:/etc/villas/node/ From 37af4f5151558ffb8261e5e14f0473faca6dbd26 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 26 Jul 2017 23:10:29 +0200 Subject: [PATCH 296/556] Move plot to raw d3 with react Remove rd3 dependency for plots. Drawing with react and raw d3 drastically improves performance. This is most due d3 has its own DOM manipulation. If this is used, it interferes with reacts DOM manipulation. Now only d3 helper libraries are used and the svg is drawn by react itself. Thus the performance gets a huge boost on plots. --- package.json | 6 +- src/components/widget-plot.js | 26 ++--- src/components/widget-plot/plot.js | 158 +++++++---------------------- 3 files changed, 53 insertions(+), 137 deletions(-) diff --git a/package.json b/package.json index 98e3fa3..e71b043 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,11 @@ "dependencies": { "bootstrap": "^3.3.7", "classnames": "^2.2.5", - "d3-scale": "^1.0.5", + "d3-array": "^1.2.0", + "d3-axis": "^1.0.8", + "d3-scale": "^1.0.6", + "d3-selection": "^1.1.0", + "d3-shape": "^1.2.0", "es6-promise": "^4.0.5", "flux": "^3.1.2", "gaugeJS": "^1.3.2", diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index c02aa97..56b5b2a 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -19,13 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import Plot from './widget-plot/plot'; -import PlotLegend from './widget-plot/plot-legend'; - -class WidgetPlot extends Component { +//import PlotLegend from './widget-plot/plot-legend'; +class WidgetPlot extends React.Component { render() { const simulator = this.props.widget.simulator; const simulation = this.props.simulation; @@ -38,15 +37,15 @@ class WidgetPlot extends Component { const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); const chosenSignals = this.props.widget.signals; - simulatorData = this.props.data[simulator.node][simulator.simulator]; + simulatorData = this.props.data[simulator.node][simulator.simulator].values[0]; // Query the signals that will be displayed in the legend legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { - if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: model_signal.name }); - } - return accum; - }, []); + if (chosenSignals.includes(signal_index)) { + accum.push({ index: signal_index, name: model_signal.name }); + } + return accum; + }, []); } return ( @@ -54,9 +53,12 @@ class WidgetPlot extends Component {

    {this.props.widget.name}

    - +
    -
    ); } diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 7b0c3aa..ee29df4 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -7,135 +7,45 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import React, { Component } from 'react'; -import { LineChart } from 'rd3'; -import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; - -class Plot extends Component { - constructor(props) { - super(props); - - this.chartWrapper = null; - - // Initialize plot size and data - this.state = Object.assign( - { size: { w: 0, h: 0 } }, - this.getPlotInitData(true) - ); - } - - // Get an object with 'invisible' init data for the last minute. - // Include start/end timestamps if required. - getPlotInitData(withRangeTimestamps = false) { - - const initSecondTime = Date.now(); - const initFirstTime = initSecondTime - 1000 * 60; // Decrease 1 min - const values = [{ values: [{x: initFirstTime, y: 0}], strokeWidth: 0 }]; - - let output = withRangeTimestamps? - { sequence: 0, values: values, firstTimestamp: initFirstTime, latestTimestamp: initSecondTime, } : - { sequence: 0, values: values }; - - return output; - } - - componentWillReceiveProps(nextProps) { - let nextData = nextProps.simulatorData; - - // handle plot size - const w = this.chartWrapper.offsetWidth - 20; - const h = this.chartWrapper.offsetHeight - 20; - const currentSize = this.state.size; - if (w !== currentSize.w || h !== currentSize.h) { - this.setState({size: { w, h } }); - } - - // If signals were cleared, clear the plot (triggers a new state) - if (this.signalsWereJustCleared(nextProps)) { this.clearPlot(); return; } - - // If no signals have been selected, just leave - if (nextProps.signals == null || nextProps.signals.length === 0) { return; } - - // Identify simulation reset - if (nextData == null || nextData.length === 0 || nextData.values[0].length === 0) { this.clearPlot(); return; } - - // check if new data, otherwise skip - if (this.state.sequence >= nextData.sequence) { return; } - - this.updatePlotData(nextProps); - - } - - signalsWereJustCleared(nextProps) { - - return this.props.signals && - nextProps.signals && - this.props.signals.length > 0 && - nextProps.signals.length === 0; - } - - clearPlot() { - this.setState( this.getPlotInitData(false) ); - } - - updatePlotData(nextProps) { - let nextData = nextProps.simulatorData; - - // get timestamps - var latestTimestamp = nextData.values[0][nextData.values[0].length - 1].x; - var firstTimestamp = latestTimestamp - nextProps.time * 1000; - var firstIndex; - - if (nextData.values[0][0].x < firstTimestamp) { - // find element index representing firstTimestamp - firstIndex = nextData.values[0].findIndex((value) => { - return value.x >= firstTimestamp; - }); - } else { - firstIndex = 0; - firstTimestamp = nextData.values[0][0].x; - latestTimestamp = firstTimestamp + nextProps.time * 1000; - } - - // copy all values for each signal in time region - var values = []; - nextProps.signals.forEach((signal_index, i, arr) => ( - // Include signal index, useful to relate them to the signal selection - values.push( - { - index: signal_index, - values: nextData.values[signal_index].slice(firstIndex, nextData.values[signal_index].length - 1)}) - )); - - this.setState({ values: values, firstTimestamp: firstTimestamp, latestTimestamp: latestTimestamp, sequence: nextData.sequence }); - } +import React from 'react'; +import { scaleLinear, scaleTime } from 'd3-scale'; +import { extent, max } from 'd3-array'; +import { line } from 'd3-shape'; +import { axisBottom, axisLeft } from 'd3-axis'; +import { select } from 'd3-selection'; +class Plot extends React.Component { render() { - // Make tick count proportional to the plot width using a rough scale ratio - var tickCount = Math.round(this.state.size.w / 80); + const leftMargin = 30; + const bottomMargin = 20; + const values = 100; - return ( -
    this.chartWrapper = domNode }> - {this.state.sequence != null && - { if (d != null) { return new Date(d.x); } }} - xAxisTickCount={ tickCount } - yAxisLabel={ this.props.yAxisLabel } - hoverAnimation={false} - circleRadius={0} - domain={{ x: [this.state.firstTimestamp, this.state.latestTimestamp] }} - /> - } -
    + let data = this.props.data; + + if (data.length > values) { + data = data.slice(data.length - values); + } + + const xScale = scaleTime().domain(extent(data, p => new Date(p.x))).range([leftMargin, this.props.width]); + const yScale = scaleLinear().domain(extent(data, p => p.y)).range([this.props.height, bottomMargin]); + + const xAxis = axisBottom().scale(xScale).ticks(5); + const yAxis = axisLeft().scale(yScale).ticks(5); + + const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); + const linePath = sparkLine(data); + + return( + + select(node).call(xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> + select(node).call(yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> + + + + + ); } - } export default Plot; From 15fd134f9e5ba05d320eec6a8d45e6401ebbf54c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 00:28:19 +0200 Subject: [PATCH 297/556] Add time scaling --- src/components/widget-plot.js | 19 ++++++++++--------- src/components/widget-plot/plot.js | 29 +++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 56b5b2a..2fb5b93 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -28,24 +28,24 @@ class WidgetPlot extends React.Component { render() { const simulator = this.props.widget.simulator; const simulation = this.props.simulation; - let legendSignals = []; + //let legendSignals = []; let simulatorData = []; // Proceed if a simulation with models and a simulator are available if (simulator && simulation && simulation.models.length > 0) { - const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); - const chosenSignals = this.props.widget.signals; + //const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); + //const chosenSignals = this.props.widget.signals; simulatorData = this.props.data[simulator.node][simulator.simulator].values[0]; // Query the signals that will be displayed in the legend - legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { + /*legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { if (chosenSignals.includes(signal_index)) { accum.push({ index: signal_index, name: model_signal.name }); } return accum; - }, []); + }, []);*/ } return ( @@ -53,10 +53,11 @@ class WidgetPlot extends React.Component {

    {this.props.widget.name}

    -
    diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index ee29df4..ce30589 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -9,24 +9,37 @@ import React from 'react'; import { scaleLinear, scaleTime } from 'd3-scale'; -import { extent, max } from 'd3-array'; +import { extent } from 'd3-array'; import { line } from 'd3-shape'; import { axisBottom, axisLeft } from 'd3-axis'; import { select } from 'd3-selection'; class Plot extends React.Component { render() { - const leftMargin = 30; - const bottomMargin = 20; - const values = 100; - + // check if data is valid + if (this.props.data == null || this.props.data.length === 0) return false; + + // only show data in requested time let data = this.props.data; - if (data.length > values) { - data = data.slice(data.length - values); + const firstTimestamp = data[data.length - 1].x - this.props.time * 1000; + if (data[0].x < firstTimestamp) { + const index = data.findIndex(value => value.x >= firstTimestamp - 100); + if (index > 0) { + data = data.slice(index - 1); + } } - const xScale = scaleTime().domain(extent(data, p => new Date(p.x))).range([leftMargin, this.props.width]); + // calculate paths for data + const leftMargin = 30; + const bottomMargin = 20; + + let xRange = extent(data, p => new Date(p.x)); + if (xRange[1] - xRange[0] < this.props.time * 1000) { + xRange[0] = xRange[1] - this.props.time * 1000; + } + + const xScale = scaleTime().domain(xRange).range([leftMargin, this.props.width]); const yScale = scaleLinear().domain(extent(data, p => p.y)).range([this.props.height, bottomMargin]); const xAxis = axisBottom().scale(xScale).ticks(5); From 9119f6380db3711fff2f0afc814753dc89809c5c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 01:11:20 +0200 Subject: [PATCH 298/556] Add multiple lines to plot --- src/components/widget-plot.js | 4 +- src/components/widget-plot/plot.js | 78 ++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 2fb5b93..0c3d641 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -37,7 +37,9 @@ class WidgetPlot extends React.Component { //const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); //const chosenSignals = this.props.widget.signals; - simulatorData = this.props.data[simulator.node][simulator.simulator].values[0]; + simulatorData = this.props.data[simulator.node][simulator.simulator].values.filter((values, index) => ( + this.props.widget.signals.findIndex(value => value === index) !== -1 + )); // Query the signals that will be displayed in the legend /*legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index ce30589..7749f48 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -14,47 +14,75 @@ import { line } from 'd3-shape'; import { axisBottom, axisLeft } from 'd3-axis'; import { select } from 'd3-selection'; -class Plot extends React.Component { - render() { - // check if data is valid - if (this.props.data == null || this.props.data.length === 0) return false; - - // only show data in requested time - let data = this.props.data; +const leftMargin = 30; +const bottomMargin = 20; - const firstTimestamp = data[data.length - 1].x - this.props.time * 1000; - if (data[0].x < firstTimestamp) { - const index = data.findIndex(value => value.x >= firstTimestamp - 100); - if (index > 0) { - data = data.slice(index - 1); - } +class Plot extends React.Component { + constructor(props) { + super(props); + + this.state = { + data: null + }; + } + + componentWillReceiveProps(nextProps) { + // check if data is valid + if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { + this.setState({ data: null }); + return; + } + + // only show data in requested time + let data = nextProps.data; + + const firstTimestamp = data[0][data[0].length - 1].x - this.props.time * 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)); } // calculate paths for data - const leftMargin = 30; - const bottomMargin = 20; - - let xRange = extent(data, p => new Date(p.x)); - if (xRange[1] - xRange[0] < this.props.time * 1000) { - xRange[0] = xRange[1] - this.props.time * 1000; + let xRange = extent(data[0], p => new Date(p.x)); + if (xRange[1] - xRange[0] < nextProps.time * 1000) { + xRange[0] = xRange[1] - nextProps.time * 1000; } + + let yRange = [0, 0]; + + data.map(values => { + const range = extent(values, p => p.y); + if (range[0] < yRange[0]) yRange[0] = range[0]; + if (range[1] > yRange[1]) yRange[1] = range[1]; + + return values; + }); - const xScale = scaleTime().domain(xRange).range([leftMargin, this.props.width]); - const yScale = scaleLinear().domain(extent(data, p => p.y)).range([this.props.height, bottomMargin]); + const xScale = scaleTime().domain(xRange).range([leftMargin, nextProps.width]); + const yScale = scaleLinear().domain(yRange).range([nextProps.height, bottomMargin]); const xAxis = axisBottom().scale(xScale).ticks(5); const yAxis = axisLeft().scale(yScale).ticks(5); const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); - const linePath = sparkLine(data); + + // generate paths from data + const lines = data.map((values, index) => ); + + this.setState({ data: lines, xAxis, yAxis }); + } + + render() { + if (this.state.data == null) return false; return( - select(node).call(xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> - select(node).call(yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> + select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> + select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> - + {this.state.data} ); From 3265838c39524dd925e90abfd1e39b8da42b40e7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 01:54:34 +0200 Subject: [PATCH 299/556] Add signal legend. Add time format. --- package.json | 1 + src/components/widget-plot.js | 16 +++++++++------- src/components/widget-plot/plot.js | 17 ++++++++++------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index e71b043..308d8c3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "d3-scale": "^1.0.6", "d3-selection": "^1.1.0", "d3-shape": "^1.2.0", + "d3-time-format": "^2.0.5", "es6-promise": "^4.0.5", "flux": "^3.1.2", "gaugeJS": "^1.3.2", diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 0c3d641..fb89a07 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -22,32 +22,32 @@ import React from 'react'; import Plot from './widget-plot/plot'; -//import PlotLegend from './widget-plot/plot-legend'; +import PlotLegend from './widget-plot/plot-legend'; class WidgetPlot extends React.Component { render() { const simulator = this.props.widget.simulator; const simulation = this.props.simulation; - //let legendSignals = []; + let legendSignals = []; let simulatorData = []; // Proceed if a simulation with models and a simulator are available if (simulator && simulation && simulation.models.length > 0) { - //const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); - //const chosenSignals = this.props.widget.signals; + const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); + const chosenSignals = this.props.widget.signals; simulatorData = this.props.data[simulator.node][simulator.simulator].values.filter((values, index) => ( this.props.widget.signals.findIndex(value => value === index) !== -1 )); // Query the signals that will be displayed in the legend - /*legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { + legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { if (chosenSignals.includes(signal_index)) { accum.push({ index: signal_index, name: model_signal.name }); } return accum; - }, []);*/ + }, []); } return ( @@ -57,11 +57,13 @@ class WidgetPlot extends React.Component {
    + +
    ); } diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 7749f48..8af08f4 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -8,11 +8,12 @@ **********************************************************************************/ import React from 'react'; -import { scaleLinear, scaleTime } from 'd3-scale'; +import { scaleLinear, scaleTime, scaleOrdinal, schemeCategory10 } from 'd3-scale'; import { extent } from 'd3-array'; import { line } from 'd3-shape'; import { axisBottom, axisLeft } from 'd3-axis'; import { select } from 'd3-selection'; +import { timeFormat } from 'd3-time-format'; const leftMargin = 30; const bottomMargin = 20; @@ -59,16 +60,18 @@ class Plot extends React.Component { return values; }); + // create scale functions for both axes const xScale = scaleTime().domain(xRange).range([leftMargin, nextProps.width]); const yScale = scaleLinear().domain(yRange).range([nextProps.height, bottomMargin]); - - const xAxis = axisBottom().scale(xScale).ticks(5); + + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); - const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); - // generate paths from data - const lines = data.map((values, index) => ); + const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); + const lineColor = scaleOrdinal(schemeCategory10); + + const lines = data.map((values, index) => ); this.setState({ data: lines, xAxis, yAxis }); } @@ -81,7 +84,7 @@ class Plot extends React.Component { select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> - + {this.state.data} From 4c73eb44f99937e477aed6738729c76a379e3ec0 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 02:00:50 +0200 Subject: [PATCH 300/556] Update plot-table with new plot --- src/components/widget-plot-table.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 7862a05..c674773 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -108,7 +108,9 @@ class WidgetPlotTable extends Component { let simulatorData = []; if (this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null) { - simulatorData = this.props.data[simulator.node][simulator.simulator]; + simulatorData = this.props.data[simulator.node][simulator.simulator].values.filter((values, index) => ( + this.props.widget.signals.findIndex(value => value === index) !== -1 + )); } if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { @@ -153,7 +155,12 @@ class WidgetPlotTable extends Component {
    - +
    From efcb49d05a9723bb236e22648a2eec78e8fc2b84 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 08:47:20 +0200 Subject: [PATCH 301/556] Remove unneeded dependencies --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 308d8c3..57c7657 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "gaugeJS": "^1.3.2", "immutable": "^3.8.1", "rc-slider": "^7.0.1", - "rd3": "^0.7.4", "react": "^15.4.2", "react-bootstrap": "^0.31.1", "react-contextmenu": "^2.3.0", From 4df0e7a5fba82a07166df4a2190c5b08cef80b89 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 09:48:38 +0200 Subject: [PATCH 302/556] Update fav icon --- public/favicon.ico | Bin 24838 -> 16958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 5c125de5d897c1ff5692a656485b3216123dcd89..11e9b5ba456c88a0f37b22a00e7d653a8d595f2c 100644 GIT binary patch literal 16958 zcmd^{du&tZ8OA@yP6CMuw~%maE=##om~>G|DbR*=tWanm3<#HzvcV{@3RY=1Z9sz6 zZKB;DowQZksF=`5oY+q6^PZT5=ISH_{^+Jwo0wFsYL$9w#V%}ax^#gi{`P#a&laUV z;n*BIPHOn&JO0l5z3=n9KIhm9J}_p$pVCr>pLuNMml(@pjI9KiVpbsLM<1n(Z7~K3 zPU!#BQN{LxGmf(?L;viFpAp`Vg8+CN?5ne~h$lCSLrs7}pVFbJfzU4SGeXk7@_*agFyNI#ZTUnYO{Z6zT_wet> z{tM13w&IeN8LU>kKY{7=Q1LIWgKfADZgQSs$?o4WMzu)`>9XNRRAV?V*CZ`zzBE0$ zFwVa?=Wl|e%I5*uW-?Qau@d|N@DP8Z8q*P});Q%qGmP2bI6u{f^2E;kZmT9jI?*fTI85J)vl3JojF;q zH$O>rW-k~4JW9mcKB;cjQ)HW!lIX{RyKYVr*=Ofdea35G5OAIN5As|B%gC0IaOcE@ z3wS@PpO;ScbH7LRbN&k8J0|=cdB2ZZX78oEggG3je*RXn&wmR90N2jEn`9S6vSu{) zrfkpLHkl1*y`0U+o>f4O1w{5t_|AlH&HMwg-;wLGQk>2V6Shy0BlB+&tQWNcsC@;j zXsMkS*H%c*1#`)feU2Pi1As@s5MnQaJhwB;posR^GYzsMYYFCm2|fXl?wkL(Lgh}l5Sg`J2W)|gvp5c%IF z=i)=;%uZFye?Rlo@W29USbBvTmJ9(N0e?p9G0C}D^JiPcnz80E5Nji;bqDcRp;P<{ zP}c`FHP^PHi1|)>`PwTCRc* z^YQbKTBs*#hSvkFYCfW!rz`8=e?97jp?STJn%BqAKWd>K{D;vpI=3zc{x?{t`Ejm- zk6Ip&pMTVX4)k0_&y@}O`)_{2LMWP}+^+0R1$GO@%YJL*_OHnT@ z&{7&l|E2I>Dr$z;1FdR4qMfIfFI(v9Ca!`H^YQbKTBs*#hSvkF(fU+dM^`sn==G<# z3O>xo&p&FRo~RjK545WJh<2V{f7(K=Teu27YTFV&|EL8WJ{2wK$ zsO_0@YTY&?+Wu-?C%2cSQtLC@p<_Tr3;b`>-+$|N3$>N;3HSv2YUH-ELTWF=w=DI2 zP-|HdwQgU98ovSmobg*@tnGLKR}%o zzW^Tt9sz#Do~MqAY)^ZI>Nz2|?Ke>8-UWz#5!{X-ztA#BoqJxRu01jFuJq64-6b>@ z121*$8v$H9d;6(#-(k69&u6~N(a>`+8F>zZceLjltvv!Qy>e&8`leR(-YWX_8e6>O zM(WxRy$9Y0=z(U?vjaWkJ+M~Mg6$&Abpo+3l3X7`!(mtRKHcAM6m1iYMq?6_y1qJ# zya&&NLBJzmn7ox2!LPul5v&t61|{#om#MQd!(^KLufw>z4jIUM=ppKUmcXZg#|V*I zmb)tpMa_v`o5|Qm-G@@B`)lRkEf4_cgKpeJu8OAKgP*x}Oomsrnx5YuW7PBY`P6gx zyVP^!L%{EoTgY`<>OH(b?mMDZHsR)_-ftMG=jcP!d-M_*1Uy2-n#;&xk&(-Omd(WX zO3evp^d5rbYtPM~-siSZ@3C$$0?>yE5ixyWn^;?4&644LGrW7ix_gvM$lX?MWpwSt zJa7`c2e=CTnEy6iJDyo{dZq#Q%dCRui$L5rFaSyt(x66B?rX;l)c4H?sqgupgMR@Y zVgTc>sqe%J>BfnqhANf~uRj3&K)G*Z%KKN^B;R=6NPQaUhQCTTn|1M{zV^fZ=eZ% zD1-kufN~xD-1t|Hg}N%14*xHJ55PxYO27Xrz9JoQeOwIhKLw9Py7pf2oPWfF5C6H) zm>U{rhel&)G=xTWZgj)Xa)aZXV4%M=80cp#w4ZGh8$&D@*w0w1cy7giNHAs`7790t zFoRVD_On#{<-D8a4l!ixW*ditBW|e@&lM2UFSfB}Xfj8*_bZyj2=_s~=K{eo=tJ@4 zXU1-ZHN(O$dGFn5=`$OYUXbgl#ZVkrs?$GEDjYFX^ K5E}WUL6@VY56)S&I{`6Nu0RscWCdj@GJHx(%?6_-;yKy1n;EEf9f}pr1CW5HA zYt$%U#C=}?jWH&%G@BaHBxsWAoUb3}&6%Ei@4Ii_JRa1`RQ23*yU)_wJ$?H0>6gj0 z${d_I^w5kvTW3xYEc?FvyP3>p$!py@`@T`|dVepIsjbbvR}af%KKy7YuQ%SDC^zmNWPYR^7avI5P-@dKev}UZ^aDAOyci9Nn zwR4qEz~tSvrp|#ACvWzo9`3B;`}^{t18dxaH;?xT7#hmJiKAaI;|O=$yxzXNOHGw~ z^!5pE^SW`av%t_$22LFPsM^l%=PSp!3r`>9w%s+^ZQYnnTQ*Ggd9-1~kj_o$YdW@b ztCkJ(ZGYjusqV5L4{^)R9Gt@gzU1t|?xhE&c^q(|(R#oa*}Sj5c({A$mhrB8*Y@tc zr)K#C{KOp-eHl35ZWJ1&zkmI>9DL%!KJE@_!=W?aH;i?ZDb0O1HPFy6 zcV0Kf)eZ0BHmz9vowF7EA{z*aue9M)iJP&Zd)qYlfJ-c^sS1qY^?>s)!!Ta@x zr@Lz|80r)7<{QVk9Z$}5SDaVtz*Rc?oH5~Wcjoc^eA&EdJ^h@aZ-BvL{K2s_7Cvfr zFL&(R?D&(9OxsS%z_BzI9^Ai^AOF$PUpGk~oO(=OpMc3@Zh&KH1a9>G%%0rC)t@oQ z4d~M`hX+g^Wf8P>A&&qjq|tZe*44Laq7qVPK#QIc)s*Qj34P`NL`Q{xBI`SnR!RC? zlGdTvC%oVZ@0BgcH>}qc!uzul@{i@sH}L0|=eZBJ9qF!HHaw?`s0(_DJj(v`(memI z6jH}=BfGlSlRV4)ouv#h*65yRR>G zo;I#~BVK&l&{+H=_~Nq$d%bFLh7GE5pS&>Fr{RMe>)MM19~z6F1oQo_y>vtlpEZF# zIc82TpMc3z9;{Q)=zG5B#4+96yHCvYy8p4;C%6x`%y$2HccC9|#vGVD)**C0xX|R| z%h)}ze!Tnrvvb@RZ!GX@2lMEq`=`08b`9$%FnN@*zJLo2wD5?MbE&LN)Z>Kty*;m= zt{Cn0>Q3nk)`bR^{dVf!3ECg6Yz4YcskI>$XH*L8E)MsudhnkP0B>+M(XEcErHUBKi~ z1`fEP&WPhp{@Ew?cPlR(ma9iw8NbJWHqp=btCtM*FnP*@ZwwlJ&-Y|LEjgvJzUtPc zz5CrWNBRV8d0-bpWAl<=zM1PU8lJseDxBK^QuuCj2fg{&2#*IG5ezf1B(o%lU+OZx7So4D?yi2*h zFBkr5pG3AJs83uy!~C3mQZLp~ss7-N9oAY>t)!eC#s)CrPukK!(!G*)H?v(~JCoj# zfvgTxMV{4?zL1neQ;ITVBAdFDf`1yG$o{g7^1sR_n{RZ7tnXio?tM%240}(z9xFY0 zlz{^-G*RET;-`7`>e0b{{`!2kM)t7Si9ZqD$~wh*hyGC>z~qs@0T&u*;h}hiKGEga zHkJ;%7aNc^o_0(>Z{Gp069H;TwPTUnvvX0SJ+kGGZ0lFBWocl>kaa)AoiMta+x_-J-?#KHFnJ*! zwD1V?)4s#|?O)DlMBhVv4IgZs?d>b<6%xK3<{o91H?-%8?PK!_fm#3d>{{gQ z?*8`b{G6?bZKdO{_9IVlz{R$PcGjeL|3*|@upby()_Lf^eQ&XQe)CjsbJ3Uolrgt< zweld3GH|fZpn(=1@PencO_a_)v6tU?WV-w8wfXLbOGae0{<*C?Ead$6v+> z|EQKThJTmwXK!c6AOD+FgtDv7i<48{-OPce!KDVkzR+XKOcREPha(;$}iUb!*)f-Fb}Y4@r9z-_{OIg z`xn^T#ZtEPv_T$M*Sr+=Z{q#~8$|7Y{0!*2u${D*Jj%dfOrS~FzpH*_|55J!7kl4w z?LT!7T(!3!632pmZh?dh`n-z$_ts42pn6;c`}hx;TSYd0idsqal5&0uGV=UM{c9xQ z1KK6&TS+a^H|6B_hPo1W3 zh+Dun!`UkP%H3}*@IE18q{7&MH2f3?T6o}Jf+xI@fh=SyUOArw`*w1_-PUlHZTHc@ z--yqIxPtI}IjPRzLIZ8cPv4P=>?A&=E~~0)>&J#V;TwAR*6}`01iu~U$@prtzW6YS ze}E>gUX+0YuF}B+Uhw2x7a7Q+oOzMNFHTNN<)40Rzg#`pABKF18@l}5A>RL`?Ri;Z zC8ExD$)im1@R{N7(wIog8$Yn(6%q$yd9(zKe};OnH%;mWBs7)>ls~T3Wi6!Xqw6+dpJLVS1P| z9qV%io-nE*rYcPxiS31>U_>mbPTXxkC*!?*zefr#2vF|qr8{|4|u^7-pD|f z&OPc->UKu)=iHgIpysp;Lsbyj}GJWoBkufOA={CRTUjr%af zc5pUH9{pg?M5%+)oN`q9yBbBt@+3xHV)qGm8b)Cp-w7~CwEhtBUk0rbjrqM zTb|tQ3-5-pw^cul`T+X&s?O;?V(FD!(Q9Qg@(LTCNz{0-vBM^SX5lti3|GpxFn4;Ax6pGc~t)R!Bo${lYH(* z!F&5X*?S&}YoDCyzwv1H+XI(+rL`;RN9}iLxlfr-r&vGG8OQa@=>+a)+Ij)sd_{wu z1Am(+3-RFr4&N8N6+hqo19S#;SA1-hG>07p3}&*j4CR+rqdV)^6n; z_vFr!(a%-=#=kb{pYmNL@6|DWkw~%E2V2jYl*e1}c{e$fib?(O+hs}eoBLRo&9(;J}YV}0Mi;LZAe{U$(s= zT<-IaV$Z+q-P!~3{HxN>Kbw30jXzM&I(S<6Ksx^}HvU2Vntb!etSsm0>)j}Me^+L5{2yz--)?W`Q?az z!WLG4UNP}+#C+NKH+ZG-Q=E>IPp%LuKLx$$8NAOGr(#~P>!EA zDYlpXDR=xM?Xv5(-qp74Cw3LzBeASHSBY`OezkbOyjP!G%WSymju_C$VBl--z Date: Thu, 27 Jul 2017 10:32:32 +0200 Subject: [PATCH 303/556] Add token to all API calls --- src/containers/app.js | 6 ++++-- src/containers/project.js | 20 ++++++++++++++------ src/containers/projects.js | 19 +++++++++++++------ src/containers/simulation.js | 19 +++++++++++++------ src/containers/simulations.js | 16 +++++++++++----- src/containers/simulators.js | 28 +++++++++++++++++++--------- src/containers/visualization.js | 20 ++++++++++++++++---- 7 files changed, 90 insertions(+), 38 deletions(-) diff --git a/src/containers/app.js b/src/containers/app.js index 70bbe67..40bfcde 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -104,11 +104,13 @@ class App extends Component { // load all simulators and simulations to fetch simulation data AppDispatcher.dispatch({ - type: 'nodes/start-load' + type: 'nodes/start-load', + token }); AppDispatcher.dispatch({ - type: 'simulations/start-load' + type: 'simulations/start-load', + token }); } diff --git a/src/containers/project.js b/src/containers/project.js index 33099a4..26a3dc8 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -25,6 +25,7 @@ import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import ProjectStore from '../stores/project-store'; +import UserStore from '../stores/user-store'; import VisualizationStore from '../stores/visualization-store'; import CustomTable from '../components/table'; @@ -34,7 +35,7 @@ import EditVisualizationDialog from '../components/dialog/edit-visualization'; class Visualizations extends Component { static getStores() { - return [ ProjectStore, VisualizationStore ]; + return [ ProjectStore, VisualizationStore, UserStore ]; } static calculateState(prevState, props) { @@ -59,6 +60,7 @@ class Visualizations extends Component { return { projects: currentProjects, visualizations: currentVisualizations, + sessionToken: UserStore.getState().token, newModal: prevState.newModal, deleteModal: prevState.deleteModal, @@ -78,6 +80,7 @@ class Visualizations extends Component { return { projects: currentProjects, visualizations: currentVisualizations, + sessionToken: UserStore.getState().token, newModal: false, deleteModal: false, @@ -95,14 +98,16 @@ class Visualizations extends Component { static loadProjects() { AppDispatcher.dispatch({ - type: 'projects/start-load' + type: 'projects/start-load', + token: this.state.sessionToken }); } static loadVisualizations(visualizations) { AppDispatcher.dispatch({ type: 'visualizations/start-load', - data: visualizations + data: visualizations, + token: this.state.sessionToken }); } @@ -117,7 +122,8 @@ class Visualizations extends Component { AppDispatcher.dispatch({ type: 'visualizations/start-add', - data: data + data: data, + token: this.state.sessionToken }); } @@ -129,7 +135,8 @@ class Visualizations extends Component { AppDispatcher.dispatch({ type: 'visualizations/start-remove', - data: this.state.modalData + data: this.state.modalData, + token: this.state.sessionToken }); } @@ -139,7 +146,8 @@ class Visualizations extends Component { if (data) { AppDispatcher.dispatch({ type: 'visualizations/start-edit', - data: data + data: data, + token: this.state.sessionToken }); } } diff --git a/src/containers/projects.js b/src/containers/projects.js index 6dd97b8..93dd94d 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -25,6 +25,7 @@ import { Button, Modal, Glyphicon } 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 Table from '../components/table'; @@ -34,13 +35,14 @@ import EditProjectDialog from '../components/dialog/edit-project'; class Projects extends Component { static getStores() { - return [ ProjectStore, SimulationStore ]; + return [ ProjectStore, SimulationStore, UserStore ]; } static calculateState() { return { projects: ProjectStore.getState(), simulations: SimulationStore.getState(), + sessionToken: UserStore.getState().token, newModal: false, editModal: false, @@ -51,11 +53,13 @@ class Projects extends Component { componentWillMount() { AppDispatcher.dispatch({ - type: 'projects/start-load' + type: 'projects/start-load', + token: this.state.sessionToken }); AppDispatcher.dispatch({ - type: 'simulations/start-load' + type: 'simulations/start-load', + token: this.state.sessionToken }); } @@ -65,7 +69,8 @@ class Projects extends Component { if (data) { AppDispatcher.dispatch({ type: 'projects/start-add', - data: data + data: data, + token: this.state.sessionToken }); } } @@ -75,7 +80,8 @@ class Projects extends Component { AppDispatcher.dispatch({ type: 'projects/start-remove', - data: this.state.modalData + data: this.state.modalData, + token: this.state.sessionToken }); } @@ -85,7 +91,8 @@ class Projects extends Component { if (data) { AppDispatcher.dispatch({ type: 'projects/start-edit', - data: data + data: data, + token: this.state.sessionToken }); } } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 0aff4bf..d021478 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -25,6 +25,7 @@ import { Button, Modal, Glyphicon } from 'react-bootstrap'; import SimulationStore from '../stores/simulation-store'; import NodeStore from '../stores/node-store'; +import UserStore from '../stores/user-store'; import AppDispatcher from '../app-dispatcher'; import Table from '../components/table'; @@ -34,13 +35,14 @@ import EditSimulationModelDialog from '../components/dialog/edit-simulation-mode class Simulation extends Component { static getStores() { - return [ SimulationStore, NodeStore ]; + return [ SimulationStore, NodeStore, UserStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), nodes: NodeStore.getState(), + sessionToken: UserStore.getState().token, newModal: false, deleteModal: false, @@ -54,11 +56,13 @@ class Simulation extends Component { componentWillMount() { AppDispatcher.dispatch({ - type: 'simulations/start-load' + type: 'simulations/start-load', + token: this.state.sessionToken }); AppDispatcher.dispatch({ - type: 'nodes/start-load' + type: 'nodes/start-load', + token: this.state.sessionToken }); } @@ -86,7 +90,8 @@ class Simulation extends Component { AppDispatcher.dispatch({ type: 'simulations/start-edit', - data: this.state.simulation + data: this.state.simulation, + token: this.state.sessionToken }); } } @@ -100,7 +105,8 @@ class Simulation extends Component { AppDispatcher.dispatch({ type: 'simulations/start-edit', - data: simulation + data: simulation, + token: this.state.sessionToken }); } @@ -114,7 +120,8 @@ class Simulation extends Component { AppDispatcher.dispatch({ type: 'simulations/start-edit', - data: simulation + data: simulation, + token: this.state.sessionToken }); } } diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 5c445d0..3082c59 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -25,6 +25,7 @@ import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; +import UserStore from '../stores/user-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; @@ -33,12 +34,13 @@ import EditSimulationDialog from '../components/dialog/edit-simulation'; class Simulations extends Component { static getStores() { - return [ SimulationStore ]; + return [ SimulationStore, UserStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), + sessionToken: UserStore.getState().token, newModal: false, deleteModal: false, @@ -49,7 +51,8 @@ class Simulations extends Component { componentWillMount() { AppDispatcher.dispatch({ - type: 'simulations/start-load' + type: 'simulations/start-load', + token: this.state.sessionToken }); } @@ -59,7 +62,8 @@ class Simulations extends Component { if (data) { AppDispatcher.dispatch({ type: 'simulations/start-add', - data: data + data: data, + token: this.state.sessionToken }); } } @@ -82,7 +86,8 @@ class Simulations extends Component { AppDispatcher.dispatch({ type: 'simulations/start-remove', - data: this.state.modalSimulation + data: this.state.modalSimulation, + token: this.state.sessionToken }); } @@ -105,7 +110,8 @@ class Simulations extends Component { if (data) { AppDispatcher.dispatch({ type: 'simulations/start-edit', - data: data + data: data, + token: this.state.sessionToken }); } } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 3e258a6..583c3a6 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -25,6 +25,7 @@ import { Button, Modal, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import NodeStore from '../stores/node-store'; +import UserStore from '../stores/user-store'; import NewNodeDialog from '../components/dialog/new-node'; import EditNodeDialog from '../components/dialog/edit-node'; @@ -34,12 +35,13 @@ import NodeTree from '../components/node-tree'; class Simulators extends Component { static getStores() { - return [ NodeStore ]; + return [ NodeStore, UserStore ]; } static calculateState() { return { nodes: NodeStore.getState(), + sessionToken: UserStore.getState().token, newNodeModal: false, deleteNodeModal: false, @@ -57,7 +59,8 @@ class Simulators extends Component { componentWillMount() { AppDispatcher.dispatch({ - type: 'nodes/start-load' + type: 'nodes/start-load', + token: this.state.sessionToken }); } @@ -67,7 +70,8 @@ class Simulators extends Component { if (data) { AppDispatcher.dispatch({ type: 'nodes/start-add', - data: data + data: data, + token: this.state.sessionToken }); } } @@ -87,7 +91,8 @@ class Simulators extends Component { if (data) { AppDispatcher.dispatch({ type: 'nodes/start-edit', - data: data + data: data, + token: this.state.sessionToken }); } } @@ -106,7 +111,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'nodes/start-remove', - data: this.state.modalData + data: this.state.modalData, + token: this.state.sessionToken }); } @@ -128,7 +134,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'nodes/start-edit', - data: node + data: node, + token: this.state.sessionToken }); } } @@ -151,7 +158,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'nodes/start-edit', - data: node + data: node, + token: this.state.sessionToken }); } } @@ -174,7 +182,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'nodes/start-edit', - data: node + data: node, + token: this.state.sessionToken }); } @@ -183,7 +192,8 @@ class Simulators extends Component { nodes.forEach((node) => { AppDispatcher.dispatch({ type: 'nodes/start-edit', - data: node + data: node, + token: this.state.sessionToken }); }); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 425f394..76edf5e 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -73,8 +73,11 @@ class Visualization extends Component { } componentWillMount() { + const token = localStorage.getItem('token'); + AppDispatcher.dispatch({ - type: 'visualizations/start-load' + type: 'visualizations/start-load', + token }); } @@ -89,9 +92,12 @@ class Visualization extends Component { if (project._id === this.state.visualization.project) { this.setState({ project: project, simulation: null }); + const token = localStorage.getItem('token'); + AppDispatcher.dispatch({ type: 'simulations/start-load', - data: project.simulation + data: project.simulation, + token }); } }); @@ -137,9 +143,12 @@ class Visualization extends Component { this.setState({ visualization: visualization, project: null }); + const token = localStorage.getItem('token'); + AppDispatcher.dispatch({ type: 'projects/start-load', - data: visualization.project + data: visualization.project, + token }); } }); @@ -268,9 +277,12 @@ class Visualization extends Component { widgets: this.transformToWidgetsList(this.state.visualization.widgets) }); + const token = localStorage.getItem('token'); + AppDispatcher.dispatch({ type: 'visualizations/start-edit', - data: visualization + data: visualization, + token }); } From adeb3e666b78cac8b27b35e4804cfcffdc612133 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 10:52:30 +0200 Subject: [PATCH 304/556] Fix token in projects container --- src/containers/project.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 26a3dc8..ef427e2 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -42,25 +42,26 @@ class Visualizations extends Component { let currentProjects = ProjectStore.getState(); let currentVisualizations = VisualizationStore.getState(); + let sessionToken = UserStore.getState().token; if (prevState) { var projectUpdate = prevState.project; // Compare content of the visualizations array, reload projects if changed if (JSON.stringify(prevState.visualizations) !== JSON.stringify(currentVisualizations)) { - Visualizations.loadProjects(); + Visualizations.loadProjects(sessionToken); } // Compare content of the projects array, update visualizations if changed if (JSON.stringify(prevState.projects) !== JSON.stringify(currentProjects)) { projectUpdate = Visualizations.findProjectInState(currentProjects, props.params.project); - Visualizations.loadVisualizations(projectUpdate.visualizations); + Visualizations.loadVisualizations(projectUpdate.visualizations, sessionToken); } return { projects: currentProjects, visualizations: currentVisualizations, - sessionToken: UserStore.getState().token, + sessionToken, newModal: prevState.newModal, deleteModal: prevState.deleteModal, @@ -74,13 +75,13 @@ class Visualizations extends Component { let initialProject = Visualizations.findProjectInState(currentProjects, props.params.project); // If projects have been loaded already but visualizations not (redirect from Projects page) if (initialProject && (!currentVisualizations || currentVisualizations.length === 0)) { - Visualizations.loadVisualizations(initialProject.visualizations); + Visualizations.loadVisualizations(initialProject.visualizations, sessionToken); } return { projects: currentProjects, visualizations: currentVisualizations, - sessionToken: UserStore.getState().token, + sessionToken, newModal: false, deleteModal: false, @@ -96,23 +97,23 @@ class Visualizations extends Component { return projects.find((project) => project._id === projectId); } - static loadProjects() { + static loadProjects(token) { AppDispatcher.dispatch({ type: 'projects/start-load', - token: this.state.sessionToken + token }); } - static loadVisualizations(visualizations) { + static loadVisualizations(visualizations, token) { AppDispatcher.dispatch({ type: 'visualizations/start-load', data: visualizations, - token: this.state.sessionToken + token }); } componentWillMount() { - Visualizations.loadProjects(); + Visualizations.loadProjects(this.state.sessionToken); } closeNewModal(data) { From 1eddcb14c50cbd046764a5756c4282f2afb18e1d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 16:52:59 +0200 Subject: [PATCH 305/556] Remove hash route --- src/router.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/router.js b/src/router.js index 85bbe78..a4ab751 100644 --- a/src/router.js +++ b/src/router.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Router, Route, hashHistory } from 'react-router'; +import { Router, Route, browserHistory } from 'react-router'; import App from './containers/app'; import Home from './containers/home'; @@ -37,7 +37,7 @@ import Logout from './containers/logout'; class Root extends Component { render() { return ( - + From aaff21eb78d79ce2000dc9997927ec2becc07592 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 21:41:13 +0200 Subject: [PATCH 306/556] Add grid slider to visualization --- src/containers/visualization.js | 36 +++++++++++++++++++++++++-------- src/containers/widget.js | 7 ++----- src/styles/app.css | 12 ++++++++++- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 76edf5e..bedb458 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -23,6 +23,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import { ContextMenu, MenuItem } from 'react-contextmenu'; +import Slider from 'rc-slider'; import WidgetFactory from '../components/widget-factory'; import ToolboxItem from '../components/toolbox-item'; @@ -60,7 +61,7 @@ class Visualization extends Component { project: prevState.project || null, simulation: prevState.simulation || null, editing: prevState.editing || false, - grid: prevState.grid || false, + grid: prevState.grid || [1, 1], editModal: prevState.editModal || false, modalData: prevState.modalData || null, @@ -332,6 +333,15 @@ class Visualization extends Component { return widget; } + setGrid(value) { + // value 0 would block all widgets, set 1 as 'grid disabled' + if (value === 0) { + value = 1; + } + + this.setState({ grid: [value, value] }); + } + render() { var current_widgets = this.state.visualization.widgets; @@ -344,13 +354,15 @@ class Visualization extends Component {
    {this.state.editing ? ( -
    - - +
    +
    + + +
    ) : (
    @@ -359,6 +371,14 @@ class Visualization extends Component {
    )} + + {this.state.editing && +
    + Grid: {this.state.grid[0] > 1 ? this.state.grid[0] : 'Disabled'} + + this.setGrid(value)} /> +
    + }
    e.preventDefault() }> diff --git a/src/containers/widget.js b/src/containers/widget.js index 18e3d12..2442dc6 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -128,11 +128,6 @@ class Widget extends Component { } render() { - - - - //console.log('render widget ' + this.props.data.z + this.props.data.type); - // configure grid var grid = this.props.grid; if (!grid) { @@ -144,6 +139,8 @@ class Widget extends Component { var borderedWidget = false; var element = null; + //console.log(widget.type + ': ' + widget.z); + // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Value') { element = diff --git a/src/styles/app.css b/src/styles/app.css index 33b3280..6ff738f 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -245,7 +245,7 @@ body { .section-header div { display: inline-block; vertical-align: middle; - height: 100%; + /* height: 100%; */ } .section-title { @@ -269,3 +269,13 @@ body { .section-header .glyphicon { font-size: 0.8em; } + +.section-grid-slider { + height: auto !important; + + float: right; +} + +.section-grid-slider .rc-slider { + margin-left: 12px; +} From 32f2c719daf9707d7e775d2be74f21331352375c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 27 Jul 2017 23:32:09 +0200 Subject: [PATCH 307/556] Add grid background to visualization edit --- src/components/grid.js | 42 +++++++++++++++++++++++++++++++++ src/containers/visualization.js | 22 ++++++++++------- 2 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 src/components/grid.js diff --git a/src/components/grid.js b/src/components/grid.js new file mode 100644 index 0000000..16e8fa5 --- /dev/null +++ b/src/components/grid.js @@ -0,0 +1,42 @@ +/** + * 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 + * 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'; + +class Grid extends React.Component { + render() { + if (this.props.disabled) return false; + + return ( + + + + + + + + + + ); + } +} + +export default Grid; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index bedb458..1140dea 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -30,6 +30,7 @@ import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; import Widget from './widget'; import EditWidget from '../components/dialog/edit-widget'; +import Grid from '../components/grid'; import UserStore from '../stores/user-store'; import VisualizationStore from '../stores/visualization-store'; @@ -61,7 +62,6 @@ class Visualization extends Component { project: prevState.project || null, simulation: prevState.simulation || null, editing: prevState.editing || false, - grid: prevState.grid || [1, 1], editModal: prevState.editModal || false, modalData: prevState.modalData || null, @@ -339,7 +339,11 @@ class Visualization extends Component { value = 1; } - this.setState({ grid: [value, value] }); + let visualization = Object.assign({}, this.state.visualization, { + grid: value + }); + + this.setState({ visualization }); } render() { @@ -374,9 +378,9 @@ class Visualization extends Component { {this.state.editing &&
    - Grid: {this.state.grid[0] > 1 ? this.state.grid[0] : 'Disabled'} + Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} - this.setGrid(value)} /> + this.setGrid(value)} />
    }
    @@ -390,9 +394,9 @@ class Visualization extends Component { - - - + + +
    @@ -401,8 +405,10 @@ class Visualization extends Component { 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.grid} /> + this.widgetChange(w, k)} onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} editing={this.state.editing} index={widget_key} grid={[this.state.visualization.grid, this.state.visualization.grid]} /> ))} + + {current_widgets != null && From 8b0854c49fb22de494da5d2fdcae3a7fb68823fe Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 28 Jul 2017 16:17:48 +0200 Subject: [PATCH 308/556] Add grid snapping --- src/components/dropzone.js | 13 ++++++++----- src/containers/visualization.js | 6 +++--- src/containers/widget.js | 27 ++++++++++++++++++++------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/components/dropzone.js b/src/components/dropzone.js index 5f8bf0d..21bad6b 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -33,13 +33,16 @@ const dropzoneTarget = { // Z-Index is one more the top most children let foundZ = props.children.reduce( (maxZ, currentChildren) => { - // 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 (currentChildren.props != 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; + } } } + return maxZ; }, 0); position.z = foundZ >= 100? foundZ : ++foundZ; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 1140dea..86b5ef3 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -296,14 +296,14 @@ class Visualization extends Component { moveWidget(e, data, applyDirection) { var widget = this.state.visualization.widgets[data.key]; var updated_widgets = {}; - updated_widgets[data.key] = applyDirection(widget); + updated_widgets[data.key] = applyDirection(widget); var new_widgets = Object.assign({}, this.state.visualization.widgets, updated_widgets); var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets }); - this.setState({ visualization: visualization }); + this.setState({ visualization: visualization }); } moveAbove(widget) { @@ -405,7 +405,7 @@ class Visualization extends Component { 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.visualization.grid, this.state.visualization.grid]} /> + this.widgetChange(w, k)} onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} editing={this.state.editing} index={widget_key} grid={this.state.visualization.grid} /> ))} diff --git a/src/containers/widget.js b/src/containers/widget.js index 2442dc6..cf4d63f 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -89,11 +89,26 @@ class Widget extends Component { } } + snapToGrid(value) { + if (this.props.grid === 1) return value; + + return Math.round(value / this.props.grid) * this.props.grid; + } + + drag(event, ui) { + let x = this.snapToGrid(ui.position.left); + let y = this.snapToGrid(ui.position.top); + + if (x !== ui.position.left || y !== ui.position.top) { + this.rnd.updatePosition({ x, y }); + } + } + dragStop(event, ui) { // update widget var widget = this.props.data; - widget.x = ui.position.left; - widget.y = ui.position.top; + widget.x = this.snapToGrid(ui.position.left); + widget.y = this.snapToGrid(ui.position.top); this.props.onWidgetChange(widget, this.props.index); } @@ -129,17 +144,14 @@ class Widget extends Component { render() { // configure grid - var grid = this.props.grid; - if (!grid) { - grid = [ 1, 1 ]; - } + let grid = [this.props.grid, this.props.grid]; // get widget element const widget = this.props.data; var borderedWidget = false; var element = null; - //console.log(widget.type + ': ' + widget.z); + //console.log('render: ' + widget.x + ', ' + widget.y); // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Value') { @@ -187,6 +199,7 @@ class Widget extends Component { className={ widgetClasses } onResizeStart={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} + onDrag={(event, ui) => this.drag(event, ui)} onDragStop={(event, ui) => this.dragStop(event, ui)} moveGrid={grid} resizeGrid={grid} From fcc809092ac92ae4d31490eb8c13d6b086aeb672 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 28 Jul 2017 16:42:41 +0200 Subject: [PATCH 309/556] Snap widget on grid while adding --- src/containers/visualization.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 86b5ef3..869df52 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -155,6 +155,12 @@ class Visualization extends Component { }); } + snapToGrid(value) { + if (this.state.visualization.grid === 1) return value; + + return Math.round(value / this.state.visualization.grid) * this.state.visualization.grid; + } + handleDrop(item, position) { let widget = null; @@ -166,6 +172,10 @@ class Visualization extends Component { defaultSimulator = this.state.simulation.models[0].simulator; } + // 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, defaultSimulator); From d9c76bf65f2f5bdff7e890d2b8679642f4187de3 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 28 Jul 2017 19:17:19 +0200 Subject: [PATCH 310/556] Add unselectable style to widgets while editing Add border to all widgets while editing --- src/containers/widget.js | 5 +++-- src/styles/app.css | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index cf4d63f..c16cd50 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -148,7 +148,7 @@ class Widget extends Component { // get widget element const widget = this.props.data; - var borderedWidget = false; + var borderedWidget = this.props.editing; var element = null; //console.log('render: ' + widget.x + ', ' + widget.y); @@ -184,7 +184,8 @@ class Widget extends Component { let widgetClasses = classNames({ 'widget': !this.props.editing, 'editing-widget': this.props.editing, - 'border': borderedWidget + 'border': borderedWidget, + 'unselectable': this.props.editing }); if (this.props.editing) { diff --git a/src/styles/app.css b/src/styles/app.css index 6ff738f..73e5f2c 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -170,6 +170,16 @@ body { color: #888; } +.unselectable { + -webkit-touch-callout: none !important; /* iOS Safari */ + -webkit-user-select: none !important; /* Safari */ + -khtml-user-select: none !important; /* Konqueror HTML */ + -moz-user-select: none !important; /* Firefox */ + -ms-user-select: none !important; /* Internet Explorer/Edge */ + user-select: none !important; /* Non-prefixed version, currently + supported by Chrome and Opera */ +} + /** * Toolbox */ From 33742326f677c2db4cbc903bfbdc802b7f7ef36a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 29 Jul 2017 10:52:03 +0200 Subject: [PATCH 311/556] Add image default size and start aspect ratio lock control --- .../dialog/edit-widget-aspect-control.js | 37 +++++++++++++++++++ .../dialog/edit-widget-control-creator.js | 4 +- src/components/dialog/edit-widget.js | 9 +++++ src/components/widget-factory.js | 1 + src/components/widget-image.js | 20 ++++------ src/containers/widget.js | 4 +- 6 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 src/components/dialog/edit-widget-aspect-control.js diff --git a/src/components/dialog/edit-widget-aspect-control.js b/src/components/dialog/edit-widget-aspect-control.js new file mode 100644 index 0000000..1288704 --- /dev/null +++ b/src/components/dialog/edit-widget-aspect-control.js @@ -0,0 +1,37 @@ +/** + * 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 + * 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, Checkbox } from 'react-bootstrap'; + +class EditWidgetAspectControl extends React.Component { + render() { + console.log(this.props.lockAspect); + + return ( + + this.props.handleChange(e)}>Lock Aspect + + ); + } +} + +export default EditWidgetAspectControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 455ca2f..a5d2072 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -29,6 +29,7 @@ import EditWidgetSimulatorControl from './edit-widget-simulator-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; import EditWidgetSignalsControl from './edit-widget-signals-control'; import EditWidgetOrientation from './edit-widget-orientation'; +import EditWidgetAspectControl from './edit-widget-aspect-control'; export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, handleChange) { // Use a list to concatenate the controls according to the widget type @@ -63,7 +64,8 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Image': { dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />); } break; case 'Gauge': { diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 398fd5a..335e264 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -73,6 +73,15 @@ class EditWidgetDialog extends Component { let changeObject = {}; if (e.target.id === 'simulator') { changeObject[e.target.id] = JSON.parse(e.target.value); + } else if (e.target.id === 'file') { + changeObject[e.target.id] = e.target.value; + + // get file and update size + let file = this.props.files.find(element => element._id === e.target.value); + + // set default size + changeObject.width = file.dimensions.width; + changeObject.height = file.dimensions.height; } else { changeObject[e.target.id] = e.target.value; } diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 364562a..b2104f2 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -71,6 +71,7 @@ class WidgetFactory { widget.minHeight = 100; widget.width = 200; widget.height = 200; + widget.lockAspect = true; break; case 'Button': widget.minWidth = 100; diff --git a/src/components/widget-image.js b/src/components/widget-image.js index 2bbba8c..afacaa6 100644 --- a/src/components/widget-image.js +++ b/src/components/widget-image.js @@ -19,35 +19,31 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import AppDispatcher from '../app-dispatcher'; import config from '../config'; -class WidgetImage extends Component { - +class WidgetImage extends React.Component { componentWillReceiveProps(nextProps) { - - // Query the image referenced by the widget (public request, no token required) + // Query the image referenced by the widget let widgetFile = nextProps.widget.file; - if (widgetFile && !nextProps.files.find( file => file._id === widgetFile ) ) { - + if (widgetFile && !nextProps.files.find(file => file._id === widgetFile)) { AppDispatcher.dispatch({ type: 'files/start-load', - data: widgetFile + data: widgetFile, + token: nextProps.token }); - } } render() { - - let file = this.props.files.find( (file) => file._id === this.props.widget.file ); + let file = this.props.files.find(file => file._id === this.props.widget.file); return (
    {file && - {file.name} e.preventDefault() } /> + {file.name} e.preventDefault()} /> }
    ); diff --git a/src/containers/widget.js b/src/containers/widget.js index c16cd50..a67fb80 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -168,7 +168,7 @@ class Widget extends Component { element = this.props.onWidgetStatusChange(w, this.props.index) } /> borderedWidget = true; } else if (widget.type === 'Image') { - element = + element = } else if (widget.type === 'Button') { element = } else if (widget.type === 'NumberInput') { @@ -195,7 +195,7 @@ class Widget extends Component { initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} minWidth={ widget.minWidth } minHeight={ widget.minHeight } - lockAspectRatio={ widget.lockedAspectRatio } + lockAspectRatio={Boolean(widget.lockAspect)} bounds={'parent'} className={ widgetClasses } onResizeStart={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } From 70b76c539fa7b41e28cc01fe24b69423041dc747 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 29 Jul 2017 11:50:02 +0200 Subject: [PATCH 312/556] Fix lock aspect for image widgets --- .../dialog/edit-widget-aspect-control.js | 18 +++++++++++++++--- .../dialog/edit-widget-control-creator.js | 2 +- src/components/dialog/edit-widget.js | 4 +++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-aspect-control.js b/src/components/dialog/edit-widget-aspect-control.js index 1288704..2e4d4d8 100644 --- a/src/components/dialog/edit-widget-aspect-control.js +++ b/src/components/dialog/edit-widget-aspect-control.js @@ -23,12 +23,24 @@ import React from 'react'; import { FormGroup, Checkbox } from 'react-bootstrap'; class EditWidgetAspectControl extends React.Component { - render() { - console.log(this.props.lockAspect); + constructor(props) { + super(props); + this.state = { + widget: { + lockAspect: true + } + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + render() { return ( - this.props.handleChange(e)}>Lock Aspect + this.props.handleChange(e)}>Lock Aspect ); } diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index a5d2072..c6f9f4c 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -65,7 +65,7 @@ export default function createControls(widgetType = null, widget = null, session case 'Image': { dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />); + handleChange(e)} />); } break; case 'Gauge': { diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 335e264..65a5de9 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -73,13 +73,15 @@ class EditWidgetDialog extends Component { let changeObject = {}; if (e.target.id === 'simulator') { changeObject[e.target.id] = JSON.parse(e.target.value); + } else if (e.target.id === 'lockAspect') { + changeObject[e.target.id] = e.target.checked; } else if (e.target.id === 'file') { changeObject[e.target.id] = e.target.value; // get file and update size let file = this.props.files.find(element => element._id === e.target.value); - // set default size + // set default size changeObject.width = file.dimensions.width; changeObject.height = file.dimensions.height; } else { From cd624b46e2fc216083c29efbd514b43ed7dc7bc2 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 29 Jul 2017 12:01:24 +0200 Subject: [PATCH 313/556] Fix aspect ratio on new image --- src/components/dialog/edit-widget.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 65a5de9..57ee278 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -55,6 +55,17 @@ class EditWidgetDialog extends Component { } } + assignAspectRatio(changeObject, fileId) { + // get aspect ratio of file + let file = this.props.files.find(element => element._id === fileId); + + // scale width to match aspect + const aspectRatio = file.dimensions.width / file.dimensions.height; + changeObject.width = this.state.temporal.height * aspectRatio; + + return changeObject; + } + handleChange(e) { if (e.constructor === Array) { // Every property in the array will be updated @@ -75,15 +86,16 @@ class EditWidgetDialog extends Component { changeObject[e.target.id] = JSON.parse(e.target.value); } else 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 - let file = this.props.files.find(element => element._id === e.target.value); - - // set default size - changeObject.width = file.dimensions.width; - changeObject.height = file.dimensions.height; + changeObject = this.assignAspectRatio(changeObject, e.target.value); } else { changeObject[e.target.id] = e.target.value; } From a022a13bcb40c9a71a5f7c08864573e792c6d3f1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 29 Jul 2017 13:15:03 +0200 Subject: [PATCH 314/556] Add text size control to edit label widget Move label text to top left corner Remove background color for widgets (testing). --- .../dialog/edit-widget-control-creator.js | 8 +++- .../dialog/edit-widget-text-size-control.js | 42 +++++++++++++++++++ src/components/widget-factory.js | 1 + src/components/widget-label.js | 2 +- src/containers/widget.js | 17 ++++---- src/styles/widgets.css | 16 +++++-- 6 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 src/components/dialog/edit-widget-text-size-control.js diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index c6f9f4c..375aa4a 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -30,6 +30,7 @@ import EditWidgetSignalControl from './edit-widget-signal-control'; import EditWidgetSignalsControl from './edit-widget-signals-control'; import EditWidgetOrientation from './edit-widget-orientation'; import EditWidgetAspectControl from './edit-widget-aspect-control'; +import EditWidgetTextSizeControl from './edit-widget-text-size-control'; export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, handleChange) { // Use a list to concatenate the controls according to the widget type @@ -103,8 +104,13 @@ export default function createControls(widgetType = null, widget = null, session validateForm(id)} handleChange={(e) => handleChange(e)} />) } break; + case 'Label': + dialogControls.push( + handleChange(e)} /> + ); + break; default: - console.log('Non-valid widget type'); + console.log('Non-valid widget type: ' + widgetType); } return dialogControls; diff --git a/src/components/dialog/edit-widget-text-size-control.js b/src/components/dialog/edit-widget-text-size-control.js new file mode 100644 index 0000000..0c66ebb --- /dev/null +++ b/src/components/dialog/edit-widget-text-size-control.js @@ -0,0 +1,42 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; + +class EditWidgetTextSizeControl extends React.Component { + render() { + 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) => ( + + ))} + + + ); + } +} + +export default EditWidgetTextSizeControl; \ No newline at end of file diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index b2104f2..80f9d91 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -54,6 +54,7 @@ class WidgetFactory { case 'Label': widget.minWidth = 70; widget.minHeight = 20; + widget.textSize = 18; break; case 'PlotTable': widget.simulator = defaultSimulator; diff --git a/src/components/widget-label.js b/src/components/widget-label.js index 5c81a84..84a9d76 100644 --- a/src/components/widget-label.js +++ b/src/components/widget-label.js @@ -25,7 +25,7 @@ class WidgetLabel extends Component { render() { return (
    -

    {this.props.widget.name}

    +

    {this.props.widget.name}

    ); } diff --git a/src/containers/widget.js b/src/containers/widget.js index a67fb80..1484767 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -148,11 +148,9 @@ class Widget extends Component { // get widget element const widget = this.props.data; - var borderedWidget = this.props.editing; + let borderedWidget = false; var element = null; - //console.log('render: ' + widget.x + ', ' + widget.y); - // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Value') { element = @@ -163,7 +161,6 @@ class Widget extends Component { element = } else if (widget.type === 'Label') { element = - borderedWidget = true; } else if (widget.type === 'PlotTable') { element = this.props.onWidgetStatusChange(w, this.props.index) } /> borderedWidget = true; @@ -181,12 +178,12 @@ class Widget extends Component { element = } - let widgetClasses = classNames({ - 'widget': !this.props.editing, - 'editing-widget': this.props.editing, - 'border': borderedWidget, - 'unselectable': this.props.editing - }); + const widgetClasses = classNames({ + 'widget': !this.props.editing, + 'editing-widget': this.props.editing, + 'border': borderedWidget, + 'unselectable': this.props.editing + }); if (this.props.editing) { return ( diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 7e72ad0..1255d4e 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -20,7 +20,6 @@ ******************************************************************************/ .widget { - background-color: #fff; overflow: auto; } @@ -28,7 +27,7 @@ border: 1px solid lightgray; } -.editing-widget { +.editing-widget:hover { background-color: #fff; } @@ -451,7 +450,18 @@ div[class*="-widget"] label { /* Begin label widget */ .label-widget { - text-align: center; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + + padding: 0; +} + +.label-widget h4 { + padding: 0; + margin: 0; } /* End label widget */ From 69c835cecba070a131e8cd76ecd318539c035d2f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 30 Jul 2017 00:11:11 +0200 Subject: [PATCH 315/556] Add word-wrap to label --- src/containers/widget.js | 4 ++-- src/styles/widgets.css | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 1484767..b58a69c 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -190,8 +190,8 @@ class Widget extends Component { { this.rnd = c; }} initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} - minWidth={ widget.minWidth } - minHeight={ widget.minHeight } + minWidth={widget.minWidth} + minHeight={widget.minHeight} lockAspectRatio={Boolean(widget.lockAspect)} bounds={'parent'} className={ widgetClasses } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 1255d4e..f085a7d 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -20,13 +20,17 @@ ******************************************************************************/ .widget { - overflow: auto; + } .border { border: 1px solid lightgray; } +.editing-widget { + +} + .editing-widget:hover { background-color: #fff; } @@ -450,18 +454,14 @@ div[class*="-widget"] label { /* Begin label widget */ .label-widget { - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - padding: 0; } .label-widget h4 { padding: 0; margin: 0; + + word-wrap: break-word; } /* End label widget */ From 0ffae6d3738f4f37c567694b4c6bb8a442cfeba0 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 14:29:29 +0200 Subject: [PATCH 316/556] Add color to label widget Remove name edit control from default dialog Remove text from plots --- .../dialog/edit-widget-control-creator.js | 7 +++++-- src/components/dialog/edit-widget-text-control.js | 9 ++++----- src/components/dialog/edit-widget.js | 7 +++---- src/components/widget-factory.js | 9 +++++++-- src/components/widget-label.js | 9 ++++++++- src/components/widget-plot-table.js | 4 +--- src/components/widget-plot.js | 4 +--- src/components/widget-table.js | 2 -- src/components/widget-value.js | 2 +- src/containers/widget.js | 2 -- src/styles/widgets.css | 13 ++++++++++--- 11 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 375aa4a..bfe6fab 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -43,7 +43,8 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ) } break; @@ -106,7 +107,9 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Label': dialogControls.push( - handleChange(e)} /> + handleChange(e)} validate={id => validateForm(id)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; default: diff --git a/src/components/dialog/edit-widget-text-control.js b/src/components/dialog/edit-widget-text-control.js index b9eef66..a87407a 100644 --- a/src/components/dialog/edit-widget-text-control.js +++ b/src/components/dialog/edit-widget-text-control.js @@ -37,15 +37,14 @@ class EditWidgetTextControl extends Component { } render() { - return ( - - { this.props.label } - this.props.handleChange(e)} /> + + {this.props.label} + this.props.handleChange(e)} /> ); } } -export default EditWidgetTextControl; \ No newline at end of file +export default EditWidgetTextControl; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 57ee278..90416f4 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component, PropTypes } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +//import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -124,7 +124,6 @@ class EditWidgetDialog extends Component { } render() { - let controls = null; if (this.props.widget) { controls = createControls( @@ -140,11 +139,11 @@ class EditWidgetDialog extends Component { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + {/* Name this.handleChange(e)} /> - + */} { controls || '' }
    diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 80f9d91..aa1a955 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -33,6 +33,7 @@ class WidgetFactory { widget.minHeight = 20; widget.width = 120; widget.height = 70; + widget.textSize = 16; break; case 'Plot': widget.simulator = defaultSimulator; @@ -52,9 +53,13 @@ class WidgetFactory { widget.height = 200; break; case 'Label': - widget.minWidth = 70; + widget.minWidth = 20; widget.minHeight = 20; - widget.textSize = 18; + widget.width = 100; + widget.height = 35; + widget.name = 'Label'; + widget.textSize = 32; + widget.fontColor = 0; break; case 'PlotTable': widget.simulator = defaultSimulator; diff --git a/src/components/widget-label.js b/src/components/widget-label.js index 84a9d76..58d2233 100644 --- a/src/components/widget-label.js +++ b/src/components/widget-label.js @@ -21,11 +21,18 @@ import React, { Component } from 'react'; +import EditWidgetColorControl from './dialog/edit-widget-color-control'; + class WidgetLabel extends Component { render() { + const style = { + fontSize: this.props.widget.textSize + 'px', + color: EditWidgetColorControl.ColorPalette[this.props.widget.fontColor] + }; + return (
    -

    {this.props.widget.name}

    +

    {this.props.widget.name}

    ); } diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index c674773..a998d09 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -141,8 +141,6 @@ class WidgetPlotTable extends Component { return (
    -

    {this.props.widget.name}

    -
    @@ -159,7 +157,7 @@ class WidgetPlotTable extends Component { data={simulatorData} time={this.props.widget.time} width={this.props.widget.width - 100} - height={this.props.widget.height - 100} + height={this.props.widget.height - 55} />
    diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index fb89a07..725e2b7 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -52,12 +52,10 @@ class WidgetPlot extends React.Component { return (
    -

    {this.props.widget.name}

    -
    diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 44d3966..697a48b 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -70,8 +70,6 @@ class WidgetTable extends Component { render() { return (
    -

    {this.props.widget.name}

    - diff --git a/src/components/widget-value.js b/src/components/widget-value.js index fdbb04b..d7337c5 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -53,7 +53,7 @@ class WidgetValue extends Component { var value_to_render = Number(this.state.value); return (
    - {this.props.widget.name} { Number.isNaN(value_to_render)? NaN : value_to_render.toFixed(3) } + {this.props.widget.name} { Number.isNaN(value_to_render)? NaN : value_to_render.toFixed(3) }
    ); } diff --git a/src/containers/widget.js b/src/containers/widget.js index b58a69c..ced8980 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -156,14 +156,12 @@ class Widget extends Component { element = } else if (widget.type === 'Plot') { element = - borderedWidget = true; } else if (widget.type === 'Table') { element = } else if (widget.type === 'Label') { element = } else if (widget.type === 'PlotTable') { element = this.props.onWidgetStatusChange(w, this.props.index) } /> - borderedWidget = true; } else if (widget.type === 'Image') { element = } else if (widget.type === 'Button') { diff --git a/src/styles/widgets.css b/src/styles/widgets.css index f085a7d..70c802c 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -20,7 +20,7 @@ ******************************************************************************/ .widget { - + } .border { @@ -300,11 +300,14 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input /* End Plots */ .single-value-widget { + padding: 0; + margin: 0; + width: 100%; height: 100%; display: flex; - justify-content: center; - align-items: center; + + word-wrap: break-word; } .single-value-widget > * { @@ -466,6 +469,10 @@ div[class*="-widget"] label { /* End label widget */ /* Begin table widget */ +.table-widget table { + background-color: #fff; +} + .table-widget td, .table-widget th { text-align: center; } From 00fb4c471b8584c308ddaf63e50ea027a679e3cf Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 21:15:18 +0200 Subject: [PATCH 317/556] Update all dependencies to lastest version Remove prop-types from all components Updating to react-router v4 needed to restructure the routes --- package.json | 10 +- src/components/dialog/dialog.js | 11 +- src/components/dialog/edit-project.js | 11 +- .../dialog/edit-simulation-model.js | 11 +- src/components/dialog/edit-simulation.js | 10 +- src/components/dialog/edit-simulator.js | 10 +- src/components/dialog/edit-user.js | 10 +- src/components/dialog/edit-visualization.js | 10 +- .../dialog/edit-widget-control-creator.js | 53 ++++--- src/components/dialog/edit-widget.js | 10 +- src/components/dialog/new-project.js | 10 +- src/components/dialog/new-simulation-model.js | 10 +- src/components/dialog/new-simulation.js | 9 +- src/components/dialog/new-simulator.js | 9 +- src/components/dialog/new-user.js | 9 +- src/components/dialog/new-visualization.js | 9 +- src/components/dropzone.js | 11 +- src/components/menu-sidebar.js | 14 +- src/components/table.js | 2 +- src/components/toolbox-item.js | 11 +- src/containers/app.js | 134 ++++-------------- src/containers/login.js | 8 +- src/containers/logout.js | 29 +--- src/containers/project.js | 4 +- src/containers/projects.js | 4 +- src/containers/simulation.js | 8 +- src/containers/visualization.js | 9 +- src/containers/widget.js | 35 ++--- src/router.js | 40 ++---- src/stores/user-store.js | 7 +- 30 files changed, 155 insertions(+), 363 deletions(-) diff --git a/package.json b/package.json index 57c7657..79cde11 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "flux": "^3.1.2", "gaugeJS": "^1.3.2", "immutable": "^3.8.1", - "rc-slider": "^7.0.1", + "rc-slider": "^8.3.0", "react": "^15.4.2", "react-bootstrap": "^0.31.1", "react-contextmenu": "^2.3.0", @@ -24,14 +24,14 @@ "react-dnd-html5-backend": "^2.2.4", "react-dom": "^15.4.2", "react-notification-system": "^0.2.13", - "react-rnd": "^4.2.2", - "react-router": "^3.0.2", + "react-rnd": "^5.0.9", + "react-router": "^4.1.2", "react-sortable-tree": "^0.1.19", "superagent": "^3.5.0" }, "devDependencies": { - "chai": "^3.5.0", - "react-scripts": "0.9.3" + "chai": "^4.1.0", + "react-scripts": "1.0.10" }, "scripts": { "start": "react-scripts start", diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index b0dff93..3f3058a 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -19,17 +19,10 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { Modal, Button } from 'react-bootstrap'; -class Dialog extends Component { - static propTypes = { - title: PropTypes.string.isRequired, - show: PropTypes.bool.isRequired, - buttonTitle: PropTypes.string.isRequired, - onClose: PropTypes.func.isRequired - }; - +class Dialog extends React.Component { closeModal() { this.props.onClose(false); } diff --git a/src/components/dialog/edit-project.js b/src/components/dialog/edit-project.js index d1fe9b4..62d8c41 100644 --- a/src/components/dialog/edit-project.js +++ b/src/components/dialog/edit-project.js @@ -19,19 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class EditProjectDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - project: PropTypes.object.isRequired, - simulations: PropTypes.array.isRequired - }; - +class EditProjectDialog extends React.Component { valid: true; constructor(props) { diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index de5855d..9a99480 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -19,21 +19,14 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Table from '../table'; import TableColumn from '../table-column'; import Dialog from './dialog'; -class EditSimulationModelDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - data: PropTypes.object.isRequired, - nodes: PropTypes.array.isRequired - }; - +class EditSimulationModelDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/edit-simulation.js b/src/components/dialog/edit-simulation.js index 95860a0..0da9b29 100644 --- a/src/components/dialog/edit-simulation.js +++ b/src/components/dialog/edit-simulation.js @@ -19,18 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class EditSimulationDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - simulation: PropTypes.object.isRequired - }; - +class EditSimulationDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index f7f6d76..ec4aa18 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -19,18 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class EditSimulatorDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - simulator: PropTypes.object.isRequired - }; - +class EditSimulatorDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js index 1720a3b..cc9e5d0 100644 --- a/src/components/dialog/edit-user.js +++ b/src/components/dialog/edit-user.js @@ -19,18 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class EditUserDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - user: PropTypes.object.isRequired - }; - +class EditUserDialog extends React.Component { valid: true; constructor(props) { diff --git a/src/components/dialog/edit-visualization.js b/src/components/dialog/edit-visualization.js index 8524bce..3cc2a09 100644 --- a/src/components/dialog/edit-visualization.js +++ b/src/components/dialog/edit-visualization.js @@ -19,18 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class EditVisualizationDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - visualization: PropTypes.object.isRequired - }; - +class EditVisualizationDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index bfe6fab..7a12b29 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -37,7 +37,7 @@ export default function createControls(widgetType = null, widget = null, session var dialogControls = []; switch(widgetType) { - case 'Value': { + case 'Value': let valueBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); } @@ -45,10 +45,9 @@ export default function createControls(widgetType = null, widget = null, session validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> - ) - } + ); break; - case 'Plot': { + case 'Plot': let plotBoundOnChange = (e) => { handleChange([e, {target: {id: 'signals', value: []}}]); } @@ -56,54 +55,54 @@ export default function createControls(widgetType = null, widget = null, session validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => plotBoundOnChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />) - } + handleChange(e)} /> + ); break; - case 'Table': { + case 'Table': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) - } + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + ); break; - case 'Image': { + case 'Image': dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />); - } + handleChange(e)} /> + ); break; - case 'Gauge': { + case 'Gauge': let gaugeBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: ''}}]); } dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) - } + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + ); break; - case 'PlotTable': { + case 'PlotTable': let plotTableBoundOnChange = (e) => { handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); } dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => plotTableBoundOnChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />) - } + handleChange(e)} /> + ); break; - case 'Slider': { + case 'Slider': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />) - } + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + ); break; - case 'Button': { + case 'Button': dialogControls.push( validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />) - } + validateForm(id)} handleChange={(e) => handleChange(e)} /> + ); break; - case 'Box': { + case 'Box': dialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} />) - } + validateForm(id)} handleChange={(e) => handleChange(e)} /> + ); break; case 'Label': dialogControls.push( diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 90416f4..825f661 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -19,20 +19,14 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; //import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; import createControls from './edit-widget-control-creator'; -class EditWidgetDialog extends Component { - static propTypes = { - sessionToken: PropTypes.string.isRequired, - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - +class EditWidgetDialog extends React.Component { valid: true; constructor(props) { diff --git a/src/components/dialog/new-project.js b/src/components/dialog/new-project.js index d61d53a..43e0ab2 100644 --- a/src/components/dialog/new-project.js +++ b/src/components/dialog/new-project.js @@ -19,18 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class NewProjectDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - simulations: PropTypes.array.isRequired - }; - +class NewProjectDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 79b3548..205c41c 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -19,20 +19,14 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; import Table from '../table'; import TableColumn from '../table-column'; import Dialog from './dialog'; -class NewSimulationModelDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - nodes: PropTypes.array.isRequired - }; - +class NewSimulationModelDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/new-simulation.js b/src/components/dialog/new-simulation.js index e0d6313..cfe0bc1 100644 --- a/src/components/dialog/new-simulation.js +++ b/src/components/dialog/new-simulation.js @@ -19,17 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class NewSimulationDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - +class NewSimulationDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index 3d9890c..a6160ae 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -19,17 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class NewSimulatorDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - +class NewSimulatorDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/new-user.js b/src/components/dialog/new-user.js index fd01f99..9746f41 100644 --- a/src/components/dialog/new-user.js +++ b/src/components/dialog/new-user.js @@ -19,17 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; import Dialog from './dialog'; -class NewUserDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - +class NewUserDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dialog/new-visualization.js b/src/components/dialog/new-visualization.js index a735b04..2f5f212 100644 --- a/src/components/dialog/new-visualization.js +++ b/src/components/dialog/new-visualization.js @@ -19,17 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class NewVisualzationDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - +class NewVisualzationDialog extends React.Component { valid: false; constructor(props) { diff --git a/src/components/dropzone.js b/src/components/dropzone.js index 21bad6b..7a9af88 100644 --- a/src/components/dropzone.js +++ b/src/components/dropzone.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { DropTarget } from 'react-dnd'; import classNames from 'classnames'; @@ -59,14 +59,7 @@ function collect(connect, monitor) { }; } -class Dropzone extends Component { - static propTypes = { - connectDropTarget: PropTypes.func.isRequired, - isOver: PropTypes.bool.isRequired, - canDrop: PropTypes.bool.isRequired, - onDrop: PropTypes.func.isRequired - }; - +class Dropzone extends React.Component { render() { var toolboxClass = classNames({ 'box-content': true, diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 152644a..110a206 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Link } from 'react-router'; +import { NavLink } from 'react-router-dom'; class SidebarMenu extends Component { render() { @@ -29,14 +29,14 @@ class SidebarMenu extends Component {

    Menu

      -
    • Home
    • -
    • Projects
    • -
    • Simulations
    • -
    • Simulators
    • +
    • Home
    • +
    • Projects
    • +
    • Simulations
    • +
    • Simulators
    • { this.props.currentRole === 'admin' ? -
    • User Management
    • : '' +
    • User Management
    • : '' } -
    • Logout
    • +
    • Logout
    ); diff --git a/src/components/table.js b/src/components/table.js index f0798c5..232cc0b 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Table, Button, Glyphicon, FormControl, Label } from 'react-bootstrap'; -import { Link } from 'react-router'; +import { Link } from 'react-router-dom'; //import TableColumn from './table-column'; diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js index 8d253f3..56b8b73 100644 --- a/src/components/toolbox-item.js +++ b/src/components/toolbox-item.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { DragSource } from 'react-dnd'; import classNames from 'classnames'; @@ -38,14 +38,7 @@ function collect(connect, monitor) { } } -class ToolboxItem extends Component { - static propTypes = { - connectDragSource: PropTypes.func.isRequired, - isDragging: PropTypes.bool.isRequired, - name: PropTypes.string.isRequired, - type: PropTypes.string.isRequired - }; - +class ToolboxItem extends React.Component { static defaultProps = { disabled: false }; diff --git a/src/containers/app.js b/src/containers/app.js index 40bfcde..8a64bbd 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -19,11 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { Container } from 'flux/utils'; import { DragDropContext } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import NotificationSystem from 'react-notification-system'; +import { Redirect, Route } from 'react-router-dom'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; @@ -34,57 +35,31 @@ import NotificationsDataManager from '../data-managers/notifications-data-manage import Header from '../components/header'; import Footer from '../components/footer'; import SidebarMenu from '../components/menu-sidebar'; + import Home from './home'; +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 Users from './users'; import '../styles/app.css'; -class App extends Component { +class App extends React.Component { static getStores() { return [ NodeStore, UserStore, SimulationStore ]; } static calculateState(prevState) { - // get list of running simulators - /*var simulators = SimulatorStore.getState().filter(simulator => { - return simulator.running === true; - }); - - // check if running simulators changed - if (prevState != null) { - var equal = true; - - // compare each element with its old one - if (prevState.runningSimulators.length === simulators.length) { - equal = prevState.runningSimulators.every(oldSimulator => { - const simulator = simulators.find(element => { - return element._id === oldSimulator._id; - }); - - if (simulator == null) { - return false; - } - - return simulator.running === oldSimulator.running; - }); - } else { - equal = false; - } - - // replace with old array to prevent change trigger - if (equal) { - simulators = prevState.runningSimulators; - } - }*/ - let currentUser = UserStore.getState().currentUser; return { nodes: NodeStore.getState(), simulations: SimulationStore.getState(), - currentRole: currentUser? currentUser.role : '', - token: UserStore.getState().token/*, - - runningSimulators: simulators*/ + currentRole: currentUser ? currentUser.role : '', + token: UserStore.getState().token }; } @@ -93,89 +68,34 @@ class App extends Component { const token = localStorage.getItem('token'); if (token != null && token !== '') { + // save token so we dont logout + this.setState({ token }); + AppDispatcher.dispatch({ type: 'users/logged-in', token: token }); - } else { - // transition to login page - this.props.router.push('/login'); } + } + componentDidMount() { // load all simulators and simulations to fetch simulation data AppDispatcher.dispatch({ type: 'nodes/start-load', - token + token: this.state.token }); AppDispatcher.dispatch({ type: 'simulations/start-load', - token + token: this.state.token }); - } - componentDidMount() { NotificationsDataManager.setSystem(this.refs.notificationSystem); } - componentWillUpdate(nextProps, nextState) { - // check if user is still logged in - if (nextState.token == null) { - // discard local token - localStorage.setItem('token', ''); - - this.props.router.push('/login'); - - return; - } - - // open connection to each node - /*const requiredNodes = this.requiredNodesBySimulations(); - - requiredNodes.forEach(node => { - AppDispatcher.dispatch({ - type: 'simulatorData/open', - identifier: simulator._id, - endpoint: node.endpoint, - signals: data.signals - }); - });*/ - } - - /*requiredNodesBySimulations() { - var nodes = {}; - - this.state.simulations.forEach(simulation => { - simulation.models.forEach(model => { - // get ID for node - var node = this.state.nodes.find(element => { - return element.name === model.simulator.node; - }); - - // add empty node if not existing - if (node !== undefined) { - if (nodes[node._id] == null) { - nodes[node._id] = { simulators: [] } - } - - // get simulator id - var simulator = node.simulators.find(simulator => { - return simulator.name === model.simulator.simulator; - }); - - nodes[node._id].simulators.push({ id: simulator.id, signals: model.length }); - } - }); - }); - - return nodes; - }*/ - render() { - // get children - var children = this.props.children; - if (this.props.location.pathname === "/") { - children = + if (this.state.token == null) { + return (); } return ( @@ -186,8 +106,16 @@ class App extends Component {
    +
    - {children} + + + + + + + +
    diff --git a/src/containers/login.js b/src/containers/login.js index d568bc7..cb23359 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -23,6 +23,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { PageHeader } 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'; @@ -64,14 +65,15 @@ class Login extends Component { if (nextState.currentUser != null) { // save login in local storage localStorage.setItem('token', nextState.token); - - // transition to index - nextProps.router.push('/'); } } } render() { + if (this.state.currentUser != null) { + return (); + } + return (
    diff --git a/src/containers/logout.js b/src/containers/logout.js index 5e246bb..9fa39ae 100644 --- a/src/containers/logout.js +++ b/src/containers/logout.js @@ -19,23 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; -import { Container } from 'flux/utils'; +import React from 'react'; +import { Redirect } from 'react-router-dom'; import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/villas-store'; - -class Home extends Component { - static getStores() { - return [ UserStore ]; - } - - static calculateState() { - return { - currentUser: UserStore.getState().currentUser - }; - } +class Logout extends React.Component { componentWillMount() { AppDispatcher.dispatch({ type: 'users/logout' @@ -45,19 +34,11 @@ class Home extends Component { localStorage.setItem('token', ''); } - componentWillUpdate(nextProps, nextState) { - // check if logged out - if (nextState.token == null) { - // transition to login page - nextProps.router.push('/login'); - } - } - render() { return ( - Login out + ); } } -export default Container.create(Home); +export default Logout; diff --git a/src/containers/project.js b/src/containers/project.js index ef427e2..d781ad2 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -54,7 +54,7 @@ class Visualizations extends Component { // Compare content of the projects array, update visualizations if changed if (JSON.stringify(prevState.projects) !== JSON.stringify(currentProjects)) { - projectUpdate = Visualizations.findProjectInState(currentProjects, props.params.project); + projectUpdate = Visualizations.findProjectInState(currentProjects, props.match.params.project); Visualizations.loadVisualizations(projectUpdate.visualizations, sessionToken); } @@ -72,7 +72,7 @@ class Visualizations extends Component { }; } else { - let initialProject = Visualizations.findProjectInState(currentProjects, props.params.project); + let initialProject = Visualizations.findProjectInState(currentProjects, props.match.params.project); // If projects have been loaded already but visualizations not (redirect from Projects page) if (initialProject && (!currentVisualizations || currentVisualizations.length === 0)) { Visualizations.loadVisualizations(initialProject.visualizations, sessionToken); diff --git a/src/containers/projects.js b/src/containers/projects.js index 93dd94d..a6c49b8 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; @@ -33,7 +33,7 @@ import TableColumn from '../components/table-column'; import NewProjectDialog from '../components/dialog/new-project'; import EditProjectDialog from '../components/dialog/edit-project'; -class Projects extends Component { +class Projects extends React.Component { static getStores() { return [ ProjectStore, SimulationStore, UserStore ]; } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index d021478..304c7d6 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; @@ -33,7 +33,7 @@ import TableColumn from '../components/table-column'; import NewSimulationModelDialog from '../components/dialog/new-simulation-model'; import EditSimulationModelDialog from '../components/dialog/edit-simulation-model'; -class Simulation extends Component { +class Simulation extends React.Component { static getStores() { return [ SimulationStore, NodeStore, UserStore ]; } @@ -67,7 +67,7 @@ class Simulation extends Component { } componentDidUpdate() { - if (this.state.simulation._id !== this.props.params.simulation) { + if (this.state.simulation._id !== this.props.match.params.simulation) { this.reloadSimulation(); } } @@ -75,7 +75,7 @@ class Simulation extends Component { reloadSimulation() { // select simulation by param id this.state.simulations.forEach((simulation) => { - if (simulation._id === this.props.params.simulation) { + if (simulation._id === this.props.match.params.simulation) { // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside this.setState({ simulation: JSON.parse(JSON.stringify(simulation)) }); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 869df52..c342430 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import { ContextMenu, MenuItem } from 'react-contextmenu'; @@ -41,7 +41,7 @@ import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; -class Visualization extends Component { +class Visualization extends React.Component { static getStores() { return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; } @@ -74,6 +74,7 @@ class Visualization extends Component { } componentWillMount() { + // TODO: Don't fetch token from local, use user-store! const token = localStorage.getItem('token'); AppDispatcher.dispatch({ @@ -83,7 +84,7 @@ class Visualization extends Component { } componentDidUpdate() { - if (this.state.visualization._id !== this.props.params.visualization) { + if (this.state.visualization._id !== this.props.match.params.visualization) { this.reloadVisualization(); } @@ -133,7 +134,7 @@ class Visualization extends Component { reloadVisualization() { // select visualization by param id this.state.visualizations.forEach((tempVisualization) => { - if (tempVisualization._id === this.props.params.visualization) { + if (tempVisualization._id === this.props.match.params.visualization) { // convert widgets list to a dictionary var visualization = Object.assign({}, tempVisualization, { diff --git a/src/containers/widget.js b/src/containers/widget.js index ced8980..42b4177 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -95,25 +95,26 @@ class Widget extends Component { return Math.round(value / this.props.grid) * this.props.grid; } - drag(event, ui) { - let x = this.snapToGrid(ui.position.left); - let y = this.snapToGrid(ui.position.top); + drag(event, data) { + const x = this.snapToGrid(data.x); + const y = this.snapToGrid(data.y); - if (x !== ui.position.left || y !== ui.position.top) { + if (x !== data.x || y !== data.y) { this.rnd.updatePosition({ x, y }); + console.log(this.rnd); } } - dragStop(event, ui) { + dragStop(event, data) { // update widget - var widget = this.props.data; - widget.x = this.snapToGrid(ui.position.left); - widget.y = this.snapToGrid(ui.position.top); + 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, styleSize, clientSize, delta) { + resizeStop(direction, delta, event) { // update widget let widget = Object.assign({}, this.props.data); @@ -126,8 +127,8 @@ class Widget extends Component { widget.y -= delta.height; } - widget.width = styleSize.width; - widget.height = styleSize.height; + widget.width += delta.width; + widget.height += delta.height; this.props.onWidgetChange(widget, this.props.index); } @@ -187,17 +188,17 @@ class Widget extends Component { return ( { this.rnd = c; }} - initial={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} + 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={ (direction, styleSize, clientSize, event) => this.borderWasClicked(event) } - onResizeStop={(direction, styleSize, clientSize, delta) => this.resizeStop(direction, styleSize, clientSize, delta)} - onDrag={(event, ui) => this.drag(event, ui)} - onDragStop={(event, ui) => this.dragStop(event, ui)} - moveGrid={grid} + 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} zIndex={widget.z} > diff --git a/src/router.js b/src/router.js index a4ab751..d9f3e45 100644 --- a/src/router.js +++ b/src/router.js @@ -19,45 +19,23 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; -import { Router, Route, browserHistory } from 'react-router'; +import React from 'react'; +import { BrowserRouter, Route, Switch } from 'react-router-dom'; import App from './containers/app'; -import Home from './containers/home'; -import Projects from './containers/projects'; -import Project from './containers/project'; -import Simulators from './containers/simulators'; -import Visualization from './containers/visualization'; -import Simulations from './containers/simulations'; -import Simulation from './containers/simulation'; -import Users from './containers/users'; import Login from './containers/login'; import Logout from './containers/logout'; -class Root extends Component { +class Root extends React.Component { render() { return ( - - - - - - - - - - - - - - - - + + + - - - - + + + ); } } diff --git a/src/stores/user-store.js b/src/stores/user-store.js index 0c3a70a..cbe2791 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -50,7 +50,7 @@ class UserStore extends ReduceStore { SimulatorDataDataManager.closeAll(); // delete user and token - return Object.assign({}, state, { token: null }); + return Object.assign({}, state, { token: null, currentUser: null }); case 'users/logged-in': // request logged-in user data @@ -67,16 +67,15 @@ class UserStore extends ReduceStore { 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. const WRONG_CREDENTIALS_NOTIFICATION = { title: 'Incorrect credentials', message: 'Please modify and try again.', level: 'error' - } - NotificationsDataManager.addNotification(WRONG_CREDENTIALS_NOTIFICATION); + }; + NotificationsDataManager.addNotification(WRONG_CREDENTIALS_NOTIFICATION); } return state; From b7d80c5fc55ea2000f20cd0029a8c1a6459d7070 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 21:20:29 +0200 Subject: [PATCH 318/556] Fix plot-table widget edit dialog --- src/components/dialog/edit-widget-text-control.js | 2 +- src/components/dialog/edit-widget.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/dialog/edit-widget-text-control.js b/src/components/dialog/edit-widget-text-control.js index a87407a..d46b98a 100644 --- a/src/components/dialog/edit-widget-text-control.js +++ b/src/components/dialog/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/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 825f661..9f75967 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -27,7 +27,7 @@ import Dialog from './dialog'; import createControls from './edit-widget-control-creator'; class EditWidgetDialog extends React.Component { - valid: true; + valid = true; constructor(props) { super(props); @@ -111,7 +111,8 @@ class EditWidgetDialog extends React.Component { name = false; } - this.valid = name; + //this.valid = name; + this.valid = true; // return state to control if (target === 'name') return name ? "success" : "error"; From 5d9f24e304fd13c3e90379f4f6c538687c8c4b96 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 22:06:22 +0200 Subject: [PATCH 319/556] Add widget locking Widgets can be locked and unlocked with the context menu Import react-contextmenu stylesheet instead of coping it into widgets.css --- src/components/widget-factory.js | 3 +- src/containers/visualization.js | 47 +++++++++++++++--- src/containers/widget.js | 7 ++- src/styles/widgets.css | 82 ++------------------------------ 4 files changed, 51 insertions(+), 88 deletions(-) diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index aa1a955..c6173bb 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -21,7 +21,8 @@ class WidgetFactory { height: 100, x: position.x, y: position.y, - z: position.z + z: position.z, + locked: false }; // set type specific properties diff --git a/src/containers/visualization.js b/src/containers/visualization.js index c342430..61bea93 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -41,6 +41,8 @@ import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; +import 'react-contextmenu/public/styles.5bb557.css'; + class Visualization extends React.Component { static getStores() { return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; @@ -357,8 +359,36 @@ class Visualization extends React.Component { this.setState({ visualization }); } + lockWidget(data) { + // lock the widget + let widget = this.state.visualization.widgets[data.key]; + widget.locked = true; + + // update visualization + let widgets = {}; + widgets[data.key] = widget; + widgets = Object.assign({}, this.state.visualization.widgets, widgets); + + const visualization = Object.assign({}, this.state.visualization, { widgets }); + this.setState({ visualization }); + } + + unlockWidget(data) { + // lock the widget + let widget = this.state.visualization.widgets[data.key]; + widget.locked = false; + + // update visualization + let widgets = {}; + widgets[data.key] = widget; + widgets = Object.assign({}, this.state.visualization.widgets, widgets); + + const visualization = Object.assign({}, this.state.visualization, { widgets }); + this.setState({ visualization }); + } + render() { - var current_widgets = this.state.visualization.widgets; + const current_widgets = this.state.visualization.widgets; return (
    @@ -425,13 +455,16 @@ class Visualization extends React.Component { {current_widgets != null && Object.keys(current_widgets).map( (widget_key) => ( - this.editWidget(e, data)}>Edit - this.deleteWidget(e, data)}>Delete + 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.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 ))} diff --git a/src/containers/widget.js b/src/containers/widget.js index 42b4177..8b7f094 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -181,7 +181,8 @@ class Widget extends Component { 'widget': !this.props.editing, 'editing-widget': this.props.editing, 'border': borderedWidget, - 'unselectable': this.props.editing + 'unselectable': this.props.editing, + 'locked': widget.locked && this.props.editing }); if (this.props.editing) { @@ -201,12 +202,14 @@ class Widget extends Component { dragGrid={grid} resizeGrid={grid} zIndex={widget.z} + enableResizing={!widget.locked} + disableDragging={widget.locked} > this.contextMenuTriggerViaDraggable = c} > {element} - ); + ); } else { return (
    diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 70c802c..b8f2483 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -35,6 +35,10 @@ background-color: #fff; } +.locked { + cursor: not-allowed !important; +} + /* Firefox-specific rules */ @-moz-document url-prefix() { .editing-widget:not(.border):hover { @@ -46,84 +50,6 @@ outline: 1px solid lightgray; } -/* Area to trigger the context menu */ -.react-contextmenu-wrapper { - width: 100%; - height: 100%; - position: absolute; - top: 0px; - left: 0px; - overflow: auto; -} - -.react-contextmenu { - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 16px; - color: #373a3c; - text-align: left; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0,0,0,.15); - border-radius: .25rem; - outline: none; - opacity: 0; - pointer-events: none; - z-index: 100; -} - -.react-contextmenu.react-contextmenu--visible { - opacity: 1; - pointer-events: auto; -} - -.react-contextmenu-item { - width: 200px; - padding: 3px 20px; - font-weight: 400; - line-height: 1.5; - color: #373a3c; - text-align: inherit; - white-space: nowrap; - background: 0 0; - border: 0; - cursor: pointer; -} - -.react-contextmenu-item.react-contextmenu-item--active, -.react-contextmenu-item:hover { - color: #fff; - background-color: #0275d8; - border-color: #0275d8; - text-decoration: none; -} - -.react-contextmenu-item--divider { - margin-bottom: 3px; - padding: 2px 0; - border-bottom: 1px solid rgba(0,0,0,.15); - cursor: inherit; -} -.react-contextmenu-item--divider:hover { - background-color: transparent; - border-color: rgba(0,0,0,.15); -} - -.react-contextmenu-item.react-contextmenu-submenu { - padding: 0; -} - -.react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item { -} - -.react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item:after { - content: "▶"; - display: inline-block; - position: absolute; - right: 7px; -} - /* Reset Bootstrap styles to "disable" while editing */ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input[disabled], .form-control[disabled], .checkbox.disabled label { cursor: inherit; From a0feed47b045a400624faadb0974911af399cb26 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 22:14:43 +0200 Subject: [PATCH 320/556] Fix unknown simulator data in table --- src/components/widget-table.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 697a48b..56389e9 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -38,7 +38,11 @@ class WidgetTable extends Component { // check data const simulator = nextProps.widget.simulator; - if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator.node][simulator.simulator] == null || nextProps.data[simulator.node][simulator.simulator].length === 0 || nextProps.data[simulator.node][simulator.simulator].values.length === 0 || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator.node] == null + || nextProps.data[simulator.node][simulator.simulator] == null + || nextProps.data[simulator.node][simulator.simulator].length === 0 + || nextProps.data[simulator.node][simulator.simulator].values.length === 0 + || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { // clear values this.setState({ rows: [], sequence: null }); return; From ddcee30799396bda08eb15da6403b1996d4bf2da Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 22:27:26 +0200 Subject: [PATCH 321/556] Add missing dependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 79cde11..380c955 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "react-notification-system": "^0.2.13", "react-rnd": "^5.0.9", "react-router": "^4.1.2", + "react-router-dom": "^4.1.2", "react-sortable-tree": "^0.1.19", "superagent": "^3.5.0" }, From b176beba5d7df27ac966f325693245cbf0de4286 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 1 Aug 2017 22:36:01 +0200 Subject: [PATCH 322/556] Move react-contextmenu stylesheet to separated file --- src/containers/visualization.js | 2 +- src/styles/context-menu.css | 80 +++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/styles/context-menu.css diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 61bea93..e28f419 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -41,7 +41,7 @@ import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; -import 'react-contextmenu/public/styles.5bb557.css'; +import '../styles/context-menu.css'; class Visualization extends React.Component { static getStores() { diff --git a/src/styles/context-menu.css b/src/styles/context-menu.css new file mode 100644 index 0000000..c21fffc --- /dev/null +++ b/src/styles/context-menu.css @@ -0,0 +1,80 @@ +/* Copied from react-contextmenu/examples */ + +.react-contextmenu { + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 16px; + color: #373a3c; + text-align: left; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,.15); + border-radius: .25rem; + outline: none; + opacity: 0; + pointer-events: none; + transition: opacity 250ms ease !important; +} + +.react-contextmenu.react-contextmenu--visible { + opacity: 1; + pointer-events: auto; +} + +.react-contextmenu-item { + padding: 3px 20px; + font-weight: 400; + line-height: 1.5; + color: #373a3c; + text-align: inherit; + white-space: nowrap; + background: 0 0; + border: 0; +cursor: pointer; +} + +.react-contextmenu-item.react-contextmenu-item--active, +.react-contextmenu-item.react-contextmenu-item--selected { + color: #fff; + background-color: #20a0ff; + border-color: #20a0ff; + text-decoration: none; +} + +.react-contextmenu-item.react-contextmenu-item--disabled, +.react-contextmenu-item.react-contextmenu-item--disabled:hover { + color: #878a8c; + background-color: transparent; + border-color: rgba(0,0,0,.15); +} + +.react-contextmenu-item--divider { + margin-bottom: 3px; + padding: 2px 0; + border-bottom: 1px solid rgba(0,0,0,.15); + cursor: inherit; +} +.react-contextmenu-item--divider:hover { + background-color: transparent; + border-color: rgba(0,0,0,.15); +} + +.react-contextmenu-item.react-contextmenu-submenu { +padding: 0; +} + +.react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item { +} + +.react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item:after { + content: "\25B6"; + display: inline-block; + position: absolute; + right: 7px; +} + +.example-multiple-targets::after { + content: attr(data-count); + display: block; +} From dcb0f6976af2ff64be8e3dd9ab060478ad09454d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 2 Aug 2017 13:50:24 +0200 Subject: [PATCH 323/556] Update backend submodule --- backend | 2 +- src/containers/projects.js | 2 +- src/containers/simulations.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend b/backend index c3bbf18..9cf1ad2 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit c3bbf18279b892374c8998a455d57ec8acc92501 +Subproject commit 9cf1ad232248988ad928272c1dedb5ae99c69d13 diff --git a/src/containers/projects.js b/src/containers/projects.js index a6c49b8..f1ea7fd 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -69,7 +69,7 @@ class Projects extends React.Component { if (data) { AppDispatcher.dispatch({ type: 'projects/start-add', - data: data, + data, token: this.state.sessionToken }); } diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 3082c59..4b8488f 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -62,7 +62,7 @@ class Simulations extends Component { if (data) { AppDispatcher.dispatch({ type: 'simulations/start-add', - data: data, + data, token: this.state.sessionToken }); } @@ -110,7 +110,7 @@ class Simulations extends Component { if (data) { AppDispatcher.dispatch({ type: 'simulations/start-edit', - data: data, + data, token: this.state.sessionToken }); } From 4d396cb218c562da62b49dad943850c2d0f67923 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 2 Aug 2017 14:01:25 +0200 Subject: [PATCH 324/556] Add missing controls to value widget edit Fix edit widget dialog tests --- .../components/dialog/edit-widget-control-creator.js | 9 ++++++--- src/components/dialog/edit-widget-control-creator.js | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index fea0b2a..457bbb6 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -10,23 +10,26 @@ import EditWidgetSimulatorControl from '../../../components/dialog/edit-widget-s import EditWidgetSignalControl from '../../../components/dialog/edit-widget-signal-control'; import EditWidgetSignalsControl from '../../../components/dialog/edit-widget-signals-control'; import EditWidgetOrientation from '../../../components/dialog/edit-widget-orientation'; +import EditWidgetTextSizeControl from '../../../components/dialog/edit-widget-text-size-control'; +import EditWidgetAspectControl from '../../../components/dialog/edit-widget-aspect-control'; describe('edit widget control creator', () => { it('should not return null', () => { let controls = createControls('Value', null, null, null, null, null, null); - expect(controls).to.be.defined; + expect(controls).to.be.not.undefined; }); var runs = [ - { args: { widgetType: 'Value' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Value' }, result: { controlNumber: 4, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextSizeControl] } }, { args: { widgetType: 'Plot' }, result: { controlNumber: 4, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, - { args: { widgetType: 'Image' }, result: { controlNumber: 1, controlTypes: [EditImageWidgetControl] } }, + { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 3, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 1, controlTypes: [EditWidgetOrientation] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, + { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } } ]; runs.forEach( (run) => { diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 7a12b29..b9305a6 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -42,9 +42,10 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: 0}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Plot': From f011a5962d3cb7b8c7477aa2a8b0392664e67037 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 2 Aug 2017 14:41:24 +0200 Subject: [PATCH 325/556] Fix widget resizing --- src/components/widget-factory.js | 8 ++++---- src/components/widget-plot.js | 6 +++--- src/containers/widget.js | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index c6173bb..ee54fa1 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -33,8 +33,9 @@ class WidgetFactory { widget.minWidth = 70; widget.minHeight = 20; widget.width = 120; - widget.height = 70; + widget.height = 30; widget.textSize = 16; + widget.name = 'Value'; break; case 'Plot': widget.simulator = defaultSimulator; @@ -48,9 +49,8 @@ class WidgetFactory { break; case 'Table': widget.simulator = defaultSimulator; - widget.minWidth = 300; - widget.minHeight = 200; - widget.width = 400; + widget.minWidth = 200; + widget.width = 300; widget.height = 200; break; case 'Label': diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 725e2b7..8333e37 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -32,9 +32,8 @@ class WidgetPlot extends React.Component { let simulatorData = []; // Proceed if a simulation with models and a simulator are available - if (simulator && simulation && simulation.models.length > 0) { - - const model = simulation.models.find( model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator ); + if (simulator && this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null && simulation && simulation.models.length > 0) { + const model = simulation.models.find(model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); const chosenSignals = this.props.widget.signals; simulatorData = this.props.data[simulator.node][simulator.simulator].values.filter((values, index) => ( @@ -46,6 +45,7 @@ class WidgetPlot extends React.Component { if (chosenSignals.includes(signal_index)) { accum.push({ index: signal_index, name: model_signal.name }); } + return accum; }, []); } diff --git a/src/containers/widget.js b/src/containers/widget.js index 8b7f094..02b70d2 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -101,7 +101,6 @@ class Widget extends Component { if (x !== data.x || y !== data.y) { this.rnd.updatePosition({ x, y }); - console.log(this.rnd); } } @@ -186,6 +185,8 @@ class Widget extends Component { }); 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; }} @@ -202,7 +203,7 @@ class Widget extends Component { dragGrid={grid} resizeGrid={grid} zIndex={widget.z} - enableResizing={!widget.locked} + enableResizing={resizing} disableDragging={widget.locked} > this.contextMenuTriggerViaDraggable = c} > From 32d8fb906149509f36e9e78a106b41426fa0a5f7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 2 Aug 2017 15:15:30 +0200 Subject: [PATCH 326/556] Fix nginx website routing --- backend | 2 +- etc/nginx/villas.conf | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend b/backend index 9cf1ad2..13d2641 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 9cf1ad232248988ad928272c1dedb5ae99c69d13 +Subproject commit 13d2641b2df01052ed742ec436c9bed3df36c9f0 diff --git a/etc/nginx/villas.conf b/etc/nginx/villas.conf index 4dabe64..770c1c1 100644 --- a/etc/nginx/villas.conf +++ b/etc/nginx/villas.conf @@ -28,6 +28,9 @@ server { # frontend location location / { root /www; + index index.html; + + try_files $uri $uri/ /index.html; } # error pages From 5cb615ef2b04033f1494c171114576f41b9f9a1c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 3 Aug 2017 09:49:18 +0200 Subject: [PATCH 327/556] Fix widget context menu Add protection to not create projects with having any valid simulation --- src/components/widget-factory.js | 4 ++-- src/containers/projects.js | 15 +++++++++++++-- src/containers/widget.js | 5 ++--- src/styles/context-menu.css | 11 ++++++++--- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index ee54fa1..68afcba 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -74,8 +74,8 @@ class WidgetFactory { widget.time = 60; break; case 'Image': - widget.minWidth = 100; - widget.minHeight = 100; + widget.minWidth = 20; + widget.minHeight = 20; widget.width = 200; widget.height = 200; widget.lockAspect = true; diff --git a/src/containers/projects.js b/src/containers/projects.js index f1ea7fd..47fda11 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -107,6 +107,14 @@ class Projects extends React.Component { return id; } + hasValidSimulation() { + const simulations = this.state.simulations.filter(simulation => { + return simulation.models.length > 0; + }); + + return simulations.length > 0; + } + render() { return (
    @@ -118,10 +126,13 @@ class Projects extends React.Component { 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} /> diff --git a/src/containers/widget.js b/src/containers/widget.js index 02b70d2..055637a 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -50,7 +50,6 @@ class Widget extends Component { } static calculateState(prevState) { - let tokenState = UserStore.getState().token; if (prevState) { @@ -149,7 +148,7 @@ class Widget extends Component { // get widget element const widget = this.props.data; let borderedWidget = false; - var element = null; + let element = null; // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Value') { @@ -180,7 +179,7 @@ class Widget extends Component { 'widget': !this.props.editing, 'editing-widget': this.props.editing, 'border': borderedWidget, - 'unselectable': this.props.editing, + 'unselectable': false, 'locked': widget.locked && this.props.editing }); diff --git a/src/styles/context-menu.css b/src/styles/context-menu.css index c21fffc..1dff534 100644 --- a/src/styles/context-menu.css +++ b/src/styles/context-menu.css @@ -74,7 +74,12 @@ padding: 0; right: 7px; } -.example-multiple-targets::after { - content: attr(data-count); - display: block; +.react-contextmenu-wrapper { + width: 100%; + height: 100%; + position: absolute; + top: 0px; + left: 0px; + overflow: auto; } + From 637f1fd2a8ae2560f63e0ebb2595da34ceb3ea52 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 3 Aug 2017 10:24:51 +0200 Subject: [PATCH 328/556] Fix nginx proxy for public files --- etc/nginx/villas.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etc/nginx/villas.conf b/etc/nginx/villas.conf index 770c1c1..d738a4b 100644 --- a/etc/nginx/villas.conf +++ b/etc/nginx/villas.conf @@ -14,6 +14,10 @@ server { proxy_pass http://backend:4000/; } + location /public { + proxy_pass http://backend:4000/public; + } + location /ws/api/ { proxy_pass http://node/api/; } From 4987a4d021cd18e3e38fc2385d2d81483e8fca5e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 3 Aug 2017 10:46:11 +0200 Subject: [PATCH 329/556] Remove sequence check on message receiving --- .../simulator-data-data-manager.js | 15 ++++++++----- src/stores/simulator-data-store.js | 21 +++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 666ea5e..ef05abd 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -78,16 +78,21 @@ class SimulatorDataDataManager { onMessage(event, node) { var message = this.bufferToMessage(event.data); - AppDispatcher.dispatch({ - type: 'simulatorData/data-changed', - data: message, - node: node - }); + if (message !== null) { + AppDispatcher.dispatch({ + type: 'simulatorData/data-changed', + data: message, + node: node + }); + } } bufferToMessage(blob) { // parse incoming message into usable data var data = new DataView(blob); + if (data.byteLength === 0) { + return null; + } let OFFSET_TYPE = 2; let OFFSET_VERSION = 4; diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 9033fd3..0826959 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -54,18 +54,16 @@ class SimulationDataStore extends ReduceStore { return state; case 'simulatorData/data-changed': - // get index for simulator id - if (state[action.node._id] == null) { - return state; - } + // get index for simulator id + if (state[action.node._id] == null) { + return state; + } - let index = action.node.simulators.findIndex(simulator => simulator.id === action.data.id); - if (index === -1 || state[action.node._id][index] == null) { - return state; - } + let index = action.node.simulators.findIndex(simulator => simulator.id === action.data.id); + if (index === -1 || state[action.node._id][index] == null) { + return state; + } - // only add data, if newer than current - if (state[action.node._id][index].sequence < action.data.sequence) { // add data to simulator for (i = 0; i < action.data.length; i++) { while (state[action.node._id][index].values.length < i + 1) { @@ -87,9 +85,6 @@ class SimulationDataStore extends ReduceStore { // explicit call to prevent array copy this.__emitChange(); - } else { - console.log('same sequence ' + state[action.node._id][index].sequence + ' ' + action.data.sequence); - } return state; From 72c2ae0e412d0d257204206d320e108d17fdc828 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 3 Aug 2017 15:09:00 +0000 Subject: [PATCH 330/556] added mongo-express web interface --- docker-compose.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3ae3f92..8fa9a85 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,8 +50,6 @@ services: # ports: # - "8080:15672" # - "5672:5672" -# networks: -# villas: # VILLASnode, the gateway between UDP and WebSocket traffic node: @@ -61,3 +59,16 @@ services: privileged: true restart: always command: node /etc/villas/node/websocket-demo.conf + volumes: + - /villas:/villas + - ./etc/node:/etc/villas/node + + # Web Interface for MongoDB + mongo-express: + image: mongo-express + environment: + ME_CONFIG_MONGODB_SERVER: database + ME_CONFIG_BASICAUTH_USERNAME: admin + ME_CONFIG_BASICAUTH_PASSWORD: "mongo-admin" + ports: + - "8081:8081" From 8abd8feb9226e8b5eb1106aae9310d48ee4221b1 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 3 Aug 2017 15:08:28 +0000 Subject: [PATCH 331/556] added new configuration playback from files --- etc/node/websocket-demo-files.conf | 78 ++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 etc/node/websocket-demo-files.conf diff --git a/etc/node/websocket-demo-files.conf b/etc/node/websocket-demo-files.conf new file mode 100644 index 0000000..840e6d4 --- /dev/null +++ b/etc/node/websocket-demo-files.conf @@ -0,0 +1,78 @@ +/** Example configuration file for VILLASnode. + * + * The syntax of this file is similar to JSON. + * A detailed description of the format can be found here: + * http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files + * + * @author Steffen Vogel + * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program 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 + * any later version. + * + * This program 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 this program. If not, see . + *********************************************************************************/ + +stats = 2; + +nodes = { + file_ssA = { + type = "file", + + in = { +# uri = "https://OOKc0UfswqvgRp0@rwth-aachen.sciebo.de/public.php/webdav/inl-csu/ssA_cosim_inl-csu_20170726_03-28-21.csv", + uri = "/villas/data/GenericCoSimExmp/inl-csu/ssA_cosim_inl-csu_20170726_03-28-21.csv" + eof = "rewind" + } + }, + file_ssB = { + type = "file", + + in = { +# uri = "https://OOKc0UfswqvgRp0@rwth-aachen.sciebo.de/public.php/webdav/inl-csu/ssB_cosim_inl-csu_20170726_03-27-19.csv", + uri = "/villas/data/GenericCoSimExmp/inl-csu/ssB_cosim_inl-csu_20170726_03-27-19.csv" + eof = "rewind" + } + } + sig_1 = { + type = "signal", + + signal = "mixed", + values = 4, + rate = 50, + frequency = 0.5 + stddev = 0.2 + }, + ws_sig = { + type = "websocket", + vectorize = 10, + }, + ws_ssA = { + type = "websocket", + vectorize = 1, + }, + ws_ssB = { + type = "websocket", + vectorize = 1, + } +}; + +############ List of paths ############ + +paths = ( + { in = "sig_1", out = "ws_sig", hooks = ( { type = "stats" } ) }, + + { in = "file_ssA", out = "ws_ssA", hooks = ( { type = "decimate", ratio = 200 } ) }, + { in = "file_ssB", out = "ws_ssB", hooks = ( { type = "decimate", ratio = 200 } ) } +); From b626c65dd321094048f4bc1d91b87606f40ebeda Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 3 Aug 2017 17:28:34 +0200 Subject: [PATCH 332/556] moved all configuration / deployment configs to Demo repo --- .gitmodules | 4 -- Dockerfile.nginx | 3 -- Dockerfile.node | 3 -- VILLAS.archive | Bin 1326 -> 0 bytes docker-compose-production.yml | 61 ---------------------- docker-compose.yml | 74 --------------------------- etc/nginx/villas.conf | 50 ------------------ etc/node/websocket-demo-files.conf | 78 ----------------------------- etc/node/websocket-demo.conf | 60 ---------------------- etc/node/websocket.conf | 57 --------------------- sample-data.sh | 25 --------- 11 files changed, 415 deletions(-) delete mode 100644 .gitmodules delete mode 100644 Dockerfile.nginx delete mode 100644 Dockerfile.node delete mode 100644 VILLAS.archive delete mode 100644 docker-compose-production.yml delete mode 100644 docker-compose.yml delete mode 100644 etc/nginx/villas.conf delete mode 100644 etc/node/websocket-demo-files.conf delete mode 100644 etc/node/websocket-demo.conf delete mode 100644 etc/node/websocket.conf delete mode 100755 sample-data.sh diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 7aee965..0000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "backend"] - path = backend - url = ../VILLASweb-backend.git - branch = develop diff --git a/Dockerfile.nginx b/Dockerfile.nginx deleted file mode 100644 index 14e8087..0000000 --- a/Dockerfile.nginx +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:stable-alpine - -COPY etc/nginx/villas.conf /etc/nginx/conf.d/default.conf diff --git a/Dockerfile.node b/Dockerfile.node deleted file mode 100644 index a778e3c..0000000 --- a/Dockerfile.node +++ /dev/null @@ -1,3 +0,0 @@ -FROM villas/node:latest - -COPY etc/node/*.conf /etc/villas/node/ diff --git a/VILLAS.archive b/VILLAS.archive deleted file mode 100644 index 0167f76ca8f8e1eca2bbe7fc582e8f9d130bf0ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1326 zcmV+}1=0E+iwFP!32ul0|FoA|Xk1kn$NzIO>GZ~z`D{=`l;IfgWthyFOnMm*8hg{y zn@Nb)qT|k--I?8-%Xls`xe#q1tO!N=VnNVKDIx_Q1by-S%4?X~upzkP6q0!UYEtKvHjwY+l0HVj(vm~FX80#F*% zahYw2hkQwUopO791AviSF*gduvuz_-PXTb`3tZ-g^l7m+^}?Y;V-rw9N7xF$ zWu|Ws=~pqSM|9#5oB*((+I6w6mKGMXDzkJtOI@{eVnJ=Fr9xJnp>t|!K`k>~EoqBc z)gmTUOZ>U4W>vmVl}>XJC+gy>i%7d{o(BNHmDLdk05q8E6NAm)NBP?NQpWvsg5Fyl zl&8aYsT1YvY zq5ab8+P8#tWXA&V%70QuwsT){K3W}c6M(v7pQ05niudyR;rlOXRYH{KC_|~ts|@@~5m)%Mc~HPd@ILNa4)bf#@q~ZGbE$)UeW40uIv@)+m26T#W+sP`bvjp zDUy>5;h}l`=hM6zf0Bo0Qx6eUT3P6A9Z9a<_ppiC~~yJ=2;EN*L0nTh^dZORw9^@wrTJ%qzQW&6wOnl#ht|?+R} zX-b7mu^LKtoYBE{v4j^hsXx)y-!r%r|MBfB-z`4%+0(+tvk&_tq?_{Vf%1trfBo{u zaSZ(M#s8J|Zv(NJ=q9tE)QRghZAS<9H&h@)`O%>%->lb081b~jlerxuW0Tt(M|b9& z;L-VbdviMv7R-a*V!Z diff --git a/docker-compose-production.yml b/docker-compose-production.yml deleted file mode 100644 index 2f229e0..0000000 --- a/docker-compose-production.yml +++ /dev/null @@ -1,61 +0,0 @@ -version: "2" - -volumes: - database: - driver: local - website: - -services: - # Build the frontend with node into a Docker volume - # This container does nothing useful beside providing an - # assets container to the nginx service - frontend: - image: villas-web - volumes: - - website:/usr/src/app/build - - nginx: - image: nginx:stable-alpine - ports: - - "80:80" - - "443:443" - volumes: - - website:/www - - ./etc/nginx:/etc/nginx/conf.d/ - - # The VILLASweb backend - backend: - image: villas-backend - environment: - - NODE_ENV=production - restart: always - - # The MongoDB database for the VILLASweb backend - database: - image: mongo:latest - user: mongodb - volumes: - - database:/data/db - restart: always - user: mongodb - - # AMQP broker for VILLAScontroller -# broker: -# image: rabbitmq:management -# environment: -# RABBITMQ_DEFAULT_USER: "villas" -# RABBITMQ_DEFAULT_PASS: "s3c0sim4!" -# ports: -# - "8080:15672" -# - "5672:5672" -# networks: -# villas: - - # VILLASnode, the gateway between UDP and WebSocket traffic - node: - image: villas/node - privileged: true - restart: always - command: node /etc/villas/node/websocket-demo.conf - volumes: - - ./etc/node:/etc/villas/node/ diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 8fa9a85..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,74 +0,0 @@ -version: "2" - -volumes: - database: - driver: local - website: - -services: - # Build the frontend with node into a Docker volume - # This container does nothing useful beside providing an - # assets container to the nginx service - frontend: - build: - context: . - volumes: - - website:/usr/src/app/build - - nginx: - build: - context: . - dockerfile: Dockerfile.nginx - ports: - - "80:80" - - "443:443" - volumes: - - website:/www - - # The VILLASweb backend - backend: - build: backend - environment: - - NODE_ENV=production - restart: always - - # The MongoDB database for the VILLASweb backend - database: - image: mongo:latest - user: mongodb - volumes: - - database:/data/db - restart: always - user: mongodb - - # AMQP broker for VILLAScontroller -# broker: -# image: rabbitmq:management -# environment: -# RABBITMQ_DEFAULT_USER: "villas" -# RABBITMQ_DEFAULT_PASS: "s3c0sim4!" -# ports: -# - "8080:15672" -# - "5672:5672" - - # VILLASnode, the gateway between UDP and WebSocket traffic - node: - build: - context: . - dockerfile: Dockerfile.node - privileged: true - restart: always - command: node /etc/villas/node/websocket-demo.conf - volumes: - - /villas:/villas - - ./etc/node:/etc/villas/node - - # Web Interface for MongoDB - mongo-express: - image: mongo-express - environment: - ME_CONFIG_MONGODB_SERVER: database - ME_CONFIG_BASICAUTH_USERNAME: admin - ME_CONFIG_BASICAUTH_PASSWORD: "mongo-admin" - ports: - - "8081:8081" diff --git a/etc/nginx/villas.conf b/etc/nginx/villas.conf deleted file mode 100644 index d738a4b..0000000 --- a/etc/nginx/villas.conf +++ /dev/null @@ -1,50 +0,0 @@ -server { - listen 80 default_server; - server_name VILLASweb; - - # backend location - location /api/ { - proxy_redirect off; - proxy_set_header Host $http_host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # rewrite url to exclude /api on context broker side - rewrite ^/api/?(.*) /api/$1 break; - - proxy_pass http://backend:4000/; - } - - location /public { - proxy_pass http://backend:4000/public; - } - - location /ws/api/ { - proxy_pass http://node/api/; - } - - location /ws { - proxy_pass http://node/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # frontend location - location / { - root /www; - index index.html; - - try_files $uri $uri/ /index.html; - } - - # error pages - error_page 404 /404.html; - location = /404.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } -} diff --git a/etc/node/websocket-demo-files.conf b/etc/node/websocket-demo-files.conf deleted file mode 100644 index 840e6d4..0000000 --- a/etc/node/websocket-demo-files.conf +++ /dev/null @@ -1,78 +0,0 @@ -/** Example configuration file for VILLASnode. - * - * The syntax of this file is similar to JSON. - * A detailed description of the format can be found here: - * http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files - * - * @author Steffen Vogel - * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC - * @license GNU General Public License (version 3) - * - * VILLASnode - * - * This program 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 - * any later version. - * - * This program 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 this program. If not, see . - *********************************************************************************/ - -stats = 2; - -nodes = { - file_ssA = { - type = "file", - - in = { -# uri = "https://OOKc0UfswqvgRp0@rwth-aachen.sciebo.de/public.php/webdav/inl-csu/ssA_cosim_inl-csu_20170726_03-28-21.csv", - uri = "/villas/data/GenericCoSimExmp/inl-csu/ssA_cosim_inl-csu_20170726_03-28-21.csv" - eof = "rewind" - } - }, - file_ssB = { - type = "file", - - in = { -# uri = "https://OOKc0UfswqvgRp0@rwth-aachen.sciebo.de/public.php/webdav/inl-csu/ssB_cosim_inl-csu_20170726_03-27-19.csv", - uri = "/villas/data/GenericCoSimExmp/inl-csu/ssB_cosim_inl-csu_20170726_03-27-19.csv" - eof = "rewind" - } - } - sig_1 = { - type = "signal", - - signal = "mixed", - values = 4, - rate = 50, - frequency = 0.5 - stddev = 0.2 - }, - ws_sig = { - type = "websocket", - vectorize = 10, - }, - ws_ssA = { - type = "websocket", - vectorize = 1, - }, - ws_ssB = { - type = "websocket", - vectorize = 1, - } -}; - -############ List of paths ############ - -paths = ( - { in = "sig_1", out = "ws_sig", hooks = ( { type = "stats" } ) }, - - { in = "file_ssA", out = "ws_ssA", hooks = ( { type = "decimate", ratio = 200 } ) }, - { in = "file_ssB", out = "ws_ssB", hooks = ( { type = "decimate", ratio = 200 } ) } -); diff --git a/etc/node/websocket-demo.conf b/etc/node/websocket-demo.conf deleted file mode 100644 index 11dbe01..0000000 --- a/etc/node/websocket-demo.conf +++ /dev/null @@ -1,60 +0,0 @@ -/** Example configuration file for VILLASnode. - * - * The syntax of this file is similar to JSON. - * A detailed description of the format can be found here: - * http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files - * - * @author Steffen Vogel - * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC - * @license GNU General Public License (version 3) - * - * VILLASnode - * - * This program 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 - * any later version. - * - * This program 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 this program. If not, see . - *********************************************************************************/ - -nodes = { - sig_1 = { - type = "signal", - - signal = "mixed", - values = 4, - rate = 25 - }, - ws_1 = { - type = "websocket", - description = "Demo Channel", - vectorize = 10, - source = { - simulator = "OP5600", - location = "ACS lab" - }, - series = ( - { label = "Random walk", unit = "V" }, - { label = "Sine", unit = "A" }, - { label = "Rect", unit = "Var"}, - { label = "Ramp", unit = "°C" } - ) - } -}; - -############ List of paths ############ - -paths = ( - { - in = "sig_1", - out = "ws_1", - reverse = false - } -); diff --git a/etc/node/websocket.conf b/etc/node/websocket.conf deleted file mode 100644 index 3a16599..0000000 --- a/etc/node/websocket.conf +++ /dev/null @@ -1,57 +0,0 @@ -/** Example configuration file for VILLASnode. - * - * The syntax of this file is similar to JSON. - * A detailed description of the format can be found here: - * http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files - * - * @author Steffen Vogel - * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC - * @license GNU General Public License (version 3) - * - * VILLASnode - * - * This program 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 - * any later version. - * - * This program 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 this program. If not, see . - *********************************************************************************/ - -nodes = { - ws_1 = { - type = "websocket", - description = "Demo Channel", - #vectorize = 10, - source = { - simulator = "OP5600", - location = "ACS lab" - }, - series = ( - { label = "Random walk", unit = "V" }, - { label = "Sine", unit = "A" }, - { label = "Rect", unit = "Var"}, - { label = "Ramp", unit = "°C" } - ) - }, - udp_1 = { - type = "socket", - layer = "udp", - - remote = "signal:12001" - local = "node:12000" - }, -}; - - -############ List of paths ############ - -paths = ( - { in = "udp_1", out = "ws_1", reverse = true } -); diff --git a/sample-data.sh b/sample-data.sh deleted file mode 100755 index b0e4aec..0000000 --- a/sample-data.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -DIR=$(basename $(pwd)) - -ACTION=${1:-import} -CONTAINER=${2:-${DIR}_database_1} -NETWORK=${4:-${DIR}_villas} -DATABASE=${3:-VILLAS} - -DOCKEROPTS="--interactive --tty --rm --network ${NETWORK} --volume $(pwd):/tmp" - -case ${ACTION} in - import) - docker run ${DOCKEROPTS} mongo:latest bash -c 'mongorestore --verbose --host '${CONTAINER}' --gzip --archive=/tmp/'${DATABASE}'.archive' - ;; - - save) - docker run ${DOCKEROPTS} mongo:latest bash -c 'mongodump --verbose --host '${CONTAINER}' --db '${DATABASE}' --gzip --archive=/tmp/'${DATABASE}'.archive' - ;; - - *) - echo "Usage: $0 (import|save) [MONGODB_CONTAINER [DATABASE [NETWORK]]]" - ;; -esac - From 39c711ef8fa6e4e397d66b4d7d574b9c2ab9d0b4 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 3 Aug 2017 17:35:33 +0200 Subject: [PATCH 333/556] removed backend submodule --- backend | 1 - 1 file changed, 1 deletion(-) delete mode 160000 backend diff --git a/backend b/backend deleted file mode 160000 index 13d2641..0000000 --- a/backend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 13d2641b2df01052ed742ec436c9bed3df36c9f0 From 3d834b3b46aee0a653ee23c34e5072a4ade84649 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 3 Aug 2017 19:01:49 +0200 Subject: [PATCH 334/556] removed deploy stage from CI config --- .gitlab-ci.yml | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b20e73..5c5ca55 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,5 @@ variables: GIT_SUBMODULE_STRATEGY: normal - DOCKER_COMPOSE_VERSION: 1.14.0 - PY_DOCKER_VERSION: 2.4.2 CI: "true" cache: @@ -16,7 +14,6 @@ cache: stages: - build - test - - deploy build_job: stage: build @@ -42,37 +39,3 @@ test_job: - build_job tags: - docker - -deploy_review: - stage: deploy - only: - - develop - environment: review - variables: - COMPOSE_TLS_VERSION: "TLSv1_2" - DOCKER_HOST: "$DEPLOYMENT_HOST" - DOCKER_TLS_VERIFY: "1" - DOCKER_CERT_PATH: "certs" - before_script: - - apk add --no-cache py-pip - - pip install --upgrade pip - - pip install docker-compose==$DOCKER_COMPOSE_VERSION - - pip install -U docker==$PY_DOCKER_VERSION - - mkdir -p $DOCKER_CERT_PATH - - echo "$DEPLOYMENT_CACERT" > $DOCKER_CERT_PATH/ca.pem - - echo "$DEPLOYMENT_CLIENT_CERT" > $DOCKER_CERT_PATH/cert.pem - - echo "$DEPLOYMENT_CLIENT_KEY" > $DOCKER_CERT_PATH/key.pem - - docker --version - - docker-compose --version - - docker info - script: - - docker-compose pull - - docker-compose build --no-cache - - docker-compose up -d - after_script: - - docker-compose rm -f - image: docker:17 - dependencies: - - build_job - tags: - - docker From 6c608f42e67721b10f5fcb0147fc4aff63e47634 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 11 Aug 2017 14:09:07 +0200 Subject: [PATCH 335/556] Add contributing.md --- CONTRIBUTING.md | 236 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4f69051 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,236 @@ +# Contributing guidelines + +Thanks for taking the time to contribute to VILLASweb, every help is appreciated! + +> **Note:** This guidelines may seem much, but they just try to describe as good as possible to help with most common questions and problems. If you are unsure about anything feel free to **ask**. + +#### Table of contents + +[Quickstart](#quickstart) + * [How to report a bug or request a feature](#report-a-bug-or-request-a-feature) + * [Fix a bug](#fix-a-bug) + +[Issues](#issues) + * [Report bugs](#report-bugs) + * [Request features](#request-features) + * [Labels](#labels) + +[Development](#development) + * [Branches](#branches) + * [Style guidelines](#style-guidelines) + - [Code guidelines](#code-guidelines) + - [Comment guidelines](#comment-guidelines) + - [Git commit guidelines](#git-commit-guidelines) + * [Merge requests](#merge-requests) + * [Hotfix](#hotfix) + +## Quickstart + +### Report a bug or request a feature + +Simply create a new issue in gitlab with an appropriate title and description. For more information see [report bugs](#report-bugs). + +### Fix a bug + +Look at the list of bugs in the issue list. Pick the bug you want to work on, create a new branch with gitlab on that issue and start working in that branch. For more information see [Development](#development). + +## Issues + +All issues are tracked by the gitlab issue tracker. Every issue created will be read! + +### Report bugs + +Every issue related to a bug must follow this rules: + + - Add the `bug` label. + - Add the version, if known the exact commit. + - If existing, add log messages. + - If possible, add screenshots or animated GIFs of the bug. + +### Request features + +Every issue related to a feature or enhancement must follow this rules: + + - Add the `feature` or `enhancement` label. + - If possible, mockup pictures or animated GIFs to help understand the request. + +### Labels + +There are two types of labels: `type` and `state`. + +**Type labels** define what type the issue is about: + - **Bug:** The issue is related to an existing bug in the system. + + - **Feature:** The issue is requesting a **new** feature. + + - **Enhancement:** The issue is requesting change or improving an **existing** feature. + + - **Question:** The issue is asking a question about the system. + + - **Invalid:** The issue was declared invalid by a project administrator. + + - **Duplicate:** The reason the issue was created is already in the system, thus the issue is marked duplicated by a project administrator. + + - **Help wanted:** This label is optional to request help by others. + +**State labels** define in which state of development the issue is: + - **Backlog:** The issue was accepted by the project administrators but has not been worked on. + + - **Development:** The issue is in active development. + + - **Testing:** The development of the issue is (mostly) finished and it is tested to make sure everything works. + + - **Doc-and-review:** The development of the issue is finished but the documentation is still missing and the project administrator want to review it before merging it into main code. + +## Development + +Before starting to develop you want to have completed the [setup](README.md#quick-start) steps. + +### Branches + +This are the type of branches you will/might see in this project: + - **Master:** The *master* branch only contains **stable** release versions which must always be merged from the *develop* branch or *release-branches*. Each commit to this branch must contain a tag with at least the version. + + - **Develop:** The *develop* branch contains the current development version. Commits to this branch are prohibited (except [hotfixes](#hotfix)). See [merge requests](#merge-requests) on how to merge your working state into *develop*. + + - **Working branches:** *Working branches*, often also called *bug-fix/feature branches*, contain the active development state of features and bug-fixes. For each new feature or bug-fix you are working on, create a new *working branch*. To create new branch use gitlab's build-in feature to create a branch related to an issue. + + - **Legacy branches:** These branches must not be touched. The store legacy code from early development state. + + - **Release branches:** When preparing a *develop* version for release it is sometimes necessary to clean up before releasing it. Thus you first create a *release branch* of *develop*, do clean up on this branch and then release to *master*. + +For more information on branches and git usage see [Git workflow tutorial](https://www.atlassian.com/git/tutorials/comparing-workflows#gitflow-workflow). + +### Style guidelines + +#### Code guidelines + + - Use **camelcase** by default for everything with respect to upper-camelcase (e.g. class names start with an upper case letter). + + - File names are all in lower case and hyphen separated (e.g. sample-file.js). + + - End files with an empty line. + + - Use [ES6](http://es6-features.org/) (ES2015) features especially `const`, arrow functions and ES6 classes. + + - Use *self-explaining names* for variables, methods and classes. **Don't** shorten names like `let ArrStr` instead of `class ArrayString`. + + - Don't use `var` unless it can't be avoided. For more information see [const](http://es6-features.org/#Constants) and [let](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let). + + - Use [ES6 arrow functions](http://es6-features.org/#ExpressionBodies) for callbacks. If only one variable is used, **don't** bracket it. + ```(javascript) + const increased = arr.map(v => v + 1); + const indexed = arr.map((v, index) => v += index); + ``` + + - Use [ES6 property shorthand](http://es6-features.org/#PropertyShorthand) whenever possible. + ```(javascript) + // Use + const obj = { x, y }; + + // Instead of + const obj = { x: x, y: y }; + ``` + + - Name *handler methods* `handleEventName` and *handler properties* `onEventName`. + ```(javascript) + + ``` + + - Use autobind for event handlers and callbacks. + ```(javascript) + handleClick = e => { + + } + ``` + + - Don't import react component (or similar) itself. Use `React.Component`. + ```(javascript) + import React from 'react'; + + class CustomComponent extends React.Component { + + } + ``` + + - Align and sort HTML properties properly. + ```(HTML) + // Do + + + + // Don't + + + ``` + +#### Comment guidelines + + - At the top of each file must be the following header: + ```(javascript) + /** + * File: + * Author: + * Date: + * + * 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 . + ******************************************************************************/ + ``` + + - By default use `//` for comments. You may use `/* */` for uncommenting a block of code. + + - Comment as many as neccessary, but don't comment obvious code which is obviously self-explaining. + ```(javascript) + // self-explaining, don't do this: + // increase index + index++; + ``` + +#### Git commit guidelines + + - The first line should be a summary of the whole commit. The following lines should explain in detail what changed. + ``` + Add dynamic rendering + + Add queue for dynamic renderer + Change renderer to use queue for assets + Add render priority to asset properties + ``` + + - Use present tense in comments (add, fix, update, remove etc.). + +### Merge requests + +When finished working on a bug-fix or feature in your branch, create a merge request to merge your code into the *develop* branch. Before creating the request, make sure your changes meet the following requirements: + + - The *code*, *documentation* and *git commits* follow all [style guidelines](#style-guidelines). + + - All CI (Continues integration) tests, if existing, must succeed. + + - Add screenshots and animated GIFs when appropriated to show changes. + + - If the *develop* branch has newer commits the *working branch* **may** be rebased to catch-up these commits. + +### Hotfix + +Sometimes it is neccessary to patch an important, security relevant or system breaking bug as fast as possible. In this case it is allowed to commit directly in *master/develop*, as long as this commit is only relevant for the bug fix. It **must** follow all rules for [merge requests](#merge-requests). From 060c08b5e3916ef2b59fca4e57d188ea07974c39 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 14 Aug 2017 22:04:58 +0200 Subject: [PATCH 336/556] Fix fetching simulators from nodes --- src/data-managers/nodes-data-manager.js | 4 ++-- src/stores/node-store.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index 12e4014..2aa85a7 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -48,7 +48,7 @@ class NodesDataManager extends RestDataManager { }); AppDispatcher.dispatch({ - type: 'nodes/edited', + type: 'nodes/simulatorsFetched', data: node }); @@ -59,7 +59,7 @@ class NodesDataManager extends RestDataManager { }); }).catch(error => { AppDispatcher.dispatch({ - type: 'nodes/edit-error', + type: 'nodes/simulatorsFetch-error', error: error }); }); diff --git a/src/stores/node-store.js b/src/stores/node-store.js index aad1df6..f871791 100644 --- a/src/stores/node-store.js +++ b/src/stores/node-store.js @@ -41,6 +41,17 @@ class NodeStore extends ArrayStore { return super.reduce(state, action); + case 'nodes/edited': + NodesDataManager.getSimulators(action.data); + + return super.reduce(state, action); + + case 'nodes/simulatorsFetched': + return this.updateElements(state, [action.data]); + + case 'nodes/simulatorsFetch-error': + return state; + default: return super.reduce(state, action); } From c02634351b6a4252931614bb40dda2f7f6f10924 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 14 Aug 2017 22:12:41 +0200 Subject: [PATCH 337/556] Fix not saving simulator IDs in nodes --- src/data-managers/nodes-data-manager.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index 2aa85a7..9b368ac 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -64,6 +64,29 @@ class NodesDataManager extends RestDataManager { }); }); } + + update(object, token = null) { + var obj = {}; + obj[this.type] = this.filterKeys(object); + + // filter simulator IDs + obj[this.type].simulators = obj[this.type].simulators.map(simulator => { + delete simulator.id; + return simulator; + }); + + RestAPI.put(this.makeURL(this.url + '/' + object._id), obj, token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/edited', + data: Object.assign({}, object, response[this.type]) + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/edit-error', + error: error + }); + }); + } } export default new NodesDataManager(); From cc2766e37318fa79da60a81c3db69ff401dd4671 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 17 Aug 2017 17:35:15 +0200 Subject: [PATCH 338/556] Add home when on '/' route --- src/containers/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/containers/app.js b/src/containers/app.js index 8a64bbd..a0ce9e6 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -108,6 +108,7 @@ class App extends React.Component {
    + From 92308a95d0cf5e7bfbc49c4ec1e3f3a873f2eec1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 17 Aug 2017 18:27:30 +0200 Subject: [PATCH 339/556] Add wrong crentials message to login form Make login button only clickable if username and password entered. --- src/components/login-form.js | 23 ++++++++++++++++++++--- src/containers/login.js | 5 +++-- src/stores/user-store.js | 14 ++++---------- src/styles/app.css | 2 +- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/components/login-form.js b/src/components/login-form.js index 62840d4..7e09091 100644 --- a/src/components/login-form.js +++ b/src/components/login-form.js @@ -30,7 +30,8 @@ class LoginForm extends Component { this.state = { username: '', - password: '' + password: '', + disableLogin: true } } @@ -47,7 +48,15 @@ class LoginForm extends Component { } handleChange(event) { - this.setState({ [event.target.id]: event.target.value }); + let disableLogin = this.state.disableLogin; + + if (event.target.id === 'username') { + disableLogin = this.state.password.length === 0 || event.target.value.length === 0; + } else if (event.target.id === 'password') { + disableLogin = this.state.username.length === 0 || event.target.value.length === 0; + } + + this.setState({ [event.target.id]: event.target.value, disableLogin }); } render() { @@ -71,9 +80,17 @@ class LoginForm extends Component { + {this.props.loginMessage && +
    + + Error: {this.props.loginMessage} + +
    + } + - + diff --git a/src/containers/login.js b/src/containers/login.js index cb23359..2a812cf 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -41,7 +41,8 @@ class Login extends Component { static calculateState() { return { currentUser: UserStore.getState().currentUser, - token: UserStore.getState().token + token: UserStore.getState().token, + loginMessage: UserStore.getState().loginMessage }; } @@ -83,7 +84,7 @@ class Login extends Component {
    Login - +
    diff --git a/src/stores/user-store.js b/src/stores/user-store.js index cbe2791..e8722c8 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -23,7 +23,6 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../app-dispatcher'; import UsersDataManager from '../data-managers/users-data-manager'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; class UserStore extends ReduceStore { @@ -35,7 +34,8 @@ class UserStore extends ReduceStore { return { users: [], currentUser: null, - token: null + token: null, + loginMessage: null }; } @@ -43,7 +43,7 @@ class UserStore extends ReduceStore { switch (action.type) { case 'users/login': UsersDataManager.login(action.username, action.password); - return state; + return Object.assign({}, state, { loginMessage: null }); case 'users/logout': // disconnect from all simulators @@ -69,13 +69,7 @@ class UserStore extends ReduceStore { 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. - const WRONG_CREDENTIALS_NOTIFICATION = { - title: 'Incorrect credentials', - message: 'Please modify and try again.', - level: 'error' - }; - - NotificationsDataManager.addNotification(WRONG_CREDENTIALS_NOTIFICATION); + state = Object.assign({}, state, { loginMessage: 'Wrong credentials! Please try again.' }); } return state; diff --git a/src/styles/app.css b/src/styles/app.css index 73e5f2c..d5b0e95 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -137,7 +137,7 @@ body { * Login form */ .login-container { - width: 500px; + max-width: 500px; margin: 30px auto; padding: 15px 20px; From c21468fe2e45e06c2f27710d2e52f4fb151b55a5 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 17 Aug 2017 18:35:54 +0200 Subject: [PATCH 340/556] Add text control to gauge edit dialog --- src/components/dialog/edit-widget-control-creator.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index b9305a6..b592952 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -75,8 +75,9 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: ''}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> ); break; case 'PlotTable': From d758a9201c98ecaa9646df91d849d55e21ceea96 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 17 Aug 2017 18:39:51 +0200 Subject: [PATCH 341/556] Fix test for gauge widget --- .gitignore | 1 + src/__tests__/components/dialog/edit-widget-control-creator.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 927d17b..0ca9d3f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +.vscode/ diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 457bbb6..1842af3 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -24,7 +24,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Plot' }, result: { controlNumber: 4, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, - { args: { widgetType: 'Gauge' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Gauge' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 3, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 1, controlTypes: [EditWidgetOrientation] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl] } }, From 2bf59d77b4475b1bca67d2c2abe615e1be0c059a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 18 Aug 2017 11:08:20 +0200 Subject: [PATCH 342/556] Make design responsive for mobile Not all components work with touch input yet. But the most part of the website is working, you can even view visualizations. --- src/components/header-menu.js | 43 ++++++++++++++++ src/components/header.js | 16 ++++-- src/components/menu-sidebar.js | 4 +- src/components/table.js | 2 +- src/containers/app.js | 56 ++++++++++++++------- src/styles/app.css | 90 ++++++++++++++++++++++++++++------ 6 files changed, 170 insertions(+), 41 deletions(-) create mode 100644 src/components/header-menu.js diff --git a/src/components/header-menu.js b/src/components/header-menu.js new file mode 100644 index 0000000..b2daf0e --- /dev/null +++ b/src/components/header-menu.js @@ -0,0 +1,43 @@ +/** + * 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 + * 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 { Button } from 'react-bootstrap'; +import { NavLink } from 'react-router-dom'; + +export default class HeaderMenu extends React.Component { + render() { + return
    + + +
      +
    • Home
    • +
    • Projects
    • +
    • Simulations
    • +
    • Simulators
    • + { this.props.currentRole === 'admin' ? +
    • User Management
    • : '' + } +
    • Logout
    • +
    +
    ; + } +} diff --git a/src/components/header.js b/src/components/header.js index 2268cb5..d0d0a87 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -19,15 +19,21 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; +import { Col, Button, Glyphicon } from 'react-bootstrap'; -import '../styles/app.css'; - -class Header extends Component { +class Header extends React.Component { render() { return (
    -

    VILLASweb

    + +

    VILLASweb

    + + + {this.props.showMenuButton && + + } +
    ); } diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 110a206..66ab5fb 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -19,10 +19,10 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { NavLink } from 'react-router-dom'; -class SidebarMenu extends Component { +class SidebarMenu extends React.Component { render() { return (
    diff --git a/src/components/table.js b/src/components/table.js index 232cc0b..b78a84e 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -151,7 +151,7 @@ class CustomTable extends Component { } return ( - +
    {this.props.children} diff --git a/src/containers/app.js b/src/containers/app.js index a0ce9e6..9141dec 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -25,6 +25,7 @@ import { DragDropContext } from 'react-dnd'; 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 AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; @@ -35,6 +36,7 @@ import NotificationsDataManager from '../data-managers/notifications-data-manage 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 './home'; import Projects from './projects'; @@ -59,7 +61,9 @@ class App extends React.Component { nodes: NodeStore.getState(), simulations: SimulationStore.getState(), currentRole: currentUser ? currentUser.role : '', - token: UserStore.getState().token + token: UserStore.getState().token, + + showSidebarMenu: false }; } @@ -93,34 +97,50 @@ class App extends React.Component { NotificationsDataManager.setSystem(this.refs.notificationSystem); } + showSidebarMenu = () => { + this.setState({ showSidebarMenu: true }); + } + + hideSidebarMenu = () => { + this.setState({ showSidebarMenu: false }); + } + render() { if (this.state.token == null) { return (); } return ( -
    - +
    +
    + + -
    +
    + -
    - +
    -
    - - - - - - - - - +
    +
    + + + +
    + + + + + + + + + +
    - -
    +
    + ); } diff --git a/src/styles/app.css b/src/styles/app.css index d5b0e95..6cc5360 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -26,16 +26,12 @@ body { background-color: #6EA2B0 !important; } -#root { - height: 100vh; -} - .app { - min-width: 800px; height: 100%; color: #4d4d4d; font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; + hyphens: auto; } .app-header { @@ -51,7 +47,25 @@ body { width: 100%; margin: 0; - text-align: center; + text-align: left; +} + +@media (min-width: 768px) { + .app-header h1 { + text-align: center !important; + } +} + +.app-header .menu-icon { + font-size: 28px; + color: #818181; + right: 5px; + + padding: 6px 0 0 0; +} + +.btn-link { + padding: 0 !important; } .app-footer { @@ -67,13 +81,6 @@ body { } .app-body { - /* Let sidebar grow and content occupy rest of the space */ - display: flex; - float: right; - width: 100%; - /* Fit between header and footer */ - min-height: calc(100vh - 140px); - padding: 15px 5px 0px 5px; } @@ -83,20 +90,30 @@ body { } .app-content { - flex: 1 1 auto; padding: 15px 20px; + width: auto; + min-height: 300px; + background-color: #fff; box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 9px 18px 0 rgba(0, 0, 0, 0.1); } +@media (min-width: 768px) { + .app-content { + margin-left: 200px !important; + } +} + /** * Menus */ .menu-sidebar { - display: inline-table; + /*display: inline-table;*/ padding: 20px 25px 20px 25px; + width: 180px; + float: left; background-color: #fff; box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), @@ -133,6 +150,49 @@ body { visibility:hidden; margin-bottom:-1px; } + +.sidenav { + height: 100%; + position: fixed; + top: 0; + right: 0; + z-index: 100; + background-color: #111; + overflow-x: hidden; + padding-top: 60px; + transition: 0.5s; +} + +.sidenav a { + padding: 8px 8px 8px 32px; + text-decoration: none; + font-size: 25px; + color: #818181; + display: block; + transition: 0.3s; +} + +.sidenav a:hover { + color: #f1f1f1; + text-decoration: none; +} + +.sidenav .closeButton { + position: absolute; + top: -15px; + right: 15px; + font-size: 56px; + margin-left: 50px; + text-decoration: none; + display: block; + color: #818181; + transition: 0.3s; +} + +.sidenav .closeButton:hover { + text-decoration: none; + color: #f1f1f1; +} /** * Login form */ From 69e5281a14f766abc135b04b6e259c22bd2bb42e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 18 Aug 2017 17:12:42 +0200 Subject: [PATCH 343/556] Add fullscreen to visualizations Fullscreen hides the header, footer and menu, thus showing only the visualization in the browser window. --- src/containers/app.js | 36 ++++++++++++++++++------- src/containers/visualization.js | 35 +++++++++++++++++++++--- src/stores/design-store.js | 48 +++++++++++++++++++++++++++++++++ src/styles/app.css | 16 ++++++++--- 4 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 src/stores/design-store.js diff --git a/src/containers/app.js b/src/containers/app.js index 9141dec..d4edcea 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -26,11 +26,13 @@ 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 classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; +import DesignStore from '../stores/design-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import Header from '../components/header'; @@ -51,7 +53,7 @@ import '../styles/app.css'; class App extends React.Component { static getStores() { - return [ NodeStore, UserStore, SimulationStore ]; + return [ NodeStore, UserStore, SimulationStore, DesignStore ]; } static calculateState(prevState) { @@ -63,7 +65,8 @@ class App extends React.Component { currentRole: currentUser ? currentUser.role : '', token: UserStore.getState().token, - showSidebarMenu: false + showSidebarMenu: false, + fullscreen: DesignStore.getState().fullscreen }; } @@ -110,6 +113,15 @@ class App extends React.Component { return (); } + const bodyClasses = classNames('app-body', { + 'app-body-spacing': !this.state.fullscreen + }); + + const contentClasses = classNames('app-content', { + 'app-content-margin-left': !this.state.fullscreen, + 'app-content-fullscreen': this.state.fullscreen + }); + return (
    @@ -119,14 +131,18 @@ class App extends React.Component {
    -
    + {!this.state.fullscreen && +
    + } -
    -
    - - +
    + {!this.state.fullscreen && +
    + + + } -
    +
    @@ -139,7 +155,9 @@ class App extends React.Component {
    -
    + {!this.state.fullscreen && +
    + } ); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e28f419..8028c43 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -37,6 +37,7 @@ import VisualizationStore from '../stores/visualization-store'; import ProjectStore from '../stores/project-store'; import SimulationStore from '../stores/simulation-store'; import FileStore from '../stores/file-store'; +import DesignStore from '../stores/design-store'; import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; @@ -45,7 +46,7 @@ import '../styles/context-menu.css'; class Visualization extends React.Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore, DesignStore ]; } static calculateState(prevState) { @@ -59,6 +60,7 @@ class Visualization extends React.Component { projects: ProjectStore.getState(), simulations: SimulationStore.getState(), files: FileStore.getState(), + fullscreen: DesignStore.getState().fullscreen, visualization: prevState.visualization || {}, project: prevState.project || null, @@ -387,6 +389,20 @@ class Visualization extends React.Component { this.setState({ visualization }); } + setFullscreen = () => { + AppDispatcher.dispatch({ + type: 'design/fullscreen', + fullscreen: true + }); + } + + unsetFullscreen = () => { + AppDispatcher.dispatch({ + type: 'design/fullscreen', + fullscreen: false + }); + } + render() { const current_widgets = this.state.visualization.widgets; @@ -411,9 +427,20 @@ class Visualization extends React.Component { ) : (
    - + {this.state.fullscreen === false ? ( + + + + + ) : ( + + )}
    )} diff --git a/src/stores/design-store.js b/src/stores/design-store.js new file mode 100644 index 0000000..25e1c74 --- /dev/null +++ b/src/stores/design-store.js @@ -0,0 +1,48 @@ +/** + * File: design-store.js + * Author: Markus Grigull + * Date: 18.08.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 { ReduceStore } from 'flux/utils'; + +import AppDispatcher from '../app-dispatcher'; + +class DesignStore extends ReduceStore { + constructor() { + super(AppDispatcher); + } + + getInitialState() { + return { + fullscreen: false + }; + } + + reduce(state, action) { + switch(action.type) { + case 'design/fullscreen': + return Object.assign({}, state, { fullscreen: action.fullscreen }); + + default: + return state; + } + } +} + +export default new DesignStore(); diff --git a/src/styles/app.css b/src/styles/app.css index 6cc5360..0df60ed 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -27,13 +27,17 @@ body { } .app { - height: 100%; + height: 100vh; color: #4d4d4d; font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; hyphens: auto; } +.app-body { + height: 100%; +} + .app-header { width: 100%; height: 60px; @@ -80,15 +84,19 @@ body { clear: both; } -.app-body { +.app-body-spacing { padding: 15px 5px 0px 5px; } -.app-body > div { +.app-body-spacing > div { margin-left: 7px; margin-right: 7px; } +.app-content-fullscreen { + height: 100%; +} + .app-content { padding: 15px 20px; @@ -101,7 +109,7 @@ body { } @media (min-width: 768px) { - .app-content { + .app-content-margin-left { margin-left: 200px !important; } } From e3fc757b3b959c70cce0a7a5592eae772d99f128 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 19 Aug 2017 14:09:15 +0200 Subject: [PATCH 344/556] Add progress bar to image upload --- src/api/rest-api.js | 4 +- .../dialog/edit-widget-image-control.js | 76 ++++++++++--------- src/data-managers/files-data-manager.js | 13 +++- src/stores/file-store.js | 4 +- 4 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/api/rest-api.js b/src/api/rest-api.js index 6a79598..43af793 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -128,9 +128,9 @@ class RestAPI { }); } - upload(url, data, token) { + upload(url, data, token, progressCallback) { return new Promise(function (resolve, reject) { - var req = request.post(url).send(data); + const req = request.post(url).send(data).on('progress', progressCallback); if (token != null) { req.set('x-access-token', token); diff --git a/src/components/dialog/edit-widget-image-control.js b/src/components/dialog/edit-widget-image-control.js index 56ae8f0..9db27ac 100644 --- a/src/components/dialog/edit-widget-image-control.js +++ b/src/components/dialog/edit-widget-image-control.js @@ -19,12 +19,12 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel, Button } from 'react-bootstrap'; +import React from 'react'; +import { FormGroup, FormControl, ControlLabel, Button, ProgressBar } from 'react-bootstrap'; import AppDispatcher from '../../app-dispatcher'; -class EditImageWidgetControl extends Component { +class EditImageWidgetControl extends React.Component { constructor(props) { super(props); @@ -32,7 +32,8 @@ class EditImageWidgetControl extends Component { widget: { file: '' }, - fileList: null + fileList: null, + progress: 0 }; } @@ -40,11 +41,11 @@ class EditImageWidgetControl extends Component { this.setState({ widget: nextProps.widget }); } - startFileUpload() { + startFileUpload = () => { // get selected file - var formData = new FormData(); + let formData = new FormData(); - for (var key in this.state.fileList) { + 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]); } @@ -54,39 +55,46 @@ class EditImageWidgetControl extends Component { AppDispatcher.dispatch({ type: 'files/start-upload', data: formData, - token: this.props.sessionToken + token: this.props.sessionToken, + progressCallback: this.uploadProgress, + finishedCallback: this.clearProgress }); } + uploadProgress = (e) => { + this.setState({ progress: Math.round(e.percent) }); + } + + clearProgress = () => { + this.setState({ progress: 0 }); + } + render() { - return ( -
    - - Image - this.props.handleChange(e)}> - { - this.props.files.length === 0? ( - - ) : ( - this.props.files.reduce( (entries, file, index) => { - entries.push(); - return entries; - }, [ - - ]) - ) - } - - + return
    + + Image + this.props.handleChange(e)}> + {this.props.files.length === 0 ? ( + + ) : ( + this.props.files.reduce((entries, file, index) => { + entries.push(); + return entries; + }, [ + + ]) + )} + + - - Upload - this.setState({ fileList: e.target.files }) } /> - + + Upload + this.setState({ fileList: e.target.files }) } /> + - -
    - ); + + +
    ; } } diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js index f5edb37..c63f895 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/data-managers/files-data-manager.js @@ -28,20 +28,25 @@ class FilesDataManager extends RestDataManager { super('file', '/files'); } - upload(file, token = null) { - RestAPI.upload(this.makeURL('/upload'), file, token).then(response => { + upload(file, token = null, progressCallback = null, finishedCallback = null) { + RestAPI.upload(this.makeURL('/upload'), file, token, progressCallback).then(response => { AppDispatcher.dispatch({ type: 'files/uploaded' }); + // Trigger a files reload AppDispatcher.dispatch({ type: 'files/start-load', - token: token + token }); + + if (finishedCallback) { + finishedCallback(); + } }).catch(error => { AppDispatcher.dispatch({ type: 'files/upload-error', - error: error + error }); }); } diff --git a/src/stores/file-store.js b/src/stores/file-store.js index 09266dd..1437652 100644 --- a/src/stores/file-store.js +++ b/src/stores/file-store.js @@ -30,11 +30,11 @@ class FileStore extends ArrayStore { reduce(state, action) { switch (action.type) { case 'files/start-upload': - FilesDataManager.upload(action.data, action.token); + FilesDataManager.upload(action.data, action.token, action.progressCallback, action.finishedCallback); return state; case 'files/uploaded': - console.log('ready uploaded'); + //console.log('ready uploaded'); return state; case 'files/upload-error': From 92850b082390977f723f3205f888dcb46cfac792 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 19 Aug 2017 14:44:40 +0200 Subject: [PATCH 345/556] Add missing image path to image widget --- src/components/widget-image.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/widget-image.js b/src/components/widget-image.js index afacaa6..3f9914a 100644 --- a/src/components/widget-image.js +++ b/src/components/widget-image.js @@ -38,13 +38,15 @@ class WidgetImage extends React.Component { } render() { - let file = this.props.files.find(file => file._id === this.props.widget.file); + const file = this.props.files.find(file => file._id === this.props.widget.file); return (
    - {file && + {file ? ( {file.name} e.preventDefault()} /> - } + ) : ( + missing-image e.preventDefault()} /> + )}
    ); } From 505c3a68d1243e340a94d84ae8762ef765e4a8ef Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 19 Aug 2017 15:38:01 +0200 Subject: [PATCH 346/556] Add unit option to value widget Fix image tag when showing missing image. --- .../dialog/edit-widget-control-creator.js | 3 +- .../dialog/edit-widget-checkbox-control.js | 45 +++++++++++++++++++ .../dialog/edit-widget-control-creator.js | 4 +- src/components/dialog/edit-widget.js | 2 + src/components/widget-factory.js | 1 + src/components/widget-image.js | 2 +- src/components/widget-value.js | 21 ++++++--- 7 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 src/components/dialog/edit-widget-checkbox-control.js diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 1842af3..f7c29f2 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -12,6 +12,7 @@ import EditWidgetSignalsControl from '../../../components/dialog/edit-widget-sig import EditWidgetOrientation from '../../../components/dialog/edit-widget-orientation'; import EditWidgetTextSizeControl from '../../../components/dialog/edit-widget-text-size-control'; import EditWidgetAspectControl from '../../../components/dialog/edit-widget-aspect-control'; +import EditWidgetCheckboxControl from '../../../components/dialog/edit-widget-checkbox-control'; describe('edit widget control creator', () => { it('should not return null', () => { @@ -20,7 +21,7 @@ describe('edit widget control creator', () => { }); var runs = [ - { args: { widgetType: 'Value' }, result: { controlNumber: 4, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextSizeControl] } }, + { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Plot' }, result: { controlNumber: 4, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, diff --git a/src/components/dialog/edit-widget-checkbox-control.js b/src/components/dialog/edit-widget-checkbox-control.js new file mode 100644 index 0000000..9c063fb --- /dev/null +++ b/src/components/dialog/edit-widget-checkbox-control.js @@ -0,0 +1,45 @@ +/** + * 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 + * 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, Checkbox } from 'react-bootstrap'; + +class EditWidgetCheckboxControl extends React.Component { + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + render() { + return + this.props.handleChange(e)}>{this.props.text} + ; + } +} + +export default EditWidgetCheckboxControl; \ No newline at end of file diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index b592952..87fd786 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -31,6 +31,7 @@ import EditWidgetSignalsControl from './edit-widget-signals-control'; import EditWidgetOrientation from './edit-widget-orientation'; import EditWidgetAspectControl from './edit-widget-aspect-control'; import EditWidgetTextSizeControl from './edit-widget-text-size-control'; +import EditWidgetCheckboxControl from './edit-widget-checkbox-control'; export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, handleChange) { // Use a list to concatenate the controls according to the widget type @@ -45,7 +46,8 @@ export default function createControls(widgetType = null, widget = null, session validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Plot': diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 9f75967..fb52bdd 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -90,6 +90,8 @@ class EditWidgetDialog extends React.Component { // get file and update size changeObject = this.assignAspectRatio(changeObject, e.target.value); + } else if (e.target.type === 'checkbox') { + changeObject[e.target.id] = e.target.checked; } else { changeObject[e.target.id] = e.target.value; } diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 68afcba..96c678e 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -36,6 +36,7 @@ class WidgetFactory { widget.height = 30; widget.textSize = 16; widget.name = 'Value'; + widget.showUnit = false; break; case 'Plot': widget.simulator = defaultSimulator; diff --git a/src/components/widget-image.js b/src/components/widget-image.js index 3f9914a..cde16e0 100644 --- a/src/components/widget-image.js +++ b/src/components/widget-image.js @@ -45,7 +45,7 @@ class WidgetImage extends React.Component { {file ? ( {file.name} e.preventDefault()} /> ) : ( - missing-image e.preventDefault()} /> + questionmark e.preventDefault()} /> )} ); diff --git a/src/components/widget-value.js b/src/components/widget-value.js index d7337c5..1f5e6b4 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -26,7 +26,8 @@ class WidgetValue extends Component { super(props); this.state = { - value: '' + value: '', + unit: '' }; } @@ -35,17 +36,23 @@ class WidgetValue extends Component { const simulator = nextProps.widget.simulator.simulator; const node = nextProps.widget.simulator.node; - //console.log(nextProps.widget.simulator); - if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].values == null) { this.setState({ value: '' }); return; } + // get unit from simulation model + let unit = ''; + + if (nextProps.simulation) { + const simulationModel = nextProps.simulation.models.find(model => model.simulator.node === node && model.simulator.simulator === simulator); + unit = simulationModel.mapping[nextProps.widget.signal].type; + } + // check if value has changed const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { - this.setState({ value: signal[signal.length - 1].y }); + this.setState({ value: signal[signal.length - 1].y, unit }); } } @@ -53,7 +60,11 @@ class WidgetValue extends Component { var value_to_render = Number(this.state.value); return (
    - {this.props.widget.name} { Number.isNaN(value_to_render)? NaN : value_to_render.toFixed(3) } + {this.props.widget.name} + {Number.isNaN(value_to_render) ? NaN : value_to_render.toFixed(3)} + {this.props.widget.showUnit && + [{this.state.unit}] + }
    ); } From c8b99a21cc5aaaa3ebd06ae6f1645cfe0e1ea563 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 20 Aug 2017 10:57:37 +0200 Subject: [PATCH 347/556] Accept enter and escape in dialogs Modal dialogs can be canceled with escape and accepted with enter if the dialog is valid. --- src/components/dialog/dialog.js | 19 +++++++++++++----- src/components/dialog/edit-node.js | 4 +++- src/components/dialog/edit-project.js | 4 +++- .../dialog/edit-simulation-model.js | 4 +++- src/components/dialog/edit-simulation.js | 4 +++- src/components/dialog/edit-simulator.js | 4 +++- src/components/dialog/edit-user.js | 4 +++- src/components/dialog/edit-visualization.js | 4 +++- src/components/dialog/edit-widget.js | 4 +++- src/components/dialog/new-node.js | 4 +++- src/components/dialog/new-project.js | 4 +++- src/components/dialog/new-simulation-model.js | 4 +++- src/components/dialog/new-simulation.js | 4 +++- src/components/dialog/new-simulator.js | 4 +++- src/components/dialog/new-user.js | 4 +++- src/components/dialog/new-visualization.js | 4 +++- src/containers/project.js | 10 +++++++++- src/containers/projects.js | 10 +++++++++- src/containers/simulation.js | 10 +++++++++- src/containers/simulations.js | 10 +++++++++- src/containers/simulators.js | 20 +++++++++++++++++-- src/containers/users.js | 10 +++++++++- 22 files changed, 122 insertions(+), 27 deletions(-) diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index 3f3058a..2643af9 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -23,17 +23,26 @@ import React from 'react'; import { Modal, Button } from 'react-bootstrap'; class Dialog extends React.Component { - closeModal() { + closeModal = (event) => { this.props.onClose(false); } - cancelModal() { + cancelModal = (event) => { this.props.onClose(true); } + onKeyPress = (event) => { + if (event.key === 'Enter') { + // prevent input from submitting + event.preventDefault(); + + this.closeModal(false); + } + } + render() { return ( - + {this.props.title} @@ -43,8 +52,8 @@ class Dialog extends React.Component { - - + + ); diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js index b6475c3..c782354 100644 --- a/src/components/dialog/edit-node.js +++ b/src/components/dialog/edit-node.js @@ -41,7 +41,9 @@ class NewNodeDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-project.js b/src/components/dialog/edit-project.js index 62d8c41..2b960b6 100644 --- a/src/components/dialog/edit-project.js +++ b/src/components/dialog/edit-project.js @@ -39,7 +39,9 @@ class EditProjectDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 9a99480..37cf0d7 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -42,7 +42,9 @@ class EditSimulationModelDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-simulation.js b/src/components/dialog/edit-simulation.js index 0da9b29..fba0d19 100644 --- a/src/components/dialog/edit-simulation.js +++ b/src/components/dialog/edit-simulation.js @@ -38,7 +38,9 @@ class EditSimulationDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index ec4aa18..c3db013 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -37,7 +37,9 @@ class EditSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-user.js b/src/components/dialog/edit-user.js index cc9e5d0..e518b7d 100644 --- a/src/components/dialog/edit-user.js +++ b/src/components/dialog/edit-user.js @@ -40,7 +40,9 @@ class EditUserDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-visualization.js b/src/components/dialog/edit-visualization.js index 3cc2a09..ccd8578 100644 --- a/src/components/dialog/edit-visualization.js +++ b/src/components/dialog/edit-visualization.js @@ -38,7 +38,9 @@ class EditVisualizationDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index fb52bdd..e408753 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -43,7 +43,9 @@ class EditWidgetDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state.temporal); + if (this.valid) { + this.props.onClose(this.state.temporal); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index 44afa9d..54be1c9 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -40,7 +40,9 @@ class NewNodeDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-project.js b/src/components/dialog/new-project.js index 43e0ab2..babcf77 100644 --- a/src/components/dialog/new-project.js +++ b/src/components/dialog/new-project.js @@ -38,7 +38,9 @@ class NewProjectDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 205c41c..a4e3bbb 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -42,7 +42,9 @@ class NewSimulationModelDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-simulation.js b/src/components/dialog/new-simulation.js index cfe0bc1..2d09c0d 100644 --- a/src/components/dialog/new-simulation.js +++ b/src/components/dialog/new-simulation.js @@ -37,7 +37,9 @@ class NewSimulationDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index a6160ae..de8eb90 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -37,7 +37,9 @@ class NewSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-user.js b/src/components/dialog/new-user.js index 9746f41..f3cf20d 100644 --- a/src/components/dialog/new-user.js +++ b/src/components/dialog/new-user.js @@ -40,7 +40,9 @@ class NewUserDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/components/dialog/new-visualization.js b/src/components/dialog/new-visualization.js index 2f5f212..70b45ec 100644 --- a/src/components/dialog/new-visualization.js +++ b/src/components/dialog/new-visualization.js @@ -37,7 +37,9 @@ class NewVisualzationDialog extends React.Component { onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + if (this.valid) { + this.props.onClose(this.state); + } } else { this.props.onClose(); } diff --git a/src/containers/project.js b/src/containers/project.js index d781ad2..3e00079 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -153,6 +153,14 @@ class Visualizations extends Component { } } + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + render() { // get visualizations for this project var visualizations = []; @@ -179,7 +187,7 @@ class Visualizations extends Component { this.closeEditModal(data)} visualization={this.state.modalData} /> - + this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> Delete Visualization diff --git a/src/containers/projects.js b/src/containers/projects.js index 47fda11..1f02f80 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -115,6 +115,14 @@ class Projects extends React.Component { return simulations.length > 0; } + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + render() { return (
    @@ -135,7 +143,7 @@ class Projects extends React.Component { this.closeNewModal(data)} simulations={this.state.simulations} /> this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> - + this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> Delete Project diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 304c7d6..32faa96 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -138,6 +138,14 @@ class Simulation extends React.Component { return name; } + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + render() { return (
    @@ -156,7 +164,7 @@ class Simulation extends React.Component { this.closeEditModal(data)} data={this.state.modalData} nodes={this.state.nodes} /> - + this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> Delete Simulation Model diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 4b8488f..af161b7 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -116,6 +116,14 @@ class Simulations extends Component { } } + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + render() { return (
    @@ -132,7 +140,7 @@ class Simulations extends Component { this.closeEditModal(data)} simulation={this.state.modalSimulation} /> - + this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> Delete Simulation diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 583c3a6..7d77841 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -198,6 +198,22 @@ class Simulators extends Component { }); } + onNodeModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteNodeModal(); + } + } + + onSimulatorModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteSimulatorModal(); + } + } + render() { return (
    @@ -218,7 +234,7 @@ class Simulators extends Component { this.closeEditSimulatorModal(data)} node={this.state.modalData} /> } - + this.setState({ deleteNodeModal: false })} onKeyPress={this.onNodeModalKeyPress}> Delete Node @@ -235,7 +251,7 @@ class Simulators extends Component { - + this.setState({ deleteSimulatorModal: false })} onKeyPress={this.onSimulatorModalKeyPress}> Delete Simulator diff --git a/src/containers/users.js b/src/containers/users.js index 288c4f4..fd742b7 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -100,6 +100,14 @@ class Users extends Component { return HUMAN_ROLE_NAMES.hasOwnProperty(role_key)? HUMAN_ROLE_NAMES[role_key] : ''; } + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + render() { return ( @@ -119,7 +127,7 @@ class Users extends Component { this.closeEditModal(data)} user={this.state.modalData} /> - + this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> Delete user From a46c8aa8803eada2b508bda77440796b5de4178f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 23 Aug 2017 18:04:16 +0200 Subject: [PATCH 348/556] change menu title from "User Managment" to "Users" in order to match the style of other entries (closes #104) --- 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 66ab5fb..51d7d83 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' ? -
  • User Management
  • : '' +
  • Users
  • : '' }
  • Logout
  • From 07ab29f5da51a199ccce2f65f1d7d9a759bf5b30 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 23 Aug 2017 18:11:46 +0200 Subject: [PATCH 349/556] more details in footer (closes #121) --- src/components/footer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/footer.js b/src/components/footer.js index 31d29ed..788ddf1 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -25,7 +25,7 @@ class Footer extends Component { render() { return ( ); } From 4f098d00c72731ecb5fe2871318331e5ebfa9ede Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 23 Aug 2017 18:32:08 +0200 Subject: [PATCH 350/556] first draft of welcome message missing: - test of stores - images --- src/containers/home.js | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/containers/home.js b/src/containers/home.js index 22e6782..d04525c 100644 --- a/src/containers/home.js +++ b/src/containers/home.js @@ -24,6 +24,7 @@ import { Container } from 'flux/utils'; // import AppDispatcher from '../app-dispatcher'; import VillasStore from '../stores/villas-store'; +import UserStore from '../stores/users-store'; class Home extends Component { static getStores() { @@ -32,13 +33,41 @@ class Home extends Component { static calculateState() { return { - villas: VillasStore.getState() + villas: VillasStore.getState(), + currentUser: UserStore.getState().currentUser + counts: { + users: UserStore.getState().users.length }; } render() { return (

    Home

    +

    Welcome {this.state.currentUser}! This is the VILLASweb frontend version [version] hosted by [admin].

    +

    This instance is hosting {this.state.counts.projects} projects consisting of {this.state.counts.nodes} nodes, {this.state.counts.simulations} simulations and {this.state.counts.visualizations} visualisations.

    +

    There are currently {this.state.counts.users} users registered.

    +

    Credits

    +

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

    + + Logo ACS +

    Links

    + +

    Funding

    +

    The development of VILLASframework projects have received funding from

    +
      +
    • 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 JARA ); } } From e2a0ba06c61cbde03beeab4dd6f1ccd8d895b405 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 25 Aug 2017 09:51:49 +0200 Subject: [PATCH 351/556] remove VillasStore --- src/containers/home.js | 4 +--- src/stores/villas-store.js | 43 -------------------------------------- 2 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 src/stores/villas-store.js diff --git a/src/containers/home.js b/src/containers/home.js index d04525c..64dabd3 100644 --- a/src/containers/home.js +++ b/src/containers/home.js @@ -23,17 +23,15 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; // import AppDispatcher from '../app-dispatcher'; -import VillasStore from '../stores/villas-store'; import UserStore from '../stores/users-store'; class Home extends Component { static getStores() { - return [ VillasStore ]; + return [ UserStore ]; } static calculateState() { return { - villas: VillasStore.getState(), currentUser: UserStore.getState().currentUser counts: { users: UserStore.getState().users.length diff --git a/src/stores/villas-store.js b/src/stores/villas-store.js deleted file mode 100644 index b553101..0000000 --- a/src/stores/villas-store.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * File: villas-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 - * 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 { ReduceStore } from 'flux/utils'; - -import AppDispatcher from '../app-dispatcher'; - -class VillasStore extends ReduceStore { - constructor() { - super(AppDispatcher); - } - - getInitialState() { - return {}; - } - - reduce(state, action) { - switch (action.type) { - default: - return state; - } - } -} - -export default new VillasStore(); From 1175b789d136cbb08a5bb801c1a480678e390e39 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 16 Sep 2017 19:33:29 +0200 Subject: [PATCH 352/556] improve styling of footer --- src/components/footer.js | 2 +- src/styles/app.css | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/footer.js b/src/components/footer.js index 788ddf1..2ebd1c9 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -25,7 +25,7 @@ class Footer extends Component { render() { return ( ); } diff --git a/src/styles/app.css b/src/styles/app.css index 6cc5360..f01e3a6 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -80,6 +80,10 @@ body { clear: both; } +.app-footer a { + color: #333; +} + .app-body { padding: 15px 5px 0px 5px; } @@ -136,7 +140,7 @@ body { .menu-sidebar ul { padding-top: 10px; list-style: none; - white-space: nowrap; + white-space: nowrap; } .menu-sidebar a::after { From e67607ddbdc3e3d5b03bf1e6b3702d94dbdd88b7 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 16 Sep 2017 19:34:03 +0200 Subject: [PATCH 353/556] properly make use of Dockers cache --- Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9307e76..498938f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,9 +4,14 @@ FROM node:8.2 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 install && npm run build +RUN npm run build VOLUME /usr/src/app/build From e808c0494809c9ca0b56747f534d082ba6ad6068 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 16 Sep 2017 20:52:35 +0200 Subject: [PATCH 354/556] finished home page --- src/config.js | 9 +- src/containers/home.js | 88 +++++++---- src/img/eonerc_rwth.svg | 152 ++++++++++++++++++ src/img/european_commission.svg | 272 ++++++++++++++++++++++++++++++++ src/img/jara.svg | 157 ++++++++++++++++++ src/img/villas_web.svg | 158 +++++++++++++++++++ src/styles/app.css | 13 ++ 7 files changed, 815 insertions(+), 34 deletions(-) create mode 100644 src/img/eonerc_rwth.svg create mode 100644 src/img/european_commission.svg create mode 100644 src/img/jara.svg create mode 100644 src/img/villas_web.svg diff --git a/src/config.js b/src/config.js index 4ade8ce..4054518 100644 --- a/src/config.js +++ b/src/config.js @@ -1,6 +1,11 @@ const config = { - publicPathBase: 'public/' + publicPathBase: 'public/', + instance: 'frontend of the Global RT-SuperLab Demonstration', + admin: { + name: 'Steffen Vogel', + mail: 'stvogel@eonerc.rwth-aachen.de' + } } -export default config \ No newline at end of file +export default config diff --git a/src/containers/home.js b/src/containers/home.js index 64dabd3..c365f0f 100644 --- a/src/containers/home.js +++ b/src/containers/home.js @@ -22,50 +22,74 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -// import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/users-store'; +import AppDispatcher from '../app-dispatcher'; + +import NodeStore from '../stores/node-store'; +import SimulationStore from '../stores/simulation-store'; +import ProjectStore from '../stores/project-store'; + +import config from '../config'; class Home extends Component { static getStores() { - return [ UserStore ]; + return [ NodeStore, SimulationStore, ProjectStore ]; } static calculateState() { return { - currentUser: UserStore.getState().currentUser - counts: { - users: UserStore.getState().users.length + nodes: NodeStore.getState(), + projects: ProjectStore.getState(), + simulations: SimulationStore.getState(), }; } + componentWillMount() { + AppDispatcher.dispatch({ + type: 'projects/start-load', + token: this.state.sessionToken + }); + + AppDispatcher.dispatch({ + type: 'simulations/start-load', + token: this.state.sessionToken + }); + } + render() { return ( -

    Home

    -

    Welcome {this.state.currentUser}! This is the VILLASweb frontend version [version] hosted by [admin].

    -

    This instance is hosting {this.state.counts.projects} projects consisting of {this.state.counts.nodes} nodes, {this.state.counts.simulations} simulations and {this.state.counts.visualizations} visualisations.

    -

    There are currently {this.state.counts.users} users registered.

    -

    Credits

    -

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

    - - Logo ACS -

    Links

    - -

    Funding

    -

    The development of VILLASframework projects have received funding from

    -
      -
    • 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 JARA +
    + Logo VILLASweb +

    Home

    +

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

    +

    + This instance is hosting {this.state.projects.length} projects consisting of {this.state.nodes.length} nodes and {this.state.simulations.length} simulations.
    +

    +

    Credits

    +

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

    + +

    Links

    + +

    Funding

    +

    The development of VILLASframework projects have received funding from

    +
      +
    • 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 ACS + Logo JARA + Logo EU +
    ); } } diff --git a/src/img/eonerc_rwth.svg b/src/img/eonerc_rwth.svg new file mode 100644 index 0000000..42c4c3f --- /dev/null +++ b/src/img/eonerc_rwth.svg @@ -0,0 +1,152 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/src/img/european_commission.svg b/src/img/european_commission.svg new file mode 100644 index 0000000..5bf4867 --- /dev/null +++ b/src/img/european_commission.svg @@ -0,0 +1,272 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/jara.svg b/src/img/jara.svg new file mode 100644 index 0000000..2f3f0d6 --- /dev/null +++ b/src/img/jara.svg @@ -0,0 +1,157 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/src/img/villas_web.svg b/src/img/villas_web.svg new file mode 100644 index 0000000..ccbc714 --- /dev/null +++ b/src/img/villas_web.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/styles/app.css b/src/styles/app.css index f01e3a6..18caa91 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -197,6 +197,19 @@ body { text-decoration: none; color: #f1f1f1; } + +/** + * Home page + */ +.home-container > ul { + margin-left: 2em; +} + +.home-container > img { + margin: 20px; +} + + /** * Login form */ From 20a9ad6521a6e314ff3df5d697e586292f4741e7 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 16 Sep 2017 20:53:07 +0200 Subject: [PATCH 355/556] fix CI --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 380c955..d6fd031 100644 --- a/package.json +++ b/package.json @@ -28,11 +28,11 @@ "react-router": "^4.1.2", "react-router-dom": "^4.1.2", "react-sortable-tree": "^0.1.19", - "superagent": "^3.5.0" + "superagent": "^3.5.0", + "react-scripts": "1.0.10" }, "devDependencies": { - "chai": "^4.1.0", - "react-scripts": "1.0.10" + "chai": "^4.1.0" }, "scripts": { "start": "react-scripts start", From 7b51cfc3f130e348275eb095e222f9bd320d6c6c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 16 Sep 2017 21:30:53 +0200 Subject: [PATCH 356/556] make Dockerfile self-hosting --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 498938f..9262cc9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,8 @@ RUN npm install COPY . /usr/src/app RUN npm run build -VOLUME /usr/src/app/build +# Run the app in a local webserver +RUN npm install -g serve +EXPOSE 5000 -CMD [ "true" ] +CMD [ "serve", "-s", "build" ] From 7825d119de8d3600c52771d3d82872e11ee965dc Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 00:29:55 +0200 Subject: [PATCH 357/556] Add gauge widget color zones --- .../dialog/edit-widget-color-zones-control.js | 131 +++++++++++++ .../dialog/edit-widget-control-creator.js | 7 +- .../dialog/edit-widget-min-max-control.js | 64 +++++++ src/components/dialog/edit-widget.js | 4 +- src/components/table-column.js | 4 +- src/components/table.js | 8 +- src/components/widget-factory.js | 9 +- src/components/widget-gauge.js | 178 ++++++++++++------ src/styles/app.css | 5 + 9 files changed, 346 insertions(+), 64 deletions(-) create mode 100644 src/components/dialog/edit-widget-color-zones-control.js create mode 100644 src/components/dialog/edit-widget-min-max-control.js diff --git a/src/components/dialog/edit-widget-color-zones-control.js b/src/components/dialog/edit-widget-color-zones-control.js new file mode 100644 index 0000000..458a4ce --- /dev/null +++ b/src/components/dialog/edit-widget-color-zones-control.js @@ -0,0 +1,131 @@ +/** + * 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 + * 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, ControlLabel, Button, Glyphicon } from 'react-bootstrap'; + +import Table from '../table'; +import TableColumn from '../table-column'; + +class EditWidgetColorZonesControl extends React.Component { + constructor(props) { + super(props); + + this.state = { + widget: { + zones: [] + }, + selectedZones: [] + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + addZone = () => { + // add row + const widget = this.state.widget; + widget.zones.push({ strokeStyle: 'ffffff', min: 0, max: 100 }); + + this.setState({ widget }); + + this.sendEvent(widget); + } + + removeZones = () => { + // remove zones + const widget = this.state.widget; + + this.state.selectedZones.forEach(row => { + widget.zones.splice(row, 1); + }); + + this.setState({ selectedZones: [], widget }); + + this.sendEvent(widget); + } + + changeCell = (event, row, column) => { + // change row + const widget = this.state.widget; + + if (column === 1) { + widget.zones[row].strokeStyle = event.target.value; + } else if (column === 2) { + widget.zones[row].min = event.target.value; + } else if (column === 3) { + widget.zones[row].max = event.target.value; + } + + this.setState({ widget }); + + this.sendEvent(widget); + } + + sendEvent(widget) { + // create event + const event = { + target: { + id: 'zones', + value: widget.zones + } + }; + + 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() { + return + Color zones + +
    + + + + +
    + + + + ; + } +} + +export default EditWidgetColorZonesControl; diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 87fd786..8846079 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -32,6 +32,8 @@ import EditWidgetOrientation from './edit-widget-orientation'; import EditWidgetAspectControl from './edit-widget-aspect-control'; 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'; export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, handleChange) { // Use a list to concatenate the controls according to the widget type @@ -79,7 +81,10 @@ export default function createControls(widgetType = null, widget = null, session dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'PlotTable': diff --git a/src/components/dialog/edit-widget-min-max-control.js b/src/components/dialog/edit-widget-min-max-control.js new file mode 100644 index 0000000..13d178a --- /dev/null +++ b/src/components/dialog/edit-widget-min-max-control.js @@ -0,0 +1,64 @@ +/** + * 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 + * 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, ControlLabel, Checkbox, Table } from 'react-bootstrap'; + +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"] = 1; + + this.state = { + widget + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ widget: nextProps.widget }); + } + + render() { + return + {this.props.label} + this.props.handleChange(e)}>Enable min-max + + + + + + + + +
    + Min: this.props.handleChange(e)} /> + + Max: this.props.handleChange(e)} /> +
    +
    ; + } +} + +export default EditWidgetMinMaxControl; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index e408753..91802e0 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -53,7 +53,7 @@ class EditWidgetDialog extends React.Component { assignAspectRatio(changeObject, fileId) { // get aspect ratio of file - let 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; @@ -94,6 +94,8 @@ 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; + } else if (e.target.type === 'number') { + changeObject[e.target.id] = Number(e.target.value); } else { changeObject[e.target.id] = e.target.value; } diff --git a/src/components/table-column.js b/src/components/table-column.js index 2867754..d78ef45 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -33,7 +33,9 @@ class TableColumn extends Component { dataIndex: false, inlineEditable: false, clickable: false, - labelKey: null + labelKey: null, + checkbox: false, + checkboxKey: '' }; render() { diff --git a/src/components/table.js b/src/components/table.js index b78a84e..94da5d0 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Table, Button, Glyphicon, FormControl, Label } from 'react-bootstrap'; +import { Table, Button, Glyphicon, FormControl, Label, Checkbox } from 'react-bootstrap'; import { Link } from 'react-router-dom'; //import TableColumn from './table-column'; @@ -96,6 +96,12 @@ class CustomTable extends Component { cell.push(); } + if (child.props.checkbox) { + const checkboxKey = this.props.checkboxKey; + + cell.push( child.props.onChecked(index, e)}>); + } + return cell; } diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 96c678e..010c01f 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -105,10 +105,15 @@ class WidgetFactory { case 'Gauge': widget.simulator = defaultSimulator; widget.signal = 0; - widget.minWidth = 200; + widget.minWidth = 100; widget.minHeight = 150; - widget.width = 200; + widget.width = 150; widget.height = 150; + widget.colorZones = false; + widget.zones = []; + widget.valueMin = 0; + widget.valueMax = 1; + widget.valueUseMinMax = false; break; case 'Box': widget.minWidth = 50; diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 800f043..984b382 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -18,62 +18,31 @@ class WidgetGauge extends Component { this.gauge = null; this.state = { - value: 0 + value: 0, + minValue: 0, + maxValue: 1 }; } - staticLabels(widget_height) { - let label_font_size = Math.floor(widget_height * 0.055); // font scaling factor, integer for performance - return { - font: label_font_size + 'px "Helvetica Neue"', - labels: [0.0, 0.1, 0.5, 0.9, 1.0], - color: "#000000", - fractionDigits: 1 - } - } - - computeGaugeOptions(widget_height) { - return { - angle: -0.25, - lineWidth: 0.2, - pointer: { - length: 0.6, - strokeWidth: 0.035 - }, - radiusScale: 0.9, - colorStart: '#6EA2B0', - colorStop: '#6EA2B0', - strokeColor: '#E0E0E0', - highDpiSupport: true, - staticLabels: this.staticLabels(widget_height) - }; - } - componentDidMount() { - const opts = this.computeGaugeOptions(this.props.widget.height); - this.gauge = new Gauge(this.gaugeCanvas).setOptions(opts); - this.gauge.maxValue = 1; - this.gauge.setMinValue(0); + 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); - } - shouldComponentUpdate(nextProps, nextState) { - - // Check if size changed, resize labels if it did (the canvas itself is scaled with css) - if (this.props.widget.height !== nextProps.widget.height) { - this.updateAfterResize(nextProps.widget.height); - } - - // signal component update only if the value changed - return this.state.value !== nextState.value; + this.updateLabels(this.state.minValue, this.state.maxValue); } componentWillReceiveProps(nextProps) { // update value const simulator = nextProps.widget.simulator; - if (nextProps.data == null || nextProps.data[simulator.node][simulator.simulator] == null || nextProps.data[simulator.node][simulator.simulator].values == null) { + if (nextProps.data == null || nextProps.data[simulator.node] == null + || nextProps.data[simulator.node][simulator.simulator] == null + || nextProps.data[simulator.node][simulator.simulator].length === 0 + || nextProps.data[simulator.node][simulator.simulator].values.length === 0 + || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { this.setState({ value: 0 }); return; } @@ -83,36 +52,129 @@ 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 (signal != null) { - const new_value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; - if (this.state.value !== new_value) { - this.setState({ value: new_value }); + const value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; + if (this.state.value !== value && value != null) { + this.setState({ value }); + + // update min-max if needed + let updateLabels = false; + let minValue = this.state.minValue; + let maxValue = this.state.maxValue; + + if (nextProps.widget.valueUseMinMax) { + if (this.state.minValue > nextProps.widget.valueMin) { + minValue = nextProps.widget.valueMin; + + this.setState({ minValue }); + this.gauge.setMinValue(minValue); + + updateLabels = true; + } + + if (this.state.maxValue < nextProps.widget.valueMax) { + maxValue = nextProps.widget.valueMax; + + this.setState({ maxValue }); + this.gauge.maxValue = maxValue; + + 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 (maxValue < this.gauge.maxValue) { + maxValue = this.gauge.maxValue; + updateLabels = true; + + this.setState({ maxValue }); + } + } + + if (updateLabels) { + this.updateLabels(minValue, maxValue); + } // update gauge's value - this.gauge.set(new_value); + this.gauge.set(value); } } } - updateAfterResize(newHeight) { - // Update labels after resize - this.gauge.setOptions({ staticLabels: this.staticLabels(newHeight) }); + updateLabels(minValue, maxValue, force) { + // calculate labels + const labels = []; + const labelCount = 5; + const labelStep = (maxValue - minValue) / (labelCount - 1); + + for (let i = 0; i < labelCount; i++) { + labels.push(minValue + labelStep * i); + } + + // calculate zones + let zones = this.props.widget.colorZones ? this.props.widget.zones : null; + 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 }); + }); + + console.log(zones); + } + + this.gauge.setOptions({ + staticLabels: { + font: '10px "Helvetica Neue"', + labels, + color: "#000000", + fractionDigits: 1 + }, + staticZones: zones + }); + } + + computeGaugeOptions(widget) { + return { + angle: -0.25, + lineWidth: 0.2, + pointer: { + length: 0.6, + strokeWidth: 0.035 + }, + radiusScale: 0.8, + colorStart: '#6EA2B0', + colorStop: '#6EA2B0', + strokeColor: '#E0E0E0', + highDpiSupport: true, + limitMax: false, + limitMin: false + }; } render() { - var componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; - var signalType = null; + const componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; + let signalType = null; if (this.props.simulation) { - var simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; + const simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; signalType = (simulationModel != null && simulationModel.length > 0) ? simulationModel.mapping[this.props.widget.signal].type : ''; } return ( -
    -
    { this.props.widget.name }
    - this.gaugeCanvas = node } /> -
    { signalType }
    -
    { this.state.value }
    +
    +
    {this.props.widget.name}
    + this.gaugeCanvas = node} /> +
    {signalType}
    +
    {this.state.value}
    ); } diff --git a/src/styles/app.css b/src/styles/app.css index 18caa91..c042e74 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -247,6 +247,11 @@ body { color: #888; } +.table-control-checkbox input { + position: relative !important; + margin-top: 0 !important; +} + .unselectable { -webkit-touch-callout: none !important; /* iOS Safari */ -webkit-user-select: none !important; /* Safari */ From bb943cce9cb391bc59f2df08e040cf72a8c68e07 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 09:26:21 +0200 Subject: [PATCH 358/556] Improve plot widgets Add y-axis scale options Add time option to table-plot --- .../dialog/edit-widget-control-creator.js | 7 ++- src/components/widget-factory.js | 14 +++-- src/components/widget-gauge.js | 2 - src/components/widget-plot-table.js | 4 +- src/components/widget-plot.js | 60 +++++++++++------- src/components/widget-plot/plot-legend.js | 26 ++++---- src/components/widget-plot/plot.js | 62 ++++++++++++------- 7 files changed, 107 insertions(+), 68 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 8846079..9cafc98 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -60,7 +60,8 @@ export default function createControls(widgetType = null, widget = null, session validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => plotBoundOnChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Table': @@ -94,7 +95,9 @@ export default function createControls(widgetType = null, widget = null, session dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => plotTableBoundOnChange(e)} />, validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Slider': diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 010c01f..faed0a3 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -47,6 +47,9 @@ class WidgetFactory { widget.minHeight = 200; widget.width = 400; widget.height = 200; + widget.yMin = 0; + widget.yMax = 10; + widget.yUseMinMax = false; break; case 'Table': widget.simulator = defaultSimulator; @@ -68,11 +71,14 @@ class WidgetFactory { widget.preselectedSignals = []; widget.signals = []; // initialize selected signals widget.ylabel = ''; - widget.minWidth = 400; - widget.minHeight = 300; - widget.width = 500; - widget.height = 500; + widget.minWidth = 200; + widget.minHeight = 100; + widget.width = 600; + widget.height = 300; widget.time = 60; + widget.yMin = 0; + widget.yMax = 10; + widget.yUseMinMax = false; break; case 'Image': widget.minWidth = 20; diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 984b382..9a5cc4b 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -127,8 +127,6 @@ class WidgetGauge extends Component { zones = zones.map(zone => { return Object.assign({}, zone, { min: (zone.min * step) + +minValue, max: zone.max * step + +minValue, strokeStyle: '#' + zone.strokeStyle }); }); - - console.log(zones); } this.gauge.setOptions({ diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index a998d09..0cef2f5 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -37,7 +37,6 @@ class WidgetPlotTable extends Component { } componentWillReceiveProps(nextProps) { - // Update internal selected signals state with props (different array objects) if (this.props.widget.signals !== nextProps.widget.signals) { this.setState( {signals: nextProps.widget.signals}); @@ -158,6 +157,9 @@ class WidgetPlotTable extends Component { time={this.props.widget.time} width={this.props.widget.width - 100} height={this.props.widget.height - 55} + yMin={this.props.widget.yMin} + yMax={this.props.widget.yMax} + yUseMinMax={this.props.widget.yUseMinMax} />
    diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 8333e37..2c51e0d 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -25,45 +25,59 @@ import Plot from './widget-plot/plot'; import PlotLegend from './widget-plot/plot-legend'; class WidgetPlot extends React.Component { - render() { - const simulator = this.props.widget.simulator; - const simulation = this.props.simulation; - let legendSignals = []; - let simulatorData = []; + constructor(props) { + super(props); + + this.state = { + data: [], + legend: [] + }; + } + + componentWillReceiveProps(nextProps) { + const simulator = nextProps.widget.simulator; + const simulation = nextProps.simulation; // Proceed if a simulation with models and a simulator are available - if (simulator && this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null && simulation && simulation.models.length > 0) { + if (simulator && nextProps.data[simulator.node] != null && nextProps.data[simulator.node][simulator.simulator] != null && simulation && simulation.models.length > 0) { const model = simulation.models.find(model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); - const chosenSignals = this.props.widget.signals; + const chosenSignals = nextProps.widget.signals; - simulatorData = this.props.data[simulator.node][simulator.simulator].values.filter((values, index) => ( - this.props.widget.signals.findIndex(value => value === index) !== -1 + const data = nextProps.data[simulator.node][simulator.simulator].values.filter((values, index) => ( + nextProps.widget.signals.findIndex(value => value === index) !== -1 )); // Query the signals that will be displayed in the legend - legendSignals = model.mapping.reduce( (accum, model_signal, signal_index) => { + const legend = model.mapping.reduce( (accum, model_signal, signal_index) => { if (chosenSignals.includes(signal_index)) { accum.push({ index: signal_index, name: model_signal.name }); } return accum; }, []); + + this.setState({ data, legend }); + } else { + this.setState({ data: [], legend: [] }); } + } - return ( -
    -
    - -
    - - + render() { + return
    +
    +
    - ); + + +
    ; } } diff --git a/src/components/widget-plot/plot-legend.js b/src/components/widget-plot/plot-legend.js index 3771a5c..fcaeae0 100644 --- a/src/components/widget-plot/plot-legend.js +++ b/src/components/widget-plot/plot-legend.js @@ -7,25 +7,21 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; -class PlotLegend extends Component { - // constructor(props) { - // super(props); - // } - +class PlotLegend extends React.Component { render() { - var colorScale = scaleOrdinal(schemeCategory10); + const colorScale = scaleOrdinal(schemeCategory10); - return ( -
    - { this.props.signals.map( (signal) => -
       {signal.name}
    ) - } -
    - ); + return
    + {this.props.signals.map(signal => +
    +   {signal.name} +
    + )} +
    ; } } -export default PlotLegend; \ No newline at end of file +export default PlotLegend; diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 8af08f4..9be58fa 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -22,22 +22,38 @@ class Plot extends React.Component { constructor(props) { super(props); + // create dummy axes + const xScale = scaleTime().domain([Date.now(), Date.now() + 5 * 1000]).range([leftMargin, props.width]); + const yScale = scaleLinear().domain([0, 10]).range([props.height, bottomMargin]); + + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); + const yAxis = axisLeft().scale(yScale).ticks(5); + this.state = { - data: null + data: null, + xAxis, + yAxis }; } componentWillReceiveProps(nextProps) { // check if data is valid if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { - this.setState({ data: null }); + // create empty plot axes + const xScale = scaleTime().domain([Date.now(), Date.now() + 5 * 1000]).range([leftMargin, nextProps.width]); + const yScale = scaleLinear().domain([0, 10]).range([nextProps.height, bottomMargin]); + + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); + const yAxis = axisLeft().scale(yScale).ticks(5); + + this.setState({ data: null, xAxis, yAxis }); return; } // only show data in requested time let data = nextProps.data; - const firstTimestamp = data[0][data[0].length - 1].x - this.props.time * 1000; + const firstTimestamp = data[0][data[0].length - 1].x - nextProps.time * 1000; if (data[0][0].x < firstTimestamp) { // only show data in range (+100 ms) const index = data[0].findIndex(value => value.x >= firstTimestamp - 100); @@ -50,20 +66,26 @@ class Plot extends React.Component { xRange[0] = xRange[1] - nextProps.time * 1000; } - let yRange = [0, 0]; + let yRange; - data.map(values => { - const range = extent(values, p => p.y); - if (range[0] < yRange[0]) yRange[0] = range[0]; - if (range[1] > yRange[1]) yRange[1] = range[1]; + if (nextProps.yUseMinMax) { + yRange = [nextProps.yMin, nextProps.yMax]; + } else { + yRange = [0, 0]; - return values; - }); + data.map(values => { + const range = extent(values, p => p.y); + if (range[0] < yRange[0]) yRange[0] = range[0]; + if (range[1] > yRange[1]) yRange[1] = range[1]; + + return values; + }); + } // create scale functions for both axes const xScale = scaleTime().domain(xRange).range([leftMargin, nextProps.width]); const yScale = scaleLinear().domain(yRange).range([nextProps.height, bottomMargin]); - + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); @@ -77,18 +99,16 @@ class Plot extends React.Component { } render() { - if (this.state.data == null) return false; + console.log(this.state); - return( - - select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> - select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> + return + select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> + select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> - - {this.state.data} - - - ); + + {this.state.data} + + ; } } From 3dfee48427bfcb869677691568af4ecd41d9c2db Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 10:06:19 +0200 Subject: [PATCH 359/556] Add html widget --- src/components/dialog/dialog.js | 4 +- .../dialog/edit-widget-control-creator.js | 64 +++++++++++-------- .../dialog/edit-widget-html-content.js | 47 ++++++++++++++ src/components/dialog/edit-widget.js | 5 -- src/components/widget-factory.js | 4 ++ src/components/widget-html.js | 30 +++++++++ src/components/widget-plot/plot.js | 2 - src/containers/visualization.js | 1 + src/containers/widget.js | 3 + 9 files changed, 123 insertions(+), 37 deletions(-) create mode 100644 src/components/dialog/edit-widget-html-content.js create mode 100644 src/components/widget-html.js diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index 2643af9..d3bb657 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -32,12 +32,12 @@ class Dialog extends React.Component { } onKeyPress = (event) => { - if (event.key === 'Enter') { + /*if (event.key === 'Enter') { // prevent input from submitting event.preventDefault(); this.closeModal(false); - } + }*/ } render() { diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 9cafc98..5b30a1e 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -34,6 +34,7 @@ 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'; export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, handleChange) { // Use a list to concatenate the controls according to the widget type @@ -45,11 +46,11 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: 0}}]); } dialogControls.push( - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Plot': @@ -57,22 +58,22 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signals', value: []}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => plotBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => plotBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Table': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> ); break; case 'Image': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Gauge': @@ -80,12 +81,12 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: ''}}]); } dialogControls.push( - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'PlotTable': @@ -93,27 +94,27 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => plotTableBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => plotTableBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Slider': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> ); break; case 'Button': dialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} handleChange={(e) => handleChange(e)} /> ); break; case 'Box': dialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} /> ); break; case 'Label': @@ -123,6 +124,13 @@ export default function createControls(widgetType = null, widget = null, session handleChange(e)} /> ); break; + + case 'HTML': + dialogControls.push( + handleChange(e)} /> + ); + break; + default: console.log('Non-valid widget type: ' + widgetType); } diff --git a/src/components/dialog/edit-widget-html-content.js b/src/components/dialog/edit-widget-html-content.js new file mode 100644 index 0000000..22cc10b --- /dev/null +++ b/src/components/dialog/edit-widget-html-content.js @@ -0,0 +1,47 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; + +class EditWidgetHTMLContent extends React.Component { + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + return + HTML Content + this.props.handleChange(e)} /> + ; + } +} + +export default EditWidgetHTMLContent; diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 91802e0..0528938 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -140,11 +140,6 @@ class EditWidgetDialog extends React.Component { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - {/* - Name - this.handleChange(e)} /> - - */} { controls || '' }
    diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index faed0a3..ac4bd70 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -129,6 +129,10 @@ class WidgetFactory { widget.border_color = 0; widget.z = 0; break; + case 'HTML': + widget.content = 'Hello World'; + break; + default: widget.width = 100; widget.height = 100; diff --git a/src/components/widget-html.js b/src/components/widget-html.js new file mode 100644 index 0000000..b358fea --- /dev/null +++ b/src/components/widget-html.js @@ -0,0 +1,30 @@ +/** + * File: widget-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 + * 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'; + +class WidgetHTML extends React.Component { + render() { + return
    + } +} + +export default WidgetHTML; diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 9be58fa..c9cc77e 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -99,8 +99,6 @@ class Plot extends React.Component { } render() { - console.log(this.state); - return select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e28f419..971d55a 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -440,6 +440,7 @@ class Visualization extends React.Component { +
    } diff --git a/src/containers/widget.js b/src/containers/widget.js index 055637a..15e89b6 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -41,6 +41,7 @@ import WidgetNumberInput from '../components/widget-number-input'; import WidgetSlider from '../components/widget-slider'; import WidgetGauge from '../components/widget-gauge'; import WidgetBox from '../components/widget-box'; +import WidgetHTML from '../components/widget-html'; import '../styles/widgets.css'; @@ -173,6 +174,8 @@ class Widget extends Component { element = } else if (widget.type === 'Box') { element = + } else if (widget.type === 'HTML') { + element = } const widgetClasses = classNames({ From 762957e3628e6d3c90d6f7980b012492e74d0d4c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 4 Apr 2017 15:21:46 +0200 Subject: [PATCH 360/556] Add import dialog Add empty export dialog Add export button to table --- src/components/dialog/export-simulator.js | 88 +++++++++++++++++++++ src/components/dialog/import-simulator.js | 94 +++++++++++++++++++++++ src/components/table-column.js | 1 + src/components/table.js | 4 + src/containers/simulators.js | 20 +++++ 5 files changed, 207 insertions(+) create mode 100644 src/components/dialog/export-simulator.js create mode 100644 src/components/dialog/import-simulator.js diff --git a/src/components/dialog/export-simulator.js b/src/components/dialog/export-simulator.js new file mode 100644 index 0000000..31ec523 --- /dev/null +++ b/src/components/dialog/export-simulator.js @@ -0,0 +1,88 @@ +/** + * File: export-simulator.js + * Author: Markus Grigull + * Date: 04.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class ExportSimulatorDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', endpoint: '' }); + } + + validateForm(target) { + // check all controls + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default ExportSimulatorDialog; diff --git a/src/components/dialog/import-simulator.js b/src/components/dialog/import-simulator.js new file mode 100644 index 0000000..6b19e46 --- /dev/null +++ b/src/components/dialog/import-simulator.js @@ -0,0 +1,94 @@ +/** + * File: import-simulator.js + * Author: Markus Grigull + * Date: 04.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class ImportSimulatorDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', endpoint: '' }); + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulator + const simulator = JSON.parse(event.target.result); + self.valid = true; + self.setState({ name: simulator.name, endpoint: simulator.endpoint }); + }; + + reader.readAsText(file); + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Simulator File + this.loadFile(e.target.files)} /> + + + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default ImportSimulatorDialog; diff --git a/src/components/table-column.js b/src/components/table-column.js index d78ef45..1aafc2e 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -28,6 +28,7 @@ class TableColumn extends Component { width: null, editButton: false, deleteButton: false, + exportButton: false, link: '/', linkKey: '', dataIndex: false, diff --git a/src/components/table.js b/src/components/table.js index 94da5d0..3d5ac85 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -102,6 +102,10 @@ class CustomTable extends Component { cell.push( child.props.onChecked(index, e)}>); } + if (child.props.exportButton) { + cell.push(); + } + return cell; } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 7d77841..ec8df05 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -32,6 +32,8 @@ import EditNodeDialog from '../components/dialog/edit-node'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; import NodeTree from '../components/node-tree'; +import ImportSimulatorDialog from '../components/dialog/import-simulator'; +import ExportSimulatorDialog from '../components/dialog/export-simulator'; class Simulators extends Component { static getStores() { @@ -46,6 +48,8 @@ class Simulators extends Component { newNodeModal: false, deleteNodeModal: false, editNodeModal: false, + importModal: false, + exportModal: false, addSimulatorModal: false, editSimulatorModal: false, @@ -186,6 +190,22 @@ class Simulators extends Component { token: this.state.sessionToken }); } + + closeImportModal(data) { + this.setState({ importModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'simulators/start-add', + data: data + }); + } + } + + labelStyle(value) { + if (value === true) return 'success'; + else return 'warning'; + } onTreeDataChange(nodes) { // update all at once From c6892da97263042a54c094b3740cbf2d5babdabd Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 4 Apr 2017 15:48:59 +0200 Subject: [PATCH 361/556] Add simulator export Add FileSaver.js dependency --- package-lock.json | 9364 +++++++++++++++++ package.json | 1 + src/components/dialog/import-node.js | 94 + .../dialog/import-simulation-model.js | 189 + src/components/dialog/import-simulation.js | 140 + src/containers/simulators.js | 44 +- 6 files changed, 9825 insertions(+), 7 deletions(-) create mode 100644 package-lock.json create mode 100644 src/components/dialog/import-node.js create mode 100644 src/components/dialog/import-simulation-model.js create mode 100644 src/components/dialog/import-simulation.js diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ed9a02b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9364 @@ +{ + "name": "villasweb-frontend", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abab": { + "version": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", + "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=" + }, + "accepts": { + "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "requires": { + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + } + }, + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=" + }, + "acorn-dynamic-import": { + "version": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + }, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "acorn-globals": { + "version": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + }, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "acorn-jsx": { + "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" + }, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } + }, + "add-dom-event-listener": { + "version": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", + "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "address": { + "version": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", + "integrity": "sha1-SACB6CtYe6MZRZ/vUS9Rb+A9WK8=" + }, + "ajv": { + "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + } + }, + "ajv-keywords": { + "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" + }, + "align-text": { + "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + }, + "alphanum-sort": { + "version": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "anser": { + "version": "https://registry.npmjs.org/anser/-/anser-1.4.1.tgz", + "integrity": "sha1-w2QYY6lizr75Qeoshwbyy08HFr0=" + }, + "ansi-align": { + "version": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", + "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + } + }, + "ansi-escapes": { + "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-html": { + "version": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "requires": { + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + } + }, + "append-transform": { + "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "requires": { + "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz" + } + }, + "argparse": { + "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + } + }, + "aria-query": { + "version": "https://registry.npmjs.org/aria-query/-/aria-query-0.5.0.tgz", + "integrity": "sha1-heMVLNjMW6sY2+1hzZxPzlT6ecM=", + "requires": { + "ast-types-flow": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + } + }, + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + } + }, + "arr-flatten": { + "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "array-equal": { + "version": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-filter": { + "version": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-find-index": { + "version": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" + }, + "array-includes": { + "version": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz" + } + }, + "array-map": { + "version": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-union": { + "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + } + }, + "array-uniq": { + "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arrify": { + "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + } + }, + "assert": { + "version": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz" + } + }, + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "assertion-error": { + "version": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "ast-types-flow": { + "version": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "async": { + "version": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "async-each": { + "version": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "autoprefixer": { + "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", + "integrity": "sha1-l7yFTH0Ll5+NZIneVHoNF/swf20=", + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", + "caniuse-lite": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000709.tgz", + "normalize-range": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "num2fraction": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "aws-sign2": { + "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "axobject-query": { + "version": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "requires": { + "ast-types-flow": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + } + }, + "babel-code-frame": { + "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + } + }, + "babel-core": { + "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "babel-helpers": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-register": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "babel-eslint": { + "version": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz" + } + }, + "babel-generator": { + "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "requires": { + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-builder-react-jsx": { + "version": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", + "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + } + }, + "babel-helper-call-delegate": { + "version": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-define-map": { + "version": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", + "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-function-name": { + "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-get-function-arity": { + "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-hoist-variables": { + "version": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-optimise-call-expression": { + "version": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-regex": { + "version": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helper-replace-supers": { + "version": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-helpers": { + "version": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + } + }, + "babel-jest": { + "version": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", + "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", + "requires": { + "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "babel-plugin-istanbul": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", + "babel-preset-jest": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz" + } + }, + "babel-loader": { + "version": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", + "integrity": "sha1-LkOma+4f/0RwUz0EAsikUy+vuvc=", + "requires": { + "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + } + }, + "babel-messages": { + "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz", + "integrity": "sha1-rbW8j0iokxFUA5WunwzD7UsQuy4=", + "requires": { + "babel-plugin-syntax-dynamic-import": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-istanbul": { + "version": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", + "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=", + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", + "test-exclude": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz" + } + }, + "babel-plugin-jest-hoist": { + "version": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", + "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" + }, + "babel-plugin-syntax-async-functions": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-class-properties": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-flow": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" + }, + "babel-plugin-syntax-jsx": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-to-generator": { + "version": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "babel-plugin-syntax-async-functions": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-class-properties": { + "version": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-plugin-syntax-class-properties": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", + "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "requires": { + "babel-plugin-transform-strict-mode": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "regexpu-core": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "babel-plugin-syntax-exponentiation-operator": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "requires": { + "babel-plugin-syntax-flow": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-react-constant-elements": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", + "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "requires": { + "babel-helper-builder-react-jsx": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", + "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "requires": { + "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "requires": { + "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-regenerator": { + "version": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "requires": { + "regenerator-transform": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz" + } + }, + "babel-plugin-transform-runtime": { + "version": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + } + }, + "babel-preset-env": { + "version": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", + "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", + "requires": { + "babel-plugin-check-es2015-constants": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "babel-plugin-syntax-trailing-function-commas": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "babel-plugin-transform-async-to-generator": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "babel-plugin-transform-es2015-arrow-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "babel-plugin-transform-es2015-block-scoped-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "babel-plugin-transform-es2015-block-scoping": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", + "babel-plugin-transform-es2015-classes": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "babel-plugin-transform-es2015-computed-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "babel-plugin-transform-es2015-destructuring": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "babel-plugin-transform-es2015-duplicate-keys": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "babel-plugin-transform-es2015-for-of": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "babel-plugin-transform-es2015-function-name": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "babel-plugin-transform-es2015-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "babel-plugin-transform-es2015-modules-systemjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "babel-plugin-transform-es2015-modules-umd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "babel-plugin-transform-es2015-object-super": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "babel-plugin-transform-es2015-parameters": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "babel-plugin-transform-es2015-shorthand-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "babel-plugin-transform-es2015-spread": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "babel-plugin-transform-es2015-sticky-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "babel-plugin-transform-es2015-template-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "babel-plugin-transform-es2015-typeof-symbol": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "babel-plugin-transform-es2015-unicode-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "babel-plugin-transform-exponentiation-operator": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "babel-plugin-transform-regenerator": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "babel-preset-flow": { + "version": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "requires": { + "babel-plugin-transform-flow-strip-types": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz" + } + }, + "babel-preset-jest": { + "version": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", + "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", + "requires": { + "babel-plugin-jest-hoist": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz" + } + }, + "babel-preset-react": { + "version": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "requires": { + "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-plugin-transform-react-display-name": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "babel-plugin-transform-react-jsx": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "babel-plugin-transform-react-jsx-self": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "babel-plugin-transform-react-jsx-source": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "babel-preset-flow": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz" + } + }, + "babel-preset-react-app": { + "version": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", + "integrity": "sha1-i3RMvkf9V8ho5vkTVSzq4mrjGGA=", + "requires": { + "babel-plugin-dynamic-import-node": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz", + "babel-plugin-syntax-dynamic-import": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "babel-plugin-transform-class-properties": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "babel-plugin-transform-object-rest-spread": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "babel-plugin-transform-react-constant-elements": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", + "babel-plugin-transform-react-jsx": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "babel-plugin-transform-react-jsx-self": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "babel-plugin-transform-react-jsx-source": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "babel-plugin-transform-regenerator": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "babel-plugin-transform-runtime": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "babel-preset-env": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", + "babel-preset-react": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz" + } + }, + "babel-register": { + "version": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "requires": { + "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "home-or-tmp": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "source-map-support": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz" + }, + "dependencies": { + "babel-core": { + "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "babel-helpers": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-register": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + } + } + }, + "babel-runtime": { + "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" + }, + "dependencies": { + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + } + } + }, + "babel-template": { + "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-traverse": { + "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-types": { + "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" + } + }, + "babylon": { + "version": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "integrity": "sha1-Pot0AriNIsNCPhN6FXeIOxX/hpo=" + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=" + }, + "batch": { + "version": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + } + }, + "big.js": { + "version": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" + }, + "binary-extensions": { + "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", + "integrity": "sha1-ZlBsFs5vTWkopbPNajPKQelB43s=" + }, + "bluebird": { + "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "bn.js": { + "version": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "integrity": "sha1-3bBI5Q2UgnkAlME+s/z8gzznq0Y=" + }, + "bonjour": { + "version": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "deep-equal": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "dns-equal": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "dns-txt": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "multicast-dns": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", + "multicast-dns-service-types": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" + } + }, + "boolbase": { + "version": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boom": { + "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + } + }, + "bootstrap": { + "version": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", + "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + }, + "boxen": { + "version": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", + "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", + "requires": { + "ansi-align": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "cli-boxes": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "filled-array": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "widest-line": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + }, + "brorand": { + "version": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-resolve": { + "version": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "requires": { + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + }, + "dependencies": { + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify-aes": { + "version": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "requires": { + "buffer-xor": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "browserify-cipher": { + "version": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "browserify-des": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" + } + }, + "browserify-des": { + "version": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "des.js": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "browserify-rsa": { + "version": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + } + }, + "browserify-sign": { + "version": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz" + } + }, + "browserify-zlib": { + "version": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" + } + }, + "browserslist": { + "version": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", + "integrity": "sha1-6bRhi4oBwZP5eGvuoJ9v0Q2+McM=", + "requires": { + "caniuse-lite": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000709.tgz", + "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + } + }, + "bser": { + "version": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "requires": { + "node-int64": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + } + }, + "buffer": { + "version": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "ieee754": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "buffer-indexof": { + "version": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.0.tgz", + "integrity": "sha1-9U9kfE9OJSKLqmVqLlfkPV8nCYI=" + }, + "buffer-xor": { + "version": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", + "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=" + }, + "caller-path": { + "version": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" + } + }, + "callsites": { + "version": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "camel-case": { + "version": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", + "upper-case": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" + } + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "camelcase-keys": { + "version": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-api": { + "version": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", + "lodash.memoize": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "lodash.uniq": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + }, + "dependencies": { + "browserslist": { + "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", + "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + } + } + } + }, + "caniuse-db": { + "version": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", + "integrity": "sha1-C2AAcrfNu/YzaodYtxua0DJo7eI=" + }, + "caniuse-lite": { + "version": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000709.tgz", + "integrity": "sha1-4CfHoN/VraWPkxoQgPxxllN1VZs=" + }, + "capture-stack-trace": { + "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", + "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=" + }, + "caseless": { + "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + } + }, + "chai": { + "version": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", + "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", + "dev": true, + "requires": { + "assertion-error": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "check-error": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "deep-eql": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "get-func-name": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "pathval": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "type-detect": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "dependencies": { + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "check-error": { + "version": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "async-each": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "is-binary-path": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz" + } + }, + "ci-info": { + "version": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", + "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" + }, + "cipher-base": { + "version": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "circular-json": { + "version": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=" + }, + "clap": { + "version": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", + "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + } + }, + "classnames": { + "version": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, + "clean-css": { + "version": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", + "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "cli-boxes": { + "version": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" + } + }, + "cli-width": { + "version": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "clone": { + "version": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" + }, + "co": { + "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "requires": { + "q": "https://registry.npmjs.org/q/-/q-1.5.0.tgz" + } + }, + "code-point-at": { + "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color": { + "version": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "color-string": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" + } + }, + "color-convert": { + "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "requires": { + "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + } + }, + "color-name": { + "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "requires": { + "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + } + }, + "colormin": { + "version": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "requires": { + "color": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "css-color-names": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + } + }, + "colors": { + "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "combined-stream": { + "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + }, + "commander": { + "version": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=" + }, + "commondir": { + "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-classes": { + "version": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", + "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", + "requires": { + "component-indexof": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz" + } + }, + "component-emitter": { + "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-indexof": { + "version": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", + "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" + }, + "compressible": { + "version": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", + "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "requires": { + "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" + } + }, + "compression": { + "version": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", + "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", + "compressible": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "vary": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz" + } + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + } + }, + "configstore": { + "version": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", + "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "requires": { + "dot-prop": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "osenv": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz" + }, + "dependencies": { + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } + } + }, + "connect-history-api-fallback": { + "version": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", + "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=" + }, + "console-browserify": { + "version": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" + } + }, + "constants-browserify": { + "version": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + }, + "content-type-parser": { + "version": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", + "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=" + }, + "convert-source-map": { + "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" + }, + "cookie": { + "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" + }, + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "requires": { + "is-directory": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "require-from-string": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "create-ecdh": { + "version": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz" + } + }, + "create-error-class": { + "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz" + } + }, + "create-hash": { + "version": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + } + }, + "create-hmac": { + "version": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + } + }, + "create-react-class": { + "version": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", + "integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=", + "requires": { + "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "cryptiles": { + "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + } + }, + "crypto-browserify": { + "version": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=", + "requires": { + "browserify-cipher": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "browserify-sign": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "create-ecdh": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "diffie-hellman": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", + "public-encrypt": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + } + }, + "css-animation": { + "version": "https://registry.npmjs.org/css-animation/-/css-animation-1.3.2.tgz", + "integrity": "sha1-31FYIO9ZA3M60tsJmUA7MDe4uIA=", + "requires": { + "component-classes": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz" + } + }, + "css-color-names": { + "version": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-loader": { + "version": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", + "integrity": "sha1-bPNXkZLONV6LONX0Ldeh8uyJjQ8=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "css-selector-tokenizer": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "cssnano": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "icss-utils": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "lodash.camelcase": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-modules-extract-imports": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "postcss-modules-local-by-default": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "postcss-modules-scope": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "postcss-modules-values": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "css-select": { + "version": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "css-what": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "domutils": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "nth-check": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz" + } + }, + "css-selector-tokenizer": { + "version": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "requires": { + "cssesc": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "fastparse": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "regexpu-core": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz" + }, + "dependencies": { + "regexpu-core": { + "version": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "requires": { + "regenerate": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "regjsgen": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "regjsparser": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" + } + } + } + }, + "css-what": { + "version": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" + }, + "cssesc": { + "version": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" + }, + "cssnano": { + "version": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "requires": { + "autoprefixer": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-calc": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "postcss-colormin": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "postcss-convert-values": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "postcss-discard-comments": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "postcss-discard-duplicates": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "postcss-discard-empty": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "postcss-discard-overridden": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "postcss-discard-unused": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "postcss-filter-plugins": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "postcss-merge-idents": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "postcss-merge-longhand": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "postcss-merge-rules": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "postcss-minify-font-values": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "postcss-minify-gradients": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "postcss-minify-params": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "postcss-minify-selectors": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "postcss-normalize-charset": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "postcss-normalize-url": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "postcss-ordered-values": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "postcss-reduce-idents": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "postcss-reduce-initial": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "postcss-reduce-transforms": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "postcss-svgo": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "postcss-unique-selectors": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "postcss-zindex": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz" + }, + "dependencies": { + "autoprefixer": { + "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", + "normalize-range": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "num2fraction": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "browserslist": { + "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", + "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "csso": { + "version": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "requires": { + "clap": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "cssom": { + "version": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" + }, + "cssstyle": { + "version": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "requires": { + "cssom": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz" + } + }, + "currently-unhandled": { + "version": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + } + }, + "d": { + "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz" + } + }, + "d3": { + "version": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, + "d3-array": { + "version": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.0.tgz", + "integrity": "sha1-FH0mlyDhdMQFen9CvosPPyulMQg=" + }, + "d3-axis": { + "version": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", + "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" + }, + "d3-collection": { + "version": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" + }, + "d3-color": { + "version": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", + "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" + }, + "d3-format": { + "version": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.0.tgz", + "integrity": "sha1-a0gLqohohdRlHcJIqPSsnaFtsHo=" + }, + "d3-interpolate": { + "version": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.5.tgz", + "integrity": "sha1-aeCZ/zkhRxblY8muw+qdHqS4p58=", + "requires": { + "d3-color": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz" + } + }, + "d3-path": { + "version": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", + "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" + }, + "d3-scale": { + "version": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz", + "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=", + "requires": { + "d3-array": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.0.tgz", + "d3-collection": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "d3-color": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", + "d3-format": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.0.tgz", + "d3-interpolate": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.5.tgz", + "d3-time": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz", + "d3-time-format": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.0.5.tgz" + } + }, + "d3-selection": { + "version": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.1.0.tgz", + "integrity": "sha1-GZhoSJZIj4OcoDchI9o08dMYgJw=" + }, + "d3-shape": { + "version": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", + "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", + "requires": { + "d3-path": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz" + } + }, + "d3-time": { + "version": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz", + "integrity": "sha1-lMr27bt4ebuAnQ0fdXK8SEgvcnA=" + }, + "d3-time-format": { + "version": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.0.5.tgz", + "integrity": "sha1-nXeAIE98kRnJFwsaVttN6aivly4=", + "requires": { + "d3-time": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz" + } + }, + "damerau-levenshtein": { + "version": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" + }, + "dashdash": { + "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "date-now": { + "version": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "decamelize": { + "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-eql": { + "version": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "dev": true, + "requires": { + "type-detect": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz" + }, + "dependencies": { + "type-detect": { + "version": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", + "dev": true + } + } + }, + "deep-equal": { + "version": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-require-extensions": { + "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "requires": { + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "define-properties": { + "version": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "object-keys": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz" + } + }, + "defined": { + "version": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "is-path-cwd": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "is-path-in-cwd": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + } + }, + "delayed-stream": { + "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "des.js": { + "version": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + } + }, + "destroy": { + "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + } + }, + "detect-node": { + "version": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" + }, + "detect-port-alt": { + "version": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", + "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", + "requires": { + "address": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz" + } + }, + "diff": { + "version": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", + "integrity": "sha1-BWaVFQ16qTI3yn43isOxaCt5Y7k=" + }, + "diffie-hellman": { + "version": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "miller-rabin": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + } + }, + "disposables": { + "version": "https://registry.npmjs.org/disposables/-/disposables-1.0.1.tgz", + "integrity": "sha1-BkcnoltU9QK9griaot+4358bOeM=" + }, + "dnd-core": { + "version": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.4.0.tgz", + "integrity": "sha1-xKW8Kup1Fk+KKV12nV9VGBDn1BE=", + "requires": { + "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "redux": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz" + } + }, + "dns-equal": { + "version": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.1.1.tgz", + "integrity": "sha1-I2nUUDivBF84mOb6VoYq7T9AKWw=", + "requires": { + "ip": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "dns-txt": { + "version": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.0.tgz" + } + }, + "doctrine": { + "version": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "requires": { + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "dom-align": { + "version": "https://registry.npmjs.org/dom-align/-/dom-align-1.6.2.tgz", + "integrity": "sha1-sU5kkXwl3mtAVSJzObTWT0t9uIU=" + }, + "dom-converter": { + "version": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "requires": { + "utila": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz" + }, + "dependencies": { + "utila": { + "version": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" + } + } + }, + "dom-helpers": { + "version": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "integrity": "sha1-MgPgf+0he9H0JLAZc1WC/Deyglo=" + }, + "dom-serializer": { + "version": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "entities": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" + }, + "dependencies": { + "domelementtype": { + "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "dom-urls": { + "version": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", + "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", + "requires": { + "urijs": "https://registry.npmjs.org/urijs/-/urijs-1.18.10.tgz" + } + }, + "dom-walk": { + "version": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "domelementtype": { + "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "requires": { + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + } + }, + "domutils": { + "version": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + } + }, + "dot-prop": { + "version": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "requires": { + "is-obj": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + } + }, + "dotenv": { + "version": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + }, + "duplexer": { + "version": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer2": { + "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "ecc-jsbn": { + "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + } + }, + "ee-first": { + "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz", + "integrity": "sha1-0OAmc1dUdwkBrjAaIWZMukXZL30=" + }, + "elliptic": { + "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "hmac-drbg": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + } + }, + "emoji-regex": { + "version": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha1-m66pKbFVVlwR6kHGYm6qZc75ksI=" + }, + "emojis-list": { + "version": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "encoding": { + "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz" + } + }, + "enhanced-resolve": { + "version": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "tapable": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz" + } + }, + "entities": { + "version": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "errno": { + "version": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "requires": { + "prr": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" + } + }, + "error-ex": { + "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + } + }, + "es-abstract": { + "version": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", + "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "requires": { + "es-to-primitive": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "is-regex": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" + } + }, + "es-to-primitive": { + "version": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "is-date-object": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "is-symbol": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz" + } + }, + "es5-ext": { + "version": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", + "requires": { + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + } + }, + "es6-iterator": { + "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + } + }, + "es6-map": { + "version": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-set": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + } + }, + "es6-promise": { + "version": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", + "integrity": "sha1-iBHpCRXZoNujYnTwskLb2nj5ySo=" + }, + "es6-set": { + "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + } + }, + "es6-symbol": { + "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz" + } + }, + "es6-weak-map": { + "version": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + } + }, + "escape-html": { + "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "requires": { + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" + }, + "dependencies": { + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "optional": true, + "requires": { + "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + } + } + } + }, + "escope": { + "version": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "requires": { + "es6-map": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "es6-weak-map": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "esrecurse": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "eslint": { + "version": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "escope": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "espree": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "esquery": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "file-entry-cache": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "ignore": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "inquirer": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "is-resolvable": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "pluralize": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "progress": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "require-uncached": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "shelljs": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "table": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "text-table": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "user-home": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" + }, + "dependencies": { + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, + "eslint-config-react-app": { + "version": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", + "integrity": "sha1-mDN1l7wBzCKZH8vdoHRR87RRFxg=" + }, + "eslint-import-resolver-node": { + "version": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz" + } + }, + "eslint-loader": { + "version": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", + "integrity": "sha1-ULFY3WJy3O+5fphCVIN/gaWALOA=", + "requires": { + "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "loader-fs-cache": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-hash": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + } + }, + "eslint-module-utils": { + "version": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + } + }, + "eslint-plugin-flowtype": { + "version": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", + "integrity": "sha1-uYdfMUZS5QgWI8nSsYo0a7t1nAk=", + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "eslint-plugin-import": { + "version": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "contains-path": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "eslint-import-resolver-node": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "eslint-module-utils": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "lodash.cond": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "pkg-up": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz" + }, + "dependencies": { + "doctrine": { + "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", + "integrity": "sha1-SpOfduwSUBBSiCMzG/lIzFczgLY=", + "requires": { + "aria-query": "https://registry.npmjs.org/aria-query/-/aria-query-0.5.0.tgz", + "array-includes": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "ast-types-flow": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "axobject-query": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "damerau-levenshtein": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "emoji-regex": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "jsx-ast-utils": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz" + } + }, + "eslint-plugin-react": { + "version": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", + "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", + "requires": { + "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "jsx-ast-utils": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz" + } + }, + "espree": { + "version": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" + } + }, + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "esquery": { + "version": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "requires": { + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "esrecurse": { + "version": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "requires": { + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + }, + "event-emitter": { + "version": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz" + } + }, + "eventemitter3": { + "version": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + }, + "events": { + "version": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "eventsource": { + "version": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "requires": { + "original": "https://registry.npmjs.org/original/-/original-1.0.0.tgz" + } + }, + "evp_bytestokey": { + "version": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "requires": { + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz" + } + }, + "exec-sh": { + "version": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", + "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", + "requires": { + "merge": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz" + } + }, + "exit-hook": { + "version": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + }, + "expand-range": { + "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" + } + }, + "express": { + "version": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", + "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "array-flatten": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "content-disposition": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "etag": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "merge-descriptors": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "proxy-addr": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "send": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "serve-static": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "vary": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz" + }, + "dependencies": { + "array-flatten": { + "version": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "path-to-regexp": { + "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } + } + }, + "extend": { + "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "external-editor": { + "version": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "requires": { + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "jschardet": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz", + "tmp": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz" + } + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "extract-text-webpack-plugin": { + "version": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", + "integrity": "sha1-dW7076gVXDaBgz+8NNpTuUF0bWw=", + "requires": { + "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "schema-utils": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "webpack-sources": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz" + } + }, + "extsprintf": { + "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + }, + "fast-deep-equal": { + "version": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-levenshtein": { + "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastparse": { + "version": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" + }, + "faye-websocket": { + "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "requires": { + "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" + } + }, + "fb-watchman": { + "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz" + } + }, + "fbemitter": { + "version": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", + "requires": { + "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz" + } + }, + "fbjs": { + "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz" + } + }, + "figures": { + "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "file-entry-cache": { + "version": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "file-loader": { + "version": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", + "integrity": "sha1-T/HfKK84cZpgmAk7iMgscdF5SjQ=", + "requires": { + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + }, + "file-saver": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", + "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" + }, + "filename-regex": { + "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fileset": { + "version": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + } + }, + "filesize": { + "version": "https://registry.npmjs.org/filesize/-/filesize-3.3.0.tgz", + "integrity": "sha1-UxSeo0YOOy4CSWKlFkiqVyz5gSI=" + }, + "fill-range": { + "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + }, + "filled-array": { + "version": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", + "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=" + }, + "finalhandler": { + "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + } + } + }, + "find-cache-dir": { + "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "requires": { + "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + } + }, + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + } + }, + "flat-cache": { + "version": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "requires": { + "circular-json": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "del": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "write": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" + } + }, + "flatten": { + "version": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + }, + "flux": { + "version": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", + "integrity": "sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io=", + "requires": { + "fbemitter": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz" + } + }, + "for-in": { + "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + } + }, + "foreach": { + "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", + "integrity": "sha1-ml47kpX5gLJiPPZPojixTOvKcHs=", + "requires": { + "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" + } + }, + "formidable": { + "version": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + }, + "forwarded": { + "version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + }, + "fresh": { + "version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "fs-extra": { + "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "universalify": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz" + } + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha1-MoK3E/s62A7eDp/PRhG1qm/AM/Q=", + "optional": true, + "requires": { + "nan": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "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.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "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=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "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.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "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=", + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "requires": { + "safe-buffer": "5.0.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "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.1.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=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } + }, + "function-bind": { + "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" + }, + "gaugeJS": { + "version": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.5.tgz", + "integrity": "sha1-v0ZTn6uuVfVVxRT3XQuEBAx2AdY=" + }, + "generate-function": { + "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "generate-object-property": { + "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + } + }, + "get-caller-file": { + "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-func-name": { + "version": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "getpass": { + "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-base": { + "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "global": { + "version": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "process": "https://registry.npmjs.org/process/-/process-0.5.2.tgz" + }, + "dependencies": { + "process": { + "version": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + } + } + }, + "globals": { + "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" + }, + "globby": { + "version": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "got": { + "version": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "requires": { + "create-error-class": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "is-redirect": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "is-retry-allowed": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "lowercase-keys": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "node-status-codes": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "timed-out": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "url-parse-lax": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growly": { + "version": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "gzip-size": { + "version": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "requires": { + "duplexer": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + } + }, + "handle-thing": { + "version": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" + }, + "handlebars": { + "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "requires": { + "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" + }, + "dependencies": { + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + } + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + }, + "dependencies": { + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "optional": true + } + } + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + } + } + } + }, + "har-schema": { + "version": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "har-schema": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" + } + }, + "has": { + "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" + } + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "hash-base": { + "version": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "hash.js": { + "version": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + } + }, + "hawk": { + "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + }, + "he": { + "version": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "history": { + "version": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", + "integrity": "sha1-bXI6hxLFgda+836MJvSu3G64aWc=", + "requires": { + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "resolve-pathname": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz", + "value-equal": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "hmac-drbg": { + "version": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + } + }, + "hoek": { + "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "hoist-non-react-statics": { + "version": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + }, + "home-or-tmp": { + "version": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } + }, + "hosted-git-info": { + "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" + }, + "hpack.js": { + "version": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "obuf": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "wbuf": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz" + } + }, + "html-comment-regex": { + "version": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" + }, + "html-encoding-sniffer": { + "version": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", + "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "requires": { + "whatwg-encoding": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz" + } + }, + "html-entities": { + "version": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier": { + "version": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", + "integrity": "sha1-SideOxoWY5q7ebTBEZH/DQ/PGrk=", + "requires": { + "camel-case": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "clean-css": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", + "commander": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "he": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "ncname": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "param-case": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "relateurl": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz" + } + }, + "html-webpack-plugin": { + "version": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", + "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", + "requires": { + "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "html-minifier": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "pretty-error": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "toposort": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz" + }, + "dependencies": { + "loader-utils": { + "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + } + } + }, + "htmlparser2": { + "version": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "requires": { + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "domhandler": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "domutils": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, + "dependencies": { + "domutils": { + "version": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "requires": { + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + } + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "http-deceiver": { + "version": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "requires": { + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" + }, + "dependencies": { + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + } + } + }, + "http-proxy": { + "version": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "requires": { + "eventemitter3": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + } + }, + "http-proxy-middleware": { + "version": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "requires": { + "http-proxy": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" + }, + "dependencies": { + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + } + } + } + }, + "http-signature": { + "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz" + } + }, + "https-browserify": { + "version": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=" + }, + "icss-replace-symbols": { + "version": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + } + }, + "ieee754": { + "version": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=" + }, + "immutable": { + "version": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz", + "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=" + }, + "imurmurhash": { + "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + } + }, + "indexes-of": { + "version": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "indexof": { + "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "requires": { + "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "readline2": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "run-async": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + }, + "internal-ip": { + "version": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "requires": { + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + } + }, + "interpret": { + "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=" + }, + "invariant": { + "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "invert-kv": { + "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-absolute-url": { + "version": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-arrayish": { + "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz" + } + }, + "is-buffer": { + "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-builtin-module": { + "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + } + }, + "is-callable": { + "version": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-ci": { + "version": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "requires": { + "ci-info": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz" + } + }, + "is-date-object": { + "version": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-directory": { + "version": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-dotfile": { + "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + }, + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "is-my-json-valid": { + "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "requires": { + "generate-function": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "generate-object-property": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "jsonpointer": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "is-npm": { + "version": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + }, + "is-obj": { + "version": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "requires": { + "is-path-inside": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" + } + }, + "is-path-inside": { + "version": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "requires": { + "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + } + }, + "is-plain-obj": { + "version": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-posix-bracket": { + "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-property": { + "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-redirect": { + "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + } + }, + "is-resolvable": { + "version": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "requires": { + "tryit": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz" + } + }, + "is-retry-allowed": { + "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-root": { + "version": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" + }, + "is-stream": { + "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "requires": { + "html-comment-regex": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" + } + }, + "is-symbol": { + "version": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, + "is-typedarray": { + "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-wsl": { + "version": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "isomorphic-fetch": { + "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", + "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" + } + }, + "isstream": { + "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", + "integrity": "sha1-/MC0YeKzvaceMFFVE4I4doJX2d4=", + "requires": { + "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "fileset": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "istanbul-lib-hook": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", + "istanbul-lib-report": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "istanbul-reports": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "istanbul-lib-coverage": { + "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=" + }, + "istanbul-lib-hook": { + "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=", + "requires": { + "append-transform": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz" + } + }, + "istanbul-lib-instrument": { + "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", + "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", + "requires": { + "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "istanbul-lib-report": { + "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", + "requires": { + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "istanbul-reports": { + "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha1-BCvlyJ4XW8P4ZSPKqynAFOd/7k4=", + "requires": { + "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz" + } + }, + "jest": { + "version": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", + "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", + "requires": { + "jest-cli": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz" + }, + "dependencies": { + "callsites": { + "version": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "jest-cli": { + "version": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", + "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "requires": { + "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "callsites": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "is-ci": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "istanbul-api": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", + "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "jest-changed-files": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", + "jest-config": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", + "jest-docblock": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "jest-environment-jsdom": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", + "jest-haste-map": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", + "jest-jasmine2": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", + "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "jest-resolve-dependencies": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", + "jest-runtime": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", + "jest-snapshot": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", + "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "node-notifier": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "string-length": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "throat": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "worker-farm": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz" + } + } + } + }, + "jest-changed-files": { + "version": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", + "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" + }, + "jest-config": { + "version": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", + "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "jest-environment-jsdom": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", + "jest-environment-node": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", + "jest-jasmine2": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", + "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "jest-resolve": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", + "jest-validate": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", + "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + } + }, + "jest-diff": { + "version": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "diff": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", + "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + } + }, + "jest-docblock": { + "version": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" + }, + "jest-environment-jsdom": { + "version": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", + "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", + "requires": { + "jest-mock": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "jsdom": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz" + } + }, + "jest-environment-node": { + "version": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", + "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", + "requires": { + "jest-mock": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz" + } + }, + "jest-haste-map": { + "version": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", + "integrity": "sha1-ZT61XIic48Ah97lGk/IKQVm63wM=", + "requires": { + "fb-watchman": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jest-docblock": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "sane": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", + "worker-farm": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz" + } + }, + "jest-jasmine2": { + "version": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", + "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jest-diff": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "jest-matchers": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", + "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "jest-snapshot": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz" + } + }, + "jest-matcher-utils": { + "version": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + } + }, + "jest-matchers": { + "version": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", + "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", + "requires": { + "jest-diff": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz" + } + }, + "jest-message-util": { + "version": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" + } + }, + "jest-mock": { + "version": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" + }, + "jest-regex-util": { + "version": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" + }, + "jest-resolve": { + "version": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", + "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", + "requires": { + "browser-resolve": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz" + } + }, + "jest-resolve-dependencies": { + "version": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", + "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "requires": { + "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz" + } + }, + "jest-runtime": { + "version": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", + "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", + "requires": { + "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "babel-jest": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", + "babel-plugin-istanbul": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jest-config": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", + "jest-haste-map": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", + "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "jest-resolve": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", + "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz" + }, + "dependencies": { + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, + "jest-snapshot": { + "version": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", + "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "jest-diff": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + } + }, + "jest-util": { + "version": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "jest-mock": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "jest-validate": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", + "leven": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + } + }, + "jest-validate": { + "version": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", + "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "leven": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + } + }, + "js-base64": { + "version": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" + }, + "js-tokens": { + "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + } + }, + "jsbn": { + "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jschardet": { + "version": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz", + "integrity": "sha1-ph8xAwalpxGI4bGs0IrdPPuwix4=" + }, + "jsdom": { + "version": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "requires": { + "abab": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", + "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "acorn-globals": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "array-equal": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "content-type-parser": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", + "cssom": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "cssstyle": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "escodegen": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "html-encoding-sniffer": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", + "nwmatcher": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", + "parse5": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "request": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "symbol-tree": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "webidl-conversions": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", + "whatwg-encoding": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", + "whatwg-url": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "xml-name-validator": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz" + }, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "jsesc": { + "version": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-loader": { + "version": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=" + }, + "json-schema": { + "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + } + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "json5": { + "version": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "jsonify": { + "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonpointer": { + "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, + "jsprim": { + "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "verror": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "jsx-ast-utils": { + "version": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" + }, + "keycode": { + "version": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", + "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo=" + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + } + }, + "klaw": { + "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "latest-version": { + "version": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", + "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", + "requires": { + "package-json": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz" + } + }, + "lazy-cache": { + "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lazy-req": { + "version": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=" + }, + "lcid": { + "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + } + }, + "leven": { + "version": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, + "levn": { + "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + } + }, + "load-json-file": { + "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "loader-fs-cache": { + "version": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "requires": { + "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + } + }, + "loader-runner": { + "version": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + }, + "loader-utils": { + "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + } + }, + "locate-path": { + "version": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash-es": { + "version": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" + }, + "lodash._getnative": { + "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._reinterpolate": { + "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.camelcase": { + "version": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.cond": { + "version": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" + }, + "lodash.defaults": { + "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.isarguments": { + "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isequal": { + "version": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + } + }, + "lodash.memoize": { + "version": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.template": { + "version": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "requires": { + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "lodash.templatesettings": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz" + } + }, + "lodash.templatesettings": { + "version": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "requires": { + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" + } + }, + "lodash.throttle": { + "version": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "lodash.uniq": { + "version": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "longest": { + "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + } + }, + "loud-rejection": { + "version": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + } + }, + "lower-case": { + "version": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lowercase-keys": { + "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + } + }, + "macaddress": { + "version": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" + }, + "makeerror": { + "version": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz" + } + }, + "map-obj": { + "version": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "math-expression-evaluator": { + "version": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" + }, + "media-typer": { + "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "meow": { + "version": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "loud-rejection": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "redent": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "trim-newlines": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "merge": { + "version": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, + "merge-descriptors": { + "version": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz" + } + }, + "miller-rabin": { + "version": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + } + }, + "mime": { + "version": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" + }, + "mime-db": { + "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + }, + "mime-types": { + "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "requires": { + "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" + } + }, + "mimic-fn": { + "version": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, + "min-document": { + "version": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz" + } + }, + "minimalistic-assert": { + "version": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", + "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "requires": { + "dns-packet": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.1.1.tgz", + "thunky": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz" + } + }, + "multicast-dns-service-types": { + "version": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + }, + "nan": { + "version": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "optional": true + }, + "natural-compare": { + "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "ncname": { + "version": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "requires": { + "xml-char-classes": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz" + } + }, + "negotiator": { + "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "no-case": { + "version": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", + "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", + "requires": { + "lower-case": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" + } + }, + "node-fetch": { + "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", + "integrity": "sha1-iZyz0KPJL5UsR/G4dvTIrqvUANU=", + "requires": { + "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + } + }, + "node-forge": { + "version": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=" + }, + "node-int64": { + "version": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "requires": { + "assert": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "browserify-zlib": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "buffer": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "console-browserify": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "constants-browserify": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "crypto-browserify": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "domain-browser": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "events": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "https-browserify": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "os-browserify": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "path-browserify": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "process": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "querystring-es3": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "stream-browserify": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "stream-http": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "timers-browserify": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.3.tgz", + "tty-browserify": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "url": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "vm-browserify": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz" + }, + "dependencies": { + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "node-notifier": { + "version": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "requires": { + "growly": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "shellwords": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "node-status-codes": { + "version": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" + }, + "normalize-package-data": { + "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "requires": { + "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" + } + }, + "normalize-path": { + "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz" + } + }, + "normalize-range": { + "version": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "query-string": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "sort-keys": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" + } + }, + "nth-check": { + "version": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "requires": { + "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + } + }, + "num2fraction": { + "version": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwmatcher": { + "version": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", + "integrity": "sha1-eumwew6oBNt+JfBctf5Al9TklJ8=" + }, + "oauth-sign": { + "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", + "integrity": "sha1-KKZZz5h9lqTavnhgKJ87UybEoDw=" + }, + "object-keys": { + "version": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.omit": { + "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + }, + "obuf": { + "version": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=" + }, + "on-finished": { + "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + } + }, + "on-headers": { + "version": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "onetime": { + "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "opn": { + "version": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=", + "requires": { + "is-wsl": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" + } + }, + "optimist": { + "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optionator": { + "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + } + }, + "original": { + "version": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "requires": { + "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz" + }, + "dependencies": { + "url-parse": { + "version": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "requires": { + "querystringify": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + } + } + } + }, + "os-browserify": { + "version": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + } + }, + "os-tmpdir": { + "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } + }, + "p-limit": { + "version": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + }, + "p-locate": { + "version": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz" + } + }, + "p-map": { + "version": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", + "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=" + }, + "package-json": { + "version": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "requires": { + "got": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "registry-auth-token": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "registry-url": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "pako": { + "version": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "param-case": { + "version": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz" + } + }, + "parse-asn1": { + "version": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz" + } + }, + "parse-glob": { + "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "parse-json": { + "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + } + }, + "parse5": { + "version": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + }, + "parseurl": { + "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "path-browserify": { + "version": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-parse": { + "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-to-regexp": { + "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "path-type": { + "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "pathval": { + "version": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", + "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", + "requires": { + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + } + }, + "performance-now": { + "version": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + }, + "pkg-dir": { + "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + }, + "dependencies": { + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + } + } + }, + "pkg-up": { + "version": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + }, + "dependencies": { + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + } + } + }, + "pluralize": { + "version": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" + }, + "portfinder": { + "version": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "requires": { + "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "dependencies": { + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", + "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz" + }, + "dependencies": { + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", + "integrity": "sha1-2+xJQ20q4V9TYRTnbRRlbNvA9E0=", + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz" + } + } + } + }, + "postcss-calc": { + "version": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-message-helpers": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "reduce-css-calc": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-colormin": { + "version": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "requires": { + "colormin": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-convert-values": { + "version": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-discard-comments": { + "version": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-discard-empty": { + "version": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-discard-overridden": { + "version": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-discard-unused": { + "version": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-filter-plugins": { + "version": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "uniqid": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-flexbugs-fixes": { + "version": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", + "integrity": "sha1-ezHLbCfQQXo1pnkUwpX4PEA8ftQ=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + } + }, + "postcss-load-config": { + "version": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "requires": { + "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss-load-options": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "postcss-load-plugins": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz" + } + }, + "postcss-load-options": { + "version": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "requires": { + "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "postcss-load-plugins": { + "version": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "requires": { + "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "postcss-loader": { + "version": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", + "integrity": "sha1-jH4AVaPfGImrxrrVLdRbL0G7xvw=", + "requires": { + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", + "postcss-load-config": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "schema-utils": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz" + } + }, + "postcss-merge-idents": { + "version": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-merge-longhand": { + "version": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-merge-rules": { + "version": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "caniuse-api": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "vendors": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz" + }, + "dependencies": { + "browserslist": { + "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", + "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-message-helpers": { + "version": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" + }, + "postcss-minify-font-values": { + "version": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-minify-gradients": { + "version": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-minify-params": { + "version": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "requires": { + "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-minify-selectors": { + "version": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "requires": { + "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + } + }, + "postcss-modules-local-by-default": { + "version": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "requires": { + "css-selector-tokenizer": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + } + }, + "postcss-modules-scope": { + "version": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "requires": { + "css-selector-tokenizer": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + } + }, + "postcss-modules-values": { + "version": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "requires": { + "icss-replace-symbols": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + } + }, + "postcss-normalize-charset": { + "version": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-normalize-url": { + "version": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "requires": { + "is-absolute-url": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "normalize-url": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-ordered-values": { + "version": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-reduce-idents": { + "version": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-reduce-initial": { + "version": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-selector-parser": { + "version": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "requires": { + "flatten": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "indexes-of": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "uniq": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + } + }, + "postcss-svgo": { + "version": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "requires": { + "is-svg": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "svgo": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-unique-selectors": { + "version": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "requires": { + "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "postcss-value-parser": { + "version": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + }, + "postcss-zindex": { + "version": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "prelude-ls": { + "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-bytes": { + "version": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" + }, + "pretty-error": { + "version": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "requires": { + "renderkid": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "utila": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + } + }, + "pretty-format": { + "version": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", + "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz" + }, + "dependencies": { + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" + } + } + } + }, + "private": { + "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + }, + "process": { + "version": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + }, + "promise": { + "version": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "requires": { + "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + } + }, + "prop-types": { + "version": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=", + "requires": { + "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "prop-types-extra": { + "version": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.0.1.tgz", + "integrity": "sha1-pXvUgQ6C0no/9DF+zBtK0AX3moI=", + "requires": { + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "proxy-addr": { + "version": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "ipaddr.js": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz" + } + }, + "prr": { + "version": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, + "pseudomap": { + "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + } + }, + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha1-jQSVTTZN7z78VbWgeT4eLIsebkk=" + }, + "query-string": { + "version": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "strict-uri-encode": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + } + }, + "querystring": { + "version": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" + }, + "raf": { + "version": "https://registry.npmjs.org/raf/-/raf-3.3.2.tgz", + "integrity": "sha1-DBO+C1tJtG921maSSNUnzysC/ic=", + "requires": { + "performance-now": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + } + }, + "randomatic": { + "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + }, + "dependencies": { + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + } + } + } + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + } + } + } + }, + "randombytes": { + "version": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "range-parser": { + "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "rc": { + "version": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "rc-align": { + "version": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.4.tgz", + "integrity": "sha1-2Dvat1YPAULnKj3h1JXatroiUkk=", + "requires": { + "dom-align": "https://registry.npmjs.org/dom-align/-/dom-align-1.6.2.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "rc-util": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz" + } + }, + "rc-animate": { + "version": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.1.tgz", + "integrity": "sha1-3z4PVv4Qav5L9S/0CM7SQcUXiRk=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "css-animation": "https://registry.npmjs.org/css-animation/-/css-animation-1.3.2.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + } + }, + "rc-slider": { + "version": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.3.0.tgz", + "integrity": "sha1-aEpTRBazciw6xOmzvf7tmmH7D/s=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "rc-tooltip": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.4.7.tgz", + "rc-util": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz", + "shallowequal": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "rc-tooltip": { + "version": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.4.7.tgz", + "integrity": "sha1-7GzDmpYt6WqRR94Ip4+zj5NRf/M=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "rc-trigger": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-1.11.3.tgz" + } + }, + "rc-trigger": { + "version": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-1.11.3.tgz", + "integrity": "sha1-R7i1jghjwid+NnuG8c+inrYS21Y=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "create-react-class": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "rc-align": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.4.tgz", + "rc-animate": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.1.tgz", + "rc-util": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz" + } + }, + "rc-util": { + "version": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz", + "integrity": "sha1-mYE92Qrufim2STmnCsF26tP0/zk=", + "requires": { + "add-dom-event-listener": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "shallowequal": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz" + }, + "dependencies": { + "shallowequal": { + "version": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", + "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", + "requires": { + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" + } + } + } + }, + "react": { + "version": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", + "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", + "requires": { + "create-react-class": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", + "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + } + }, + "react-bootstrap": { + "version": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.1.tgz", + "integrity": "sha1-Z5yfc653/yB4Z9U2SWIHKR86Ptc=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "dom-helpers": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "keycode": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "prop-types-extra": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.0.1.tgz", + "react-overlays": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.0.tgz", + "react-prop-types": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "uncontrollable": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "react-contextmenu": { + "version": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.6.5.tgz", + "integrity": "sha1-jm4s6k+a1PnypHhwPL3o0p9WXNY=", + "requires": { + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "react-d3": { + "version": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", + "integrity": "sha1-3s7c7ZZ/SM2JzNeftAjUfw8qy+I=", + "requires": { + "d3": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "react": "https://registry.npmjs.org/react/-/react-15.6.1.tgz" + } + }, + "react-dev-utils": { + "version": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", + "integrity": "sha1-GkImPptqoR3LRdad/l6xs1S9VTE=", + "requires": { + "address": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", + "anser": "https://registry.npmjs.org/anser/-/anser-1.4.1.tgz", + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "detect-port-alt": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "filesize": "https://registry.npmjs.org/filesize/-/filesize-3.3.0.tgz", + "gzip-size": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "html-entities": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "inquirer": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", + "is-root": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "opn": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "recursive-readdir": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", + "shell-quote": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "sockjs-client": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "text-table": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + }, + "dependencies": { + "ansi-escapes": { + "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cli-cursor": { + "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" + } + }, + "figures": { + "version": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + } + }, + "inquirer": { + "version": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", + "integrity": "sha1-h2IcT7pAcvSKjdccn5328QCy1TQ=", + "requires": { + "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "external-editor": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "figures": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "run-async": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "rx-lite-aggregates": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mute-stream": { + "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz" + } + }, + "restore-cursor": { + "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + } + }, + "run-async": { + "version": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz" + } + }, + "rx-lite": { + "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "requires": { + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + }, + "dependencies": { + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + } + } + } + } + } + }, + "react-display-name": { + "version": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.0.tgz", + "integrity": "sha1-Dh9whuRaMtB3ZN817TL/FvEll5A=" + }, + "react-dnd": { + "version": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.4.0.tgz", + "integrity": "sha1-lvAELNTNN1tPDDQT9uyE0me315I=", + "requires": { + "disposables": "https://registry.npmjs.org/disposables/-/disposables-1.0.1.tgz", + "dnd-core": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.4.0.tgz", + "hoist-non-react-statics": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + } + }, + "react-dnd-html5-backend": { + "version": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.4.1.tgz", + "integrity": "sha1-Q50ryvi9i4elE4a+tRwSiCYYLd0=", + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "react-dnd-scrollzone": { + "version": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", + "integrity": "sha1-1wcXDAzTt6s9mR3WqMwLNxJFQTk=", + "requires": { + "hoist-non-react-statics": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "lodash.throttle": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "raf": "https://registry.npmjs.org/raf/-/raf-3.3.2.tgz", + "react-display-name": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.0.tgz" + } + }, + "react-dom": { + "version": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz", + "integrity": "sha1-LLDtQZEDjlPCCes6eaI+Kkz5lHA=", + "requires": { + "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + } + }, + "react-draggable": { + "version": "https://registry.npmjs.org/react-draggable/-/react-draggable-2.2.6.tgz", + "integrity": "sha1-OoBuEPLaa6v+pBNr5lEOibDXaQE=", + "requires": { + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz" + } + }, + "react-error-overlay": { + "version": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", + "integrity": "sha1-mI5I9vNDr6l6cZxN2uUbj+jM/ug=", + "requires": { + "anser": "https://registry.npmjs.org/anser/-/anser-1.2.5.tgz", + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "react-dev-utils": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", + "settle-promise": "https://registry.npmjs.org/settle-promise/-/settle-promise-1.0.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + }, + "dependencies": { + "anser": { + "version": "https://registry.npmjs.org/anser/-/anser-1.2.5.tgz", + "integrity": "sha1-Xc/JVuqjc7nCMBDdINq+ws4ZR1s=" + } + } + }, + "react-notification-system": { + "version": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.14.tgz", + "integrity": "sha1-IfkX85/u4UVRaGQ1CHUEFDPE1cA=", + "requires": { + "create-react-class": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + } + }, + "react-overlays": { + "version": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.0.tgz", + "integrity": "sha1-UxiY/1ZsflxyJurShjuM+fu1qYE=", + "requires": { + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "dom-helpers": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "react-prop-types": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "react-prop-types": { + "version": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "requires": { + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "react-resizable-box": { + "version": "https://registry.npmjs.org/react-resizable-box/-/react-resizable-box-2.0.6.tgz", + "integrity": "sha1-xvvXwLrHpmeOsy0Jk8q3tgG+qOc=", + "requires": { + "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + } + }, + "react-rnd": { + "version": "https://registry.npmjs.org/react-rnd/-/react-rnd-5.0.9.tgz", + "integrity": "sha1-a3suaeeuIwYJF8sDd3TxXIMIZgY=", + "requires": { + "react-draggable": "https://registry.npmjs.org/react-draggable/-/react-draggable-2.2.6.tgz", + "react-resizable-box": "https://registry.npmjs.org/react-resizable-box/-/react-resizable-box-2.0.6.tgz" + } + }, + "react-router": { + "version": "https://registry.npmjs.org/react-router/-/react-router-4.1.2.tgz", + "integrity": "sha1-euAnNBq8QusIrZ96jKwI0FY2cs4=", + "requires": { + "history": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", + "hoist-non-react-statics": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + } + }, + "react-router-dom": { + "version": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.1.2.tgz", + "integrity": "sha1-f4p8qGjTKsrdGcoJVDtA0m347Dc=", + "requires": { + "history": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "react-router": "https://registry.npmjs.org/react-router/-/react-router-4.1.2.tgz" + } + }, + "react-scripts": { + "version": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.0.10.tgz", + "integrity": "sha1-h2A1WUdCIg9A/7hlpMfo3A+nriM=", + "requires": { + "autoprefixer": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", + "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "babel-eslint": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "babel-jest": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", + "babel-loader": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", + "babel-preset-react-app": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "case-sensitive-paths-webpack-plugin": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "css-loader": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", + "dotenv": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "eslint": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "eslint-config-react-app": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", + "eslint-loader": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", + "eslint-plugin-flowtype": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", + "eslint-plugin-import": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "eslint-plugin-jsx-a11y": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", + "eslint-plugin-react": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", + "extract-text-webpack-plugin": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", + "file-loader": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", + "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "html-webpack-plugin": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", + "jest": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss-flexbugs-fixes": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", + "postcss-loader": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", + "react-dev-utils": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", + "react-error-overlay": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", + "style-loader": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "sw-precache-webpack-plugin": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", + "url-loader": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "webpack": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", + "webpack-dev-server": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", + "webpack-manifest-plugin": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", + "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" + }, + "dependencies": { + "promise": { + "version": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", + "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=", + "requires": { + "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + } + } + } + }, + "react-sortable-tree": { + "version": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", + "integrity": "sha1-JqBd4gEv+kalpNsrcSdDcSV9rrg=", + "requires": { + "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "react-dnd": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.4.0.tgz", + "react-dnd-html5-backend": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.4.1.tgz", + "react-dnd-scrollzone": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", + "react-virtualized": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz" + } + }, + "react-virtualized": { + "version": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", + "integrity": "sha1-eZpvI4Ge64KGDVm4L60z0dQgMl4=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "dom-helpers": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + } + }, + "read-all-stream": { + "version": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "read-pkg": { + "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + } + }, + "read-pkg-up": { + "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + }, + "dependencies": { + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + } + } + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "readdirp": { + "version": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + } + }, + "readline2": { + "version": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" + } + }, + "rechoir": { + "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz" + } + }, + "recursive-readdir": { + "version": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", + "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", + "requires": { + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" + }, + "dependencies": { + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + } + } + } + }, + "redent": { + "version": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "strip-indent": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + } + }, + "reduce-css-calc": { + "version": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "math-expression-evaluator": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "reduce-function-call": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz" + }, + "dependencies": { + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + } + } + }, + "reduce-function-call": { + "version": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "dependencies": { + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + } + } + }, + "redux": { + "version": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=", + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash-es": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "symbol-observable": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz" + } + }, + "regenerate": { + "version": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" + }, + "regenerator-runtime": { + "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "regenerator-transform": { + "version": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz" + } + }, + "regex-cache": { + "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "requires": { + "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + }, + "regexpu-core": { + "version": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "regjsgen": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "regjsparser": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" + } + }, + "registry-auth-token": { + "version": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "requires": { + "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "registry-url": { + "version": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz" + } + }, + "regjsgen": { + "version": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + }, + "dependencies": { + "jsesc": { + "version": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "relateurl": { + "version": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-trailing-separator": { + "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" + }, + "renderkid": { + "version": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "requires": { + "css-select": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "dom-converter": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "htmlparser2": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "utila": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz" + }, + "dependencies": { + "utila": { + "version": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" + } + } + }, + "repeat-element": { + "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + } + }, + "request": { + "version": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "requires": { + "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "har-validator": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "performance-now": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" + }, + "dependencies": { + "form-data": { + "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" + } + }, + "performance-now": { + "version": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } + } + }, + "require-directory": { + "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + }, + "require-main-filename": { + "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-uncached": { + "version": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" + } + }, + "requires-port": { + "version": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", + "requires": { + "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" + } + }, + "resolve-from": { + "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + }, + "resolve-pathname": { + "version": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz", + "integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ=" + }, + "restore-cursor": { + "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "onetime": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" + } + }, + "right-align": { + "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + } + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + } + }, + "ripemd160": { + "version": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "run-async": { + "version": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "rx-lite": { + "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" + }, + "rx-lite-aggregates": { + "version": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" + } + }, + "safe-buffer": { + "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + }, + "sane": { + "version": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", + "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", + "requires": { + "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "exec-sh": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", + "fb-watchman": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "walker": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "watch": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz" + }, + "dependencies": { + "bser": { + "version": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "requires": { + "node-int64": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + } + }, + "fb-watchman": { + "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "requires": { + "bser": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "sax": { + "version": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + }, + "schema-utils": { + "version": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "requires": { + "ajv": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz" + }, + "dependencies": { + "ajv": { + "version": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", + "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "requires": { + "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "fast-deep-equal": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "json-schema-traverse": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + } + } + } + }, + "select-hose": { + "version": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.9.1.tgz", + "integrity": "sha1-zdpEktcNSGVw+HxlVGAjVY4d+lo=", + "requires": { + "node-forge": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz" + } + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + }, + "semver-diff": { + "version": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "send": { + "version": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "destroy": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "etag": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "mime": { + "version": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + } + } + }, + "serve-index": { + "version": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", + "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "batch": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" + } + }, + "serve-static": { + "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=", + "requires": { + "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "send": "https://registry.npmjs.org/send/-/send-0.15.3.tgz" + } + }, + "serviceworker-cache-polyfill": { + "version": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", + "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" + }, + "set-blocking": { + "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setimmediate": { + "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "settle-promise": { + "version": "https://registry.npmjs.org/settle-promise/-/settle-promise-1.0.0.tgz", + "integrity": "sha1-aXrbWLgh84fOJ1fAbvyd5fDuM9g=" + }, + "sha.js": { + "version": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "shallowequal": { + "version": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", + "integrity": "sha1-FWHb3vuMAUCBADGQhXZNo/z4P48=" + }, + "shell-quote": { + "version": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "array-map": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "array-reduce": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + } + }, + "shelljs": { + "version": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + } + }, + "shellwords": { + "version": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", + "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=" + }, + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + }, + "slide": { + "version": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "sntp": { + "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + } + }, + "sockjs": { + "version": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "requires": { + "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz" + }, + "dependencies": { + "faye-websocket": { + "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" + } + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } + } + }, + "sockjs-client": { + "version": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "eventsource": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz" + } + }, + "sort-keys": { + "version": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + } + }, + "source-list-map": { + "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + }, + "source-map-support": { + "version": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "spdx-correct": { + "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" + } + }, + "spdx-expression-parse": { + "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "spdy": { + "version": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "handle-thing": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "http-deceiver": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "select-hose": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "spdy-transport": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz" + } + }, + "spdy-transport": { + "version": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "detect-node": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "hpack.js": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "obuf": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "wbuf": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz" + } + }, + "sprintf-js": { + "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "statuses": { + "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-browserify": { + "version": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "stream-http": { + "version": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", + "requires": { + "builtin-status-codes": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "to-arraybuffer": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "strict-uri-encode": { + "version": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "string-length": { + "version": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "requires": { + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + }, + "stringstream": { + "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "strip-indent": { + "version": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + } + }, + "strip-json-comments": { + "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-loader": { + "version": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "integrity": "sha1-zDFFmvvNbYC3Ig7lSykan9Zv9es=", + "requires": { + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "schema-utils": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz" + } + }, + "superagent": { + "version": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz", + "integrity": "sha1-M2GjlxVnUEw1EGOr6q4PqiPb8/g=", + "requires": { + "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "cookiejar": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", + "formidable": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", + "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + } + }, + "svgo": { + "version": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "requires": { + "coa": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "colors": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "csso": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "whet.extend": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" + } + }, + "sw-precache": { + "version": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.0.tgz", + "integrity": "sha1-62IlzlgM6q4UgZRXigrQGrfqGZw=", + "requires": { + "dom-urls": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", + "es6-promise": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "pretty-bytes": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "sw-toolbox": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", + "update-notifier": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz" + } + }, + "sw-precache-webpack-plugin": { + "version": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", + "integrity": "sha1-S1MI6vZPivyLDpUopvUKj5zZ7aw=", + "requires": { + "del": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "sw-precache": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.0.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz" + } + }, + "sw-toolbox": { + "version": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", + "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", + "requires": { + "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "serviceworker-cache-polyfill": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz" + } + }, + "symbol-observable": { + "version": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "symbol-tree": { + "version": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" + }, + "table": { + "version": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "requires": { + "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "slice-ansi": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + }, + "dependencies": { + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "requires": { + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + } + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + } + } + } + }, + "tapable": { + "version": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", + "integrity": "sha1-5GwNqsuyuKmLmwzqD0BSEFgX7Vw=" + }, + "test-exclude": { + "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=", + "requires": { + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + } + }, + "text-table": { + "version": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "throat": { + "version": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha1-UMsGcO28QCN7njR9fh+I5GIK+DY=" + }, + "through": { + "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "thunky": { + "version": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" + }, + "time-stamp": { + "version": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" + }, + "timed-out": { + "version": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" + }, + "timers-browserify": { + "version": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.3.tgz", + "integrity": "sha1-Qf0L3JJqX+7cM6F6jh99SRkl9/w=", + "requires": { + "global": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + } + }, + "tmp": { + "version": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "requires": { + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } + }, + "tmpl": { + "version": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-arraybuffer": { + "version": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "toposort": { + "version": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", + "integrity": "sha1-8CzYp0vYvi/A6YYRw7rLlaFxhpw=" + }, + "tough-cookie": { + "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + } + }, + "tr46": { + "version": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "trim-newlines": { + "version": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-right": { + "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tryit": { + "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=" + }, + "tty-browserify": { + "version": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "tweetnacl": { + "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + } + }, + "type-detect": { + "version": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" + } + }, + "typedarray": { + "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz", + "integrity": "sha1-EQ1T+kw/MmwSEpK76skE0uAzh8o=" + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz", + "integrity": "sha1-qX24yLprnbpOL4jYaqlUj6YyADQ=", + "requires": { + "commander": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "uglify-to-browserify": { + "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uncontrollable": { + "version": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", + "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", + "requires": { + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz" + } + }, + "uniq": { + "version": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqid": { + "version": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "requires": { + "macaddress": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" + } + }, + "uniqs": { + "version": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "universalify": { + "version": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "unpipe": { + "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, + "update-notifier": { + "version": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", + "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", + "requires": { + "boxen": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "configstore": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", + "is-npm": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "latest-version": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", + "lazy-req": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "semver-diff": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz" + } + }, + "upper-case": { + "version": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "urijs": { + "version": "https://registry.npmjs.org/urijs/-/urijs-1.18.10.tgz", + "integrity": "sha1-uURj6rpZoaeWA2pGe7YzxmfyIas=" + }, + "url": { + "version": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "querystring": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + }, + "dependencies": { + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha1-zI/qgse5Bud3cBklCGnlaemVwpU=", + "requires": { + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz" + } + }, + "url-parse": { + "version": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "requires": { + "querystringify": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + }, + "dependencies": { + "querystringify": { + "version": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" + } + } + }, + "url-parse-lax": { + "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + } + }, + "user-home": { + "version": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + } + }, + "util": { + "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "dependencies": { + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utila": { + "version": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + }, + "validate-npm-package-license": { + "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" + } + }, + "value-equal": { + "version": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", + "integrity": "sha1-wiCjBDYfzmmU277ao8fhobiVhx0=" + }, + "vary": { + "version": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + }, + "vendors": { + "version": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" + }, + "verror": { + "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "requires": { + "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + } + }, + "vm-browserify": { + "version": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" + } + }, + "walker": { + "version": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz" + } + }, + "warning": { + "version": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "watch": { + "version": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" + }, + "watchpack": { + "version": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "requires": { + "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "wbuf": { + "version": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "requires": { + "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + } + }, + "webidl-conversions": { + "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", + "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=" + }, + "webpack": { + "version": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", + "integrity": "sha1-LgRX8KuxrF3zqxBsacZy8jZ4Xwc=", + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "acorn-dynamic-import": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "enhanced-resolve": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "json-loader": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "loader-runner": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "node-libs-browser": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "tapable": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "watchpack": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "webpack-sources": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz" + }, + "dependencies": { + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "loader-utils": { + "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "source-list-map": { + "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", + "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + }, + "dependencies": { + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + } + } + } + }, + "webpack-sources": { + "version": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", + "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", + "requires": { + "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + } + } + } + }, + "yargs-parser": { + "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } + }, + "webpack-dev-middleware": { + "version": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "requires": { + "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "time-stamp": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz" + } + }, + "webpack-dev-server": { + "version": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", + "integrity": "sha1-TTanKLA7iyr6SO0wJCiEfOooQK0=", + "requires": { + "ansi-html": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "bonjour": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "compression": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", + "connect-history-api-fallback": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", + "del": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "express": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", + "html-entities": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "http-proxy-middleware": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "internal-ip": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "opn": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "portfinder": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "selfsigned": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.9.1.tgz", + "serve-index": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", + "sockjs": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "sockjs-client": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", + "spdy": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "webpack-dev-middleware": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + } + }, + "del": { + "version": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "requires": { + "globby": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "is-path-cwd": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "is-path-in-cwd": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + } + }, + "globby": { + "version": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + }, + "dependencies": { + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "opn": { + "version": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "sockjs-client": { + "version": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", + "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "eventsource": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz" + } + }, + "yargs-parser": { + "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + } + } + } + }, + "webpack-manifest-plugin": { + "version": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", + "integrity": "sha1-a2xxiq3oolN5lXhLRr0umDYFfKo=", + "requires": { + "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + }, + "dependencies": { + "fs-extra": { + "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + } + }, + "jsonfile": { + "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + } + } + }, + "webpack-sources": { + "version": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "integrity": "sha1-xzVkNqTRMSO+LiQmoF0drZy+Zc8=", + "requires": { + "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + }, + "dependencies": { + "source-list-map": { + "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=" + } + } + }, + "websocket-driver": { + "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "requires": { + "websocket-extensions": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz" + } + }, + "websocket-extensions": { + "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=" + }, + "whatwg-encoding": { + "version": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", + "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "requires": { + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" + }, + "dependencies": { + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + } + } + }, + "whatwg-fetch": { + "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whatwg-url": { + "version": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "requires": { + "tr46": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "webidl-conversions": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + }, + "dependencies": { + "webidl-conversions": { + "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + } + } + }, + "whet.extend": { + "version": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "requires": { + "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + } + }, + "which-module": { + "version": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "widest-line": { + "version": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + } + }, + "window-size": { + "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "worker-farm": { + "version": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz", + "integrity": "sha1-pDi8mTp6fRM7y2VHyV7KfP9Il9g=", + "requires": { + "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "wrap-ansi": { + "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + } + }, + "write-file-atomic": { + "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "slide": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + } + }, + "xdg-basedir": { + "version": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + } + }, + "xml-char-classes": { + "version": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=" + }, + "xml-name-validator": { + "version": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + }, + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + } + } + } + }, + "yargs-parser": { + "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} diff --git a/package.json b/package.json index d6fd031..844c1ac 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "d3-shape": "^1.2.0", "d3-time-format": "^2.0.5", "es6-promise": "^4.0.5", + "file-saver": "^1.3.3", "flux": "^3.1.2", "gaugeJS": "^1.3.2", "immutable": "^3.8.1", diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js new file mode 100644 index 0000000..6b19e46 --- /dev/null +++ b/src/components/dialog/import-node.js @@ -0,0 +1,94 @@ +/** + * File: import-simulator.js + * Author: Markus Grigull + * Date: 04.04.2017 + * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC + * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + **********************************************************************************/ + +import React, { Component, PropTypes } from 'react'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class ImportSimulatorDialog extends Component { + static propTypes = { + show: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + }; + + valid: false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', endpoint: '' }); + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulator + const simulator = JSON.parse(event.target.result); + self.valid = true; + self.setState({ name: simulator.name, endpoint: simulator.endpoint }); + }; + + reader.readAsText(file); + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Simulator File + this.loadFile(e.target.files)} /> + + + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default ImportSimulatorDialog; diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialog/import-simulation-model.js new file mode 100644 index 0000000..e21557f --- /dev/null +++ b/src/components/dialog/import-simulation-model.js @@ -0,0 +1,189 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; + +import Table from '../table'; +import TableColumn from '../table-column'; +import Dialog from './dialog'; + +class ImportSimulationModelDialog extends React.Component { + valid = false; + imported = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + simulator: { node: '', simulator: '' }, + length: '1', + mapping: [ { name: 'Signal', type: 'Type' } ] + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + resetState() { + this.setState({ + name: '', + simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, + length: '1', + mapping: [ { name: 'Signal', type: 'Type' } ] + }); + + this.imported = false; + } + + handleChange(e) { + if (e.target.id === 'length') { + // change mapping size + if (e.target.value > this.state.mapping.length) { + // add missing signals + while (this.state.mapping.length < e.target.value) { + this.state.mapping.push({ name: 'Signal', type: 'Type' }); + } + } else { + // remove signals + this.state.mapping.splice(e.target.value, this.state.mapping.length - e.target.value); + } + } + + if (e.target.id === 'simulator') { + this.setState({ simulator: JSON.parse(e.target.value) }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } + } + + handleMappingChange(event, row, column) { + var mapping = this.state.mapping; + + if (column === 1) { + mapping[row].name = event.target.value; + } else if (column === 2) { + mapping[row].type = event.target.value; + } + + this.setState({ mapping: mapping }); + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulator + const model = JSON.parse(event.target.result); + + self.imported = true; + self.valid = true; + self.setState({ name: model.name, mapping: model.mapping, length: model.length, simulator: { node: self.props.nodes[0]._id, simulator: 0 } }); + }; + + reader.readAsText(file); + } + + validateForm(target) { + // check all controls + var name = true; + var length = true; + var simulator = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.simulator === '') { + simulator = false; + } + + // test if simulatorid is a number (in a string, not type of number) + if (!/^\d+$/.test(this.state.length)) { + length = false; + } + + this.valid = name && length && simulator; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else if (target === 'length') return length ? "success" : "error"; + else if (target === 'simulator') return simulator ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Simulation Model File + this.loadFile(e.target.files)} /> + + + + Name + this.handleChange(e)} /> + + + + Simulator + this.handleChange(e)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) + ))} + + + + Length + this.handleChange(e)} /> + + + + Mapping + + + this.handleMappingChange(event, row, column)} /> + this.handleMappingChange(event, row, column)} /> +
    +
    +
    +
    + ); + } +} + +export default ImportSimulationModelDialog; \ No newline at end of file diff --git a/src/components/dialog/import-simulation.js b/src/components/dialog/import-simulation.js new file mode 100644 index 0000000..86bf46f --- /dev/null +++ b/src/components/dialog/import-simulation.js @@ -0,0 +1,140 @@ +/** + * 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, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class ImportSimulationDialog extends React.Component { + valid = false; + imported = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + models: [] + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e, index) { + if (e.target.id === 'simulator') { + const models = this.state.models; + models[index].simulator = JSON.parse(e.target.value); + + this.setState({ models }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } + } + + resetState() { + this.setState({ name: '', models: [] }); + + this.imported = false; + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulator + const simulation = JSON.parse(event.target.result); + simulation.models.forEach(model => { + model.simulator = { + node: self.props.nodes[0]._id, + simulator: 0 + } + }); + + self.imported = true; + self.setState({ name: simulation.name, models: simulation.models }); + }; + + 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 ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Simulation File + this.loadFile(e.target.files)} /> + + + + Name + this.handleChange(e)} /> + + + + {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/containers/simulators.js b/src/containers/simulators.js index ec8df05..7111ddf 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -22,6 +22,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; import NodeStore from '../stores/node-store'; @@ -32,8 +33,7 @@ import EditNodeDialog from '../components/dialog/edit-node'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; import NodeTree from '../components/node-tree'; -import ImportSimulatorDialog from '../components/dialog/import-simulator'; -import ExportSimulatorDialog from '../components/dialog/export-simulator'; +import ImportNodeDialog from '../components/dialog/import-node'; class Simulators extends Component { static getStores() { @@ -191,17 +191,36 @@ class Simulators extends Component { }); } - closeImportModal(data) { - this.setState({ importModal: false }); + closeImportNodeModal(data) { + this.setState({ importNodeModal: false }); if (data) { AppDispatcher.dispatch({ - type: 'simulators/start-add', - data: data + type: 'nodes/start-add', + data, + token: this.state.sessionToken }); } } + exportNode(data) { + const node = this.state.nodes.find((element) => { + return element._id === data.id; + }); + + // filter properties + let simulator = Object.assign({}, node); + delete simulator._id; + + simulator.simulators.forEach(simulator => { + delete simulator.id; + }); + + // show save dialog + const blob = new Blob([JSON.stringify(simulator, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'node - ' + node.name + '.json'); + } + labelStyle(value) { if (value === true) return 'success'; else return 'warning'; @@ -240,15 +259,26 @@ class Simulators extends Component {

    Simulators

    +
    Hint: Node names must be unique. Simulator names must be unique on a node. - this.onTreeDataChange(treeData)} onNodeDelete={(node) => this.showDeleteNodeModal(node)} onNodeEdit={(node) => this.showEditNodeModal(node)} onNodeAdd={(node) => this.showAddSimulatorModal(node)} onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} /> + this.onTreeDataChange(treeData)} + onNodeDelete={(node) => this.showDeleteNodeModal(node)} + onNodeEdit={(node) => this.showEditNodeModal(node)} + onNodeAdd={(node) => this.showAddSimulatorModal(node)} + onNodeExport={node => this.exportNode(node)} + onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} + onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} + /> this.closeNewNodeModal(data)} nodes={this.state.nodes} /> this.closeEditNodeModal(data)} nodes={this.state.nodes} /> this.closeAddSimulatorModal(data)} node={this.state.modalData}/> + this.closeImportNodeModal(data)} nodes={this.state.nodes} /> {this.state.editSimulatorModal && this.closeEditSimulatorModal(data)} node={this.state.modalData} /> From d354e0a3762953d3c159f5347d9aeab490664864 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 4 Apr 2017 20:29:05 +0200 Subject: [PATCH 362/556] Change import dialog before modal dialog Name exported file after simulator name --- src/components/dialog/import-node.js | 13 ++--- src/components/dialog/import-simulator.js | 63 +++++++++++++---------- src/containers/simulators.js | 20 +++++++ 3 files changed, 61 insertions(+), 35 deletions(-) diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js index 6b19e46..ed10849 100644 --- a/src/components/dialog/import-node.js +++ b/src/components/dialog/import-node.js @@ -7,18 +7,13 @@ * Unauthorized copying of this file, via any medium is strictly prohibited. **********************************************************************************/ -import React, { Component, PropTypes } from 'react'; +import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; -class ImportSimulatorDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - - valid: false; +class ImportNodeDialog extends React.Component { + valid = false; constructor(props) { super(props); @@ -91,4 +86,4 @@ class ImportSimulatorDialog extends Component { } } -export default ImportSimulatorDialog; +export default ImportNodeDialog; diff --git a/src/components/dialog/import-simulator.js b/src/components/dialog/import-simulator.js index 6b19e46..996c323 100644 --- a/src/components/dialog/import-simulator.js +++ b/src/components/dialog/import-simulator.js @@ -42,47 +42,58 @@ class ImportSimulatorDialog extends Component { } resetState() { - this.setState({ name: '', endpoint: '' }); - } + this.setState({ + name: this.props.simulator.name, + endpoint: this.props.simulator.endpoint + }); - loadFile(fileList) { - // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { - return; + // validate incoming state + var endpoint = true; + var name = true; + + if (this.props.simulator.name === '') { + name = false; } - // create file reader - var reader = new FileReader(); - var self = this; + if (this.props.simulator.endpoint === '') { + endpoint = false; + } - reader.onload = function(event) { - // read simulator - const simulator = JSON.parse(event.target.result); - self.valid = true; - self.setState({ name: simulator.name, endpoint: simulator.endpoint }); - }; + this.valid = endpoint && name; + } - reader.readAsText(file); + validateForm(target) { + // check all controls + var endpoint = true; + var name = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.endpoint === '') { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; } render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - - Simulator File - this.loadFile(e.target.files)} /> - - - + Name - this.handleChange(e)} /> + this.handleChange(e)} /> - + Endpoint - this.handleChange(e)} /> + this.handleChange(e)} /> diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 7111ddf..31ed312 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -253,6 +253,26 @@ class Simulators extends Component { } } + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulator + const simulator = JSON.parse(event.target.result); + self.setState({ importModal: true, modalSimulator: simulator }); + }; + + reader.readAsText(file); + } + render() { return (
    From e27824f8516c85842d00ae941b93cacd9fa41bd8 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 5 Apr 2017 11:09:38 +0200 Subject: [PATCH 363/556] Add simulation import & export Simulation models are imported/exported with it's simulation --- src/containers/simulations.js | 63 +++++++++++++++++-- src/data-managers/simulations-data-manager.js | 2 +- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/containers/simulations.js b/src/containers/simulations.js index af161b7..f5acf69 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -21,7 +21,8 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Modal, Glyphicon, FormGroup, FormControl, Form } from 'react-bootstrap'; +import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; @@ -31,6 +32,7 @@ import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewSimulationDialog from '../components/dialog/new-simulation'; import EditSimulationDialog from '../components/dialog/edit-simulation'; +import ImportSimulationDialog from '../components/dialog/import-simulation'; class Simulations extends Component { static getStores() { @@ -45,6 +47,7 @@ class Simulations extends Component { newModal: false, deleteModal: false, editModal: false, + importModal: false, modalSimulation: {} }; } @@ -123,6 +126,49 @@ class Simulations extends Component { this.confirmDeleteModal(); } } + + closeImportModal(data) { + this.setState({ importModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'simulations/start-add', + data: data + }); + } + } + + exportSimulation(data) { + // filter properties + var simulation = Object.assign({}, data); + delete simulation._id; + delete simulation.projects; + delete simulation.running; + + // show save dialog + const blob = new Blob([JSON.stringify(simulation, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, simulation.name + '.json'); + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulation + const simulation = JSON.parse(event.target.result); + self.setState({ importModal: true, modalSimulation: simulation }); + }; + + reader.readAsText(file); + } render() { return ( @@ -131,14 +177,23 @@ class Simulations extends Component { - this.setState({ editModal: true, modalSimulation: this.state.simulations[index] })} onDelete={index => this.setState({ deleteModal: true, modalSimulation: this.state.simulations[index] })} /> + this.setState({ editModal: true, modalSimulation: this.state.simulations[index] })} onDelete={index => this.setState({ deleteModal: true, modalSimulation: this.state.simulations[index] })} onExport={(index) => this.exportSimulation(this.state.simulations[index])} />
    - +
    + + + + + + { this.fileInput = ref; }} type="file" style={{ display: 'none' }} onChange={(e) => this.loadFile(e.target.files)} /> + + +
    this.closeNewModal(data)} /> - this.closeEditModal(data)} simulation={this.state.modalSimulation} /> + this.closeImportModal(data)} simulation={this.state.modalSimulation} /> this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index d5756cb..d5fdfde 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -21,4 +21,4 @@ import RestDataManager from './rest-data-manager'; -export default new RestDataManager('simulation', '/simulations'); +export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models' ]); From 02dcf185a327969960ba58a044c18b7e72024e14 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 5 Apr 2017 11:30:48 +0200 Subject: [PATCH 364/556] Add simulation model import & export --- .../dialog/import-simulation-model.js | 2 +- src/containers/simulation.js | 45 +++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialog/import-simulation-model.js index e21557f..c2ce502 100644 --- a/src/components/dialog/import-simulation-model.js +++ b/src/components/dialog/import-simulation-model.js @@ -186,4 +186,4 @@ class ImportSimulationModelDialog extends React.Component { } } -export default ImportSimulationModelDialog; \ No newline at end of file +export default ImportSimulationModelDialog; diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 32faa96..a2b2d99 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -21,7 +21,8 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Modal, Glyphicon, FormControl, FormGroup, Form } from 'react-bootstrap'; +import FileSaver from 'file-saver'; import SimulationStore from '../stores/simulation-store'; import NodeStore from '../stores/node-store'; @@ -32,6 +33,7 @@ import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewSimulationModelDialog from '../components/dialog/new-simulation-model'; import EditSimulationModelDialog from '../components/dialog/edit-simulation-model'; +import ImportSimulationModelDialog from '../components/dialog/import-simulation-model'; class Simulation extends React.Component { static getStores() { @@ -47,6 +49,7 @@ class Simulation extends React.Component { newModal: false, deleteModal: false, editModal: false, + importModal: false, modalData: {}, modalIndex: null, @@ -146,6 +149,42 @@ class Simulation extends React.Component { } } + exportSimulationModel(data) { + // filter properties + var model = Object.assign({}, data); + + // get simulator name + this.state.simulators.forEach(simulator => { + if (simulator._id === model.simulator) { + model.simulator = simulator.name; + } + }); + + // show save dialog + const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, model.name + '.json'); + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulation model + const simulationModel = JSON.parse(event.target.result); + self.setState({ importModal: true, modalData: simulationModel }); + }; + + reader.readAsText(file); + } + render() { return (
    @@ -155,10 +194,10 @@ class Simulation extends React.Component { this.getSimulatorName(simulator)} /> - this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} /> + this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onExport={(index) => this.exportSimulationModel(this.state.simulation.models[index])} /> - + this.closeNewModal(data)} nodes={this.state.nodes} /> From 0878909660aa8c967fe008f72032213df875efed Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 6 Apr 2017 14:39:04 +0200 Subject: [PATCH 365/556] Add simulation model selection in simulation import --- src/components/dialog/import-simulation.js | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/dialog/import-simulation.js b/src/components/dialog/import-simulation.js index 86bf46f..a7e18ac 100644 --- a/src/components/dialog/import-simulation.js +++ b/src/components/dialog/import-simulation.js @@ -33,13 +33,21 @@ class ImportSimulationDialog extends React.Component { this.state = { name: '', - models: [] + selectedModels: [] }; } onClose(canceled) { if (canceled === false) { - this.props.onClose(this.state); + // create simulation + const simulation = { + name: this.state.name, + models: this.props.simulation.models.filter((element, index) => { + return this.state.selectedModels[index]; + }) + }; + + this.props.onClose(simulation); } else { this.props.onClose(); } @@ -104,6 +112,20 @@ class ImportSimulationDialog extends React.Component { if (target === 'name') return name ? "success" : "error"; } + selectModels(event) { + // update selection + const selectedModels = this.state.selectedModels.map((element, index) => { + // eslint-disable-next-line + if (event.target.id == index) { + return !element; + } else { + return element; + } + }); + + this.setState({ selectedModels: selectedModels }); + } + render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> From a4ef517670a136e3d1bcd0c14c40aa889cb5c326 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 14:32:17 +0200 Subject: [PATCH 366/556] Improve imports and exports --- src/components/dialog/export-simulator.js | 88 ------------------- src/components/dialog/import-node.js | 64 +++++++++++--- src/components/dialog/import-simulation.js | 26 +----- src/components/dialog/new-node.js | 2 +- src/components/dialog/new-simulation-model.js | 2 +- src/components/node-tree.js | 1 + src/containers/simulation.js | 42 ++++++++- src/containers/simulations.js | 82 +++++++++-------- 8 files changed, 138 insertions(+), 169 deletions(-) delete mode 100644 src/components/dialog/export-simulator.js diff --git a/src/components/dialog/export-simulator.js b/src/components/dialog/export-simulator.js deleted file mode 100644 index 31ec523..0000000 --- a/src/components/dialog/export-simulator.js +++ /dev/null @@ -1,88 +0,0 @@ -/** - * File: export-simulator.js - * Author: Markus Grigull - * Date: 04.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component, PropTypes } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -import Dialog from './dialog'; - -class ExportSimulatorDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - - valid: false; - - constructor(props) { - super(props); - - this.state = { - name: '', - endpoint: '' - }; - } - - onClose(canceled) { - if (canceled === false) { - this.props.onClose(this.state); - } else { - this.props.onClose(); - } - } - - handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); - } - - resetState() { - this.setState({ name: '', endpoint: '' }); - } - - validateForm(target) { - // check all controls - var endpoint = true; - var name = true; - - if (this.state.name === '') { - name = false; - } - - if (this.state.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Endpoint - this.handleChange(e)} /> - - -
    -
    - ); - } -} - -export default ExportSimulatorDialog; diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js index ed10849..e1128df 100644 --- a/src/components/dialog/import-node.js +++ b/src/components/dialog/import-node.js @@ -1,11 +1,23 @@ /** - * File: import-simulator.js + * File: import-node.js * Author: Markus Grigull - * Date: 04.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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, ControlLabel } from 'react-bootstrap'; @@ -14,13 +26,15 @@ import Dialog from './dialog'; class ImportNodeDialog extends React.Component { valid = false; + imported = false; constructor(props) { super(props); this.state = { name: '', - endpoint: '' + endpoint: '', + simulators: [] }; } @@ -38,6 +52,8 @@ class ImportNodeDialog extends React.Component { resetState() { this.setState({ name: '', endpoint: '' }); + + this.imported = false; } loadFile(fileList) { @@ -53,14 +69,34 @@ class ImportNodeDialog extends React.Component { reader.onload = function(event) { // read simulator - const simulator = JSON.parse(event.target.result); - self.valid = true; - self.setState({ name: simulator.name, endpoint: simulator.endpoint }); + const node = JSON.parse(event.target.result); + self.imported = true; + self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators }); }; reader.readAsText(file); } + validateForm(target) { + // check all controls + let endpoint = true; + let name = true; + + if (this.state.name === '' || this.props.nodes.find(node => node.name === this.state.name) !== undefined) { + name = false; + } + + if (this.state.endpoint === '' || this.props.nodes.find(node => node.endpoint === this.state.endpoint) !== undefined) { + endpoint = false; + } + + this.valid = endpoint && name; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + else return endpoint ? "success" : "error"; + } + render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> @@ -70,14 +106,14 @@ class ImportNodeDialog extends React.Component { this.loadFile(e.target.files)} /> - + Name - this.handleChange(e)} /> + this.handleChange(e)} /> - + Endpoint - this.handleChange(e)} /> + this.handleChange(e)} /> diff --git a/src/components/dialog/import-simulation.js b/src/components/dialog/import-simulation.js index a7e18ac..624b11e 100644 --- a/src/components/dialog/import-simulation.js +++ b/src/components/dialog/import-simulation.js @@ -33,21 +33,13 @@ class ImportSimulationDialog extends React.Component { this.state = { name: '', - selectedModels: [] + models: [], }; } onClose(canceled) { if (canceled === false) { - // create simulation - const simulation = { - name: this.state.name, - models: this.props.simulation.models.filter((element, index) => { - return this.state.selectedModels[index]; - }) - }; - - this.props.onClose(simulation); + this.props.onClose(this.state); } else { this.props.onClose(); } @@ -112,20 +104,6 @@ class ImportSimulationDialog extends React.Component { if (target === 'name') return name ? "success" : "error"; } - selectModels(event) { - // update selection - const selectedModels = this.state.selectedModels.map((element, index) => { - // eslint-disable-next-line - if (event.target.id == index) { - return !element; - } else { - return element; - } - }); - - this.setState({ selectedModels: selectedModels }); - } - render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index 54be1c9..e7ec1c9 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -25,7 +25,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; class NewNodeDialog extends React.Component { - valid: false; + valid = false; constructor(props) { super(props); diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index a4e3bbb..9538b30 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -27,7 +27,7 @@ import TableColumn from '../table-column'; import Dialog from './dialog'; class NewSimulationModelDialog extends React.Component { - valid: false; + valid = false; constructor(props) { super(props); diff --git a/src/components/node-tree.js b/src/components/node-tree.js index 24c1be3..7513710 100644 --- a/src/components/node-tree.js +++ b/src/components/node-tree.js @@ -47,6 +47,7 @@ class NodeTree extends React.Component { buttons.push(); buttons.push(); buttons.push(); + buttons.push(); } else { // get child index var index = rowInfo.path[1] - rowInfo.path[0] - 1; diff --git a/src/containers/simulation.js b/src/containers/simulation.js index a2b2d99..e28a8e9 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon, FormControl, FormGroup, Form } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import SimulationStore from '../stores/simulation-store'; @@ -129,6 +129,20 @@ class Simulation extends React.Component { } } + closeImportModal(data) { + this.setState({ importModal: false }); + + if (data) { + this.state.simulation.models.push(data); + + AppDispatcher.dispatch({ + type: 'simulations/start-edit', + data: this.state.simulation, + token: this.state.sessionToken + }); + } + } + getSimulatorName(simulator) { var name = "undefined"; @@ -141,6 +155,16 @@ class Simulation extends React.Component { return name; } + exportModel(index) { + // filter properties + let simulationModel = Object.assign({}, this.state.simulation.models[index]); + delete simulationModel.simulator; + + // show save dialog + const blob = new Blob([JSON.stringify(simulationModel, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'simulation model - ' + simulationModel.name + '.json'); + } + onModalKeyPress = (event) => { if (event.key === 'Enter') { event.preventDefault(); @@ -194,14 +218,24 @@ class Simulation extends React.Component { this.getSimulatorName(simulator)} /> - this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} onExport={(index) => this.exportSimulationModel(this.state.simulation.models[index])} /> + this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} + onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} + onExport={index => this.exportModel(index)} + /> - + + this.closeNewModal(data)} nodes={this.state.nodes} /> - this.closeEditModal(data)} data={this.state.modalData} nodes={this.state.nodes} /> + this.closeImportModal(data)} nodes={this.state.nodes} /> this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> diff --git a/src/containers/simulations.js b/src/containers/simulations.js index f5acf69..3acc22a 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -21,12 +21,13 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon, FormGroup, FormControl, Form } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } 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 NodeStore from '../stores/node-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; @@ -36,12 +37,13 @@ import ImportSimulationDialog from '../components/dialog/import-simulation'; class Simulations extends Component { static getStores() { - return [ SimulationStore, UserStore ]; + return [ SimulationStore, UserStore, NodeStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), + nodes: NodeStore.getState(), sessionToken: UserStore.getState().token, newModal: false, @@ -119,6 +121,18 @@ class Simulations extends Component { } } + 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(); @@ -126,29 +140,6 @@ class Simulations extends Component { this.confirmDeleteModal(); } } - - closeImportModal(data) { - this.setState({ importModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'simulations/start-add', - data: data - }); - } - } - - exportSimulation(data) { - // filter properties - var simulation = Object.assign({}, data); - delete simulation._id; - delete simulation.projects; - delete simulation.running; - - // show save dialog - const blob = new Blob([JSON.stringify(simulation, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, simulation.name + '.json'); - } loadFile(fileList) { // get file @@ -170,6 +161,23 @@ class Simulations extends Component { reader.readAsText(file); } + 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'); + } + render() { return (
    @@ -177,23 +185,23 @@ class Simulations extends Component { - this.setState({ editModal: true, modalSimulation: this.state.simulations[index] })} onDelete={index => this.setState({ deleteModal: true, modalSimulation: this.state.simulations[index] })} onExport={(index) => this.exportSimulation(this.state.simulations[index])} /> + 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.fileInput = ref; }} type="file" style={{ display: 'none' }} onChange={(e) => this.loadFile(e.target.files)} /> - - -
    + + this.closeNewModal(data)} /> this.closeEditModal(data)} simulation={this.state.modalSimulation} /> - this.closeImportModal(data)} simulation={this.state.modalSimulation} /> + this.closeImportModal(data)} nodes={this.state.nodes} /> this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> From 891c7f7f85955eecd0abc43d62c2687071025d4e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 18:24:09 +0200 Subject: [PATCH 367/556] Add visualization export --- src/components/dialog/import-simulator.js | 105 ----------- src/components/dialog/import-visualization.js | 133 +++++++++++++ src/containers/project.js | 177 ++++++++++-------- src/containers/simulation.js | 36 ---- src/containers/simulations.js | 20 -- 5 files changed, 231 insertions(+), 240 deletions(-) delete mode 100644 src/components/dialog/import-simulator.js create mode 100644 src/components/dialog/import-visualization.js diff --git a/src/components/dialog/import-simulator.js b/src/components/dialog/import-simulator.js deleted file mode 100644 index 996c323..0000000 --- a/src/components/dialog/import-simulator.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * File: import-simulator.js - * Author: Markus Grigull - * Date: 04.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - -import React, { Component, PropTypes } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; - -import Dialog from './dialog'; - -class ImportSimulatorDialog extends Component { - static propTypes = { - show: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired - }; - - valid: false; - - constructor(props) { - super(props); - - this.state = { - name: '', - endpoint: '' - }; - } - - onClose(canceled) { - if (canceled === false) { - 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.simulator.name, - endpoint: this.props.simulator.endpoint - }); - - // validate incoming state - var endpoint = true; - var name = true; - - if (this.props.simulator.name === '') { - name = false; - } - - if (this.props.simulator.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; - } - - validateForm(target) { - // check all controls - var endpoint = true; - var name = true; - - if (this.state.name === '') { - name = false; - } - - if (this.state.endpoint === '') { - endpoint = false; - } - - this.valid = endpoint && name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Endpoint - this.handleChange(e)} /> - - -
    -
    - ); - } -} - -export default ImportSimulatorDialog; diff --git a/src/components/dialog/import-visualization.js b/src/components/dialog/import-visualization.js new file mode 100644 index 0000000..7ed8113 --- /dev/null +++ b/src/components/dialog/import-visualization.js @@ -0,0 +1,133 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; + +import Dialog from './dialog'; + +class ImportVisualizationDialog extends React.Component { + valid = false; + imported = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + widgets: [], + grid: 0 + }; + } + + onClose(canceled) { + if (canceled === false) { + this.props.onClose(this.state); + } else { + this.props.onClose(); + } + } + + handleChange(e, index) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', widgets: [], grid: 0 }); + + this.imported = false; + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + var reader = new FileReader(); + var self = this; + + reader.onload = function(event) { + // read simulator + const visualization = JSON.parse(event.target.result); + + let defaultSimulator = ""; + if (self.props.simulation.models != null) { + defaultSimulator = self.props.simulation.models[0].simulator; + } + + visualization.widgets.forEach(widget => { + switch (widget.type) { + case 'Value': + case 'Plot': + case 'Table': + case 'PlotTable': + case 'Gauge': + widget.simulator = defaultSimulator; + break; + } + }); + + self.imported = true; + self.valid = true; + self.setState({ name: visualization.name, widgets: visualization.widgets, grid: visualization.grid }); + }; + + 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 ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Visualization File + this.loadFile(e.target.files)} /> + + + + Name + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default ImportVisualizationDialog; diff --git a/src/containers/project.js b/src/containers/project.js index 3e00079..df39dce 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -22,98 +22,80 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { Button, Modal, Glyphicon } 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 CustomTable from '../components/table'; import TableColumn from '../components/table-column'; import NewVisualzationDialog from '../components/dialog/new-visualization'; import EditVisualizationDialog from '../components/dialog/edit-visualization'; +import ImportVisualizationDialog from '../components/dialog/import-visualization'; class Visualizations extends Component { static getStores() { - return [ ProjectStore, VisualizationStore, UserStore ]; + return [ ProjectStore, VisualizationStore, UserStore, SimulationStore ]; } static calculateState(prevState, props) { + prevState = prevState || {}; - let currentProjects = ProjectStore.getState(); - let currentVisualizations = VisualizationStore.getState(); - let sessionToken = UserStore.getState().token; + // load project + const sessionToken = UserStore.getState().token; - if (prevState) { - var projectUpdate = prevState.project; + 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 + }); - // Compare content of the visualizations array, reload projects if changed - if (JSON.stringify(prevState.visualizations) !== JSON.stringify(currentVisualizations)) { - Visualizations.loadProjects(sessionToken); - } - - // Compare content of the projects array, update visualizations if changed - if (JSON.stringify(prevState.projects) !== JSON.stringify(currentProjects)) { - projectUpdate = Visualizations.findProjectInState(currentProjects, props.match.params.project); - Visualizations.loadVisualizations(projectUpdate.visualizations, sessionToken); - } - - return { - projects: currentProjects, - visualizations: currentVisualizations, - sessionToken, - - newModal: prevState.newModal, - deleteModal: prevState.deleteModal, - editModal: prevState.editModal, - modalData: prevState.modalData, - - project: projectUpdate - }; - } else { - - let initialProject = Visualizations.findProjectInState(currentProjects, props.match.params.project); - // If projects have been loaded already but visualizations not (redirect from Projects page) - if (initialProject && (!currentVisualizations || currentVisualizations.length === 0)) { - Visualizations.loadVisualizations(initialProject.visualizations, sessionToken); - } - - return { - projects: currentProjects, - visualizations: currentVisualizations, - sessionToken, - - newModal: false, - deleteModal: false, - editModal: false, - modalData: {}, - - project: initialProject || {} - }; + project = {}; } + + // load simulation + let simulation = {}; + + if (project.simulation != null) { + simulation = SimulationStore.getState().find(simulation => simulation._id === project.simulation); + } + + // load visualizations + let visualizations = []; + + if (project.visualizations != null) { + visualizations = VisualizationStore.getState().filter(visualization => project.visualizations.includes(visualization._id)); + } + + return { + visualizations, + project, + simulation, + sessionToken, + + newModal: prevState.newModal || false, + deleteModal: prevState.deleteModal || false, + editModal: prevState.editModal || false, + importModal: prevState.importModal || false, + modalData: prevState.modalData || {} + }; } - static findProjectInState(projects, projectId) { - return projects.find((project) => project._id === projectId); - } - - static loadProjects(token) { - AppDispatcher.dispatch({ - type: 'projects/start-load', - token - }); - } - - static loadVisualizations(visualizations, token) { + componentDidMount() { AppDispatcher.dispatch({ type: 'visualizations/start-load', - data: visualizations, - token + token: this.state.sessionToken }); - } - componentWillMount() { - Visualizations.loadProjects(this.state.sessionToken); + AppDispatcher.dispatch({ + type: 'simulations/start-load', + token: this.state.sessionToken + }); } closeNewModal(data) { @@ -153,6 +135,44 @@ class Visualizations extends Component { } } + closeImportModal(data) { + this.setState({ importModal: false }); + + if (data) { + data.project = this.state.project._id; + + AppDispatcher.dispatch({ + type: 'visualizations/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 + }); + }); + } + } + + exportVisualization(index) { + // filter properties + let visualization = Object.assign({}, this.state.visualizations[index]); + delete visualization._id; + delete visualization.project; + delete visualization.user; + + visualization.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'); + } + onModalKeyPress = (event) => { if (event.key === 'Enter') { event.preventDefault(); @@ -162,30 +182,29 @@ class Visualizations extends Component { } render() { - // get visualizations for this project - var visualizations = []; - if (this.state.visualizations && this.state.project.visualizations) { - visualizations = this.state.visualizations.filter( - (visualization) => this.state.project.visualizations.includes(visualization._id) - ).sort( - (visA, visB) => visA.name.localeCompare(visB.name) - ); - } - return (

    {this.state.project.name}

    - + - this.setState({ editModal: true, modalData: visualizations[index] })} onDelete={(index) => this.setState({ deleteModal: true, modalData: visualizations[index] })} /> + 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)} + /> + this.closeNewModal(data)} /> - this.closeEditModal(data)} visualization={this.state.modalData} /> + this.closeImportModal(data)} simulation={this.state.simulation} /> this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> diff --git a/src/containers/simulation.js b/src/containers/simulation.js index e28a8e9..6d28515 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -173,42 +173,6 @@ class Simulation extends React.Component { } } - exportSimulationModel(data) { - // filter properties - var model = Object.assign({}, data); - - // get simulator name - this.state.simulators.forEach(simulator => { - if (simulator._id === model.simulator) { - model.simulator = simulator.name; - } - }); - - // show save dialog - const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, model.name + '.json'); - } - - loadFile(fileList) { - // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { - return; - } - - // create file reader - var reader = new FileReader(); - var self = this; - - reader.onload = function(event) { - // read simulation model - const simulationModel = JSON.parse(event.target.result); - self.setState({ importModal: true, modalData: simulationModel }); - }; - - reader.readAsText(file); - } - render() { return (
    diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 3acc22a..1f9da4c 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -141,26 +141,6 @@ class Simulations extends Component { } } - loadFile(fileList) { - // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { - return; - } - - // create file reader - var reader = new FileReader(); - var self = this; - - reader.onload = function(event) { - // read simulation - const simulation = JSON.parse(event.target.result); - self.setState({ importModal: true, modalSimulation: simulation }); - }; - - reader.readAsText(file); - } - exportSimulation(index) { // filter properties let simulation = Object.assign({}, this.state.simulations[index]); From 31ad0a5ca2427494ea932a3e26eb797334e4ddeb Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sat, 19 Aug 2017 10:42:40 +0200 Subject: [PATCH 368/556] Add pause button in visualization --- src/containers/visualization.js | 49 +++++++++++++++++++++++++-------- src/containers/widget.js | 32 +++++++++++++-------- src/styles/app.css | 4 +-- 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index d8a3872..8492737 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import { ContextMenu, MenuItem } from 'react-contextmenu'; import Slider from 'rc-slider'; @@ -66,6 +66,7 @@ class Visualization extends React.Component { project: prevState.project || null, simulation: prevState.simulation || null, editing: prevState.editing || false, + paused: prevState.paused || false, editModal: prevState.editModal || false, modalData: prevState.modalData || null, @@ -402,6 +403,14 @@ class Visualization extends React.Component { fullscreen: false }); } + + pauseData = () => { + this.setState({ paused: true }); + } + + unpauseData = () => { + this.setState({ paused: false }); + } render() { const current_widgets = this.state.visualization.widgets; @@ -418,10 +427,10 @@ class Visualization extends React.Component {
    -
    @@ -444,13 +453,19 @@ class Visualization extends React.Component {
    )} - {this.state.editing && -
    - Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} +
    + {this.state.editing ? ( +
    + Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} - this.setGrid(value)} /> -
    - } + this.setGrid(value)} /> +
    + ) : (this.state.paused ? ( + + ): ( + + ))} +
    e.preventDefault() }> @@ -473,8 +488,18 @@ class Visualization extends React.Component { 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.visualization.grid} /> + 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.visualization.grid} + paused={this.state.paused} + /> ))} diff --git a/src/containers/widget.js b/src/containers/widget.js index 15e89b6..4667614 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; +import React from 'react'; import { Container } from 'flux/utils'; import { ContextMenuTrigger } from 'react-contextmenu'; import Rnd from 'react-rnd'; @@ -45,26 +45,36 @@ import WidgetHTML from '../components/widget-html'; import '../styles/widgets.css'; -class Widget extends Component { +class Widget extends React.Component { static getStores() { return [ SimulatorDataStore, FileStore, UserStore ]; } - static calculateState(prevState) { - let tokenState = UserStore.getState().token; + static calculateState(prevState, props) { + const sessionToken = UserStore.getState().token; + + let simulatorData = {}; + + if (props.paused) { + if (prevState && prevState.simulatorData) { + simulatorData = JSON.parse(JSON.stringify(prevState.simulatorData)); + } + } else { + simulatorData = SimulatorDataStore.getState(); + } if (prevState) { return { - sessionToken: tokenState, - simulatorData: SimulatorDataStore.getState(), + sessionToken, + simulatorData, files: FileStore.getState(), sequence: prevState.sequence + 1 - } + }; } else { return { - sessionToken: tokenState, - simulatorData: SimulatorDataStore.getState(), + sessionToken, + simulatorData, files: FileStore.getState(), sequence: 0 @@ -144,7 +154,7 @@ class Widget extends Component { render() { // configure grid - let grid = [this.props.grid, this.props.grid]; + const grid = [this.props.grid, this.props.grid]; // get widget element const widget = this.props.data; @@ -223,4 +233,4 @@ class Widget extends Component { } } -export default Container.create(Widget); +export default Container.create(Widget, { withProps: true }); diff --git a/src/styles/app.css b/src/styles/app.css index b9a85a9..b069c5d 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -370,12 +370,12 @@ body { font-size: 0.8em; } -.section-grid-slider { +.section-buttons-group-right { height: auto !important; float: right; } -.section-grid-slider .rc-slider { +.section-buttons-group-right .rc-slider { margin-left: 12px; } From 2abadabdf365974dd1a3abf9792f4e513f8d0273 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 18:41:17 +0200 Subject: [PATCH 369/556] Fix fullscreen style --- src/styles/app.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/app.css b/src/styles/app.css index b069c5d..7d58d04 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -88,7 +88,7 @@ body { color: #333; } -.app-body { +.app-body-spacing { padding: 15px 5px 0px 5px; } From ac8aaffd86fd66e3ce29e8495f22dcdcaff93f64 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 18:48:20 +0200 Subject: [PATCH 370/556] Fix control tests --- .../components/dialog/edit-widget-control-creator.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index f7c29f2..f426ac8 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -13,6 +13,9 @@ import EditWidgetOrientation from '../../../components/dialog/edit-widget-orient import EditWidgetTextSizeControl from '../../../components/dialog/edit-widget-text-size-control'; import EditWidgetAspectControl from '../../../components/dialog/edit-widget-aspect-control'; import EditWidgetCheckboxControl from '../../../components/dialog/edit-widget-checkbox-control'; +import EditWidgetMinMaxControl from '../../../components/dialog/edit-widget-min-max-control'; +import EditWidgetColorZonesControl from '../../../components/dialog/edit-widget-color-zones-control'; +import EditWidgetHTMLContent from '../../../components/dialog/edit-widget-html-content'; describe('edit widget control creator', () => { it('should not return null', () => { @@ -22,11 +25,11 @@ describe('edit widget control creator', () => { var runs = [ { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, - { args: { widgetType: 'Plot' }, result: { controlNumber: 4, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, + { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, - { args: { widgetType: 'Gauge' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, - { args: { widgetType: 'PlotTable' }, result: { controlNumber: 3, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl] } }, + { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, + { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 1, controlTypes: [EditWidgetOrientation] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, From 0450b6f694d3f37ae6b36e3917162cc4f0fc04d5 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 18 Sep 2017 18:52:28 +0200 Subject: [PATCH 371/556] Fix build process --- src/components/dialog/import-visualization.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/dialog/import-visualization.js b/src/components/dialog/import-visualization.js index 7ed8113..5d276f9 100644 --- a/src/components/dialog/import-visualization.js +++ b/src/components/dialog/import-visualization.js @@ -85,6 +85,9 @@ class ImportVisualizationDialog extends React.Component { case 'Gauge': widget.simulator = defaultSimulator; break; + + default: + break; } }); From 5a027a1af742134fec2c269bc9cec0c6aed0d2d6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 20 Sep 2017 09:21:13 +0200 Subject: [PATCH 372/556] Add continues plot drawing Plots are now drawn 30 times per second independent of incoming data. Improve plot legend styling. Fix footer styling. --- src/components/widget-plot-table.js | 3 +- src/components/widget-plot.js | 1 + src/components/widget-plot/plot.js | 54 +++++++++++++++++++---------- src/containers/widget.js | 4 +-- src/styles/app.css | 15 ++++---- src/styles/widgets.css | 4 +-- 6 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 0cef2f5..ce5392d 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -136,8 +136,6 @@ class WidgetPlotTable extends Component { return accum; }, []); - - return (
    @@ -160,6 +158,7 @@ class WidgetPlotTable extends Component { yMin={this.props.widget.yMin} yMax={this.props.widget.yMax} yUseMinMax={this.props.widget.yUseMinMax} + paused={this.props.paused} />
    diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 2c51e0d..9b7c006 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -73,6 +73,7 @@ class WidgetPlot extends React.Component { yMin={this.props.widget.yMin} yMax={this.props.widget.yMax} yUseMinMax={this.props.widget.yUseMinMax} + paused={this.props.paused} />
    diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index c9cc77e..2f574ab 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -23,7 +23,7 @@ class Plot extends React.Component { super(props); // create dummy axes - const xScale = scaleTime().domain([Date.now(), Date.now() + 5 * 1000]).range([leftMargin, props.width]); + const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([leftMargin, props.width]); const yScale = scaleLinear().domain([0, 10]).range([props.height, bottomMargin]); const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); @@ -31,16 +31,25 @@ class Plot extends React.Component { this.state = { data: null, + lines: null, xAxis, yAxis }; } + componentDidMount() { + this.interval = setInterval(this.tick, 50); + } + + componentWillUnmount() { + clearInterval(this.interval); + } + componentWillReceiveProps(nextProps) { // check if data is valid if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { // create empty plot axes - const xScale = scaleTime().domain([Date.now(), Date.now() + 5 * 1000]).range([leftMargin, nextProps.width]); + const xScale = scaleTime().domain([Date.now() - 5 * nextProps.time * 1000, Date.now()]).range([leftMargin, nextProps.width]); const yScale = scaleLinear().domain([0, 10]).range([nextProps.height, bottomMargin]); const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); @@ -53,27 +62,30 @@ class Plot extends React.Component { // only show data in requested time let data = nextProps.data; - const firstTimestamp = data[0][data[0].length - 1].x - nextProps.time * 1000; + 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)); } - // calculate paths for data - let xRange = extent(data[0], p => new Date(p.x)); - if (xRange[1] - xRange[0] < nextProps.time * 1000) { - xRange[0] = xRange[1] - nextProps.time * 1000; + this.setState({ data }); + } + + tick = () => { + if (this.state.data == null || this.props.paused === true) { + return; } + // calculate yRange let yRange; - - if (nextProps.yUseMinMax) { - yRange = [nextProps.yMin, nextProps.yMax]; + + if (this.props.yUseMinMax) { + yRange = [this.props.yMin, this.props.yMax]; } else { yRange = [0, 0]; - data.map(values => { + this.props.data.map(values => { const range = extent(values, p => p.y); if (range[0] < yRange[0]) yRange[0] = range[0]; if (range[1] > yRange[1]) yRange[1] = range[1]; @@ -81,10 +93,10 @@ class Plot extends React.Component { return values; }); } - + // create scale functions for both axes - const xScale = scaleTime().domain(xRange).range([leftMargin, nextProps.width]); - const yScale = scaleLinear().domain(yRange).range([nextProps.height, bottomMargin]); + const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([leftMargin, this.props.width]); + const yScale = scaleLinear().domain(yRange).range([this.props.height, bottomMargin]); const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); @@ -93,9 +105,9 @@ class Plot extends React.Component { const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); const lineColor = scaleOrdinal(schemeCategory10); - const lines = data.map((values, index) => ); + const lines = this.state.data.map((values, index) => ); - this.setState({ data: lines, xAxis, yAxis }); + this.setState({ lines, xAxis, yAxis }); } render() { @@ -103,8 +115,14 @@ class Plot extends React.Component { select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> - - {this.state.data} + + + + + + + + {this.state.lines} ; } diff --git a/src/containers/widget.js b/src/containers/widget.js index 4667614..dc4e66c 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -165,13 +165,13 @@ class Widget extends React.Component { if (widget.type === 'Value') { element = } else if (widget.type === 'Plot') { - element = + element = } else if (widget.type === 'Table') { element = } else if (widget.type === 'Label') { element = } else if (widget.type === 'PlotTable') { - element = this.props.onWidgetStatusChange(w, this.props.index) } /> + element = this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { element = } else if (widget.type === 'Button') { diff --git a/src/styles/app.css b/src/styles/app.css index 7d58d04..17e08e5 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -35,7 +35,7 @@ body { } .app-body { - height: 100%; + /*height: 100%;*/ } .app-header { @@ -74,18 +74,17 @@ body { .app-footer { width: 100%; - height: 60px; - /* Float below body */ - float: right; - padding-top: 20px; + + margin-top: 20px; + padding-bottom: 10px; text-align: center; - - clear: both; } .app-footer a { - color: #333; + color: #4d4d4d; + + text-decoration: underline; } .app-body-spacing { diff --git a/src/styles/widgets.css b/src/styles/widgets.css index b8f2483..e1f16ca 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -220,7 +220,7 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input .legend-color { height: 50%; display: inline-block; - vertical-align: middle; + margin-right: 5px; } /* End Plots */ @@ -375,7 +375,7 @@ div[class*="-widget"] label { position: absolute; width: 100%; font-weight: bold; - font-size: 1.5em; + font-size: 18px; bottom: 10%; text-align: center; } From b6613ab0cdd086bc0b8b0c26a9739fff99e5b33b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 20 Sep 2017 12:46:32 +0200 Subject: [PATCH 373/556] add support for vectors of samples (closes #107) --- .../simulator-data-data-manager.js | 35 ++++++++++++---- src/stores/simulator-data-store.js | 41 +++++++++++-------- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index ef05abd..c81979d 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -76,20 +76,19 @@ class SimulatorDataDataManager { } onMessage(event, node) { - var message = this.bufferToMessage(event.data); + var msgs = this.bufferToMessageArray(event.data); - if (message !== null) { + if (msgs.length > 0) { AppDispatcher.dispatch({ type: 'simulatorData/data-changed', - data: message, + data: msgs, node: node }); } } - bufferToMessage(blob) { + bufferToMessage(data) { // parse incoming message into usable data - var data = new DataView(blob); if (data.byteLength === 0) { return null; } @@ -97,11 +96,10 @@ class SimulatorDataDataManager { let OFFSET_TYPE = 2; let OFFSET_VERSION = 4; + var id = data.getUint8(1); var bits = data.getUint8(0); var length = data.getUint16(0x02, 1); - var id = data.getUint8(1); - - var values = new Float32Array(data.buffer, data.byteOffset + 0x10, length); + var bytes = length * 4 + 16; return { version: (bits >> OFFSET_VERSION) & 0xF, @@ -109,10 +107,29 @@ class SimulatorDataDataManager { length: length, sequence: data.getUint32(0x04, 1), timestamp: data.getUint32(0x08, 1) * 1e3 + data.getUint32(0x0C, 1) * 1e-6, - values: values, + values: new Float32Array(data.buffer, data.byteOffset + 0x10, length), + blob: new DataView( data.buffer, data.byteOffset + 0x00, bytes), id: id }; } + + bufferToMessageArray(blob) { + /* some local variables for parsing */ + var offset = 0; + var msgs = []; + + /* for every msg in vector */ + while (offset < blob.byteLength) { + var msg = this.bufferToMessage(new DataView(blob, offset)); + + if (msg !== undefined) { + msgs.push(msg); + offset += msg.blob.byteLength; + } + } + + return msgs; + } } export default new SimulatorDataDataManager(); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 0826959..25a24d1 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -36,7 +36,7 @@ class SimulationDataStore extends ReduceStore { } reduce(state, action) { - var i; + var i, j; switch (action.type) { case 'simulatorData/open': @@ -59,29 +59,34 @@ class SimulationDataStore extends ReduceStore { return state; } - let index = action.node.simulators.findIndex(simulator => simulator.id === action.data.id); - if (index === -1 || state[action.node._id][index] == null) { - return state; - } + // loop over all samples in a vector + for (j = 0; j < action.data.length; j++) { + let smp = action.data[j]; - // add data to simulator - for (i = 0; i < action.data.length; i++) { - while (state[action.node._id][index].values.length < i + 1) { - state[action.node._id][index].values.push([]); + let index = action.node.simulators.findIndex(simulator => simulator.id === smp.id); + if (index === -1 || state[action.node._id][index] == null) { + return state; } - state[action.node._id][index].values[i].push({ x: action.data.timestamp, y: action.data.values[i] }); + // add data to simulator + for (i = 0; i < smp.length; i++) { + while (state[action.node._id][index].values.length < i + 1) { + state[action.node._id][index].values.push([]); + } - // erase old values - if (state[action.node._id][index].values[i].length > MAX_VALUES) { - const pos = state[action.node._id][index].values[i].length - MAX_VALUES; - state[action.node._id][index].values[i].splice(0, pos); + state[action.node._id][index].values[i].push({ x: smp.timestamp, y: smp.values[i] }); + + // erase old values + if (state[action.node._id][index].values[i].length > MAX_VALUES) { + const pos = state[action.node._id][index].values[i].length - MAX_VALUES; + state[action.node._id][index].values[i].splice(0, pos); + } } - } - // update metadata - state[action.node._id][index].timestamp = action.data.timestamp; - state[action.node._id][index].sequence = action.data.sequence; + // update metadata + state[action.node._id][index].timestamp = smp.timestamp; + state[action.node._id][index].sequence = smp.sequence; + } // explicit call to prevent array copy this.__emitChange(); From 7af8c632b029419ec9b701aca4f8e80c98120cdc Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 20 Sep 2017 13:57:59 +0200 Subject: [PATCH 374/556] home screen is now a component instead of a container --- src/{containers => components}/home.js | 43 +++++++++++--------------- src/containers/app.js | 2 +- 2 files changed, 19 insertions(+), 26 deletions(-) rename src/{containers => components}/home.js (75%) diff --git a/src/containers/home.js b/src/components/home.js similarity index 75% rename from src/containers/home.js rename to src/components/home.js index c365f0f..82d4a1e 100644 --- a/src/containers/home.js +++ b/src/components/home.js @@ -19,39 +19,31 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, { Component } from 'react'; -import { Container } from 'flux/utils'; +import React from 'react'; -import AppDispatcher from '../app-dispatcher'; +import { Link } from 'react-router-dom'; -import NodeStore from '../stores/node-store'; -import SimulationStore from '../stores/simulation-store'; -import ProjectStore from '../stores/project-store'; +import RestAPI from '../api/rest-api'; import config from '../config'; -class Home extends Component { - static getStores() { - return [ NodeStore, SimulationStore, ProjectStore ]; +class Home extends React.Component { + constructor(props) { + super(props); + this.state = {}; } - static calculateState() { - return { - nodes: NodeStore.getState(), - projects: ProjectStore.getState(), - simulations: SimulationStore.getState(), - }; + getCounts(type) { + if (this.state.hasOwnProperty('counts')) + return this.state.counts[type]; + else + return '?'; } componentWillMount() { - AppDispatcher.dispatch({ - type: 'projects/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulations/start-load', - token: this.state.sessionToken + RestAPI.get('/api/v1/counts').then(response => { + this.setState({ counts: response }); + console.log(response); }); } @@ -65,7 +57,8 @@ class Home extends Component { VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}.

    - This instance is hosting {this.state.projects.length} projects consisting of {this.state.nodes.length} nodes and {this.state.simulations.length} simulations.
    + This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('nodes')} nodes, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulators')} 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.

    @@ -94,4 +87,4 @@ class Home extends Component { } } -export default Container.create(Home); +export default Home; diff --git a/src/containers/app.js b/src/containers/app.js index d4edcea..85a2b63 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -35,12 +35,12 @@ import UserStore from '../stores/user-store'; import DesignStore from '../stores/design-store'; import NotificationsDataManager from '../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 './home'; import Projects from './projects'; import Project from './project'; import Simulators from './simulators'; From 12d60786a4337d26d68b3c3805d18663efb3a4d5 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 20 Sep 2017 13:58:07 +0200 Subject: [PATCH 375/556] added editorconfig --- .editorconfig | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b41d3eb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +# Matches multiple files with brace expansion notation +# Set default charset +[*.js] +charset = utf-8 +indent_style = space +indent_size = 2 +trim_trailing_whitespace=true From b2e6af2ea2d2889c42ceeee10dc6e009066711b6 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 01:21:23 +0200 Subject: [PATCH 376/556] added new lamp widget (closes #126) --- .../dialog/edit-widget-control-creator.js | 1 + .../dialog/edit-widget-control-creator.js | 14 +++- src/components/widget-factory.js | 11 +++ src/components/widget-lamp.js | 74 +++++++++++++++++++ src/containers/visualization.js | 19 ++--- src/containers/widget.js | 5 +- 6 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 src/components/widget-lamp.js diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index f426ac8..91bea92 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -24,6 +24,7 @@ describe('edit widget control creator', () => { }); var runs = [ + { args: { widgetType: 'Lamp' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextControl, EditWidgetColorControl, EditWidgetColorControl] } }, { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 5b30a1e..c45f53b 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -52,7 +52,19 @@ export default function createControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} /> ); - break; + break; + case 'Lamp': + let lampBoundOnChange = (e) => { + handleChange([e, {target: {id: 'signal', value: 0}}]); + } + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => lampBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} 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: []}}]); diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index ac4bd70..7908e00 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -27,6 +27,17 @@ class WidgetFactory { // set type specific properties switch(type) { + case 'Lamp': + widget.simulator = defaultSimulator; + widget.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; + break; case 'Value': widget.simulator = defaultSimulator; widget.signal = 0; diff --git a/src/components/widget-lamp.js b/src/components/widget-lamp.js new file mode 100644 index 0000000..83d228c --- /dev/null +++ b/src/components/widget-lamp.js @@ -0,0 +1,74 @@ +/** + * File: widget-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 + * 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 './dialog/edit-widget-color-control'; + +class WidgetLamp extends Component { + constructor(props) { + super(props); + + this.state = { + value: '', + threshold: 0 + }; + } + + componentWillReceiveProps(nextProps) { + // update value + const simulator = nextProps.widget.simulator.simulator; + const node = nextProps.widget.simulator.node; + + if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].values == null) { + this.setState({ value: '' }); + return; + } + + // check if value has changed + const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; + if (signal != null && this.state.value !== signal[signal.length - 1].y) { + this.setState({ value: signal[signal.length - 1].y }); + } + } + + render() { + let colors = EditWidgetColorControl.ColorPalette; + let color; + + if (Number(this.state.value) > Number(this.props.widget.threshold)) + color = colors[this.props.widget.on_color]; + else + color = colors[this.props.widget.off_color]; + + let style = { + backgroundColor: color, + width: this.props.widget.width, + height: this.props.widget.height + } + + return ( +
    + ); + } +} + +export default WidgetLamp; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 8492737..ae5ef41 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -471,6 +471,7 @@ class Visualization extends React.Component {
    e.preventDefault() }> {this.state.editing &&
    + @@ -489,15 +490,15 @@ class Visualization extends React.Component { 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.visualization.grid} + this.widgetChange(w, k)} + onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} + editing={this.state.editing} + index={widget_key} + grid={this.state.visualization.grid} paused={this.state.paused} /> ))} diff --git a/src/containers/widget.js b/src/containers/widget.js index dc4e66c..4aae170 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -30,6 +30,7 @@ import UserStore from '../stores/user-store'; import SimulatorDataStore from '../stores/simulator-data-store'; import FileStore from '../stores/file-store'; +import WidgetLamp from '../components/widget-lamp'; import WidgetValue from '../components/widget-value'; import WidgetPlot from '../components/widget-plot'; import WidgetTable from '../components/widget-table'; @@ -162,7 +163,9 @@ class Widget extends React.Component { let element = null; // dummy is passed to widgets to keep updating them while in edit mode - if (widget.type === 'Value') { + if (widget.type === 'Lamp') { + element = + } else if (widget.type === 'Value') { element = } else if (widget.type === 'Plot') { element = From 0c598fa90b0fd28d92db9c2ca26859be1012e692 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 01:21:48 +0200 Subject: [PATCH 377/556] whitespace cleanups --- .../dialog/edit-widget-control-creator.js | 6 +++--- .../dialog/edit-widget-control-creator.js | 5 ++--- src/components/widget-factory.js | 4 ++-- src/containers/visualization.js | 2 +- src/containers/widget.js | 13 ++++++------- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 91bea92..2719185 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -41,10 +41,10 @@ describe('edit widget control creator', () => { let itMsg = run.args.widgetType + ' widget edit model should have correct controls'; it(itMsg, () => { let controls = createControls(run.args.widgetType, null, null, null, null, null, null); - + expect(controls).to.have.lengthOf(run.result.controlNumber); - + controls.forEach( (control) => expect(control.type).to.be.oneOf(run.result.controlTypes)) }); }); -}); \ No newline at end of file +}); diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index c45f53b..22fe5c6 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -86,7 +86,7 @@ export default function createControls(widgetType = null, widget = null, session dialogControls.push( validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> - ); + ); break; case 'Gauge': let gaugeBoundOnChange = (e) => { @@ -136,7 +136,6 @@ export default function createControls(widgetType = null, widget = null, session handleChange(e)} /> ); break; - case 'HTML': dialogControls.push( handleChange(e)} /> @@ -148,4 +147,4 @@ export default function createControls(widgetType = null, widget = null, session } return dialogControls; -} \ No newline at end of file +} diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 7908e00..0126b8f 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -143,7 +143,7 @@ class WidgetFactory { case 'HTML': widget.content = 'Hello World'; break; - + default: widget.width = 100; widget.height = 100; @@ -152,4 +152,4 @@ class WidgetFactory { } } -export default WidgetFactory; \ No newline at end of file +export default WidgetFactory; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index ae5ef41..48911aa 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -403,7 +403,7 @@ class Visualization extends React.Component { fullscreen: false }); } - + pauseData = () => { this.setState({ paused: true }); } diff --git a/src/containers/widget.js b/src/containers/widget.js index 4aae170..2242464 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -69,7 +69,6 @@ class Widget extends React.Component { sessionToken, simulatorData, files: FileStore.getState(), - sequence: prevState.sequence + 1 }; } else { @@ -77,7 +76,6 @@ class Widget extends React.Component { sessionToken, simulatorData, files: FileStore.getState(), - sequence: 0 }; } @@ -89,7 +87,7 @@ class Widget extends React.Component { // Reference to the context menu element this.contextMenuTriggerViaDraggable = null; } - + componentWillMount() { // If loading for the first time if (this.state.sessionToken) { @@ -101,7 +99,8 @@ class Widget extends React.Component { } snapToGrid(value) { - if (this.props.grid === 1) return value; + if (this.props.grid === 1) + return value; return Math.round(value / this.props.grid) * this.props.grid; } @@ -190,7 +189,7 @@ class Widget extends React.Component { } else if (widget.type === 'HTML') { element = } - + const widgetClasses = classNames({ 'widget': !this.props.editing, 'editing-widget': this.props.editing, @@ -211,7 +210,7 @@ class Widget extends React.Component { lockAspectRatio={Boolean(widget.lockAspect)} bounds={'parent'} className={ widgetClasses } - onResizeStart={(event, direction, ref) => this.borderWasClicked(event)} + 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)} @@ -225,7 +224,7 @@ class Widget extends React.Component { {element} - ); + ); } else { return (
    From 0d49fcdbaaa08838a1fcd01ba14f2fb3bd66d113 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 01:22:05 +0200 Subject: [PATCH 378/556] fix warning about nonexistent property of Link component --- src/components/home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/home.js b/src/components/home.js index 82d4a1e..6fae984 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -57,7 +57,7 @@ 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('nodes')} nodes, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulators')} simulations. + This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('nodes')} nodes, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulators')} simulations. A total of {this.getCounts('users')} users are registered.

    Credits

    From bcb6e3edcabfc3b81df0ef545073cbee40a80ed8 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 03:16:05 +0200 Subject: [PATCH 379/556] add support for keyboard control to visualizations (closes #124) --- src/containers/visualization.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 48911aa..fef662d 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -82,12 +82,18 @@ class Visualization extends React.Component { // TODO: Don't fetch token from local, use user-store! const token = localStorage.getItem('token'); + document.addEventListener('keydown', this.handleKeydown.bind(this)); + AppDispatcher.dispatch({ type: 'visualizations/start-load', token }); } + componentWillUnmount() { + document.removeEventListener('keydown', this.handleKeydown.bind(this)); + } + componentDidUpdate() { if (this.state.visualization._id !== this.props.match.params.visualization) { this.reloadVisualization(); @@ -120,6 +126,24 @@ class Visualization extends React.Component { } } + handleKeydown(e) { + console.log(e); + + switch (e.key) { + case ' ': + case 'p': + this.setState({ paused: !this.state.paused }); + break; + case 'e': + this.setState({ editing: !this.state.editing }); + break; + case 'f': + this.props.toggleFullscreen(); + break; + default: + } + } + getNewWidgetKey() { // Increase the counter and update the state return this.state.last_widget_key++; From 10f961662b42d96c46e3d5d5af112a1e8c56550a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 03:18:41 +0200 Subject: [PATCH 380/556] refactor visualization fullscreen mode --- package.json | 5 ++-- src/containers/app.js | 34 ++++++----------------- src/containers/visualization.js | 22 +++------------ src/stores/design-store.js | 48 --------------------------------- src/styles/app.css | 7 +++++ 5 files changed, 22 insertions(+), 94 deletions(-) delete mode 100644 src/stores/design-store.js diff --git a/package.json b/package.json index 844c1ac..a1088d2 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,14 @@ "react-dnd": "^2.2.4", "react-dnd-html5-backend": "^2.2.4", "react-dom": "^15.4.2", + "react-fullscreenable": "^2.4.3", "react-notification-system": "^0.2.13", "react-rnd": "^5.0.9", "react-router": "^4.1.2", "react-router-dom": "^4.1.2", + "react-scripts": "1.0.10", "react-sortable-tree": "^0.1.19", - "superagent": "^3.5.0", - "react-scripts": "1.0.10" + "superagent": "^3.5.0" }, "devDependencies": { "chai": "^4.1.0" diff --git a/src/containers/app.js b/src/containers/app.js index 85a2b63..9df9f57 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -26,13 +26,11 @@ 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 classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; import NodeStore from '../stores/node-store'; import UserStore from '../stores/user-store'; -import DesignStore from '../stores/design-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import Home from '../components/home'; @@ -53,7 +51,7 @@ import '../styles/app.css'; class App extends React.Component { static getStores() { - return [ NodeStore, UserStore, SimulationStore, DesignStore ]; + return [ NodeStore, UserStore, SimulationStore ]; } static calculateState(prevState) { @@ -66,7 +64,6 @@ class App extends React.Component { token: UserStore.getState().token, showSidebarMenu: false, - fullscreen: DesignStore.getState().fullscreen }; } @@ -113,15 +110,6 @@ class App extends React.Component { return (); } - const bodyClasses = classNames('app-body', { - 'app-body-spacing': !this.state.fullscreen - }); - - const contentClasses = classNames('app-content', { - 'app-content-margin-left': !this.state.fullscreen, - 'app-content-fullscreen': this.state.fullscreen - }); - return (
    @@ -131,18 +119,14 @@ class App extends React.Component {
    - {!this.state.fullscreen && -
    - } +
    -
    - {!this.state.fullscreen && - - - - } +
    + + + -
    +
    @@ -155,9 +139,7 @@ class App extends React.Component {
    - {!this.state.fullscreen && -
    - } +
    ); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index fef662d..e355a1e 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -23,7 +23,9 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button, Glyphicon } from 'react-bootstrap'; import { ContextMenu, MenuItem } from 'react-contextmenu'; +import Fullscreenable from 'react-fullscreenable'; import Slider from 'rc-slider'; +import classNames from 'classnames'; import WidgetFactory from '../components/widget-factory'; import ToolboxItem from '../components/toolbox-item'; @@ -37,7 +39,6 @@ import VisualizationStore from '../stores/visualization-store'; import ProjectStore from '../stores/project-store'; import SimulationStore from '../stores/simulation-store'; import FileStore from '../stores/file-store'; -import DesignStore from '../stores/design-store'; import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; @@ -46,7 +47,7 @@ import '../styles/context-menu.css'; class Visualization extends React.Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore, DesignStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; } static calculateState(prevState) { @@ -60,7 +61,6 @@ class Visualization extends React.Component { projects: ProjectStore.getState(), simulations: SimulationStore.getState(), files: FileStore.getState(), - fullscreen: DesignStore.getState().fullscreen, visualization: prevState.visualization || {}, project: prevState.project || null, @@ -414,20 +414,6 @@ class Visualization extends React.Component { this.setState({ visualization }); } - setFullscreen = () => { - AppDispatcher.dispatch({ - type: 'design/fullscreen', - fullscreen: true - }); - } - - unsetFullscreen = () => { - AppDispatcher.dispatch({ - type: 'design/fullscreen', - fullscreen: false - }); - } - pauseData = () => { this.setState({ paused: true }); } @@ -553,4 +539,4 @@ class Visualization extends React.Component { } } -export default Container.create(Visualization); +export default Fullscreenable()(Container.create(Visualization)); diff --git a/src/stores/design-store.js b/src/stores/design-store.js deleted file mode 100644 index 25e1c74..0000000 --- a/src/stores/design-store.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * File: design-store.js - * Author: Markus Grigull - * Date: 18.08.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 { ReduceStore } from 'flux/utils'; - -import AppDispatcher from '../app-dispatcher'; - -class DesignStore extends ReduceStore { - constructor() { - super(AppDispatcher); - } - - getInitialState() { - return { - fullscreen: false - }; - } - - reduce(state, action) { - switch(action.type) { - case 'design/fullscreen': - return Object.assign({}, state, { fullscreen: action.fullscreen }); - - default: - return state; - } - } -} - -export default new DesignStore(); diff --git a/src/styles/app.css b/src/styles/app.css index 17e08e5..2e9675d 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -216,6 +216,13 @@ body { margin: 20px; } +/** + * Visualizations + */ +.fullscreen-padding { + padding: 10px; +} + /** * Login form From 04c6d04b6dee84ee31f72a6501212d10a78023fd Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 03:19:16 +0200 Subject: [PATCH 381/556] visualizations: move all buttons to the right side --- src/containers/visualization.js | 82 +++++++++++++++------------------ 1 file changed, 38 insertions(+), 44 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e355a1e..60f85f4 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -425,56 +425,46 @@ class Visualization extends React.Component { render() { const current_widgets = this.state.visualization.widgets; + let boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); + + let buttons = [] + let editingControls = []; + + if (this.state.editing) { + editingControls.push( +
    + Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} + this.setGrid(value)} /> +
    + ) + + buttons.push({ click: () => this.stopEditing(), glyph: 'floppy-disk', text: 'Save' }); + buttons.push({ click: () => this.discardChanges(), glyph: 'remove', text: 'Cancel' }); + } + + if (!this.props.isFullscreen) { + buttons.push({ click: this.props.toggleFullscreen, glyph: 'resize-full', text: 'Fullscreen' }); + buttons.push({ click: this.state.paused ? this.unpauseData : this.pauseData, glyph: this.state.paused ? 'play' : 'pause', text: this.state.paused ? 'Live' : 'Pause' }); + + if (!this.state.editing) + buttons.push({ click: () => this.setState({ editing: true }), glyph: 'pencil', text: 'Edit' }); + } + + const buttonList = buttons.map((btn, idx) => + + ); + return ( -
    +
    - - {this.state.visualization.name} - + {this.state.visualization.name}
    - {this.state.editing ? ( -
    -
    - - -
    -
    - ) : ( -
    - {this.state.fullscreen === false ? ( - - - - - ) : ( - - )} -
    - )}
    - {this.state.editing ? ( -
    - Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} - - this.setGrid(value)} /> -
    - ) : (this.state.paused ? ( - - ): ( - - ))} + { buttonList }
    @@ -494,6 +484,10 @@ class Visualization extends React.Component { + +
    + { editingControls } +
    } From 8ff36447c8e7a9baaaeeecbf4de648625e728a1d Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 21 Sep 2017 03:34:39 +0200 Subject: [PATCH 382/556] update grid dimensions if dropzone is resized (closes #92) --- src/containers/visualization.js | 2 +- src/styles/app.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 60f85f4..8f6a800 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -257,7 +257,7 @@ class Visualization extends React.Component { this.setState({ maxWidgetHeight: maxHeight, - dropZoneHeight: maxHeight + 40 + dropZoneHeight: maxHeight + 80 }); } /* diff --git a/src/styles/app.css b/src/styles/app.css index 2e9675d..16f8a65 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -283,6 +283,7 @@ body { width: 100%; min-height: 400px; + display: flex; position: relative; } From 884f59369a7b13d9b32de9f9abc270e9ad26ed36 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 22 Sep 2017 11:00:04 +0200 Subject: [PATCH 383/556] Add proper min-max scaling to plots and gauges --- src/components/home.js | 1 - src/components/widget-gauge.js | 30 +++++++--- src/components/widget-plot/plot.js | 59 +++++++++++++++---- src/containers/visualization.js | 2 - .../simulator-data-data-manager.js | 20 +++---- 5 files changed, 81 insertions(+), 31 deletions(-) diff --git a/src/components/home.js b/src/components/home.js index 6fae984..95b20b3 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -43,7 +43,6 @@ class Home extends React.Component { componentWillMount() { RestAPI.get('/api/v1/counts').then(response => { this.setState({ counts: response }); - console.log(response); }); } diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 9a5cc4b..9493c6b 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -19,19 +19,19 @@ class WidgetGauge extends Component { this.state = { value: 0, - minValue: 0, - maxValue: 1 + minValue: null, + maxValue: null }; } 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); } componentWillReceiveProps(nextProps) { @@ -52,7 +52,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 (signal != null) { - const value = Math.round( signal[signal.length - 1].y * 1e3 ) / 1e3; + const value = Math.round(signal[signal.length - 1].y * 1e3) / 1e3; if (this.state.value !== value && value != null) { this.setState({ value }); @@ -61,6 +61,22 @@ class WidgetGauge extends Component { let minValue = this.state.minValue; let maxValue = this.state.maxValue; + if (minValue == null) { + minValue = value - 0.5; + updateLabels = true; + + this.setState({ minValue }); + this.gauge.setMinValue(minValue); + } + + if (maxValue == null) { + maxValue = value + 0.5; + updateLabels = true; + + this.setState({ maxValue }); + this.gauge.maxValue = maxValue; + } + if (nextProps.widget.valueUseMinMax) { if (this.state.minValue > nextProps.widget.valueMin) { minValue = nextProps.widget.valueMin; diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 2f574ab..4caf4c2 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -24,7 +24,13 @@ class Plot extends React.Component { // create dummy axes const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([leftMargin, props.width]); - const yScale = scaleLinear().domain([0, 10]).range([props.height, bottomMargin]); + let yScale; + + if (props.yUseMinMax) { + yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height, bottomMargin]); + } else { + yScale = scaleLinear().domain([0, 10]).range([props.height, bottomMargin]); + } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); @@ -38,19 +44,29 @@ class Plot extends React.Component { } componentDidMount() { - this.interval = setInterval(this.tick, 50); + this.createInterval(); } componentWillUnmount() { - clearInterval(this.interval); + this.removeInterval(); } componentWillReceiveProps(nextProps) { - // check if data is valid + if (nextProps.time !== this.props.time) { + this.createInterval(); + } + + // check if data is invalid if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { // create empty plot axes const xScale = scaleTime().domain([Date.now() - 5 * nextProps.time * 1000, Date.now()]).range([leftMargin, nextProps.width]); - const yScale = scaleLinear().domain([0, 10]).range([nextProps.height, bottomMargin]); + let yScale; + + if (nextProps.yUseMinMax) { + yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height, bottomMargin]); + } else { + yScale = scaleLinear().domain([0, 10]).range([nextProps.height, bottomMargin]); + } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); @@ -72,25 +88,46 @@ class Plot extends React.Component { this.setState({ data }); } + createInterval() { + this.removeInterval(); + + if (this.props.time < 30) { + this.interval = setInterval(this.tick, 50); + } else if (this.props.time < 120) { + this.interval = setInterval(this.tick, 100); + } else if (this.props.time < 300) { + this.interval = setInterval(this.tick, 200); + } else { + this.interval = setInterval(this.tick, 1000); + } + } + + removeInterval() { + if (this.interval != null) { + clearInterval(this.interval); + + this.interval = null; + } + } + tick = () => { if (this.state.data == null || this.props.paused === true) { return; } // calculate yRange - let yRange; + let yRange = [0, 0]; if (this.props.yUseMinMax) { yRange = [this.props.yMin, this.props.yMax]; - } else { - yRange = [0, 0]; + } else if (this.props.data.length > 0) { + yRange = [this.props.data[0][0].y, this.props.data[0][0].y]; - this.props.data.map(values => { + this.props.data.forEach(values => { const range = extent(values, p => p.y); + if (range[0] < yRange[0]) yRange[0] = range[0]; if (range[1] > yRange[1]) yRange[1] = range[1]; - - return values; }); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 8f6a800..52c2443 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -127,8 +127,6 @@ class Visualization extends React.Component { } handleKeydown(e) { - console.log(e); - switch (e.key) { case ' ': case 'p': diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index c81979d..f74462d 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -93,13 +93,13 @@ class SimulatorDataDataManager { return null; } - let OFFSET_TYPE = 2; - let OFFSET_VERSION = 4; + const OFFSET_TYPE = 2; + const OFFSET_VERSION = 4; - var id = data.getUint8(1); - var bits = data.getUint8(0); - var length = data.getUint16(0x02, 1); - var bytes = length * 4 + 16; + const id = data.getUint8(1); + const bits = data.getUint8(0); + const length = data.getUint16(0x02, 1); + const bytes = length * 4 + 16; return { version: (bits >> OFFSET_VERSION) & 0xF, @@ -108,19 +108,19 @@ class SimulatorDataDataManager { sequence: data.getUint32(0x04, 1), timestamp: data.getUint32(0x08, 1) * 1e3 + data.getUint32(0x0C, 1) * 1e-6, values: new Float32Array(data.buffer, data.byteOffset + 0x10, length), - blob: new DataView( data.buffer, data.byteOffset + 0x00, bytes), + blob: new DataView(data.buffer, data.byteOffset + 0x00, bytes), id: id }; } bufferToMessageArray(blob) { /* some local variables for parsing */ - var offset = 0; - var msgs = []; + let offset = 0; + const msgs = []; /* for every msg in vector */ while (offset < blob.byteLength) { - var msg = this.bufferToMessage(new DataView(blob, offset)); + const msg = this.bufferToMessage(new DataView(blob, offset)); if (msg !== undefined) { msgs.push(msg); From 94003207f3bd8e4d4e7b0718e2359eb344887325 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 24 Sep 2017 15:48:13 +0200 Subject: [PATCH 384/556] Add relative endpoint for nodes --- src/api/websocket-api.js | 12 ++++++++---- src/components/dialog/edit-node.js | 14 +++++++++++--- src/components/dialog/import-node.js | 18 +++++++++++++----- src/components/dialog/new-node.js | 16 ++++++++++++---- src/data-managers/nodes-data-manager.js | 10 +++++++++- .../simulator-data-data-manager.js | 8 ++++---- 6 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index ff866e2..00d2f60 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -20,9 +20,9 @@ ******************************************************************************/ class WebsocketAPI { - addSocket(endpoint, callbacks) { + addSocket(node, callbacks) { // create web socket client - var socket = new WebSocket(this.getURL(endpoint), 'live'); + const socket = new WebSocket(this.getURL(node), 'live'); socket.binaryType = 'arraybuffer'; // register callbacks @@ -34,8 +34,12 @@ class WebsocketAPI { return socket; } - getURL(endpoint) { - return 'ws://' + endpoint; + getURL(node) { + if (node.relativeEndpoint) { + return 'ws://' + window.location.host + '/' + node.endpoint; + } else { + return 'ws://' + node.endpoint; + } } } diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js index c782354..19b2f8e 100644 --- a/src/components/dialog/edit-node.js +++ b/src/components/dialog/edit-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; import Dialog from './dialog'; @@ -35,6 +35,7 @@ class NewNodeDialog extends React.Component { endpoint: '', config: {}, simulators: [], + relativeEndpoint: false, _id: '' }; } @@ -50,11 +51,15 @@ class NewNodeDialog extends React.Component { } handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); + if (e.target.type === 'checkbox') { + this.setState({ [e.target.id]: e.target.checked }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id }); + this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id, relativeEndpoint: this.props.node.relativeEndpoint }); } validateForm(target) { @@ -91,6 +96,9 @@ class NewNodeDialog extends React.Component { this.handleChange(e)} /> + + this.handleChange(e)}>Relative Endpoint +
    ); diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js index e1128df..1f35129 100644 --- a/src/components/dialog/import-node.js +++ b/src/components/dialog/import-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,7 +34,8 @@ class ImportNodeDialog extends React.Component { this.state = { name: '', endpoint: '', - simulators: [] + simulators: [], + relativeEndpoint: false }; } @@ -47,11 +48,15 @@ class ImportNodeDialog extends React.Component { } handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); + if (e.target.type === 'checkbox') { + this.setState({ [e.target.id]: e.target.checked }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: '', endpoint: '' }); + this.setState({ name: '', endpoint: '', relativeEndpoint: false }); this.imported = false; } @@ -71,7 +76,7 @@ class ImportNodeDialog extends React.Component { // read simulator const node = JSON.parse(event.target.result); self.imported = true; - self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators }); + self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators, relativeEndpoint: node.relativeEndpoint }); }; reader.readAsText(file); @@ -116,6 +121,9 @@ class ImportNodeDialog extends React.Component { this.handleChange(e)} />
    + + this.handleChange(e)}>Relative Endpoint +
    ); diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index e7ec1c9..b0b4357 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,7 +34,8 @@ class NewNodeDialog extends React.Component { name: '', endpoint: '', config: {}, - simulators: [] + simulators: [], + relativeEndpoint: false }; } @@ -49,11 +50,15 @@ class NewNodeDialog extends React.Component { } handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); + if (e.target.type === 'checkbox') { + this.setState({ [e.target.id]: e.target.checked }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: '', endpoint: '', config: {}, simulators: [] }); + this.setState({ name: '', endpoint: '', config: {}, simulators: [], relativeEndpoint: false }); } validateForm(target) { @@ -90,6 +95,9 @@ class NewNodeDialog extends React.Component { this.handleChange(e)} /> + + this.handleChange(e)}>Relative Endpoint +
    ); diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index 9b368ac..0a02419 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -28,8 +28,16 @@ class NodesDataManager extends RestDataManager { super('node', '/nodes'); } + getURL(node) { + if (node.relativeEndpoint) { + return 'http://' + window.location.host + '/' + node.endpoint + '/api/v1'; + } else { + return 'http://' + node.endpoint + '/api/v1'; + } + } + getSimulators(node) { - RestAPI.post('http://' + node.endpoint + '/api/v1', { + RestAPI.post(this.getURL(node), { action: 'nodes', id: node._id }).then(response => { diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index f74462d..2f88c02 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -30,18 +30,18 @@ class SimulatorDataDataManager { open(endpoint, node) { // pass signals to onOpen callback if (this._sockets[node._id] != null) { - if (this._sockets[node._id].url !== WebsocketAPI.getURL(endpoint)) { + if (this._sockets[node._id].url !== WebsocketAPI.getURL(node)) { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } else { // set flag if a socket to this simulator was already create before if (this._sockets[node._id] === null) { - this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } else { - this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } } From fe2de0f524deef7d2f3e35398a978df120af3090 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 24 Sep 2017 19:01:42 +0200 Subject: [PATCH 385/556] Fix widgets simulation models Fix plot widget time axis Fix visualization component key warning --- src/components/widget-plot-table.js | 1 - src/components/widget-plot/plot.js | 3 ++- src/components/widget-table.js | 10 ++++++---- src/containers/visualization.js | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index ce5392d..0ff3082 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -44,7 +44,6 @@ class WidgetPlotTable extends Component { // Identify if there was a change in the preselected signals if (nextProps.simulation && (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.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); diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 4caf4c2..c7bff16 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -59,7 +59,7 @@ class Plot extends React.Component { // check if data is invalid if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { // create empty plot axes - const xScale = scaleTime().domain([Date.now() - 5 * nextProps.time * 1000, Date.now()]).range([leftMargin, nextProps.width]); + const xScale = scaleTime().domain([Date.now() - nextProps.time * 1000, Date.now()]).range([leftMargin, nextProps.width]); let yScale; if (nextProps.yUseMinMax) { @@ -112,6 +112,7 @@ class Plot extends React.Component { tick = () => { if (this.state.data == null || this.props.paused === true) { + this.setState({ lines: null }); return; } diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 56389e9..e72bca7 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -62,10 +62,12 @@ class WidgetTable extends Component { var rows = []; nextProps.data[simulator.node][simulator.simulator].values.forEach((signal, index) => { - rows.push({ - name: simulationModel.mapping[index].name, - value: signal[signal.length - 1].y.toFixed(3) - }) + if (index < simulationModel.mapping.length) { + rows.push({ + name: simulationModel.mapping[index].name, + value: signal[signal.length - 1].y.toFixed(3) + }); + } }); this.setState({ rows: rows, sequence: nextProps.data[simulator.node][simulator.simulator].sequence }); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 52c2443..3af78e1 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -430,7 +430,7 @@ class Visualization extends React.Component { if (this.state.editing) { editingControls.push( -
    +
    Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} this.setGrid(value)} />
    From 85eead776c3b8c3a40359fc7c2563038d40b22af Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 24 Sep 2017 21:04:00 +0200 Subject: [PATCH 386/556] Fix mapping out of bound errors --- src/components/widget-gauge.js | 2 +- src/components/widget-value.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 9493c6b..5fc4153 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -180,7 +180,7 @@ class WidgetGauge extends Component { if (this.props.simulation) { const simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; - signalType = (simulationModel != null && simulationModel.length > 0) ? simulationModel.mapping[this.props.widget.signal].type : ''; + signalType = (simulationModel != null && simulationModel.length > 0 && this.props.widget.signal < simulationModel.length) ? simulationModel.mapping[this.props.widget.signal].type : ''; } return ( diff --git a/src/components/widget-value.js b/src/components/widget-value.js index 1f5e6b4..4744d22 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -46,7 +46,10 @@ class WidgetValue extends Component { if (nextProps.simulation) { const simulationModel = nextProps.simulation.models.find(model => model.simulator.node === node && model.simulator.simulator === simulator); - unit = simulationModel.mapping[nextProps.widget.signal].type; + + if (nextProps.widget.signal < simulationModel.mapping.length) { + unit = simulationModel.mapping[nextProps.widget.signal].type; + } } // check if value has changed From 669108948a287e597f3abaedbd108dbea2d2408f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 25 Sep 2017 12:27:25 +0200 Subject: [PATCH 387/556] Fix y-axis label --- src/components/widget-plot-table.js | 1 + src/components/widget-plot.js | 1 + src/components/widget-plot/plot.js | 2 ++ src/containers/visualization.js | 8 ++++---- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 0ff3082..65ce77d 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -158,6 +158,7 @@ class WidgetPlotTable extends Component { yMax={this.props.widget.yMax} yUseMinMax={this.props.widget.yUseMinMax} paused={this.props.paused} + yLabel={this.props.widget.ylabel} />
    diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 9b7c006..cccbca1 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -74,6 +74,7 @@ class WidgetPlot extends React.Component { yMax={this.props.widget.yMax} yUseMinMax={this.props.widget.yUseMinMax} paused={this.props.paused} + yLabel={this.props.widget.ylabel} />
    diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index c7bff16..6043726 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -152,6 +152,8 @@ class Plot extends React.Component { return select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> + + {this.props.yLabel} diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 3af78e1..cf8d09f 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -82,7 +82,7 @@ class Visualization extends React.Component { // TODO: Don't fetch token from local, use user-store! const token = localStorage.getItem('token'); - document.addEventListener('keydown', this.handleKeydown.bind(this)); + //document.addEventListener('keydown', this.handleKeydown.bind(this)); AppDispatcher.dispatch({ type: 'visualizations/start-load', @@ -91,7 +91,7 @@ class Visualization extends React.Component { } componentWillUnmount() { - document.removeEventListener('keydown', this.handleKeydown.bind(this)); + //document.removeEventListener('keydown', this.handleKeydown.bind(this)); } componentDidUpdate() { @@ -126,7 +126,7 @@ class Visualization extends React.Component { } } - handleKeydown(e) { + /*handleKeydown(e) { switch (e.key) { case ' ': case 'p': @@ -140,7 +140,7 @@ class Visualization extends React.Component { break; default: } - } + }*/ getNewWidgetKey() { // Increase the counter and update the state From 30284bf6b141fdb4dfc68720c1c2c033ae96ffc4 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 25 Sep 2017 13:11:19 +0200 Subject: [PATCH 388/556] Improve plot legend and y-label --- src/components/widget-plot.js | 2 +- src/components/widget-plot/plot-legend.js | 2 +- src/components/widget-plot/plot.js | 21 ++++++++++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index cccbca1..ef1d04c 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -50,7 +50,7 @@ class WidgetPlot extends React.Component { // Query the signals that will be displayed in the legend const legend = model.mapping.reduce( (accum, model_signal, signal_index) => { if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: model_signal.name }); + accum.push({ index: signal_index, name: model_signal.name, type: model_signal.type }); } return accum; diff --git a/src/components/widget-plot/plot-legend.js b/src/components/widget-plot/plot-legend.js index fcaeae0..9c8ad71 100644 --- a/src/components/widget-plot/plot-legend.js +++ b/src/components/widget-plot/plot-legend.js @@ -17,7 +17,7 @@ class PlotLegend extends React.Component { return
    {this.props.signals.map(signal =>
    -   {signal.name} +   {signal.name} [{signal.type}]
    )}
    ; diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 6043726..16ef357 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -149,15 +149,26 @@ class Plot extends React.Component { } render() { - return - select(node).call(this.state.xAxis)} style={{ transform: `translateY(${this.props.height}px)` }} /> - select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin}px)`}} /> + const yLabelPos = { + x: 12, + y: this.props.height / 2 + } + + let labelMargin = 0; + + if (this.props.yLabel !== "") { + labelMargin = 20; + } + + return + select(node).call(this.state.xAxis)} style={{ transform: `translateX(${labelMargin}px) translateY(${this.props.height}px)` }} /> + select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin + labelMargin}px)`}} /> - {this.props.yLabel} + {this.props.yLabel} - + From 5aba1072e49725d75dc372307e1f1f5f337bf527 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 25 Sep 2017 15:45:03 +0200 Subject: [PATCH 389/556] Move plot legend to top --- src/components/widget-plot-table.js | 9 ++++++--- src/components/widget-plot.js | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 65ce77d..3d32284 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -79,7 +79,8 @@ class WidgetPlotTable extends Component { accum.push( { index: signal_index, - name: model_signal.name + name: model_signal.name, + type: model_signal.type } ) } @@ -129,7 +130,8 @@ class WidgetPlotTable extends Component { if (this.state.signals.includes(signal.index)) { accum.push({ index: signal.index, - name: signal.name + name: signal.name, + type: signal.type }); } return accum; @@ -138,6 +140,8 @@ class WidgetPlotTable extends Component { return (
    + +
    { checkBoxes.length > 0 ? ( @@ -162,7 +166,6 @@ class WidgetPlotTable extends Component { />
    -
    ); diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index ef1d04c..4aaad39 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -64,6 +64,8 @@ class WidgetPlot extends React.Component { render() { return
    + +
    - -
    ; } } From b393d8e2e019826d5f47e56ea1381dc187101978 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 25 Sep 2017 16:12:07 +0200 Subject: [PATCH 390/556] Fix plot scaling --- src/components/widget-plot/plot.js | 49 +++++++++++++++++------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 16ef357..c79843c 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -17,19 +17,25 @@ import { timeFormat } from 'd3-time-format'; const leftMargin = 30; const bottomMargin = 20; +const rightMargin = 10; class Plot extends React.Component { constructor(props) { super(props); // create dummy axes - const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([leftMargin, props.width]); + let labelMargin = 0; + if (props.yLabel !== '') { + labelMargin = 20; + } + + const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([0, props.width - leftMargin - labelMargin - rightMargin]); let yScale; if (props.yUseMinMax) { - yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height, bottomMargin]); + yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height, 0]); } else { - yScale = scaleLinear().domain([0, 10]).range([props.height, bottomMargin]); + yScale = scaleLinear().domain([0, 10]).range([props.height, 0]); } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); @@ -39,7 +45,8 @@ class Plot extends React.Component { data: null, lines: null, xAxis, - yAxis + yAxis, + labelMargin }; } @@ -56,22 +63,27 @@ class Plot extends React.Component { this.createInterval(); } + let labelMargin = 0; + if (nextProps.yLabel !== '') { + labelMargin = 20; + } + // check if data is invalid if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { // create empty plot axes - const xScale = scaleTime().domain([Date.now() - nextProps.time * 1000, Date.now()]).range([leftMargin, nextProps.width]); + const xScale = scaleTime().domain([Date.now() - nextProps.time * 1000, Date.now()]).range([0, nextProps.width - leftMargin - labelMargin - rightMargin]); let yScale; if (nextProps.yUseMinMax) { - yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height, bottomMargin]); + yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height, 0]); } else { - yScale = scaleLinear().domain([0, 10]).range([nextProps.height, bottomMargin]); + yScale = scaleLinear().domain([0, 10]).range([nextProps.height, 0]); } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); - this.setState({ data: null, xAxis, yAxis }); + this.setState({ data: null, xAxis, yAxis, labelMargin }); return; } @@ -85,7 +97,7 @@ class Plot extends React.Component { data = data.map(values => values.slice(index)); } - this.setState({ data }); + this.setState({ data, labelMargin }); } createInterval() { @@ -133,8 +145,8 @@ class Plot extends React.Component { } // create scale functions for both axes - const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([leftMargin, this.props.width]); - const yScale = scaleLinear().domain(yRange).range([this.props.height, bottomMargin]); + const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([0, this.props.width - leftMargin - this.state.labelMargin - rightMargin]); + const yScale = scaleLinear().domain(yRange).range([this.props.height - bottomMargin, 0]); const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); @@ -154,21 +166,16 @@ class Plot extends React.Component { y: this.props.height / 2 } - let labelMargin = 0; - - if (this.props.yLabel !== "") { - labelMargin = 20; - } - - return - select(node).call(this.state.xAxis)} style={{ transform: `translateX(${labelMargin}px) translateY(${this.props.height}px)` }} /> - select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin + labelMargin}px)`}} /> + return + select(node).call(this.state.xAxis)} style={{ transform: `translateX(${leftMargin + this.state.labelMargin}px) translateY(${this.props.height - bottomMargin}px)` }} /> + select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin + this.state.labelMargin}px)`}} /> {this.props.yLabel} + Time [s] - + From 0b0f848b57624c40a55cbdf9d969bd1785dcab4b Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Mon, 25 Sep 2017 17:15:36 +0200 Subject: [PATCH 391/556] Fix plot clip zones --- src/components/widget-plot/plot.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index c79843c..702940d 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -19,6 +19,8 @@ const leftMargin = 30; const bottomMargin = 20; const rightMargin = 10; +let uniqueIdentifier = 0; + class Plot extends React.Component { constructor(props) { super(props); @@ -33,9 +35,9 @@ class Plot extends React.Component { let yScale; if (props.yUseMinMax) { - yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height, 0]); + yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height - bottomMargin, 0]); } else { - yScale = scaleLinear().domain([0, 10]).range([props.height, 0]); + yScale = scaleLinear().domain([0, 10]).range([props.height - bottomMargin, 0]); } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); @@ -46,7 +48,8 @@ class Plot extends React.Component { lines: null, xAxis, yAxis, - labelMargin + labelMargin, + identifier: uniqueIdentifier++ }; } @@ -75,9 +78,9 @@ class Plot extends React.Component { let yScale; if (nextProps.yUseMinMax) { - yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height, 0]); + yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height - bottomMargin, 0]); } else { - yScale = scaleLinear().domain([0, 10]).range([nextProps.height, 0]); + yScale = scaleLinear().domain([0, 10]).range([nextProps.height - bottomMargin, 0]); } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); @@ -174,12 +177,12 @@ class Plot extends React.Component { Time [s] - + - + {this.state.lines} ; From 4311bf76082d496bae42b370cd5d060c88f9240c Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 Jan 2018 13:43:45 +0100 Subject: [PATCH 392/556] basic topology rendering widget using pintura and static dependencies --- public/Pintura/css/colours.css | 61 + public/Pintura/css/svg.css | 84 + public/Pintura/images/Pintura_logo.svg | 1225 +++++++++++ public/Pintura/images/brea.svg | 24 + public/Pintura/images/conn.svg | 21 + public/Pintura/images/cons.svg | 22 + public/Pintura/images/net.svg | 27 + public/Pintura/images/sol.svg | 32 + public/Pintura/images/sync.svg | 22 + public/Pintura/images/term.svg | 21 + public/Pintura/images/topo.svg | 22 + public/Pintura/images/trans.svg | 22 + public/Pintura/js/cimjson.js | 197 ++ public/Pintura/js/cimsvg.js | 140 ++ public/Pintura/js/cimview.js | 208 ++ public/Pintura/js/cimxml.js | 253 +++ public/Pintura/js/handlebars.runtime.js | 1468 +++++++++++++ public/Pintura/templates/template.js | 2521 +++++++++++++++++++++++ public/index.html | 7 + src/components/widget-topology.js | 84 + src/containers/visualization.js | 1 + src/containers/widget.js | 3 + 22 files changed, 6465 insertions(+) create mode 100644 public/Pintura/css/colours.css create mode 100644 public/Pintura/css/svg.css create mode 100644 public/Pintura/images/Pintura_logo.svg create mode 100644 public/Pintura/images/brea.svg create mode 100644 public/Pintura/images/conn.svg create mode 100644 public/Pintura/images/cons.svg create mode 100644 public/Pintura/images/net.svg create mode 100644 public/Pintura/images/sol.svg create mode 100644 public/Pintura/images/sync.svg create mode 100644 public/Pintura/images/term.svg create mode 100644 public/Pintura/images/topo.svg create mode 100644 public/Pintura/images/trans.svg create mode 100644 public/Pintura/js/cimjson.js create mode 100644 public/Pintura/js/cimsvg.js create mode 100644 public/Pintura/js/cimview.js create mode 100644 public/Pintura/js/cimxml.js create mode 100644 public/Pintura/js/handlebars.runtime.js create mode 100644 public/Pintura/templates/template.js create mode 100644 src/components/widget-topology.js diff --git a/public/Pintura/css/colours.css b/public/Pintura/css/colours.css new file mode 100644 index 0000000..0911a35 --- /dev/null +++ b/public/Pintura/css/colours.css @@ -0,0 +1,61 @@ +#menu { + color:#fff!important; + background-color:#000!important +} +.dark-grey-background { + color:black; + background:#aaa; +} +.light-grey-background { + color:black; + background:#ddd; +} +.blue-grey-background { + color:white; + background:#607d8b; +} +.floating-panel-item { + font-size:12px; +} +#floating-panel-list-div { + background:#aaa; +} +.floating-panel-list { + background:grey; + border:none; +} +.w3-ul li { + border-bottom:0px; +} +#sidebar { + background:#607d8b; + border-right:thick solid white; +} +.component-type-name { + color:black; + font-size:12px; +} +.floating-panel-name { + font-size:12px; +} +.dark-font { + color:black; +} +.dropdown-menu { + border:medium solid black; + background:#607d8b; + border:medium solid black; + border-width: 1px 1px 1px 1px; +} +.dropdown-menu h4 { + color:white; +} +.dropdown-menu a { + color: black; + background:#ddd; + font-size:14px; +} +.dropdown-menu a:hover { + background:#bbb; + color: white; +} diff --git a/public/Pintura/css/svg.css b/public/Pintura/css/svg.css new file mode 100644 index 0000000..2fcb5e9 --- /dev/null +++ b/public/Pintura/css/svg.css @@ -0,0 +1,84 @@ +.bar { + stroke: #000; + stroke-width: 3px; +} + +.highlighted-node:hover { + stroke: #ff0; +} + +line { + stroke: #000; + stroke-width: 1px; +} + +.line { + stroke: #000; + stroke-width: 2px; +} +.terminal-connnode { + stroke: #000; + stroke-width: 1px; +} +.terminal-toponode { + stroke: #000; + stroke-width: 1px; +} +.conduct { + stroke: #000; + stroke-width: 1px; +} +.unknown { + stroke: #f0f; + stroke-width: 1px; + height: 20px; + width: 20px; +} +.acline { + stroke: #000; + stroke-width: 2px; +} +#backing { + fill: whitesmoke; +} + +/* Below here are SVG elements that we don't want the user to interact with + therefore we disable pointer events */ + +.svglabel { + visibility: hidden; + pointer-events: none; + -webkit-user-select: none; /* Chrome all / Safari all */ + -moz-user-select: none; /* Firefox all */ + -ms-user-select: none; /* IE 10+ */ +} +.svglabel-high { + visibility: visible; + font-size: 12px; + font-family: "sans-serif"; + text-anchor: right; + fill: black; + stroke-width: 1px; + pointer-events: none; + -webkit-user-select: none; /* Chrome all / Safari all */ + -moz-user-select: none; /* Firefox all */ + -ms-user-select: none; /* IE 10+ */ +} +.gridLine { + stroke: #aaa; + stroke-width: 1px; + pointer-events: none; + -webkit-user-select: none; /* Chrome all / Safari all */ + -moz-user-select: none; /* Firefox all */ + -ms-user-select: none; /* IE 10+ */ +} +.gridLabel { + font-size: 8px; + font-family: "sans-serif"; + fill: grey; + stroke-width: 0px; + pointer-events: none; + -webkit-user-select: none; /* Chrome all / Safari all */ + -moz-user-select: none; /* Firefox all */ + -ms-user-select: none; /* IE 10+ */ +} diff --git a/public/Pintura/images/Pintura_logo.svg b/public/Pintura/images/Pintura_logo.svg new file mode 100644 index 0000000..3230dd5 --- /dev/null +++ b/public/Pintura/images/Pintura_logo.svg @@ -0,0 +1,1225 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/Pintura/images/brea.svg b/public/Pintura/images/brea.svg new file mode 100644 index 0000000..0361327 --- /dev/null +++ b/public/Pintura/images/brea.svg @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/public/Pintura/images/conn.svg b/public/Pintura/images/conn.svg new file mode 100644 index 0000000..cce4240 --- /dev/null +++ b/public/Pintura/images/conn.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/public/Pintura/images/cons.svg b/public/Pintura/images/cons.svg new file mode 100644 index 0000000..47b333d --- /dev/null +++ b/public/Pintura/images/cons.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/public/Pintura/images/net.svg b/public/Pintura/images/net.svg new file mode 100644 index 0000000..494831c --- /dev/null +++ b/public/Pintura/images/net.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/public/Pintura/images/sol.svg b/public/Pintura/images/sol.svg new file mode 100644 index 0000000..f738402 --- /dev/null +++ b/public/Pintura/images/sol.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/public/Pintura/images/sync.svg b/public/Pintura/images/sync.svg new file mode 100644 index 0000000..717aa31 --- /dev/null +++ b/public/Pintura/images/sync.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/public/Pintura/images/term.svg b/public/Pintura/images/term.svg new file mode 100644 index 0000000..d67173e --- /dev/null +++ b/public/Pintura/images/term.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/public/Pintura/images/topo.svg b/public/Pintura/images/topo.svg new file mode 100644 index 0000000..643c352 --- /dev/null +++ b/public/Pintura/images/topo.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/public/Pintura/images/trans.svg b/public/Pintura/images/trans.svg new file mode 100644 index 0000000..e9af2ce --- /dev/null +++ b/public/Pintura/images/trans.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/public/Pintura/js/cimjson.js b/public/Pintura/js/cimjson.js new file mode 100644 index 0000000..9bb2e89 --- /dev/null +++ b/public/Pintura/js/cimjson.js @@ -0,0 +1,197 @@ +/* + * Copyright © 2016-2017, RWTH Aachen University + * Authors: Richard Marston + * + * This program 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. + * + * This program 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. + * + * A copy of the GNU General Public License is in the LICENSE file + * in the top level directory of this source tree. + */ + +var cimjson = cimjson || (function() { + + const imageNames = { + "cim:ACLineSegment": "images/term.svg", + "cim:Terminal": "images/term.svg", + "cim:Breaker": "images/brea.svg", + "cim:ConnectivityNode": "images/conn.svg", + "cim:EnergyConsumer": "images/cons.svg", + "cim:EquivalentInjection": "images/cons.svg", + "cim:ExternalNetworkInjection": "images/net.svg", + "cim:PowerTransformer": "images/trans.svg", + "cim:SolarGeneratingUnit": "images/solar.svg", + "cim:SynchronousMachine": "images/sync.svg", + "cim:TopologicalNode": "images/topo.svg", + "cim:TransformerWinding": "images/trans.svg", + }; + + const PinturaDiagramObjectPoints = "Pintura:DiagramObjectPoints"; + + var getImageName = function(type) { + return imageNames[type]; + } + + var convertDiagramObjectToTemplateFormat = function(diagramObject, graph, categoryGraphName, diagramList) { + + let originalPoints = diagramObject[PinturaDiagramObjectPoints]; + let preOffsetPoints = []; + let imagePoints = []; + let labelPoint; + let object; + let categoryGraph = graph[categoryGraphName]; + const imageHeight = 12; + const imageWidth = 12; + if (diagramObject["cim:DiagramObject.IdentifiedObject"] != undefined) { + let rdfId = diagramObject["cim:DiagramObject.IdentifiedObject"]["rdf:resource"].substring(1); + for (let index in originalPoints) { + let point = originalPoints[index]; + preOffsetPoints.push( + { + "x": parseInt(point["cim:DiagramObjectPoint.xPosition"]).toString(), + "y": parseInt(point["cim:DiagramObjectPoint.yPosition"]).toString() + }); + imagePoints.push( + { + "imageHeight" : imageHeight.toString(), + "imageWidth" : imageWidth.toString(), + "x" : (parseInt(point["cim:DiagramObjectPoint.xPosition"]) - (imageWidth/2)).toString(), + "y" : (parseInt(point["cim:DiagramObjectPoint.yPosition"]) - (imageHeight/2)).toString() + }); + }; + labelPoint = { + "x": (parseInt(preOffsetPoints[0].x) + (imageWidth/2)).toString(), + "y": (parseInt(preOffsetPoints[0].y) - (imageHeight/2)).toString() + }; + object = + { + "pintura:image" : getImageName(categoryGraphName), + "pintura:rdfId" : rdfId, + "pintura:points" : imagePoints, + "pintura:label" : { + "text": categoryGraph[rdfId]["cim:IdentifiedObject.name"], + "x" : labelPoint.x, + "y" : labelPoint.y + } + } + while (preOffsetPoints.length > 1) { + if (object["pintura:line"] == null) { + object["pintura:line"] = []; + } + let line = { + "x1": preOffsetPoints[0].x, + "y1": preOffsetPoints[0].y, + "x2": preOffsetPoints[1].x, + "y2": preOffsetPoints[1].y + }; + object["pintura:line"].push(line); + preOffsetPoints.shift() + } + } + let diagram = diagramObject["cim:DiagramObject.Diagram"]["rdf:resource"].substring(1); + if (diagramList[diagram] === undefined){ + diagramList[diagram] = { "pintura:name" : graph["cim:Diagram"][diagram]["cim:IdentifiedObject.name"] }; + } + if (diagramObject["cim:DiagramObject.IdentifiedObject"]) { + let identifiedObject = diagramObject["cim:DiagramObject.IdentifiedObject"]["rdf:resource"].substring(1); + if (diagramList[diagram]["components"] === undefined){ + diagramList[diagram]["components"] = {}; + } + if (diagramList[diagram]["components"][categoryGraphName] === undefined){ + diagramList[diagram]["components"][categoryGraphName] = {}; + } + diagramList[diagram]["components"][categoryGraphName][identifiedObject] = object; + } + }; + + var convertToTemplatableFormat = function(diagramObjects, graph) { + + let output = { 'Diagram' : {} }; + let diagramList = output['Diagram']; + + for (categoryGraphName in imageNames) { + + let categoryGraph = graph[categoryGraphName]; + for (let key in categoryGraph) { + let diagramObject = diagramObjects[key]; + if (diagramObject != undefined) { + convertDiagramObjectToTemplateFormat(diagramObject, graph, categoryGraphName, diagramList); + } + } + } + return output; + }; + + var indexDiagramGraphByComponentType = function(input) { + /* + * Index the diagram object graph by the identified object's id so we don't + * have to go hunting for the referenced object inside the diagram objects. + */ + let graph = {}; + for (let key in input) { + let diagramObject = input[key]; + let diagram = diagramObject["cim:DiagramObject.Diagram"]["rdf:resource"].substring(1); + if (diagramObject["cim:DiagramObject.IdentifiedObject"]) { + let identifiedObject = input[key]["cim:DiagramObject.IdentifiedObject"]["rdf:resource"].substring(1); + graph[identifiedObject] = input[key]; + } + } + return graph; + }; + + var addDiagramObjectPointsToDiagramObjects = function(diagramObjectPointGraph, diagramObjectGraph){ + for (let key in diagramObjectPointGraph) { + mergeMatchingDataIntoParentNodeArray(diagramObjectPointGraph[key], "cim:DiagramObjectPoint.DiagramObject", diagramObjectGraph, PinturaDiagramObjectPoints); + } + }; + + /* + * Create link to a member of an array of e.g. points + */ + var mergeMatchingDataIntoParentNodeArray = function(node, matchingElement, destinationGraph, destinationElement) { + if (node[matchingElement]) { + let id = node[matchingElement]["rdf:resource"].substr(1); + if (destinationGraph[id]) { + if (destinationGraph[id][destinationElement] === undefined) { + destinationGraph[id][destinationElement] = []; + } + destinationGraph[id][destinationElement].push(node); + } + else { + console.log("Could not find destination "+matchingElement+" to merge into "+destinationElement+"."); + } + } + else { + console.log("Could not find matching element "+matchingElement+" to merge "+destinationElement+" into ."); + } + }; + + var getTemplateJson = function(graph) { + let updatedDiagramObjects = JSON.parse(JSON.stringify(graph['cim:DiagramObject'])); + let diagramObjectPoints = graph['cim:DiagramObjectPoint']; + addDiagramObjectPointsToDiagramObjects(diagramObjectPoints, updatedDiagramObjects); + + let diagramObjectsByIdentifiedObjects = indexDiagramGraphByComponentType(updatedDiagramObjects); + + templateReadyFormat = convertToTemplatableFormat(diagramObjectsByIdentifiedObjects, graph); + + return templateReadyFormat; + }; + + return { + getTemplateJson, + }; +}()); + +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + cimjson + }; +} diff --git a/public/Pintura/js/cimsvg.js b/public/Pintura/js/cimsvg.js new file mode 100644 index 0000000..aaf97d0 --- /dev/null +++ b/public/Pintura/js/cimsvg.js @@ -0,0 +1,140 @@ +/* + * Copyright © 2016-2017, RWTH Aachen University + * Authors: Richard Marston + * + * This program 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. + * + * This program 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. + * + * A copy of the GNU General Public License is in the LICENSE file + * in the top level directory of this source tree. + */ + +var cimsvg = cimsvg || (function() { + + var svgNode = null; + var xmlNode = null; + var pinturaNode = null; + var sidebarNode = null; + + function handler() { + //console.log(this.getResponseHeader('content-type')); + } + + var includeFile = function(fileName, callback) { + let dom = svgNode.ownerDocument; + let newTag = dom.createElement("script"); + newTag.type = "text/javascript"; + newTag.src=fileName; + if ( callback != undefined ) { + newTag.onload=function() { + callback(); + }; + } + svgNode.parentElement.appendChild(newTag); + }; + + var applyTemplate = function(data) { + var template = Handlebars.templates['cim2svg']; + return template(data); + }; + + var loadFile = function(fileContents) { + if (cimxml.moreXmlData(fileContents)) { + baseJson = cimxml.getBaseJson(); + templateJson = cimjson.getTemplateJson(baseJson); + svgNode.ownerDocument.getElementById('diagrams').innerHTML = applyTemplate(templateJson); + if(sidebarNode != null) { + cimmenu.populateSidebar(sidebarNode, templateJson); + } + } + }; + + var setFileCount = function(count) { + cimxml.setRdfFileCount(count); + }; + + var isNode = false; + if (typeof module !== 'undefined' && module.exports) { + isNode = true; + } + + var updateComponent = function(type, id, attribute, value) { + cimxml.updateComponentInBaseJson(type, id, attribute, value) + baseJson = cimxml.getBaseJson(); + templateJson = cimjson.getTemplateJson(baseJson); + if (attribute === "cim:IdentifiedObject.name") { + buttonId = '#' + id + "-sidebar-button" + button = sidebarNode.querySelector(buttonId) + button.innerHTML = value; + } + }; + + var loadXml = function(fileName, callback) { + // Create a connection to the file. + var Connect = new XMLHttpRequest(); + // Define which file to open and + Connect.open("GET", fileName, true); + Connect.setRequestHeader("Content-Type", "text/xml"); + Connect.onreadystatechange = handler; + Connect.onload = function (e) { + if(Connect.readyState === 4) { + if(Connect.status === 200) { + callback(Connect.responseXML); + } + else { + console.log(Connect.statusText); + } + } + }; + // send the request. + Connect.send(null); + }; + + return { + init : function(svg, sidebar, componentAttributes, componentCreation) { + svgNode = svg; + sidebarNode = sidebar; + includeFile("handlebars.runtime.js", function() { + includeFile("src/cimview.js", function() { + cimview.init(svgNode); + if(sidebarNode != undefined) { + includeFile("src/cimmenu.js", function() { + cimmenu.init(componentAttributes) + }); + } + includeFile("templates/template.js", function(){ + includeFile("src/cimxml.js", function(){ + includeFile("src/cimjson.js", function(){}); + }); + }); + }); + }); + loadXml("templates/generated_add_components/menu.xml", function(xml){ + if(componentCreation != undefined) { + accordion = componentCreation.querySelector('#component-creation-list-div') + accordion.innerHTML = xml.documentElement.innerHTML; + } + }); + }, + setSVG : function(svg) { + svgNode = svg; + }, + loadFile, + setFileCount, + updateComponent, + }; + +}()); + +if (cimsvg.isNode) { + module.exports = { + cimsvg + } +} diff --git a/public/Pintura/js/cimview.js b/public/Pintura/js/cimview.js new file mode 100644 index 0000000..3c96201 --- /dev/null +++ b/public/Pintura/js/cimview.js @@ -0,0 +1,208 @@ +/* + * Copyright © 2016-2017, RWTH Aachen University + * Authors: Richard Marston + * + * This program 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. + * + * This program 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. + * + * A copy of the GNU General Public License is in the LICENSE file + * in the top level directory of this source tree. + */ + +var cimview = cimview || (function() { + + var svgNode = null; + + var zoomSizes = [ + { width: 1024, height: 768 }, + { width: 920, height: 690 }, + { width: 816, height: 612 }, + { width: 712, height: 532 }, + { width: 608, height: 456 }, + { width: 504, height: 378 }, + { width: 400, height: 300 }, + ]; + + var zoomLevel = 0; + + var zoomToLevel = function(level) { + zoomLevel = level; + let rect = getViewBox(); + centreOfGrid = { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }; + rect.width = zoomSizes[level].width; + rect.height = zoomSizes[level].height; + rect.x = centreOfGrid.x - (rect.width / 2); + rect.y = centreOfGrid.y - (rect.height / 2); + setViewBox(rect); + }; + + var zoomOut = function() { + let level = zoomLevel-1; + if (level < 0) { + level = 0; + } + zoomToLevel(level); + //document.getElementById("zoomer").value=level; + }; + + var zoomIn = function() { + let level = zoomLevel+1; + let lastIndex = zoomSizes.length-1; + if (level > lastIndex) { + level = lastIndex; + } + zoomToLevel(level); + //document.getElementById("zoomer").value=level; + }; + + var pan = function(point) { + let rect = getViewBox(); + rect.x += point.x; + rect.y += point.y; + setViewBox(rect); + }; + + var clearGrid = function() { + let oldLines = Array.from(svgNode.getElementsByClassName("gridLine")); + oldLines.forEach(function(key) { + key.remove(); + }); + let oldLabels = Array.from(svgNode.getElementsByClassName("gridLabel")); + oldLabels.forEach(function(key) { + key.remove(); + }); + }; + + var createLocationMarker = function(id, loc, x, y) { + let grid = svgNode.ownerDocument.getElementById("grid"); + let textAttributes = { + "x": x, + "y": y, + "class": "gridLabel", + "id": id, + }; + let text = createSvgTag("text", textAttributes); + text.innerHTML = loc; + grid.appendChild(text); + }; + + var createGridLine = function(x1, y1, x2, y2) { + let grid = svgNode.ownerDocument.getElementById("grid"); + let lineAttributes = { + "x1": x1, + "x2": x2, + "y1": y1, + "y2": y2, + "class": "gridLine", + }; + let line = createSvgTag("line", lineAttributes); + grid.appendChild(line); + }; + + /* + * Create a tag in the svg namespace + */ + const createSvgTag = function(tagname, attributes) { + let xmlns="http://www.w3.org/2000/svg"; + let newTag = svgNode.ownerDocument.createElementNS(xmlns, tagname); + for (let key in attributes) { + newTag.setAttribute(key, attributes[key]); + } + return newTag; + }; + + var calculateStartOffset = function(distanceFromOrigin, gridSize) { + let offset; + if (distanceFromOrigin < 0) { + offset = distanceFromOrigin - ( distanceFromOrigin % gridSize ); + } + else { + offset = distanceFromOrigin + gridSize - ( distanceFromOrigin % gridSize ); + } + return offset; + }; + + var createGrid = function() { + clearGrid(); + let gridSize = 100; + let viewBoxRect = getViewBox(); + /* horizontal lines */ + let startOffsetY = calculateStartOffset(viewBoxRect.y, gridSize); + let startOffsetX = calculateStartOffset(viewBoxRect.x, gridSize); + for (let i=0; i<(viewBoxRect.height/gridSize); i++) { + let yval = i*gridSize+startOffsetY; + createGridLine(viewBoxRect.x, yval, viewBoxRect.width+viewBoxRect.x, yval); + createLocationMarker(yval+"y", yval.toString(), viewBoxRect.x+10, yval+20); + } + /* vertical lines */ + for (let i=0; i<(viewBoxRect.width/gridSize); i++) { + let xval = i*gridSize+startOffsetX; + createGridLine(xval, viewBoxRect.y, xval, viewBoxRect.height+viewBoxRect.y); + createLocationMarker(xval+"x", xval.toString(), xval+10, viewBoxRect.y+20); + } + }; + + var getViewBox = function() { + let rect = {}; + viewBoxString = svgNode.getAttribute("viewBox"); + viewBoxElements = viewBoxString.split(" "); + rect.x = parseInt(viewBoxElements[0]); + rect.y = parseInt(viewBoxElements[1]); + rect.width = parseInt(viewBoxElements[2]); + rect.height = parseInt(viewBoxElements[3]); + return rect; + }; + + var setViewBox = function(rect) { + let viewBoxString = rect.x+" "+rect.y+" "+rect.width+" "+rect.height; + svgNode.setAttribute("viewBox", viewBoxString); + let bg = svgNode.ownerDocument.getElementById("backing"); + bg.setAttribute("x", rect.x); + bg.setAttribute("y", rect.y); + bg.setAttribute("width", "100%"); + bg.setAttribute("height", "100%"); + createGrid(); + }; + + var clearDisplay = function() { + while (svgNode.firstChild) { + svgNode.removeChild(svgNode.firstChild); + } + }; + + var hideAllLabels = function() { + Array.from(svgNode.getElementsByClassName("svglabel")).forEach(function (label) { + label.setAttributeNS(null, "visibility", "hidden"); + }); + }; + + var init = function(svg) { + svgNode = svg; + let rect = { x: "-100", y: "-100", width: "1024", height: "768" }; + setViewBox(rect); + }; + + /* + * Specify the functions that this module exports + */ + return { + init, + pan, + zoomIn, + zoomOut, + }; + +}()); + +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + cimview + } +} diff --git a/public/Pintura/js/cimxml.js b/public/Pintura/js/cimxml.js new file mode 100644 index 0000000..128deb9 --- /dev/null +++ b/public/Pintura/js/cimxml.js @@ -0,0 +1,253 @@ +/* + * Copyright © 2016-2017, RWTH Aachen University + * Authors: Richard Marston + * + * This program 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. + * + * This program 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. + * + * A copy of the GNU General Public License is in the LICENSE file + * in the top level directory of this source tree. + */ + +var cimxml = cimxml || (function() { + + var xmlDoc; + var rdfFileCount = 0; + var rdfFileReceived = 0; + var jsonBaseData = null; + const xmlnsString = "xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cim='http://iec.ch/TC57/2012/CIM-schema-cim16#' xmlns:md='http://iec.ch/TC57/61970-552/ModelDescription/1#' xmlns:entsoe='http://entsoe.eu/Secretariat/ProfileExtension/2#'"; + + var getRawXML = function() { + return xmlDoc; + }; + + var getBaseJson = function() { + return jsonBaseData; + }; + + /* + * Convert a small data item into XML and add it to a node + */ + var addChild = function(object, name, doc, owner) { + + let child; + if (typeof object == "object") { + child = doc.createElement(name); + child.setAttribute("rdf:resource", object["rdf:resource"]); + } + else { + child = doc.createElement(name); + child.innerHTML = object; + } + owner.appendChild(child); + }; + + var copyXmlDataIntoObject = function(object, node) { + + let childNodes = node.children; + for (let childIndex = 0; childIndex < childNodes.length; childIndex++) { + let thisChild = childNodes[childIndex]; + if (thisChild.nodeType == Node.ELEMENT_NODE) { + if (thisChild.attributes.length > 0) { + object[thisChild.nodeName] = { "rdf:resource": thisChild.getAttribute("rdf:resource")}; + } + else { + object[thisChild.nodeName] = thisChild.innerHTML; + } + } + } + }; + + var importXmlNodeIntoGraph = function(graph, nodeCategory, node, id) { + + let thisObject = { }; + + thisObject['rdfid'] = id + + copyXmlDataIntoObject(thisObject, node); + + if (!graph[nodeCategory]) { + graph[nodeCategory] = {}; + } + + /* add the new object to the graph */ + let categoryGraph = graph[nodeCategory]; + categoryGraph[id] = thisObject; + }; + + var importAboutDataIntoGraph = function(graph, nodeCategory, thisNode, id) { + + if (graph[nodeCategory] && graph[nodeCategory][id]) { + let thisObject = graph[nodeCategory][id].about = []; + copyXmlDataIntoObject(thisObject, thisNode); + } + }; + + /* + * What is the rdf:ID attribute for this node + */ + var getRdfId = function(node) { + + let rdfId = node.getAttribute("rdf:ID"); + return rdfId; + }; + + /* + * What is the rdf:about attribute for this node + */ + var getRdfAbout = function(node) { + + let rdfAbout = node.getAttribute("rdf:about"); + return rdfAbout; + }; + + /* + * Clear the buffer of XML data that we use to handle multiple file imports + */ + var clearXmlData = function() { + + xmlDoc = null; + }; + + var xmlns = function(){ + + return xmlnsString; + }; + + /* + * Function to create a JSON document from an RDF (XML) DOM. + * RDF is a shallow xml format so we don"t have to dig too + * deep, a node will only ever have children or attributes. + */ + var createObjectGraphFromXml = function( xmlData ) { + + let graph = {}; + let topLevelNodes = xmlData.documentElement.childNodes; + + /* loop through all of the top level nodes */ + for (let topLevelIndex=0; topLevelIndex 0) { + if (rdfFileCount == rdfFileReceived) { + return true; + } + } + }; + + /* + * Here comes some more data + */ + var moreXmlData = function(text, draw=true) { + + if (!xmlDoc) { + xmlDoc = getDOM(""); + } + + let newDoc = getDOM(text); + let nodes = newDoc.documentElement.childNodes; + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].nodeType == Node.ELEMENT_NODE) { + if (nodes[i].nodeName != "md:FullModel") { + xmlDoc.documentElement.appendChild(nodes[i].cloneNode(true)); + } + } + } + + rdfFileReceived++; + if (checkIfParseReady()) { + jsonBaseData = createObjectGraphFromXml(xmlDoc); + rdfFileReceived = 0; + rdfFileCount = 0; + return true; + } + return false; + }; + + /* + * Different method of getting DOM required for some platforms + */ + var getDOM = function(text) { + + let newDoc; + if ( window.DOMParser ) { + newDoc = ( new DOMParser() ).parseFromString( text, "application/xml" ); + } + else if( window.ActiveXObject ) { + let xmlObject = new ActiveXObject( "Microsoft.XMLDOM" ); + xmlObject.async = false; + xmlObject.loadXML( text ); + newDoc = xmlObject; + xmlObject = undefined; + } + else { + throw new Error( "Cannot find an XML parser!" ); + } + return newDoc; + }; + + var updateComponentInBaseJson = function(type, id, attribute, value) { + jsonBaseData[type][id][attribute] = value + }; + + return { + getBaseJson, + setRdfFileCount, + clearXmlData, + moreXmlData, + getRawXML, + updateComponentInBaseJson, + }; +}()); + +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + cimxml + }; +} diff --git a/public/Pintura/js/handlebars.runtime.js b/public/Pintura/js/handlebars.runtime.js new file mode 100644 index 0000000..86c977a --- /dev/null +++ b/public/Pintura/js/handlebars.runtime.js @@ -0,0 +1,1468 @@ +/**! + + @license + handlebars v4.0.10 + +Copyright (C) 2011-2016 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Handlebars"] = factory(); + else + root["Handlebars"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _handlebarsBase = __webpack_require__(3); + + var base = _interopRequireWildcard(_handlebarsBase); + + // Each of these augment the Handlebars object. No need to setup here. + // (This is done to easily share code between commonjs and browse envs) + + var _handlebarsSafeString = __webpack_require__(20); + + var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); + + var _handlebarsException = __webpack_require__(5); + + var _handlebarsException2 = _interopRequireDefault(_handlebarsException); + + var _handlebarsUtils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_handlebarsUtils); + + var _handlebarsRuntime = __webpack_require__(21); + + var runtime = _interopRequireWildcard(_handlebarsRuntime); + + var _handlebarsNoConflict = __webpack_require__(33); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + // For compatibility and usage outside of module systems, make the Handlebars object a namespace + function create() { + var hb = new base.HandlebarsEnvironment(); + + Utils.extend(hb, base); + hb.SafeString = _handlebarsSafeString2['default']; + hb.Exception = _handlebarsException2['default']; + hb.Utils = Utils; + hb.escapeExpression = Utils.escapeExpression; + + hb.VM = runtime; + hb.template = function (spec) { + return runtime.template(spec, hb); + }; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; + } + } + + newObj["default"] = obj; + return newObj; + } + }; + + exports.__esModule = true; + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; + }; + + exports.__esModule = true; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.HandlebarsEnvironment = HandlebarsEnvironment; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _helpers = __webpack_require__(9); + + var _decorators = __webpack_require__(17); + + var _logger = __webpack_require__(19); + + var _logger2 = _interopRequireDefault(_logger); + + var VERSION = '4.0.10'; + exports.VERSION = VERSION; + var COMPILER_REVISION = 7; + + exports.COMPILER_REVISION = COMPILER_REVISION; + var REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '== 1.x.x', + 5: '== 2.0.0-alpha.x', + 6: '>= 2.0.0-beta.1', + 7: '>= 4.0.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$defineProperty = __webpack_require__(6)['default']; + + exports.__esModule = true; + + var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + try { + if (loc) { + this.lineNumber = line; + + // Work around issue under safari where we can't directly set the column value + /* istanbul ignore next */ + if (_Object$defineProperty) { + Object.defineProperty(this, 'column', { + value: column, + enumerable: true + }); + } else { + this.column = column; + } + } + } catch (nop) { + /* Ignore if the browser is very particular */ + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(7), __esModule: true }; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(8); + module.exports = function defineProperty(it, key, desc){ + return $.setDesc(it, key, desc); + }; + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + var $Object = Object; + module.exports = { + create: $Object.create, + getProto: $Object.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: $Object.getOwnPropertyDescriptor, + setDesc: $Object.defineProperty, + setDescs: $Object.defineProperties, + getKeys: $Object.keys, + getNames: $Object.getOwnPropertyNames, + getSymbols: $Object.getOwnPropertySymbols, + each: [].forEach + }; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + + var _helpersBlockHelperMissing = __webpack_require__(10); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(11); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(12); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(13); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(14); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(15); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(16); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(18); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }), +/* 20 */ +/***/ (function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$seal = __webpack_require__(22)['default']; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(3); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + // An empty object to use as replacement for null-contexts + nullContext: _Object$seal({}), + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + // Use the current closure context to save the partial-block if this partial + var currentPartialBlock = options.data && options.data['partial-block']; + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + (function () { + options.data = _base.createFrame(options.data); + // Wrapper function to get access to currentPartialBlock from the closure + var fn = options.fn; + partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // Restore the partial-block from the closure for the execution of the block + // i.e. the part inside the block of the partial call. + options.data = _base.createFrame(options.data); + options.data['partial-block'] = currentPartialBlock; + return fn(context, options); + }; + if (fn.partials) { + options.partials = Utils.extend({}, options.partials, fn.partials); + } + })(); + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(23), __esModule: true }; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(24); + module.exports = __webpack_require__(29).Object.seal; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + + // 19.1.2.17 Object.seal(O) + var isObject = __webpack_require__(25); + + __webpack_require__(26)('seal', function($seal){ + return function seal(it){ + return $seal && isObject(it) ? $seal(it) : it; + }; + }); + +/***/ }), +/* 25 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + + // most Object methods by ES6 should accept primitives + var $export = __webpack_require__(27) + , core = __webpack_require__(29) + , fails = __webpack_require__(32); + module.exports = function(KEY, exec){ + var fn = (core.Object || {})[KEY] || Object[KEY] + , exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); + }; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + + var global = __webpack_require__(28) + , core = __webpack_require__(29) + , ctx = __webpack_require__(30) + , PROTOTYPE = 'prototype'; + + var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , IS_WRAP = type & $export.W + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] + , key, own, out; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && key in target; + if(own && key in exports)continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function(C){ + var F = function(param){ + return this instanceof C ? new C(param) : C(param); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; + } + }; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + module.exports = $export; + +/***/ }), +/* 28 */ +/***/ (function(module, exports) { + + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); + if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef + +/***/ }), +/* 29 */ +/***/ (function(module, exports) { + + var core = module.exports = {version: '1.2.6'}; + if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + + // optional / simple context binding + var aFunction = __webpack_require__(31); + module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; + } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; + }; + +/***/ }), +/* 31 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; + }; + +/***/ }), +/* 32 */ +/***/ (function(module, exports) { + + module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; + } + }; + +/***/ }), +/* 33 */ +/***/ (function(module, exports) { + + /* WEBPACK VAR INJECTION */(function(global) {/* global window */ + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/public/Pintura/templates/template.js b/public/Pintura/templates/template.js new file mode 100644 index 0000000..14a8178 --- /dev/null +++ b/public/Pintura/templates/template.js @@ -0,0 +1,2521 @@ +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['cim2svg'] = template({"1":function(container,depth0,helpers,partials,data,blockParams,depths) { + var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return " \n" + + ((stack1 = helpers["with"].call(alias1,(depth0 != null ? depth0.components : depth0),{"name":"with","hash":{},"fn":container.program(2, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); +},"2":function(container,depth0,helpers,partials,data,blockParams,depths) { + var stack1; + + return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 2, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); +},"3":function(container,depth0,helpers,partials,data,blockParams,depths) { + var stack1; + + return " \n" + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(4, data, 2, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") + + " \n"; +},"4":function(container,depth0,helpers,partials,data,blockParams,depths) { + var stack1, helper, options, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, buffer = + " \n" + + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0["pintura:points"] : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); + stack1 = ((helper = (helper = helpers["pintura:label"] || (depth0 != null ? depth0["pintura:label"] : depth0)) != null ? helper : alias2),(options={"name":"pintura:label","hash":{},"fn":container.program(7, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); + if (!helpers["pintura:label"]) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)} + if (stack1 != null) { buffer += stack1; } + return buffer + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0["pintura:line"] : depth0),{"name":"each","hash":{},"fn":container.program(9, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") + + " \n"; +},"5":function(container,depth0,helpers,partials,data,blockParams,depths) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; + + return " \n"; +},"7":function(container,depth0,helpers,partials,data,blockParams) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; + + return " " + + alias4(((helper = (helper = helpers.text || (depth0 != null ? depth0.text : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"text","hash":{},"data":data,"blockParams":blockParams}) : helper))) + + "\n"; +},"9":function(container,depth0,helpers,partials,data,blockParams) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return " \n"; +},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) { + var stack1; + + return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.Diagram : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") + + "\n\n"; +},"useData":true,"useDepths":true,"useBlockParams":true}); +templates['pintura2html'] = template({"1":function(container,depth0,helpers,partials,data,blockParams) { + var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}); + + return "
  • Components in Diagram: " + + container.escapeExpression(((helper = (helper = helpers["pintura:name"] || (depth0 != null ? depth0["pintura:name"] : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"pintura:name","hash":{},"data":data,"blockParams":blockParams}) : helper))) + + "
  • \n" + + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.components : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 2, blockParams),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); +},"2":function(container,depth0,helpers,partials,data,blockParams) { + var stack1, alias1=container.lambda, alias2=container.escapeExpression; + + return " \n
    \n" + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 2, blockParams),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") + + "
    \n"; +},"3":function(container,depth0,helpers,partials,data,blockParams) { + var stack1, alias1=container.lambda, alias2=container.escapeExpression; + + return " \n"; +},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams) { + var stack1; + + return "
      \n" + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.Diagram : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0, blockParams),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") + + "
    \n"; +},"useData":true,"useBlockParams":true}); +templates['ACDCTerminal'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "\n
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ACDCTerminal.connected\n \n
    • \n
    • \n cim:ACDCTerminal.sequenceNumber\n \n
    • \n
    \n"; +},"useData":true}); +templates['ACLineSegment'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "\n
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ACLineSegment.b0ch\n \n
    • \n
    • \n cim:ACLineSegment.bch\n \n
    • \n
    • \n cim:ACLineSegment.g0ch\n \n
    • \n
    • \n cim:ACLineSegment.gch\n \n
    • \n
    • \n cim:ACLineSegment.r\n \n
    • \n
    • \n cim:ACLineSegment.r0\n \n
    • \n
    • \n cim:ACLineSegment.shortCircuitEndTemperature\n \n
    • \n
    • \n cim:ACLineSegment.x\n \n
    • \n
    • \n cim:ACLineSegment.x0\n \n
    • \n
    • \n cim:ACLineSegment.Clamp\n \n
    • \n
    \n"; +},"useData":true}); +templates['ACLineSegmentPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ACLineSegmentPhase.phase\n \n
    • \n
    • \n cim:ACLineSegmentPhase.ACLineSegment\n \n
    • \n
    \n"; +},"useData":true}); +templates['AsynchronousMachine'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:AsynchronousMachine.asynchronousMachineType\n \n
    • \n
    • \n cim:AsynchronousMachine.converterFedDrive\n \n
    • \n
    • \n cim:AsynchronousMachine.efficiency\n \n
    • \n
    • \n cim:AsynchronousMachine.iaIrRatio\n \n
    • \n
    • \n cim:AsynchronousMachine.nominalFrequency\n \n
    • \n
    • \n cim:AsynchronousMachine.nominalSpeed\n \n
    • \n
    • \n cim:AsynchronousMachine.polePairNumber\n \n
    • \n
    • \n cim:AsynchronousMachine.ratedMechanicalPower\n \n
    • \n
    • \n cim:AsynchronousMachine.reversible\n \n
    • \n
    • \n cim:AsynchronousMachine.rr1\n \n
    • \n
    • \n cim:AsynchronousMachine.rr2\n \n
    • \n
    • \n cim:AsynchronousMachine.rxLockedRotorRatio\n \n
    • \n
    • \n cim:AsynchronousMachine.tpo\n \n
    • \n
    • \n cim:AsynchronousMachine.tppo\n \n
    • \n
    • \n cim:AsynchronousMachine.xlr1\n \n
    • \n
    • \n cim:AsynchronousMachine.xlr2\n \n
    • \n
    • \n cim:AsynchronousMachine.xm\n \n
    • \n
    • \n cim:AsynchronousMachine.xp\n \n
    • \n
    • \n cim:AsynchronousMachine.xpp\n \n
    • \n
    • \n cim:AsynchronousMachine.xs\n \n
    • \n
    \n"; +},"useData":true}); +templates['BaseFrequency'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BaseFrequency.frequency\n \n
    • \n
    \n"; +},"useData":true}); +templates['BasePower'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BasePower.basePower\n \n
    • \n
    \n"; +},"useData":true}); +templates['BaseVoltage'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BaseVoltage.nominalVoltage\n \n
    • \n
    • \n cim:BaseVoltage.ConductingEquipment\n \n
    • \n
    \n"; +},"useData":true}); +templates['BasicIntervalSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BasicIntervalSchedule.startTime\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value1Multiplier\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value1Unit\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value2Multiplier\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value2Unit\n \n
    • \n
    \n"; +},"useData":true}); +templates['Bay'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Bay.bayEnergyMeasFlag\n \n
    • \n
    • \n cim:Bay.bayPowerMeasFlag\n \n
    • \n
    • \n cim:Bay.breakerConfiguration\n \n
    • \n
    • \n cim:Bay.busBarConfiguration\n \n
    • \n
    \n"; +},"useData":true}); +templates['Breaker'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Breaker.inTransitTime\n \n
    • \n
    \n"; +},"useData":true}); +templates['BusbarSection'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BusbarSection.ipMax\n \n
    • \n
    • \n cim:BusbarSection.VoltageControlZone\n \n
    • \n
    \n"; +},"useData":true}); +templates['BusNameMarker'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "\n
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BusNameMarker.priority\n \n
    • \n
    • \n cim:BusNameMarker.ReportingGroup\n \n
    • \n
    • \n cim:BusNameMarker.Terminal\n \n
    • \n
    \n"; +},"useData":true}); +templates['Clamp'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Clamp.lengthFromTerminal1\n \n
    • \n
    \n"; +},"useData":true}); +templates['CompositeSwitch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:CompositeSwitch.compositeSwitchType\n \n
    • \n
    • \n cim:CompositeSwitch.Switches\n \n
    • \n
    \n"; +},"useData":true}); +templates['ConductingEquipment'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ConductingEquipment.ProtectiveActionAdjustment\n \n
    • \n
    \n"; +},"useData":true}); +templates['Conductor'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Conductor.length\n \n
    • \n
    \n"; +},"useData":true}); +templates['ConnectivityNodeContainer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; +},"useData":true}); +templates['ConnectivityNode'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ConnectivityNode.ConnectivityNodeContainer\n \n
    • \n
    \n"; +},"useData":true}); +templates['Connector'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; +},"useData":true}); +templates['Curve'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Curve.curveStyle\n \n
    • \n
    • \n cim:Curve.xMultiplier\n \n
    • \n
    • \n cim:Curve.xUnit\n \n
    • \n
    • \n cim:Curve.y1Multiplier\n \n
    • \n
    • \n cim:Curve.y1Unit\n \n
    • \n
    • \n cim:Curve.y2Multiplier\n \n
    • \n
    • \n cim:Curve.y2Unit\n \n
    • \n
    • \n cim:Curve.y3Multiplier\n \n
    • \n
    • \n cim:Curve.y3Unit\n \n
    • \n
    • \n cim:Curve.CurveDatas\n \n
    • \n
    \n"; +},"useData":true}); +templates['Cut'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Cut.lengthFromTerminal1\n \n
    • \n
    • \n cim:Cut.ACLineSegment\n \n
    • \n
    \n"; +},"useData":true}); +templates['DCTopologicalNode'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; +},"useData":true}); +templates['Disconnector'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; +},"useData":true}); +templates['EarthFaultCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EarthFaultCompensator.r\n \n
    • \n
    \n"; +},"useData":true}); +templates['EnergyConsumer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EnergyConsumer.customerCount\n \n
    • \n
    • \n cim:EnergyConsumer.grounded\n \n
    • \n
    • \n cim:EnergyConsumer.p\n \n
    • \n
    • \n cim:EnergyConsumer.pfixed\n \n
    • \n
    • \n cim:EnergyConsumer.pfixedPct\n \n
    • \n
    • \n cim:EnergyConsumer.phaseConnection\n \n
    • \n
    • \n cim:EnergyConsumer.q\n \n
    • \n
    • \n cim:EnergyConsumer.qfixed\n \n
    • \n
    • \n cim:EnergyConsumer.qfixedPct\n \n
    • \n
    • \n cim:EnergyConsumer.LoadResponse\n \n
    • \n
    • \n cim:EnergyConsumer.EnergyConsumerPhase\n \n
    • \n
    \n"; +},"useData":true}); +templates['EnergyConsumerPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EnergyConsumerPhase.pfixed\n \n
    • \n
    • \n cim:EnergyConsumerPhase.pfixedPct\n \n
    • \n
    • \n cim:EnergyConsumerPhase.phase\n \n
    • \n
    • \n cim:EnergyConsumerPhase.qfixed\n \n
    • \n
    • \n cim:EnergyConsumerPhase.qfixedPct\n \n
    • \n
    \n"; +},"useData":true}); +templates['EnergySource'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EnergySource.activePower\n \n
    • \n
    • \n cim:EnergySource.nominalVoltage\n \n
    • \n
    • \n cim:EnergySource.r\n \n
    • \n
    • \n cim:EnergySource.r0\n \n
    • \n
    • \n cim:EnergySource.reactivePower\n \n
    • \n
    • \n cim:EnergySource.rn\n \n
    • \n
    • \n cim:EnergySource.voltageAngle\n \n
    • \n
    • \n cim:EnergySource.voltageMagnitude\n \n
    • \n
    • \n cim:EnergySource.x\n \n
    • \n
    • \n cim:EnergySource.x0\n \n
    • \n
    • \n cim:EnergySource.xn\n \n
    • \n
    • \n cim:EnergySource.EnergySchedulingType\n \n
    • \n
    \n"; +},"useData":true}); +templates['EquipmentContainer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EquipmentContainer.Equipments\n \n
    • \n
    \n"; +},"useData":true}); +templates['Equipment'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
      \n
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:Equipment.aggregate\n \n
      • \n
      • \n cim:Equipment.normallyInService\n \n
      • \n
      • \n cim:Equipment.WeatherStation\n \n
      • \n
      \n"; +},"useData":true}); +templates['ExternalNetworkInjection'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:ExternalNetworkInjection.governorSCD\n \n
      • \n
      • \n cim:ExternalNetworkInjection.ikSecond\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxInitialSymShCCurrent\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxP\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxQ\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxR0ToX0Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxR1ToX1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxZ0ToZ1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minInitialSymShCCurrent\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minP\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minQ\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minR0ToX0Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minR1ToX1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minZ0ToZ1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.p\n \n
      • \n
      • \n cim:ExternalNetworkInjection.q\n \n
      • \n
      • \n cim:ExternalNetworkInjection.referencePriority\n \n
      • \n
      • \n cim:ExternalNetworkInjection.voltageFactor\n \n
      • \n
      \n"; +},"useData":true}); +templates['FrequencyConverter'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:FrequencyConverter.frequency\n \n
      • \n
      • \n cim:FrequencyConverter.maxP\n \n
      • \n
      • \n cim:FrequencyConverter.maxU\n \n
      • \n
      • \n cim:FrequencyConverter.minP\n \n
      • \n
      • \n cim:FrequencyConverter.minU\n \n
      • \n
      \n"; +},"useData":true}); +templates['Fuse'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      \n"; +},"useData":true}); +templates['GeographicalRegion'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:GeographicalRegion.Regions\n \n
      • \n
      \n"; +},"useData":true}); +templates['GroundDisconnector'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      \n"; +},"useData":true}); +templates['Ground'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      \n"; +},"useData":true}); +templates['GroundingImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:GroundingImpedance.x\n \n
      • \n
      \n"; +},"useData":true}); +templates['IrregularIntervalSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
        \n
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:IrregularIntervalSchedule.TimePoints\n \n
        • \n
        \n"; +},"useData":true}); +templates['Jumper'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; +},"useData":true}); +templates['Junction'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; +},"useData":true}); +templates['LinearShuntCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:LinearShuntCompensator.b0PerSection\n \n
        • \n
        • \n cim:LinearShuntCompensator.bPerSection\n \n
        • \n
        • \n cim:LinearShuntCompensator.g0PerSection\n \n
        • \n
        • \n cim:LinearShuntCompensator.gPerSection\n \n
        • \n
        \n"; +},"useData":true}); +templates['LinearShuntCompensatorPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:LinearShuntCompensatorPhase.bPerSection\n \n
        • \n
        • \n cim:LinearShuntCompensatorPhase.gPerSection\n \n
        • \n
        \n"; +},"useData":true}); +templates['Line'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; +},"useData":true}); +templates['LoadBreakSwitch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; +},"useData":true}); +templates['MutualCoupling'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:MutualCoupling.b0ch\n \n
        • \n
        • \n cim:MutualCoupling.distance11\n \n
        • \n
        • \n cim:MutualCoupling.distance12\n \n
        • \n
        • \n cim:MutualCoupling.distance21\n \n
        • \n
        • \n cim:MutualCoupling.distance22\n \n
        • \n
        • \n cim:MutualCoupling.g0ch\n \n
        • \n
        • \n cim:MutualCoupling.r0\n \n
        • \n
        • \n cim:MutualCoupling.x0\n \n
        • \n
        • \n cim:MutualCoupling.First_Terminal\n \n
        • \n
        • \n cim:MutualCoupling.Second_Terminal\n \n
        • \n
        \n"; +},"useData":true}); +templates['NonlinearShuntCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:NonlinearShuntCompensator.NonlinearShuntCompensatorPoints\n \n
        • \n
        \n"; +},"useData":true}); +templates['NonlinearShuntCompensatorPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:NonlinearShuntCompensatorPhase.NonlinearShuntCompensatorPhasePoints\n \n
        • \n
        \n"; +},"useData":true}); +templates['OperatingParticipant'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
          \n
            \n
              \n
                \n
                  \n
                • \n cim:IdentifiedObject.name\n \n
                • \n
                \n"; +},"useData":true}); +templates['PerLengthImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                  \n
                    \n
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PerLengthImpedance.ACLineSegments\n \n
                    • \n
                    \n"; +},"useData":true}); +templates['PerLengthLineParameter'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    \n"; +},"useData":true}); +templates['PerLengthPhaseImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PerLengthPhaseImpedance.conductorCount\n \n
                    • \n
                    • \n cim:PerLengthPhaseImpedance.PhaseImpedanceData\n \n
                    • \n
                    \n"; +},"useData":true}); +templates['PerLengthSequenceImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.b0ch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.bch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.g0ch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.gch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.r\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.r0\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.x\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.x0\n \n
                    • \n
                    \n"; +},"useData":true}); +templates['PetersenCoil'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PetersenCoil.mode\n \n
                    • \n
                    • \n cim:PetersenCoil.nominalU\n \n
                    • \n
                    • \n cim:PetersenCoil.offsetCurrent\n \n
                    • \n
                    • \n cim:PetersenCoil.positionCurrent\n \n
                    • \n
                    • \n cim:PetersenCoil.xGroundMax\n \n
                    • \n
                    • \n cim:PetersenCoil.xGroundMin\n \n
                    • \n
                    • \n cim:PetersenCoil.xGroundNominal\n \n
                    • \n
                    \n"; +},"useData":true}); +templates['PhaseTapChangerAsymmetrical'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PhaseTapChangerAsymmetrical.windingConnectionAngle\n \n
                    • \n
                    \n"; +},"useData":true}); +templates['PhaseTapChanger'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                      \n
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PhaseTapChangerLinear'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerLinear.stepPhaseShiftIncrement\n \n
                      • \n
                      • \n cim:PhaseTapChangerLinear.xMax\n \n
                      • \n
                      • \n cim:PhaseTapChangerLinear.xMin\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PhaseTapChangerNonLinear'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerNonLinear.voltageStepIncrement\n \n
                      • \n
                      • \n cim:PhaseTapChangerNonLinear.xMax\n \n
                      • \n
                      • \n cim:PhaseTapChangerNonLinear.xMin\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PhaseTapChangerSymmetrical'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PhaseTapChangerTable'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerTable.PhaseTapChangerTabular\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PhaseTapChangerTablePoint'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerTablePoint.angle\n \n
                      • \n
                      • \n cim:PhaseTapChangerTablePoint.PhaseTapChangerTable\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PhaseTapChangerTabular'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['Plant'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PowerSystemResource'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PowerSystemResource.Controls\n \n
                      • \n
                      • \n cim:PowerSystemResource.Measurements\n \n
                      • \n
                      • \n cim:PowerSystemResource.PSRType\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PowerTransformerEnd'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.b\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.b0\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.connectionKind\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.g\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.g0\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.phaseAngleClock\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.r\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.r0\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.ratedS\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.ratedU\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.x\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.x0\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PowerTransformer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PowerTransformer.beforeShCircuitHighestOperatingCurrent\n \n
                      • \n
                      • \n cim:PowerTransformer.beforeShCircuitHighestOperatingVoltage\n \n
                      • \n
                      • \n cim:PowerTransformer.beforeShortCircuitAnglePf\n \n
                      • \n
                      • \n cim:PowerTransformer.highSideMinOperatingU\n \n
                      • \n
                      • \n cim:PowerTransformer.isPartOfGeneratorUnit\n \n
                      • \n
                      • \n cim:PowerTransformer.operationalValuesConsidered\n \n
                      • \n
                      • \n cim:PowerTransformer.vectorGroup\n \n
                      • \n
                      • \n cim:PowerTransformer.PowerTransformerEnd\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['ProtectedSwitch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:ProtectedSwitch.breakingCapacity\n \n
                      • \n
                      \n"; +},"useData":true}); +templates['PSRType'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                        \n
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RatioTapChanger'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RatioTapChanger.stepVoltageIncrement\n \n
                        • \n
                        • \n cim:RatioTapChanger.tculControlMode\n \n
                        • \n
                        • \n cim:RatioTapChanger.RatioTapChangerTable\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RatioTapChangerTable'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RatioTapChangerTablePoint'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RatioTapChangerTablePoint.RatioTapChangerTable\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['ReactiveCapabilityCurve'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.coolantTemperature\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.hydrogenPressure\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.EquivalentInjection\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.InitiallyUsedBySynchronousMachines\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.SynchronousMachines\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['Recloser'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RegularIntervalSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegularIntervalSchedule.endTime\n \n
                        • \n
                        • \n cim:RegularIntervalSchedule.timeStep\n \n
                        • \n
                        • \n cim:RegularIntervalSchedule.TimePoints\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RegulatingCondEq'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegulatingCondEq.controlEnabled\n \n
                        • \n
                        • \n cim:RegulatingCondEq.RegulatingControl\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RegulatingControl'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegulatingControl.discrete\n \n
                        • \n
                        • \n cim:RegulatingControl.enabled\n \n
                        • \n
                        • \n cim:RegulatingControl.mode\n \n
                        • \n
                        • \n cim:RegulatingControl.monitoredPhase\n \n
                        • \n
                        • \n cim:RegulatingControl.targetDeadband\n \n
                        • \n
                        • \n cim:RegulatingControl.targetValue\n \n
                        • \n
                        • \n cim:RegulatingControl.targetValueUnitMultiplier\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['RegulationSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegulationSchedule.RegulatingControl\n \n
                        • \n
                        • \n cim:RegulationSchedule.VoltageControlZones\n \n
                        • \n
                        \n"; +},"useData":true}); +templates['ReportingSuperGroup'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                          \n
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:ReportingSuperGroup.ReportingGroup\n \n
                          • \n
                          • \n cim:ReportingSuperGroup.ReportingGroup\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['RotatingMachine'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:RotatingMachine.p\n \n
                          • \n
                          • \n cim:RotatingMachine.q\n \n
                          • \n
                          • \n cim:RotatingMachine.ratedPowerFactor\n \n
                          • \n
                          • \n cim:RotatingMachine.ratedS\n \n
                          • \n
                          • \n cim:RotatingMachine.ratedU\n \n
                          • \n
                          • \n cim:RotatingMachine.HydroPump\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['Sectionaliser'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['SeriesCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SeriesCompensator.r\n \n
                          • \n
                          • \n cim:SeriesCompensator.r0\n \n
                          • \n
                          • \n cim:SeriesCompensator.varistorPresent\n \n
                          • \n
                          • \n cim:SeriesCompensator.varistorRatedCurrent\n \n
                          • \n
                          • \n cim:SeriesCompensator.varistorVoltageThreshold\n \n
                          • \n
                          • \n cim:SeriesCompensator.x\n \n
                          • \n
                          • \n cim:SeriesCompensator.x0\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['ShuntCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:ShuntCompensator.aVRDelay\n \n
                          • \n
                          • \n cim:ShuntCompensator.grounded\n \n
                          • \n
                          • \n cim:ShuntCompensator.maximumSections\n \n
                          • \n
                          • \n cim:ShuntCompensator.nomU\n \n
                          • \n
                          • \n cim:ShuntCompensator.normalSections\n \n
                          • \n
                          • \n cim:ShuntCompensator.phaseConnection\n \n
                          • \n
                          • \n cim:ShuntCompensator.sections\n \n
                          • \n
                          • \n cim:ShuntCompensator.switchOnCount\n \n
                          • \n
                          • \n cim:ShuntCompensator.switchOnDate\n \n
                          • \n
                          • \n cim:ShuntCompensator.voltageSensitivity\n \n
                          • \n
                          • \n cim:ShuntCompensator.ShuntCompensatorPhase\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['ShuntCompensatorPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:ShuntCompensatorPhase.maximumSections\n \n
                          • \n
                          • \n cim:ShuntCompensatorPhase.normalSections\n \n
                          • \n
                          • \n cim:ShuntCompensatorPhase.phase\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['StaticVarCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:StaticVarCompensator.capacitiveRating\n \n
                          • \n
                          • \n cim:StaticVarCompensator.inductiveRating\n \n
                          • \n
                          • \n cim:StaticVarCompensator.q\n \n
                          • \n
                          • \n cim:StaticVarCompensator.slope\n \n
                          • \n
                          • \n cim:StaticVarCompensator.sVCControlMode\n \n
                          • \n
                          • \n cim:StaticVarCompensator.voltageSetPoint\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['SubGeographicalRegion'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SubGeographicalRegion.Lines\n \n
                          • \n
                          • \n cim:SubGeographicalRegion.Substations\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['Substation'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:Substation.VoltageLevels\n \n
                          • \n
                          • \n cim:Substation.Bays\n \n
                          • \n
                          • \n cim:Substation.DCConverterUnit\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['Switch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:Switch.normalOpen\n \n
                          • \n
                          • \n cim:Switch.open\n \n
                          • \n
                          • \n cim:Switch.ratedCurrent\n \n
                          • \n
                          • \n cim:Switch.retained\n \n
                          • \n
                          • \n cim:Switch.switchOnCount\n \n
                          • \n
                          • \n cim:Switch.switchOnDate\n \n
                          • \n
                          • \n cim:Switch.SwitchPhase\n \n
                          • \n
                          • \n cim:Switch.SwitchSchedules\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['SwitchPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SwitchPhase.closed\n \n
                          • \n
                          • \n cim:SwitchPhase.normalOpen\n \n
                          • \n
                          • \n cim:SwitchPhase.phaseSide1\n \n
                          • \n
                          • \n cim:SwitchPhase.phaseSide2\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['SwitchSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['SynchronousMachine'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SynchronousMachine.aVRToManualLag\n \n
                          • \n
                          • \n cim:SynchronousMachine.aVRToManualLead\n \n
                          • \n
                          • \n cim:SynchronousMachine.baseQ\n \n
                          • \n
                          • \n cim:SynchronousMachine.condenserP\n \n
                          • \n
                          • \n cim:SynchronousMachine.coolantCondition\n \n
                          • \n
                          • \n cim:SynchronousMachine.coolantType\n \n
                          • \n
                          • \n cim:SynchronousMachine.earthing\n \n
                          • \n
                          • \n cim:SynchronousMachine.earthingStarPointR\n \n
                          • \n
                          • \n cim:SynchronousMachine.earthingStarPointX\n \n
                          • \n
                          • \n cim:SynchronousMachine.ikk\n \n
                          • \n
                          • \n cim:SynchronousMachine.manualToAVR\n \n
                          • \n
                          • \n cim:SynchronousMachine.maxQ\n \n
                          • \n
                          • \n cim:SynchronousMachine.maxU\n \n
                          • \n
                          • \n cim:SynchronousMachine.minQ\n \n
                          • \n
                          • \n cim:SynchronousMachine.minU\n \n
                          • \n
                          • \n cim:SynchronousMachine.mu\n \n
                          • \n
                          • \n cim:SynchronousMachine.operatingMode\n \n
                          • \n
                          • \n cim:SynchronousMachine.qPercent\n \n
                          • \n
                          • \n cim:SynchronousMachine.r\n \n
                          • \n
                          • \n cim:SynchronousMachine.r0\n \n
                          • \n
                          • \n cim:SynchronousMachine.r2\n \n
                          • \n
                          • \n cim:SynchronousMachine.referencePriority\n \n
                          • \n
                          • \n cim:SynchronousMachine.satDirectSubtransX\n \n
                          • \n
                          • \n cim:SynchronousMachine.satDirectSyncX\n \n
                          • \n
                          • \n cim:SynchronousMachine.satDirectTransX\n \n
                          • \n
                          • \n cim:SynchronousMachine.shortCircuitRotorType\n \n
                          • \n
                          • \n cim:SynchronousMachine.type\n \n
                          • \n
                          • \n cim:SynchronousMachine.voltageRegulationRange\n \n
                          • \n
                          • \n cim:SynchronousMachine.x0\n \n
                          • \n
                          • \n cim:SynchronousMachine.x2\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['TapChangerControl'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:TapChangerControl.limitVoltage\n \n
                          • \n
                          • \n cim:TapChangerControl.lineDropCompensation\n \n
                          • \n
                          • \n cim:TapChangerControl.lineDropR\n \n
                          • \n
                          • \n cim:TapChangerControl.lineDropX\n \n
                          • \n
                          • \n cim:TapChangerControl.reverseLineDropR\n \n
                          • \n
                          • \n cim:TapChangerControl.reverseLineDropX\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['TapChanger'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:TapChanger.controlEnabled\n \n
                          • \n
                          • \n cim:TapChanger.highStep\n \n
                          • \n
                          • \n cim:TapChanger.initialDelay\n \n
                          • \n
                          • \n cim:TapChanger.lowStep\n \n
                          • \n
                          • \n cim:TapChanger.ltcFlag\n \n
                          • \n
                          • \n cim:TapChanger.neutralStep\n \n
                          • \n
                          • \n cim:TapChanger.neutralU\n \n
                          • \n
                          • \n cim:TapChanger.normalStep\n \n
                          • \n
                          • \n cim:TapChanger.step\n \n
                          • \n
                          • \n cim:TapChanger.subsequentDelay\n \n
                          • \n
                          • \n cim:TapChanger.TapChangerControl\n \n
                          • \n
                          \n"; +},"useData":true}); +templates['TapSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                            \n
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TapSchedule.TapChanger\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['Terminal'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:Terminal.phases\n \n
                            • \n
                            • \n cim:Terminal.ConnectivityNode\n \n
                            • \n
                            • \n cim:Terminal.ConductingEquipment\n \n
                            • \n
                            • \n cim:Terminal.RegulatingControl\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TopologicalIsland'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TopologicalIsland.TopologicalNodes\n \n
                            • \n
                            • \n cim:TopologicalIsland.AngleRefTopologicalNode\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TopologicalNode'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TopologicalNode.pInjection\n \n
                            • \n
                            • \n cim:TopologicalNode.qInjection\n \n
                            • \n
                            • \n cim:TopologicalNode.ReportingGroup\n \n
                            • \n
                            • \n cim:TopologicalNode.ConnectivityNodeContainer\n \n
                            • \n
                            • \n cim:TopologicalNode.BaseVoltage\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TransformerCoreAdmittance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.b\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.b0\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.g\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.g0\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.TransformerEnd\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TransformerEnd'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerEnd.bmagSat\n \n
                            • \n
                            • \n cim:TransformerEnd.endNumber\n \n
                            • \n
                            • \n cim:TransformerEnd.grounded\n \n
                            • \n
                            • \n cim:TransformerEnd.magBaseU\n \n
                            • \n
                            • \n cim:TransformerEnd.magSatFlux\n \n
                            • \n
                            • \n cim:TransformerEnd.rground\n \n
                            • \n
                            • \n cim:TransformerEnd.xground\n \n
                            • \n
                            • \n cim:TransformerEnd.PhaseTapChanger\n \n
                            • \n
                            • \n cim:TransformerEnd.StarImpedance\n \n
                            • \n
                            • \n cim:TransformerEnd.RatioTapChanger\n \n
                            • \n
                            • \n cim:TransformerEnd.BaseVoltage\n \n
                            • \n
                            • \n cim:TransformerEnd.Terminal\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TransformerMeshImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.r\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.r0\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.x\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.x0\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.ToTransformerEnd\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.FromTransformerEnd\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TransformerStarImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.r\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.r0\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.x\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.x0\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TransformerTankEnd'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerTankEnd.phases\n \n
                            • \n
                            • \n cim:TransformerTankEnd.TransformerTank\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['TransformerTank'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerTank.PowerTransformer\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['VoltageControlZone'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            \n"; +},"useData":true}); +templates['VoltageLevel'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; + + return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:VoltageLevel.highVoltageLimit\n \n
                            • \n
                            • \n cim:VoltageLevel.lowVoltageLimit\n \n
                            • \n
                            • \n cim:VoltageLevel.Bays\n \n
                            • \n
                            • \n cim:VoltageLevel.BaseVoltage\n \n
                            • \n
                            \n"; +},"useData":true}); +})(); diff --git a/public/index.html b/public/index.html index 2775a2d..7c7f981 100644 --- a/public/index.html +++ b/public/index.html @@ -27,5 +27,12 @@ To begin the development, run `npm start`. To create a production bundle, use `npm run build`. --> + + + + + + + diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js new file mode 100644 index 0000000..c6764bc --- /dev/null +++ b/src/components/widget-topology.js @@ -0,0 +1,84 @@ +/** + * File: widget-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 + * 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'; + +const pinturaGridStyle = { + display: 'none' +} + +class WidgetTopology extends React.Component { + constructor(props) { + super(props); + this.input = null; + this.svgElem = null; + } + + componentDidMount() { + if (this.svgElem) { + window.cimsvg.setSVG(this.svgElem); + window.cimview.init(this.svgElem); + } + } + + fileReader(e) { + let files = e.target.files; + if (files) { + window.cimxml.clearXmlData() + window.cimsvg.setFileCount(files.length); + for (var i=0, f; i < files.length; i++) { + f=files[i]; + if (!f) { + return; + } + var reader = new FileReader(); + reader.onload = function(e) { + var contents = e.target.result; + window.cimsvg.loadFile(contents); + }; + reader.readAsText(f); + } + } + } + + render() { + + let svgLabelStyles = { + 'fontSize': '10pt', + 'fill': 'white' + } + + return (
                            + this.input = c} type="file" multiple="true" onChange={ e => this.fileReader(e)} /> + this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> + + + + + console.log('I (%o) was clicked!') } x="2" y="6" width="70" height="20" /> + Click Me! + + +
                            ); + } +} + +export default WidgetTopology; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index cf8d09f..8ae5856 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -482,6 +482,7 @@ class Visualization extends React.Component { +
                            { editingControls } diff --git a/src/containers/widget.js b/src/containers/widget.js index 2242464..b0e03a4 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -43,6 +43,7 @@ import WidgetSlider from '../components/widget-slider'; import WidgetGauge from '../components/widget-gauge'; import WidgetBox from '../components/widget-box'; import WidgetHTML from '../components/widget-html'; +import WidgetTopology from '../components/widget-topology'; import '../styles/widgets.css'; @@ -188,6 +189,8 @@ class Widget extends React.Component { element = } else if (widget.type === 'HTML') { element = + } else if (widget.type === 'Topology') { + element = } const widgetClasses = classNames({ From 3f1c2ade0a2166d1f9e7e0025b044ba0e542165b Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 Jan 2018 15:43:41 +0100 Subject: [PATCH 393/556] added pan/zoom capabilities to pintura topology --- package.json | 1 + public/Pintura/js/cimjson.js | 6 ++++- src/components/widget-topology.js | 43 ++++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index a1088d2..f1125c4 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "react-router-dom": "^4.1.2", "react-scripts": "1.0.10", "react-sortable-tree": "^0.1.19", + "react-svg-pan-zoom": "^2.14.1", "superagent": "^3.5.0" }, "devDependencies": { diff --git a/public/Pintura/js/cimjson.js b/public/Pintura/js/cimjson.js index 9bb2e89..957c369 100644 --- a/public/Pintura/js/cimjson.js +++ b/public/Pintura/js/cimjson.js @@ -18,6 +18,7 @@ var cimjson = cimjson || (function() { + var pathBase = ''; const imageNames = { "cim:ACLineSegment": "images/term.svg", "cim:Terminal": "images/term.svg", @@ -36,7 +37,7 @@ var cimjson = cimjson || (function() { const PinturaDiagramObjectPoints = "Pintura:DiagramObjectPoints"; var getImageName = function(type) { - return imageNames[type]; + return pathBase + imageNames[type]; } var convertDiagramObjectToTemplateFormat = function(diagramObject, graph, categoryGraphName, diagramList) { @@ -186,6 +187,9 @@ var cimjson = cimjson || (function() { }; return { + setImagePathBase : function(path) { + pathBase = path; + }, getTemplateJson, }; }()); diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index c6764bc..529d958 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -20,22 +20,35 @@ ******************************************************************************/ import React from 'react'; +import {ReactSVGPanZoom} from 'react-svg-pan-zoom'; const pinturaGridStyle = { display: 'none' } +const pinturaBackingStyle = { + fill: 'transparent' +} + class WidgetTopology extends React.Component { constructor(props) { super(props); this.input = null; this.svgElem = null; + this.Viewer = null; } componentDidMount() { if (this.svgElem) { - window.cimsvg.setSVG(this.svgElem); + window.cimjson.setImagePathBase(process.env.PUBLIC_URL + '/Pintura/'); + window.cimsvg.setSVG(this.svgElem); // function not available in upstream source window.cimview.init(this.svgElem); + window.onMouseLeave = function() {}; + window.onMouseOver = function() {}; + window.onMouseLeave = function() {}; + window.onMouseUp = function() {}; + window.onMouseDown = function() {}; + window.onMouseMove = function() {}; } } @@ -68,15 +81,25 @@ class WidgetTopology extends React.Component { return (
                            this.input = c} type="file" multiple="true" onChange={ e => this.fileReader(e)} /> - this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> - - - - - console.log('I (%o) was clicked!') } x="2" y="6" width="70" height="20" /> - Click Me! - - + this.Viewer = Viewer} + style={{outline: "1px solid black"}} + detectAutoPan={false} + width={this.props.widget.width-2} height={this.props.widget.height-2} + onClick={event => console.log('click', event.x, event.y, event.originalEvent)} + onMouseMove={event => console.log('move', event.x, event.y)} > + + this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> + + + + + console.log('I (%o) was clicked!') } x="2" y="6" width="70" height="20" /> + Click Me! + + + +
                            ); } } From 2b0d69f03a359f04bd6c936383d1d56ca477f1e5 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Tue, 9 Jan 2018 17:16:41 +0100 Subject: [PATCH 394/556] Upload CIM model and retrieve it to/from backend and show spinner while loading. --- .../dialog/edit-widget-control-creator.js | 11 +- src/components/dialog/edit-widget.js | 8 +- src/components/widget-topology.js | 113 +++++++++++------- src/containers/widget.js | 2 +- src/styles/simple-spinner.css | 19 +++ 5 files changed, 105 insertions(+), 48 deletions(-) create mode 100644 src/styles/simple-spinner.css diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 22fe5c6..2c503ba 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -83,8 +83,10 @@ 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')); dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; @@ -141,6 +143,13 @@ export default function createControls(widgetType = null, widget = null, session handleChange(e)} /> ); break; + case 'Topology': + // Restrict to only xml files (MIME) + let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); + dialogControls.push( + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + ); + break; default: console.log('Non-valid widget type: ' + widgetType); diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index 0528938..daf51fe 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -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; } @@ -90,8 +90,10 @@ class EditWidgetDialog extends React.Component { } else if (e.target.id === 'file') { changeObject[e.target.id] = e.target.value; - // get file and update size - changeObject = this.assignAspectRatio(changeObject, 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') { diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index 529d958..796d18e 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -21,21 +21,47 @@ import React from 'react'; import {ReactSVGPanZoom} from 'react-svg-pan-zoom'; +import config from '../config'; +import '../styles/simple-spinner.css'; + +// Do not show Pintura's grid const pinturaGridStyle = { display: 'none' } +// Avoid another color in the frontend const pinturaBackingStyle = { fill: 'transparent' } +// Center spinner +const spinnerContainerStyle = { + width: '100%', + height: '100%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center' +} + +// Topology failed message +const msgContainerStyle = Object.assign({ + backgroundColor: '#ececec' +},spinnerContainerStyle) + +const failedMsgStyle = { + fontWeight: 'bold' +} + class WidgetTopology extends React.Component { constructor(props) { super(props); - this.input = null; this.svgElem = null; this.Viewer = null; + + this.state = { + visualizationState: 'initial' + }; } componentDidMount() { @@ -52,55 +78,56 @@ class WidgetTopology extends React.Component { } } - fileReader(e) { - let files = e.target.files; - if (files) { - window.cimxml.clearXmlData() - window.cimsvg.setFileCount(files.length); - for (var i=0, f; i < files.length; i++) { - f=files[i]; - if (!f) { - return; + 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 (file) { + fetch(new Request('/' + config.publicPathBase + file.path)) + .then( response => { + if (response.status === 200) { + this.setState({'visualizationState': 'ready' }); + window.cimxml.clearXmlData() + window.cimsvg.setFileCount(1); + response.text().then( contents => window.cimsvg.loadFile(contents)); + } else { + throw new Error('Request failed'); } - var reader = new FileReader(); - reader.onload = function(e) { - var contents = e.target.result; - window.cimsvg.loadFile(contents); - }; - reader.readAsText(f); - } + }) + .catch(error => { + this.setState({'visualizationState': 'failed' }); + }); + } } } render() { + var markup = null; - let svgLabelStyles = { - 'fontSize': '10pt', - 'fill': 'white' + switch(this.state.visualizationState) { + case 'loading': + markup =
                            ; break; + case 'failed': + markup =
                            Topology could not be loaded
                            ; break; + default: + markup = (
                            + this.Viewer = Viewer} + style={{outline: "1px solid black"}} + detectAutoPan={false} + width={this.props.widget.width-2} height={this.props.widget.height-2} > + + this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> + + + + + + +
                            ); } - - return (
                            - this.input = c} type="file" multiple="true" onChange={ e => this.fileReader(e)} /> - this.Viewer = Viewer} - style={{outline: "1px solid black"}} - detectAutoPan={false} - width={this.props.widget.width-2} height={this.props.widget.height-2} - onClick={event => console.log('click', event.x, event.y, event.originalEvent)} - onMouseMove={event => console.log('move', event.x, event.y)} > - - this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> - - - - - console.log('I (%o) was clicked!') } x="2" y="6" width="70" height="20" /> - Click Me! - - - - -
                            ); + return markup; } } diff --git a/src/containers/widget.js b/src/containers/widget.js index b0e03a4..7ebd0aa 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -190,7 +190,7 @@ class Widget extends React.Component { } else if (widget.type === 'HTML') { element = } else if (widget.type === 'Topology') { - element = + element = } const widgetClasses = classNames({ diff --git a/src/styles/simple-spinner.css b/src/styles/simple-spinner.css new file mode 100644 index 0000000..c86368a --- /dev/null +++ b/src/styles/simple-spinner.css @@ -0,0 +1,19 @@ + +/* + Basic spinner animation + taken from: https://www.w3schools.com/howto/howto_css_loader.asp +*/ + +.loader { + border: 16px solid #f3f3f3; + border-top: 16px solid #6ea2b0; + border-radius: 50%; + width: 120px; + height: 120px; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} From bf1f4513fd445c30df519d4d0dc8935e305ba628 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 10 Jan 2018 13:58:25 +0100 Subject: [PATCH 395/556] notify if no topology model has been selected. --- src/components/widget-topology.js | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index 796d18e..5181f83 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -49,7 +49,7 @@ const msgContainerStyle = Object.assign({ backgroundColor: '#ececec' },spinnerContainerStyle) -const failedMsgStyle = { +const msgStyle = { fontWeight: 'bold' } @@ -78,6 +78,11 @@ class WidgetTopology extends React.Component { } } + attachComponentEvents() { + window.onMouseOver = (e) => console.log(e); + window.onMouseLeave = (e) => console.log(e); + } + componentWillReceiveProps(nextProps) { const file = nextProps.files.find(file => file._id === nextProps.widget.file); // Ensure model is requested only once or a different was selected @@ -90,15 +95,27 @@ class WidgetTopology extends React.Component { this.setState({'visualizationState': 'ready' }); window.cimxml.clearXmlData() window.cimsvg.setFileCount(1); - response.text().then( contents => window.cimsvg.loadFile(contents)); + response.text().then( contents => { + window.cimsvg.loadFile(contents); + this.attachComponentEvents(); + }); } else { throw new Error('Request failed'); } }) .catch(error => { - this.setState({'visualizationState': 'failed' }); + this.setState({ + 'visualizationState': 'show_message', + 'message': 'Topology could not be loaded.'}); }); } + } else { + // No file has been selected + if (!nextProps.widget.file) { + this.setState({ + 'visualizationState': 'show_message', + 'message': 'Select a topology model first.'}); + } } } @@ -108,8 +125,8 @@ class WidgetTopology extends React.Component { switch(this.state.visualizationState) { case 'loading': markup =
                            ; break; - case 'failed': - markup =
                            Topology could not be loaded
                            ; break; + case 'show_message': + markup =
                            { this.state.message }
                            ; break; default: markup = (
                            Date: Wed, 10 Jan 2018 14:37:12 +0100 Subject: [PATCH 396/556] deinitialize window functions when unmounting topology widget --- src/components/widget-topology.js | 33 +++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index 5181f83..8fca895 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -53,6 +53,32 @@ const msgStyle = { fontWeight: 'bold' } +// Initialize functions +function attachComponentEvents() { + window.onMouseOver = (e) => show(textSibling(e)); + window.onMouseLeave = (e) => hide(textSibling(e)); +} + +function textSibling(e) { + // Find sibling text element and toggle its visibility + let gParent = e.target.parentElement; + return gParent.getElementsByTagName('text')[0]; +} + +function show(element) { + element.style.visibility = 'inherit'; +} + +function hide(element) { + element.style.visibility = 'hidden'; +} + +// De-initialize functions +function detachComponentEvents() { + window.onMouseOver = null; + window.onMouseLeave = null; +} + class WidgetTopology extends React.Component { constructor(props) { super(props); @@ -78,9 +104,8 @@ class WidgetTopology extends React.Component { } } - attachComponentEvents() { - window.onMouseOver = (e) => console.log(e); - window.onMouseLeave = (e) => console.log(e); + componentWillUnmount() { + detachComponentEvents(); } componentWillReceiveProps(nextProps) { @@ -97,7 +122,7 @@ class WidgetTopology extends React.Component { window.cimsvg.setFileCount(1); response.text().then( contents => { window.cimsvg.loadFile(contents); - this.attachComponentEvents(); + attachComponentEvents(); }); } else { throw new Error('Request failed'); From b08c40de391484d5c439335eb932d7a64b40cba9 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 10 Jan 2018 16:17:12 +0100 Subject: [PATCH 397/556] Proper Pintura loading error handling (nested promise) --- src/components/widget-topology.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index 8fca895..bab361b 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -120,7 +120,7 @@ class WidgetTopology extends React.Component { this.setState({'visualizationState': 'ready' }); window.cimxml.clearXmlData() window.cimsvg.setFileCount(1); - response.text().then( contents => { + return response.text().then( contents => { window.cimsvg.loadFile(contents); attachComponentEvents(); }); From 3174750fb7f4fd047ad64bc6ff67ddc87dad28b1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 10 Jan 2018 16:50:43 +0100 Subject: [PATCH 398/556] Initial widget topology size --- src/components/widget-factory.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 0126b8f..9cae22a 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -143,6 +143,10 @@ class WidgetFactory { case 'HTML': widget.content = 'Hello World'; break; + case 'Topology': + widget.width = 600; + widget.height = 400; + break; default: widget.width = 100; From b5ec30f647f278f5d3e4cfe50524e6156209a1af Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Wed, 10 Jan 2018 16:51:25 +0100 Subject: [PATCH 399/556] Restrict to one topology widget at the time --- src/components/toolbox-item.js | 4 ++-- src/containers/visualization.js | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js index 56b8b73..ff2a7cb 100644 --- a/src/components/toolbox-item.js +++ b/src/components/toolbox-item.js @@ -53,13 +53,13 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource( - + {this.props.name} , {dropEffect}); } else { return ( - + {this.props.name} ); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 8ae5856..1f30c13 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -454,6 +454,10 @@ class Visualization extends React.Component { ); + // 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 (
                            @@ -482,7 +486,7 @@ class Visualization extends React.Component { - +
                            { editingControls } From e7904d2bd727bc81eaf62a9daf2c686897517ba6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Tue, 6 Feb 2018 00:38:32 +0100 Subject: [PATCH 400/556] Add reverse channel for simulation data --- .gitignore | 2 +- src/api/websocket-api.js | 8 +- .../dialog/edit-simulation-model.js | 85 ++++++++++++------ .../dialog/edit-widget-control-creator.js | 16 +++- .../dialog/edit-widget-signal-control.js | 7 +- .../dialog/edit-widget-signals-control.js | 2 +- .../dialog/import-simulation-model.js | 85 ++++++++++++------ src/components/dialog/new-simulation-model.js | 86 +++++++++++++------ src/components/widget-factory.js | 6 ++ src/components/widget-gauge.js | 9 +- src/components/widget-lamp.js | 4 +- src/components/widget-plot-table.js | 4 +- src/components/widget-plot.js | 4 +- src/components/widget-slider.js | 8 +- src/components/widget-table.js | 14 +-- src/components/widget-value.js | 8 +- src/containers/visualization.js | 6 +- src/containers/widget.js | 11 ++- src/data-managers/rest-data-manager.js | 9 ++ src/data-managers/simulations-data-manager.js | 22 ++++- .../simulator-data-data-manager.js | 52 +++++++++-- src/stores/simulator-data-store.js | 56 +++++++++--- 22 files changed, 367 insertions(+), 137 deletions(-) diff --git a/.gitignore b/.gitignore index 0ca9d3f..801e1dd 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* .vscode/ - +*.code-workspace diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index 00d2f60..73b2dd4 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -26,10 +26,10 @@ class WebsocketAPI { socket.binaryType = 'arraybuffer'; // register callbacks - if (callbacks.onOpen) socket.addEventListener('open', event => callbacks.onOpen(event)); - if (callbacks.onClose) socket.addEventListener('close', event => callbacks.onClose(event)); - if (callbacks.onMessage) socket.addEventListener('message', event => callbacks.onMessage(event)); - if (callbacks.onError) socket.addEventListener('error', event => callbacks.onError(event)); + if (callbacks.onOpen) socket.onopen = callbacks.onOpen; + if (callbacks.onClose) socket.onclose = callbacks.onClose; + if (callbacks.onMessage) socket.onmessage = callbacks.onMessage; + if (callbacks.onError) socket.onerror = callbacks.onError; return socket; } diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 37cf0d7..9aacadd 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; import Table from '../table'; import TableColumn from '../table-column'; @@ -35,8 +35,10 @@ class EditSimulationModelDialog extends React.Component { this.state = { name: '', simulator: { node: '', simulator: '' }, - length: 1, - mapping: [{ name: 'Signal', type: 'Type' }] + outputLength: 1, + inputLength: 1, + outputMapping: [{ name: 'Signal', type: 'Type' }], + inputMapping: [{ name: 'Signal', type: 'Type' }] } } @@ -51,16 +53,24 @@ class EditSimulationModelDialog extends React.Component { } handleChange(e) { - if (e.target.id === 'length') { + let mapping = null; + + if (e.target.id === 'outputLength') { + mapping = this.state.outputMapping; + } else if (e.target.id === 'inputLength') { + mapping = this.state.inputMapping; + } + + if (mapping != null) { // change mapping size - if (e.target.value > this.state.mapping.length) { + if (e.target.value > mapping.length) { // add missing signals - while (this.state.mapping.length < e.target.value) { - this.state.mapping.push({ name: 'Signal', type: 'Type' }); + while (mapping.length < e.target.value) { + mapping.push({ name: 'Signal', type: 'Type' }); } } else { // remove signals - this.state.mapping.splice(e.target.value, this.state.mapping.length - e.target.value); + mapping.splice(e.target.value, mapping.length - e.target.value); } } @@ -72,8 +82,8 @@ class EditSimulationModelDialog extends React.Component { } } - handleMappingChange(event, row, column) { - var mapping = this.state.mapping; + handleMappingChange(key, event, row, column) { + const mapping = this.state[key]; if (column === 1) { mapping[row].name = event.target.value; @@ -81,37 +91,45 @@ class EditSimulationModelDialog extends React.Component { mapping[row].type = event.target.value; } - this.setState({ mapping: mapping }); + this.setState({ [key]: mapping }); } resetState() { this.setState({ name: this.props.data.name, simulator: this.props.data.simulator, - length: this.props.data.length, - mapping: this.props.data.mapping + outputLength: this.props.data.outputLength, + inputLength: this.props.data.inputLength, + outputMapping: this.props.data.outputMapping, + inputMapping: this.props.data.inputMapping }); } validateForm(target) { // check all controls var name = true; - var length = true; + let inputLength = true; + let outputLength = true; if (this.state.name === '') { name = false; } // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.length)) { - length = false; + if (!/^\d+$/.test(this.state.outputLength)) { + outputLength = false; } - this.valid = name && length; + if (!/^\d+$/.test(this.state.inputLength)) { + inputLength = false; + } + + this.valid = name && inputLength && outputLength; // return state to control if (target === 'name') return name ? "success" : "error"; - else if (target === 'length') return length ? "success" : "error"; + else if (target === 'outputLength') return outputLength ? "success" : "error"; + else if (target === 'inputLength') return inputLength ? "success" : "error"; } render() { @@ -133,17 +151,32 @@ class EditSimulationModelDialog extends React.Component { ))} - - Length - this.handleChange(e)} /> + + Output Length + this.handleChange(e)} /> - - Mapping - + + Output Mapping + Click Name or Type cell to edit +
                            - this.handleMappingChange(event, row, column)} /> - this.handleMappingChange(event, row, column)} /> + this.handleMappingChange('outputMapping', event, row, column)} /> + this.handleMappingChange('outputMapping', event, row, column)} /> +
                            +
                            + + Input Length + this.handleChange(e)} /> + + + + Input Mapping + Click Name or Type cell to edit + + + this.handleMappingChange('inputMapping', event, row, column)} /> + this.handleMappingChange('inputMapping', event, row, column)} />
                            diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 2c503ba..99ef3ba 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -117,13 +117,17 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Slider': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> ); break; case 'Button': dialogControls.push( validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> ); break; case 'Box': @@ -151,6 +155,14 @@ export default function createControls(widgetType = null, widget = null, session ); break; + case 'NumberInput': + dialogControls.push( + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + ); + break; + default: console.log('Non-valid widget type: ' + widgetType); } diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index 98d9b06..b0deda1 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -46,7 +46,12 @@ class EditWidgetSignalControl extends Component { const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); // If simulation model update the signals to render - signalsToRender = simulationModel ? simulationModel.mapping : []; + if (this.props.input) { + signalsToRender = simulationModel ? simulationModel.inputMapping : []; + } else { + signalsToRender = simulationModel ? simulationModel.outputMapping : []; + } + } return ( diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index c52b928..7a0a595 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -61,7 +61,7 @@ class EditWidgetSignalsControl extends Component { const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); // If simulation model update the signals to render - signalsToRender = simulationModel? simulationModel.mapping : []; + signalsToRender = simulationModel? simulationModel.outputMapping : []; } return ( diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialog/import-simulation-model.js index c2ce502..196e885 100644 --- a/src/components/dialog/import-simulation-model.js +++ b/src/components/dialog/import-simulation-model.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; import Table from '../table'; import TableColumn from '../table-column'; @@ -36,8 +36,10 @@ class ImportSimulationModelDialog extends React.Component { this.state = { name: '', simulator: { node: '', simulator: '' }, - length: '1', - mapping: [ { name: 'Signal', type: 'Type' } ] + outputLength: '1', + inputLength: '1', + outputMapping: [ { name: 'Signal', type: 'Type' } ], + inputMapping: [{ name: 'Signal', type: 'Type' }] }; } @@ -53,24 +55,34 @@ class ImportSimulationModelDialog extends React.Component { this.setState({ name: '', simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, - length: '1', - mapping: [ { name: 'Signal', type: 'Type' } ] + outputLength: '1', + inputLength: '1', + outputMapping: [{ name: 'Signal', type: 'Type' }], + inputMapping: [{ name: 'Signal', type: 'Type' }] }); this.imported = false; } handleChange(e) { - if (e.target.id === 'length') { + let mapping = null; + + if (e.target.id === 'outputLength') { + mapping = this.state.outputMapping; + } else if (e.target.id === 'inputLength') { + mapping = this.state.inputMapping; + } + + if (mapping != null) { // change mapping size - if (e.target.value > this.state.mapping.length) { + if (e.target.value > mapping.length) { // add missing signals - while (this.state.mapping.length < e.target.value) { - this.state.mapping.push({ name: 'Signal', type: 'Type' }); + while (mapping.length < e.target.value) { + mapping.push({ name: 'Signal', type: 'Type' }); } } else { // remove signals - this.state.mapping.splice(e.target.value, this.state.mapping.length - e.target.value); + mapping.splice(e.target.value, mapping.length - e.target.value); } } @@ -81,8 +93,8 @@ class ImportSimulationModelDialog extends React.Component { } } - handleMappingChange(event, row, column) { - var mapping = this.state.mapping; + handleMappingChange(key, event, row, column) { + const mapping = this.state[key]; if (column === 1) { mapping[row].name = event.target.value; @@ -90,7 +102,7 @@ class ImportSimulationModelDialog extends React.Component { mapping[row].type = event.target.value; } - this.setState({ mapping: mapping }); + this.setState({ [key]: mapping }); } loadFile(fileList) { @@ -119,7 +131,8 @@ class ImportSimulationModelDialog extends React.Component { validateForm(target) { // check all controls var name = true; - var length = true; + let inputLength = true; + let outputLength = true; var simulator = true; if (this.state.name === '') { @@ -131,15 +144,20 @@ class ImportSimulationModelDialog extends React.Component { } // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.length)) { - length = false; + if (!/^\d+$/.test(this.state.outputLength)) { + outputLength = false; } - this.valid = name && length && simulator; + if (!/^\d+$/.test(this.state.inputLength)) { + inputLength = false; + } + + this.valid = name && inputLength && outputLength && simulator; // return state to control if (target === 'name') return name ? "success" : "error"; - else if (target === 'length') return length ? "success" : "error"; + else if (target === 'outputLength') return outputLength ? "success" : "error"; + else if (target === 'inputLength') return inputLength ? "success" : "error"; else if (target === 'simulator') return simulator ? "success" : "error"; } @@ -167,17 +185,32 @@ class ImportSimulationModelDialog extends React.Component { ))}
                            - - Length - this.handleChange(e)} /> + + Output Length + this.handleChange(e)} /> - - Mapping - + + Output Mapping + Click Name or Type cell to edit +
                            - this.handleMappingChange(event, row, column)} /> - this.handleMappingChange(event, row, column)} /> + this.handleMappingChange('outputMapping', event, row, column)} /> + this.handleMappingChange('outputMapping', event, row, column)} /> +
                            +
                            + + Input Length + this.handleChange(e)} /> + + + + Input Mapping + Click Name or Type cell to edit + + + this.handleMappingChange('inputMapping', event, row, column)} /> + this.handleMappingChange('inputMapping', event, row, column)} />
                            diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 9538b30..e94f562 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -35,8 +35,10 @@ class NewSimulationModelDialog extends React.Component { this.state = { name: '', simulator: { node: '', simulator: '' }, - length: '1', - mapping: [ { name: 'Signal', type: 'Type' } ] + outputLength: '1', + inputLength: '1', + outputMapping: [ { name: 'Signal', type: 'Type' } ], + inputMapping: [ { name: 'Signal', type: 'Type' } ] }; } @@ -51,16 +53,24 @@ class NewSimulationModelDialog extends React.Component { } handleChange(e) { - if (e.target.id === 'length') { + let mapping = null; + + if (e.target.id === 'outputLength') { + mapping = this.state.outputMapping; + } else if (e.target.id === 'inputLength') { + mapping = this.state.inputMapping; + } + + if (mapping != null) { // change mapping size - if (e.target.value > this.state.mapping.length) { + if (e.target.value > mapping.length) { // add missing signals - while (this.state.mapping.length < e.target.value) { - this.state.mapping.push({ name: 'Signal', type: 'Type' }); + while (mapping.length < e.target.value) { + mapping.push({ name: 'Signal', type: 'Type' }); } } else { // remove signals - this.state.mapping.splice(e.target.value, this.state.mapping.length - e.target.value); + mapping.splice(e.target.value, mapping.length - e.target.value); } } @@ -71,8 +81,8 @@ class NewSimulationModelDialog extends React.Component { } } - handleMappingChange(event, row, column) { - var mapping = this.state.mapping; + handleMappingChange(key, event, row, column) { + const mapping = this.state[key]; if (column === 1) { mapping[row].name = event.target.value; @@ -80,23 +90,26 @@ class NewSimulationModelDialog extends React.Component { mapping[row].type = event.target.value; } - this.setState({ mapping: mapping }); + this.setState({ [key]: mapping }); } resetState() { this.setState({ name: '', simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, - length: '1', - mapping: [ { name: 'Signal', type: 'Type' } ] + outputLength: '1', + inputLength: '1', + outputMapping: [{ name: 'Signal', type: 'Type' }], + inputMapping: [{ name: 'Signal', type: 'Type' }] }); } validateForm(target) { // check all controls - var name = true; - var length = true; - var simulator = true; + let name = true; + let inputLength = true; + let outputLength = true; + let simulator = true; if (this.state.name === '') { name = false; @@ -107,15 +120,20 @@ class NewSimulationModelDialog extends React.Component { } // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.length)) { - length = false; + if (!/^\d+$/.test(this.state.outputLength)) { + outputLength = false; } - this.valid = name && length && simulator; + if (!/^\d+$/.test(this.state.inputLength)) { + inputLength = false; + } + + this.valid = name && inputLength && outputLength && simulator; // return state to control if (target === 'name') return name ? "success" : "error"; - else if (target === 'length') return length ? "success" : "error"; + else if (target === 'outputLength') return outputLength ? "success" : "error"; + else if (target === 'inputLength') return inputLength ? "success" : "error"; else if (target === 'simulator') return simulator ? "success" : "error"; } @@ -138,18 +156,32 @@ class NewSimulationModelDialog extends React.Component { ))}
                            - - Length - this.handleChange(e)} /> + + Output Length + this.handleChange(e)} /> - - Mapping + + Output Mapping Click Name or Type cell to edit - +
                            - this.handleMappingChange(event, row, column)} /> - this.handleMappingChange(event, row, column)} /> + this.handleMappingChange('outputMapping', event, row, column)} /> + this.handleMappingChange('outputMapping', event, row, column)} /> +
                            +
                            + + Input Length + this.handleChange(e)} /> + + + + Input Mapping + Click Name or Type cell to edit + + + this.handleMappingChange('inputMapping', event, row, column)} /> + this.handleMappingChange('inputMapping', event, row, column)} />
                            diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 9cae22a..87f31dd 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -105,12 +105,16 @@ class WidgetFactory { widget.height = 100; widget.background_color = 1; widget.font_color = 0; + widget.simulator = defaultSimulator; + widget.signal = 0; break; case 'NumberInput': widget.minWidth = 200; widget.minHeight = 50; widget.width = 200; widget.height = 50; + widget.simulator = defaultSimulator; + widget.signal = 0; break; case 'Slider': widget.minWidth = 380; @@ -118,6 +122,8 @@ class WidgetFactory { widget.width = 400; widget.height = 50; widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation + widget.simulator = defaultSimulator; + widget.signal = 0; break; case 'Gauge': widget.simulator = defaultSimulator; diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 5fc4153..cb23d31 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -40,15 +40,14 @@ class WidgetGauge extends Component { if (nextProps.data == null || nextProps.data[simulator.node] == null || nextProps.data[simulator.node][simulator.simulator] == null - || nextProps.data[simulator.node][simulator.simulator].length === 0 - || nextProps.data[simulator.node][simulator.simulator].values.length === 0 - || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { + || nextProps.data[simulator.node][simulator.simulator].output.values.length === 0 + || nextProps.data[simulator.node][simulator.simulator].output.values[0].length === 0) { this.setState({ value: 0 }); return; } // check if value has changed - const signal = nextProps.data[simulator.node][simulator.simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[simulator.node][simulator.simulator].output.values[nextProps.widget.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) { @@ -180,7 +179,7 @@ class WidgetGauge extends Component { if (this.props.simulation) { const simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; - signalType = (simulationModel != null && simulationModel.length > 0 && this.props.widget.signal < simulationModel.length) ? simulationModel.mapping[this.props.widget.signal].type : ''; + signalType = (simulationModel != null && simulationModel.length > 0 && this.props.widget.signal < simulationModel.length) ? simulationModel.outputMapping[this.props.widget.signal].type : ''; } return ( diff --git a/src/components/widget-lamp.js b/src/components/widget-lamp.js index 83d228c..db2fa06 100644 --- a/src/components/widget-lamp.js +++ b/src/components/widget-lamp.js @@ -38,13 +38,13 @@ class WidgetLamp extends Component { const simulator = nextProps.widget.simulator.simulator; const node = nextProps.widget.simulator.node; - if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].values == null) { + if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].output.values == null) { this.setState({ value: '' }); return; } // check if value has changed - const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[node][simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 3d32284..3cba4c7 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -71,7 +71,7 @@ class WidgetPlotTable extends Component { // Proceed if a simulation model is available if (simulationModel) { // Create checkboxes using the signal indices from simulation model - preselectedSignals = simulationModel.mapping.reduce( + preselectedSignals = simulationModel.outputMapping.reduce( // Loop through simulation model signals (accum, model_signal, signal_index) => { // Append them if they belong to the current selected type @@ -107,7 +107,7 @@ class WidgetPlotTable extends Component { let simulatorData = []; if (this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null) { - simulatorData = this.props.data[simulator.node][simulator.simulator].values.filter((values, index) => ( + simulatorData = this.props.data[simulator.node][simulator.simulator].output.values.filter((values, index) => ( this.props.widget.signals.findIndex(value => value === index) !== -1 )); } diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 4aaad39..c492f3f 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -43,12 +43,12 @@ class WidgetPlot extends React.Component { const model = simulation.models.find(model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); const chosenSignals = nextProps.widget.signals; - const data = nextProps.data[simulator.node][simulator.simulator].values.filter((values, index) => ( + const data = nextProps.data[simulator.node][simulator.simulator].output.values.filter((values, index) => ( nextProps.widget.signals.findIndex(value => value === index) !== -1 )); // Query the signals that will be displayed in the legend - const legend = model.mapping.reduce( (accum, model_signal, signal_index) => { + const legend = model.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 }); } diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index 2ea720c..d242de9 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -55,11 +55,9 @@ class WidgetSlider extends Component { } valueChanged(newValue) { - // Enable to propagate action - // let newWidget = Object.assign({}, this.props.widget, { - // value: newValue - // }); - // this.props.onWidgetChange(newWidget); + if (this.props.onInputChanged) { + this.props.onInputChanged(newValue); + } } render() { diff --git a/src/components/widget-table.js b/src/components/widget-table.js index e72bca7..625b84b 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -40,9 +40,9 @@ class WidgetTable extends Component { if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator.node] == null || nextProps.data[simulator.node][simulator.simulator] == null - || nextProps.data[simulator.node][simulator.simulator].length === 0 - || nextProps.data[simulator.node][simulator.simulator].values.length === 0 - || nextProps.data[simulator.node][simulator.simulator].values[0].length === 0) { + || nextProps.data[simulator.node][simulator.simulator].output.length === 0 + || nextProps.data[simulator.node][simulator.simulator].output.values.length === 0 + || nextProps.data[simulator.node][simulator.simulator].output.values[0].length === 0) { // clear values this.setState({ rows: [], sequence: null }); return; @@ -61,16 +61,16 @@ class WidgetTable extends Component { // get rows var rows = []; - nextProps.data[simulator.node][simulator.simulator].values.forEach((signal, index) => { - if (index < simulationModel.mapping.length) { + nextProps.data[simulator.node][simulator.simulator].output.values.forEach((signal, index) => { + if (index < simulationModel.outputMapping.length) { rows.push({ - name: simulationModel.mapping[index].name, + name: simulationModel.outputMapping[index].name, value: signal[signal.length - 1].y.toFixed(3) }); } }); - this.setState({ rows: rows, sequence: nextProps.data[simulator.node][simulator.simulator].sequence }); + this.setState({ rows: rows, sequence: nextProps.data[simulator.node][simulator.simulator].output.sequence }); } render() { diff --git a/src/components/widget-value.js b/src/components/widget-value.js index 4744d22..fc8b6d0 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -36,7 +36,7 @@ class WidgetValue extends Component { const simulator = nextProps.widget.simulator.simulator; const node = nextProps.widget.simulator.node; - if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].values == null) { + if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].output.values == null) { this.setState({ value: '' }); return; } @@ -47,13 +47,13 @@ class WidgetValue extends Component { if (nextProps.simulation) { const simulationModel = nextProps.simulation.models.find(model => model.simulator.node === node && model.simulator.simulator === simulator); - if (nextProps.widget.signal < simulationModel.mapping.length) { - unit = simulationModel.mapping[nextProps.widget.signal].type; + if (nextProps.widget.signal < simulationModel.outputMapping.length) { + unit = simulationModel.outputMapping[nextProps.widget.signal].type; } } // check if value has changed - const signal = nextProps.data[node][simulator].values[nextProps.widget.signal]; + const signal = nextProps.data[node][simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y, unit }); } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 1f30c13..b42720f 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -480,9 +480,9 @@ class Visualization extends React.Component { - - - + + + diff --git a/src/containers/widget.js b/src/containers/widget.js index 7ebd0aa..bab9d79 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -153,6 +153,15 @@ class Widget extends React.Component { } } + inputDataChanged(widget, data) { + AppDispatcher.dispatch({ + type: 'simulatorData/inputChanged', + simulator: widget.simulator, + signal: widget.signal, + data + }); + } + render() { // configure grid const grid = [this.props.grid, this.props.grid]; @@ -182,7 +191,7 @@ class Widget extends React.Component { } else if (widget.type === 'NumberInput') { element = } else if (widget.type === 'Slider') { - element = this.props.onWidgetStatusChange(w, this.props.index) } /> + element = this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={(value) => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { element = } else if (widget.type === 'Box') { diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index 2ae0a46..dbd278e 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -29,6 +29,7 @@ class RestDataManager { this.url = url; this.type = type; this.keyFilter = keyFilter; + this.onLoad = null; } makeURL(part) { @@ -61,6 +62,10 @@ class RestDataManager { type: this.type + 's/loaded', data: data }); + + if (this.onLoad != null) { + this.onLoad(data); + } }).catch(error => { AppDispatcher.dispatch({ type: this.type + 's/load-error', @@ -78,6 +83,10 @@ class RestDataManager { type: this.type + 's/loaded', data: data }); + + if (this.onLoad != null) { + this.onLoad(data); + } }).catch(error => { AppDispatcher.dispatch({ type: this.type + 's/load-error', diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index d5fdfde..bb9a6ba 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -20,5 +20,25 @@ ******************************************************************************/ import RestDataManager from './rest-data-manager'; +import AppDispatcher from '../app-dispatcher'; -export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models' ]); +class SimulationsDataManager extends RestDataManager { + constructor() { + super('simulation', '/simulations', [ '_id', 'name', 'projects', 'models' ]); + + this.onLoad = this.onSimulationsLoad; + } + + onSimulationsLoad(simulation) { + for (let model of simulation.models) { + AppDispatcher.dispatch({ + type: 'simulatorData/prepare', + inputLength: parseInt(model.inputLength, 10), + outputLength: parseInt(model.outputLength, 10), + node: model.simulator + }); + } + } +} + +export default new SimulationsDataManager(); diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 2f88c02..eee8e03 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -22,6 +22,9 @@ import WebsocketAPI from '../api/websocket-api'; import AppDispatcher from '../app-dispatcher'; +const OFFSET_TYPE = 2; +const OFFSET_VERSION = 4; + class SimulatorDataDataManager { constructor() { this._sockets = {}; @@ -34,14 +37,14 @@ class SimulatorDataDataManager { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node), onError: (error) => this.onError(error, node) }); } } else { // set flag if a socket to this simulator was already create before if (this._sockets[node._id] === null) { - this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node), onError: (error) => this.onError(error, node) }); } else { - this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node), onError: (error) => this.onError(error, node) }); } } } @@ -56,6 +59,18 @@ class SimulatorDataDataManager { } } + send(message, nodeId) { + const socket = this._sockets[nodeId]; + if (socket == null) { + return false; + } + + const data = this.messageToBuffer(message); + socket.send(data); + + return true; + } + onOpen(event, node, firstOpen) { AppDispatcher.dispatch({ type: 'simulatorData/opened', @@ -75,6 +90,10 @@ class SimulatorDataDataManager { delete this._sockets[node._id]; } + onError(error, node) { + console.error('Error on ' + node._id + ':' + error); + } + onMessage(event, node) { var msgs = this.bufferToMessageArray(event.data); @@ -93,9 +112,6 @@ class SimulatorDataDataManager { return null; } - const OFFSET_TYPE = 2; - const OFFSET_VERSION = 4; - const id = data.getUint8(1); const bits = data.getUint8(0); const length = data.getUint16(0x02, 1); @@ -130,6 +146,30 @@ class SimulatorDataDataManager { return msgs; } + + messageToBuffer(message) { + const buffer = new ArrayBuffer(16 + 4 * message.length); + const view = new DataView(buffer); + + let bits = 0; + bits |= (message.version & 0xF) << OFFSET_VERSION; + bits |= (message.type & 0x3) << OFFSET_TYPE; + + const sec = Math.floor(message.timestamp / 1e3); + const nsec = (message.timestamp - sec * 1e3) * 1e6; + + view.setUint8(0x00, bits, true); + view.setUint8(0x01, message.id, true); + view.setUint16(0x02, message.length, true); + view.setUint32(0x04, message.sequence, true); + view.setUint32(0x08, sec, true); + view.setUint32(0x0C, nsec, true); + + const data = new Float32Array(buffer, 0x10, message.length); + data.set(message.values); + + return buffer; + } } export default new SimulatorDataDataManager(); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 25a24d1..61864bf 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -46,11 +46,30 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/opened': // create entry for simulator state[action.node._id] = {}; + return state; - action.node.simulators.forEach((simulator, index) => { - state[action.node._id][index] = { sequence: -1, values: [] }; - }); + case 'simulatorData/prepare': + if (state[action.node.node] == null) { + return state; + } + state[action.node.node][action.node.simulator] = { + output: { + sequence: -1, + length: action.outputLength, + values: [] + }, + input: { + sequence: -1, + length: action.inputLength, + version: 2, + type: 0, + id: action.node.simulator, + timestamp: Date.now(), + values: new Array(action.inputLength).fill(0) + } + }; + return state; case 'simulatorData/data-changed': @@ -70,22 +89,22 @@ class SimulationDataStore extends ReduceStore { // add data to simulator for (i = 0; i < smp.length; i++) { - while (state[action.node._id][index].values.length < i + 1) { - state[action.node._id][index].values.push([]); + while (state[action.node._id][index].output.values.length < i + 1) { + state[action.node._id][index].output.values.push([]); } - state[action.node._id][index].values[i].push({ x: smp.timestamp, y: smp.values[i] }); + state[action.node._id][index].output.values[i].push({ x: smp.timestamp, y: smp.values[i] }); // erase old values - if (state[action.node._id][index].values[i].length > MAX_VALUES) { - const pos = state[action.node._id][index].values[i].length - MAX_VALUES; - state[action.node._id][index].values[i].splice(0, pos); + if (state[action.node._id][index].output.values[i].length > MAX_VALUES) { + const pos = state[action.node._id][index].output.values[i].length - MAX_VALUES; + state[action.node._id][index].output.values[i].splice(0, pos); } } // update metadata - state[action.node._id][index].timestamp = smp.timestamp; - state[action.node._id][index].sequence = smp.sequence; + state[action.node._id][index].output.timestamp = smp.timestamp; + state[action.node._id][index].output.sequence = smp.sequence; } // explicit call to prevent array copy @@ -93,6 +112,21 @@ class SimulationDataStore extends ReduceStore { return state; + case 'simulatorData/inputChanged': + // find simulator in node array + if (state[action.simulator.node] == null || state[action.simulator.node][action.simulator.simulator] == null) { + return state; + } + + // update message properties + state[action.simulator.node][action.simulator.simulator].input.timestamp = Date.now(); + state[action.simulator.node][action.simulator.simulator].input.sequence++; + state[action.simulator.node][action.simulator.simulator].input.values[action.signal] = action.data; + + SimulatorDataDataManager.send(state[action.simulator.node][action.simulator.simulator].input, action.simulator.node); + + return state; + case 'simulatorData/closed': // close and delete socket if (state[action.node] != null) { From 3c31ffb80261ace00adf522f9d609c198f4668af Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 6 Feb 2018 23:27:43 +0100 Subject: [PATCH 401/556] fixed README --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 793013d..c933425 100644 --- a/README.md +++ b/README.md @@ -24,16 +24,13 @@ We recommend Docker to get started quickly: ```bash $ git clone --recursive git@git.rwth-aachen.de:VILLASframework/VILLASweb.git +$ cd VILLASweb $ npm install -$ npm build -$ docker-compose up -$ ./sample-data.sh import +$ npm start ``` The default user and password are configured in the `config.js` file of the _backend_. By default they are: __admin__ / __admin__. -For development you can use `npm start` to spawn a local webserver. - ## Copyright 2017, Institute for Automation of Complex Power Systems, EONERC From 48f899ac906cf8233cd8488cb1f47624edb5d0c2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 7 Feb 2018 13:04:16 +0100 Subject: [PATCH 402/556] fix HTTPS issues for node endpoint urls --- src/api/websocket-api.js | 15 ++++++++++----- src/components/dialog/edit-node.js | 8 ++------ src/components/dialog/import-node.js | 12 ++++-------- src/components/dialog/new-node.js | 10 +++------- src/data-managers/nodes-data-manager.js | 11 ++++++----- 5 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index 73b2dd4..a5ceba1 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -35,11 +35,16 @@ class WebsocketAPI { } getURL(node) { - if (node.relativeEndpoint) { - return 'ws://' + window.location.host + '/' + node.endpoint; - } else { - return 'ws://' + node.endpoint; - } + // create an anchor element (note: no need to append this element to the document) + var link = document.createElement('a'); + link.href = node.endpoint; + + if (link.protocol === 'https:') + link.protocol = 'wss:'; + else + link.protocol = 'ws:'; + + return link.href; } } diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js index 19b2f8e..beba460 100644 --- a/src/components/dialog/edit-node.js +++ b/src/components/dialog/edit-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -35,7 +35,6 @@ class NewNodeDialog extends React.Component { endpoint: '', config: {}, simulators: [], - relativeEndpoint: false, _id: '' }; } @@ -59,7 +58,7 @@ class NewNodeDialog extends React.Component { } resetState() { - this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id, relativeEndpoint: this.props.node.relativeEndpoint }); + this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id }); } validateForm(target) { @@ -96,9 +95,6 @@ class NewNodeDialog extends React.Component { this.handleChange(e)} />
                            - - this.handleChange(e)}>Relative Endpoint -
    ); diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js index 1f35129..5401745 100644 --- a/src/components/dialog/import-node.js +++ b/src/components/dialog/import-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,8 +34,7 @@ class ImportNodeDialog extends React.Component { this.state = { name: '', endpoint: '', - simulators: [], - relativeEndpoint: false + simulators: [] }; } @@ -56,7 +55,7 @@ class ImportNodeDialog extends React.Component { } resetState() { - this.setState({ name: '', endpoint: '', relativeEndpoint: false }); + this.setState({ name: '', endpoint: '' }); this.imported = false; } @@ -76,7 +75,7 @@ class ImportNodeDialog extends React.Component { // read simulator const node = JSON.parse(event.target.result); self.imported = true; - self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators, relativeEndpoint: node.relativeEndpoint }); + self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators }); }; reader.readAsText(file); @@ -121,9 +120,6 @@ class ImportNodeDialog extends React.Component { this.handleChange(e)} /> - - this.handleChange(e)}>Relative Endpoint - ); diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index b0b4357..aedd1ee 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,8 +34,7 @@ class NewNodeDialog extends React.Component { name: '', endpoint: '', config: {}, - simulators: [], - relativeEndpoint: false + simulators: [] }; } @@ -58,7 +57,7 @@ class NewNodeDialog extends React.Component { } resetState() { - this.setState({ name: '', endpoint: '', config: {}, simulators: [], relativeEndpoint: false }); + this.setState({ name: '', endpoint: '', config: {}, simulators: [] }); } validateForm(target) { @@ -95,9 +94,6 @@ class NewNodeDialog extends React.Component { this.handleChange(e)} /> - - this.handleChange(e)}>Relative Endpoint - ); diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index 0a02419..2374a1f 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -29,11 +29,12 @@ class NodesDataManager extends RestDataManager { } getURL(node) { - if (node.relativeEndpoint) { - return 'http://' + window.location.host + '/' + node.endpoint + '/api/v1'; - } else { - return 'http://' + node.endpoint + '/api/v1'; - } + // create an anchor element (note: no need to append this element to the document) + var link = document.createElement('a'); + link.href = node.endpoint; + link.pathname = link.pathname + 'api/v1'; + + return link.href; } getSimulators(node) { From 7cae5047fb82b886ceaf14fdde5b9295dabb17a7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 8 Feb 2018 10:42:17 +0100 Subject: [PATCH 403/556] Fix widget edit dialogs tests --- .../components/dialog/edit-widget-control-creator.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 2719185..8e6d155 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -16,6 +16,8 @@ import EditWidgetCheckboxControl from '../../../components/dialog/edit-widget-ch import EditWidgetMinMaxControl from '../../../components/dialog/edit-widget-min-max-control'; import EditWidgetColorZonesControl from '../../../components/dialog/edit-widget-color-zones-control'; import EditWidgetHTMLContent from '../../../components/dialog/edit-widget-html-content'; +import editWidgetSimulatorControl from '../../../components/dialog/edit-widget-simulator-control'; +import editWidgetSignalControl from '../../../components/dialog/edit-widget-signal-control'; describe('edit widget control creator', () => { it('should not return null', () => { @@ -31,10 +33,12 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Slider' }, result: { controlNumber: 1, controlTypes: [EditWidgetOrientation] } }, - { args: { widgetType: 'Button' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl] } }, + { args: { widgetType: 'Slider' }, result: { controlNumber: 3, controlTypes: [EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, - { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } } + { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, + { args: { widgetType: 'HTML' }, result: { controlNumber: 1, controlTypes: [EditWidgetHTMLContent] } }, + { args: { widgetType: 'NumberInput'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, editWidgetSimulatorControl, editWidgetSignalControl] } } ]; runs.forEach( (run) => { From 4f540b33ae49c98500af5e63daccffdcc534cf3c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 8 Feb 2018 10:43:23 +0100 Subject: [PATCH 404/556] Fix test imports and update package-lock.json --- package-lock.json | 1587 ++++++++++++----- .../dialog/edit-widget-control-creator.js | 4 +- 2 files changed, 1156 insertions(+), 435 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed9a02b..e3c97f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,12 +59,10 @@ } } }, - "add-dom-event-listener": { - "version": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", - "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", - "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "add-event-listener": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", + "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" }, "address": { "version": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", @@ -245,11 +243,6 @@ "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, - "assertion-error": { - "version": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, "ast-types-flow": { "version": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" @@ -1340,16 +1333,58 @@ } }, "chai": { - "version": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", - "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "check-error": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "deep-eql": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "get-func-name": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "pathval": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "type-detect": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + }, + "dependencies": { + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "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 + } } }, "chalk": { @@ -1369,11 +1404,6 @@ } } }, - "check-error": { - "version": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, "chokidar": { "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", @@ -1527,21 +1557,6 @@ "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "component-classes": { - "version": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", - "requires": { - "component-indexof": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz" - } - }, - "component-emitter": { - "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-indexof": { - "version": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" - }, "compressible": { "version": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", @@ -1639,10 +1654,6 @@ "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "cookiejar": { - "version": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" - }, "core-js": { "version": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" @@ -1707,15 +1718,6 @@ "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" } }, - "create-react-class": { - "version": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", - "integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=", - "requires": { - "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, "cross-spawn": { "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", @@ -1747,13 +1749,6 @@ "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" } }, - "css-animation": { - "version": "https://registry.npmjs.org/css-animation/-/css-animation-1.3.2.tgz", - "integrity": "sha1-31FYIO9ZA3M60tsJmUA7MDe4uIA=", - "requires": { - "component-classes": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz" - } - }, "css-color-names": { "version": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" @@ -1958,52 +1953,66 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.0.tgz", - "integrity": "sha1-FH0mlyDhdMQFen9CvosPPyulMQg=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" }, "d3-axis": { "version": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" }, - "d3-collection": { - "version": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" - }, - "d3-color": { - "version": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", - "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" - }, - "d3-format": { - "version": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.0.tgz", - "integrity": "sha1-a0gLqohohdRlHcJIqPSsnaFtsHo=" - }, - "d3-interpolate": { - "version": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.5.tgz", - "integrity": "sha1-aeCZ/zkhRxblY8muw+qdHqS4p58=", - "requires": { - "d3-color": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz" - } - }, "d3-path": { "version": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" }, "d3-scale": { - "version": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz", - "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", "requires": { - "d3-array": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.0.tgz", - "d3-collection": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "d3-color": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", - "d3-format": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.0.tgz", - "d3-interpolate": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.5.tgz", - "d3-time": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz", - "d3-time-format": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.0.5.tgz" + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-format": "1.2.2", + "d3-interpolate": "1.1.6", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" + }, + "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.0.3" + } + }, + "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-selection": { - "version": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.1.0.tgz", - "integrity": "sha1-GZhoSJZIj4OcoDchI9o08dMYgJw=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", + "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" }, "d3-shape": { "version": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", @@ -2012,15 +2021,19 @@ "d3-path": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz" } }, - "d3-time": { - "version": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz", - "integrity": "sha1-lMr27bt4ebuAnQ0fdXK8SEgvcnA=" - }, "d3-time-format": { - "version": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.0.5.tgz", - "integrity": "sha1-nXeAIE98kRnJFwsaVttN6aivly4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { - "d3-time": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz" + "d3-time": "1.0.8" + }, + "dependencies": { + "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==" + } } }, "damerau-levenshtein": { @@ -2055,21 +2068,6 @@ "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "deep-eql": { - "version": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", - "dev": true, - "requires": { - "type-detect": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz" - }, - "dependencies": { - "type-detect": { - "version": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", - "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", - "dev": true - } - } - }, "deep-equal": { "version": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" @@ -2166,20 +2164,6 @@ "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" } }, - "disposables": { - "version": "https://registry.npmjs.org/disposables/-/disposables-1.0.1.tgz", - "integrity": "sha1-BkcnoltU9QK9griaot+4358bOeM=" - }, - "dnd-core": { - "version": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.4.0.tgz", - "integrity": "sha1-xKW8Kup1Fk+KKV12nV9VGBDn1BE=", - "requires": { - "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "redux": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz" - } - }, "dns-equal": { "version": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" @@ -2207,10 +2191,6 @@ "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" } }, - "dom-align": { - "version": "https://registry.npmjs.org/dom-align/-/dom-align-1.6.2.tgz", - "integrity": "sha1-sU5kkXwl3mtAVSJzObTWT0t9uIU=" - }, "dom-converter": { "version": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", @@ -2423,8 +2403,9 @@ } }, "es6-promise": { - "version": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", - "integrity": "sha1-iBHpCRXZoNujYnTwskLb2nj5ySo=" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" }, "es6-set": { "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -3000,19 +2981,6 @@ "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, - "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", - "integrity": "sha1-ml47kpX5gLJiPPZPojixTOvKcHs=", - "requires": { - "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" - } - }, - "formidable": { - "version": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" - }, "forwarded": { "version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" @@ -3801,14 +3769,6 @@ } } }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "requires": { - "safe-buffer": "5.0.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3819,6 +3779,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "requires": { + "safe-buffer": "5.0.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -3931,6 +3899,14 @@ } } }, + "fullscreen": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fullscreen/-/fullscreen-1.1.1.tgz", + "integrity": "sha1-uQF8O/myPgfv/Ru86RDPXsJFkSk=", + "requires": { + "add-event-listener": "0.0.1" + } + }, "function-bind": { "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" @@ -3954,11 +3930,6 @@ "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, - "get-func-name": { - "version": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, "get-stdin": { "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" @@ -4183,17 +4154,6 @@ "version": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, - "history": { - "version": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", - "integrity": "sha1-bXI6hxLFgda+836MJvSu3G64aWc=", - "requires": { - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "resolve-pathname": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz", - "value-equal": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" - } - }, "hmac-drbg": { "version": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", @@ -4411,8 +4371,9 @@ "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=" }, "immutable": { - "version": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz", - "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=" + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" }, "imurmurhash": { "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5174,10 +5135,6 @@ "version": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" }, - "keycode": { - "version": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", - "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo=" - }, "kind-of": { "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", @@ -5270,14 +5227,6 @@ "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" }, - "lodash-es": { - "version": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", - "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" - }, - "lodash._getnative": { - "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, "lodash._reinterpolate": { "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" @@ -5294,27 +5243,10 @@ "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, - "lodash.isarguments": { - "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, "lodash.isequal": { "version": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, - "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" - } - }, "lodash.memoize": { "version": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" @@ -5924,11 +5856,6 @@ "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" } }, - "pathval": { - "version": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, "pbkdf2": { "version": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", @@ -6997,7 +6924,7 @@ }, "promise": { "version": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" } @@ -7010,13 +6937,6 @@ "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" } }, - "prop-types-extra": { - "version": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.0.1.tgz", - "integrity": "sha1-pXvUgQ6C0no/9DF+zBtK0AX3moI=", - "requires": { - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" - } - }, "proxy-addr": { "version": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", @@ -7052,10 +6972,6 @@ "version": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" }, - "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha1-jQSVTTZN7z78VbWgeT4eLIsebkk=" - }, "query-string": { "version": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", @@ -7143,107 +7059,410 @@ } } }, - "rc-align": { - "version": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.4.tgz", - "integrity": "sha1-2Dvat1YPAULnKj3h1JXatroiUkk=", - "requires": { - "dom-align": "https://registry.npmjs.org/dom-align/-/dom-align-1.6.2.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "rc-util": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz" - } - }, - "rc-animate": { - "version": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.1.tgz", - "integrity": "sha1-3z4PVv4Qav5L9S/0CM7SQcUXiRk=", - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "css-animation": "https://registry.npmjs.org/css-animation/-/css-animation-1.3.2.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" - } - }, "rc-slider": { - "version": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.3.0.tgz", - "integrity": "sha1-aEpTRBazciw6xOmzvf7tmmH7D/s=", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.0.tgz", + "integrity": "sha512-Ek68lWlMZm2b9N0AevvBvd/1GRG+n/kvf2wpvSz4xkXawc2SXpF64auU2qF6eyvv98qhGFoDeyCELMATYddJkA==", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-runtime": "6.26.0", "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "rc-tooltip": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.4.7.tgz", - "rc-util": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz", - "shallowequal": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" - } - }, - "rc-tooltip": { - "version": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.4.7.tgz", - "integrity": "sha1-7GzDmpYt6WqRR94Ip4+zj5NRf/M=", - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "rc-trigger": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-1.11.3.tgz" - } - }, - "rc-trigger": { - "version": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-1.11.3.tgz", - "integrity": "sha1-R7i1jghjwid+NnuG8c+inrYS21Y=", - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "create-react-class": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "rc-align": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.4.tgz", - "rc-animate": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.1.tgz", - "rc-util": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz" - } - }, - "rc-util": { - "version": "https://registry.npmjs.org/rc-util/-/rc-util-4.0.4.tgz", - "integrity": "sha1-mYE92Qrufim2STmnCsF26tP0/zk=", - "requires": { - "add-dom-event-listener": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "shallowequal": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz" + "prop-types": "15.6.0", + "rc-tooltip": "3.7.0", + "rc-util": "4.3.1", + "shallowequal": "1.0.2", + "warning": "3.0.0" }, "dependencies": { - "shallowequal": { - "version": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", - "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", + "add-dom-event-listener": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", + "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", "requires": { - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "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.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "component-classes": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", + "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", + "requires": { + "component-indexof": "0.0.3" + } + }, + "component-indexof": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", + "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "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.16", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "css-animation": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.4.1.tgz", + "integrity": "sha1-W4gTEl3g+7uwu+G0cq6EIhRpt6g=", + "requires": { + "babel-runtime": "6.26.0", + "component-classes": "1.2.6" + } + }, + "dom-align": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.6.7.tgz", + "integrity": "sha512-FrHttKVCqdHaDyVjygY+8kRhcNOJEdvAkc2ltppJUz71ekgpzIOuLgsOIKVqzdETI2EocmW2DzF+uP365qcR5Q==" + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "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.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.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "rc-align": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.5.tgz", + "integrity": "sha512-V1AN/gMNiJ3vOzbY/H3CTxhzYH+Ri2KlsEpo1SN8/SYmI4I/ZfQpScFAgmERuIGcLStA2sOEeBNVpH2FaOd2hA==", + "requires": { + "babel-runtime": "6.26.0", + "dom-align": "1.6.7", + "prop-types": "15.6.0", + "rc-util": "4.3.1" + } + }, + "rc-animate": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.4.tgz", + "integrity": "sha512-DjJLTUQj7XKKcuS8cczN0uOLfuSmgrVXFGieP1SZc87xUUTFGh8B/KjNmEtlfvxkSrSuVfb2rrEPER4SqKUtEA==", + "requires": { + "babel-runtime": "6.26.0", + "css-animation": "1.4.1", + "prop-types": "15.6.0" + } + }, + "rc-tooltip": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.0.tgz", + "integrity": "sha512-xEoUMatXp8OEL61UFH0+NrC39nkKzpOBhLrJCnnRpDRduU8L3DOhF6CNlIMkvg68hxlGGdquFtFw2t+1xNLX5A==", + "requires": { + "babel-runtime": "6.26.0", + "prop-types": "15.6.0", + "rc-trigger": "2.3.3" + } + }, + "rc-trigger": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.3.3.tgz", + "integrity": "sha512-j8MHq0jES4vXShFbSExyty/WVR238lrZzUfsSaIDeiziBIiUAOP6SR2HBEi2gSGK239Jm3bWIJvwGA85kFMgmQ==", + "requires": { + "babel-runtime": "6.26.0", + "create-react-class": "15.6.3", + "prop-types": "15.6.0", + "rc-align": "2.3.5", + "rc-animate": "2.4.4", + "rc-util": "4.3.1" + } + }, + "rc-util": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.3.1.tgz", + "integrity": "sha512-OVNMKLePnwn0dCX/Gpc+/kGEDpmMo1Rfesg9xFcAckRd+D+YwVqV+dUJMHugP+4nRtbXi55o0HwPlkKIApYfQA==", + "requires": { + "add-dom-event-listener": "1.0.2", + "babel-runtime": "6.26.0", + "prop-types": "15.6.0", + "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" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "shallowequal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", + "integrity": "sha512-zlVXeVUKvo+HEv1e2KQF/csyeMKx2oHvatQ9l6XjCUj3agvC8XGf6R9HvIPDSmp8FNPvx7b5kaEJTRi7CqxtEw==" + }, + "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==" + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" } } } }, "react": { - "version": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", - "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { - "create-react-class": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", - "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "create-react-class": "15.6.3", + "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + "prop-types": "15.6.0" + }, + "dependencies": { + "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.16", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "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==" + } } }, "react-bootstrap": { - "version": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.1.tgz", - "integrity": "sha1-Z5yfc653/yB4Z9U2SWIHKR86Ptc=", + "version": "0.31.5", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.5.tgz", + "integrity": "sha512-xgDihgX4QvYHmHzL87faDBMDnGfYyqcrqV0TEbWY+JizePOG1vfb8M3xJN+6MJ3kUYqDtQSZ7v/Q6Y5YDrkMdA==", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "babel-runtime": "6.26.0", "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "dom-helpers": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "keycode": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "prop-types-extra": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.0.1.tgz", - "react-overlays": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.0.tgz", - "react-prop-types": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", - "uncontrollable": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + "dom-helpers": "3.3.1", + "invariant": "2.2.2", + "keycode": "2.1.9", + "prop-types": "15.6.0", + "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.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "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.2.7", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "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": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "dom-helpers": "3.3.1", + "prop-types": "15.6.0", + "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.2.2" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + } } }, "react-contextmenu": { - "version": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.6.5.tgz", - "integrity": "sha1-jm4s6k+a1PnypHhwPL3o0p9WXNY=", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.9.2.tgz", + "integrity": "sha512-DdcO6iLBIJuDVsRpJLG/9N6ine0OVZhuQvnSPCEihfcyJFz+SHU9pQo+w9LWi2PdUxFbFV52BwAuutQkAYJxaA==", "requires": { "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -7254,7 +7473,7 @@ "integrity": "sha1-3s7c7ZZ/SM2JzNeftAjUfw8qy+I=", "requires": { "d3": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "react": "https://registry.npmjs.org/react/-/react-15.6.1.tgz" + "react": "15.6.2" } }, "react-dev-utils": { @@ -7381,22 +7600,117 @@ "integrity": "sha1-Dh9whuRaMtB3ZN817TL/FvEll5A=" }, "react-dnd": { - "version": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.4.0.tgz", - "integrity": "sha1-lvAELNTNN1tPDDQT9uyE0me315I=", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.5.4.tgz", + "integrity": "sha512-y9YmnusURc+3KPgvhYKvZ9oCucj51MSZWODyaeV0KFU0cquzA7dCD1g/OIYUKtNoZ+MXtacDngkdud2TklMSjw==", "requires": { - "disposables": "https://registry.npmjs.org/disposables/-/disposables-1.0.1.tgz", - "dnd-core": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.4.0.tgz", - "hoist-non-react-statics": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + "disposables": "1.0.2", + "dnd-core": "2.5.4", + "hoist-non-react-statics": "2.3.1", + "invariant": "2.2.2", + "lodash": "4.17.5", + "prop-types": "15.6.0" + }, + "dependencies": { + "disposables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.2.tgz", + "integrity": "sha1-NsamdEdfVaLWkTVnpgFETkh7S24=" + }, + "dnd-core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.5.4.tgz", + "integrity": "sha512-BcI782MfTm3wCxeIS5c7tAutyTwEIANtuu3W6/xkoJRwiqhRXKX3BbGlycUxxyzMsKdvvoavxgrC3EMPFNYL9A==", + "requires": { + "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "invariant": "2.2.2", + "lodash": "4.17.5", + "redux": "3.7.2" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "hoist-non-react-statics": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", + "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "lodash-es": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.5.tgz", + "integrity": "sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw==" + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.5", + "lodash-es": "4.17.5", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "symbol-observable": "1.2.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "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==" + } } }, "react-dnd-html5-backend": { - "version": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.4.1.tgz", - "integrity": "sha1-Q50ryvi9i4elE4a+tRwSiCYYLd0=", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.5.4.tgz", + "integrity": "sha512-jDqAkm/hI8Tl4HcsbhkBgB6HgpJR1e+ML1SbfxaegXYiuMxEVQm0FOwEH5WxUoo6fmIG4N+H0rSm59POuZOCaA==", "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + } } }, "react-dnd-scrollzone": { @@ -7411,20 +7725,45 @@ } }, "react-dom": { - "version": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz", - "integrity": "sha1-LLDtQZEDjlPCCes6eaI+Kkz5lHA=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", "requires": { - "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" - } - }, - "react-draggable": { - "version": "https://registry.npmjs.org/react-draggable/-/react-draggable-2.2.6.tgz", - "integrity": "sha1-OoBuEPLaa6v+pBNr5lEOibDXaQE=", - "requires": { - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz" + "prop-types": "15.6.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "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==" + } } }, "react-error-overlay": { @@ -7445,69 +7784,309 @@ } } }, - "react-notification-system": { - "version": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.14.tgz", - "integrity": "sha1-IfkX85/u4UVRaGQ1CHUEFDPE1cA=", - "requires": { - "create-react-class": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" - } - }, - "react-overlays": { - "version": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.0.tgz", - "integrity": "sha1-UxiY/1ZsflxyJurShjuM+fu1qYE=", + "react-fullscreenable": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.4.3.tgz", + "integrity": "sha512-SJtFN90hkVp18HnfS0CXodHzVByAK66JRSxAhMXNnE95q4Z3prBpZkh0G724uVi4NBRRPI4znHeTNFQStSdtJA==", "requires": { "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "dom-helpers": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "react-prop-types": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + "fullscreen": "1.1.1", + "react-display-name": "0.2.3" + }, + "dependencies": { + "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=" + } } }, - "react-prop-types": { - "version": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", - "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "react-notification-system": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.16.tgz", + "integrity": "sha1-m52iCw00eGtgBXxStCUW6hKVN0o=", "requires": { - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" - } - }, - "react-resizable-box": { - "version": "https://registry.npmjs.org/react-resizable-box/-/react-resizable-box-2.0.6.tgz", - "integrity": "sha1-xvvXwLrHpmeOsy0Jk8q3tgG+qOc=", - "requires": { - "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + "create-react-class": "15.6.3", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prop-types": "15.6.0" + }, + "dependencies": { + "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.16", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "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==" + } } }, "react-rnd": { - "version": "https://registry.npmjs.org/react-rnd/-/react-rnd-5.0.9.tgz", - "integrity": "sha1-a3suaeeuIwYJF8sDd3TxXIMIZgY=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-5.1.3.tgz", + "integrity": "sha512-NDzuA0HcL94bev9E5GppsXWKAqco+bNfLV75HexKZY+2ZbgvAbplN/Mf0jd2/b5ZJ2P7vjEvIVhwuUFGHveZgw==", "requires": { - "react-draggable": "https://registry.npmjs.org/react-draggable/-/react-draggable-2.2.6.tgz", - "react-resizable-box": "https://registry.npmjs.org/react-resizable-box/-/react-resizable-box-2.0.6.tgz" + "react-draggable": "3.0.5", + "react-resizable-box": "2.1.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "requires": { + "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "prop-types": "15.6.0" + } + }, + "react-resizable-box": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-resizable-box/-/react-resizable-box-2.1.0.tgz", + "integrity": "sha1-i7oIG1rb4q8L5HaMTx3mqEpCOq0=" + }, + "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==" + } } }, "react-router": { - "version": "https://registry.npmjs.org/react-router/-/react-router-4.1.2.tgz", - "integrity": "sha1-euAnNBq8QusIrZ96jKwI0FY2cs4=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", + "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", "requires": { - "history": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", - "hoist-non-react-statics": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "history": "4.7.2", + "hoist-non-react-statics": "2.3.1", + "invariant": "2.2.2", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "warning": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + "path-to-regexp": "1.7.0", + "prop-types": "15.6.0", + "warning": "3.0.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "2.2.2", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "resolve-pathname": "2.2.0", + "value-equal": "0.4.0", + "warning": "3.0.0" + } + }, + "hoist-non-react-statics": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", + "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "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=", + "requires": { + "isarray": "0.0.1" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "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==" + }, + "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==" + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + } } }, "react-router-dom": { - "version": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.1.2.tgz", - "integrity": "sha1-f4p8qGjTKsrdGcoJVDtA0m347Dc=", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", + "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", "requires": { - "history": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", + "history": "4.7.2", + "invariant": "2.2.2", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "react-router": "https://registry.npmjs.org/react-router/-/react-router-4.1.2.tgz" + "prop-types": "15.6.0", + "react-router": "4.2.0", + "warning": "3.0.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "2.2.2", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "resolve-pathname": "2.2.0", + "value-equal": "0.4.0", + "warning": "3.0.0" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "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==" + }, + "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==" + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + } } }, "react-scripts": { @@ -7564,16 +8143,56 @@ }, "react-sortable-tree": { "version": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", - "integrity": "sha1-JqBd4gEv+kalpNsrcSdDcSV9rrg=", + "integrity": "sha512-+yRojiLuh/jHI3qLV9sGYRIYuF7dPm0r2HyCvlnVBV6sYHKslNvNg3dyWa+owqhOfHiIlTArqP1AK9ELFzlZLg==", "requires": { "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "react-dnd": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.4.0.tgz", - "react-dnd-html5-backend": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.4.1.tgz", + "react-dnd": "2.5.4", + "react-dnd-html5-backend": "2.5.4", "react-dnd-scrollzone": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", "react-virtualized": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz" } }, + "react-svg-pan-zoom": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.15.1.tgz", + "integrity": "sha512-A5zlNKO9Q77oP9jnGE+GG423RB3hg28ZyDrULciexu78rU9WaR4IiqR+egzZA+qUKYYyP7oJiedYspzekAqbtg==", + "requires": { + "prop-types": "15.6.0", + "transformation-matrix": "1.7.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.17" + } + }, + "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "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==" + } + } + }, "react-virtualized": { "version": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", "integrity": "sha1-eZpvI4Ge64KGDVm4L60z0dQgMl4=", @@ -7718,16 +8337,6 @@ } } }, - "redux": { - "version": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=", - "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "lodash-es": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "symbol-observable": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz" - } - }, "regenerate": { "version": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" @@ -7916,10 +8525,6 @@ "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, - "resolve-pathname": { - "version": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz", - "integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ=" - }, "restore-cursor": { "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", @@ -8136,10 +8741,6 @@ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" } }, - "shallowequal": { - "version": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", - "integrity": "sha1-FWHb3vuMAUCBADGQhXZNo/z4P48=" - }, "shell-quote": { "version": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", @@ -8332,13 +8933,6 @@ "version": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, "string-length": { "version": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", @@ -8355,6 +8949,13 @@ "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" } }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, "stringstream": { "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" @@ -8393,19 +8994,163 @@ } }, "superagent": { - "version": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz", - "integrity": "sha1-M2GjlxVnUEw1EGOr6q4PqiPb8/g=", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", + "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", "requires": { - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "cookiejar": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", - "formidable": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + "component-emitter": "1.2.1", + "cookiejar": "2.1.1", + "debug": "3.1.0", + "extend": "3.0.1", + "form-data": "2.3.1", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.6.0", + "qs": "6.5.1", + "readable-stream": "2.3.3" + }, + "dependencies": { + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "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" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } } }, "supports-color": { @@ -8433,7 +9178,7 @@ "integrity": "sha1-62IlzlgM6q4UgZRXigrQGrfqGZw=", "requires": { "dom-urls": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", - "es6-promise": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", + "es6-promise": "4.2.4", "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -8461,10 +9206,6 @@ "serviceworker-cache-polyfill": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz" } }, - "symbol-observable": { - "version": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - }, "symbol-tree": { "version": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" @@ -8587,6 +9328,11 @@ "version": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "transformation-matrix": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.7.0.tgz", + "integrity": "sha512-nBXvxh7J2zqNKgKGyLttne3I2iHmEWyywQ+rOHjSSuSEzVT7I+4Cf0H1fyePggG7Y5VFlWM66fd7xwi7rWhCTQ==" + }, "trim-newlines": { "version": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" @@ -8622,11 +9368,6 @@ "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" } }, - "type-detect": { - "version": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", - "dev": true - }, "type-is": { "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", @@ -8656,13 +9397,6 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, - "uncontrollable": { - "version": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", - "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", - "requires": { - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz" - } - }, "uniq": { "version": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" @@ -8799,10 +9533,6 @@ "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" } }, - "value-equal": { - "version": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", - "integrity": "sha1-wiCjBDYfzmmU277ao8fhobiVhx0=" - }, "vary": { "version": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" @@ -8832,13 +9562,6 @@ "makeerror": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz" } }, - "warning": { - "version": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } - }, "watch": { "version": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 8e6d155..ef02578 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -16,8 +16,6 @@ import EditWidgetCheckboxControl from '../../../components/dialog/edit-widget-ch import EditWidgetMinMaxControl from '../../../components/dialog/edit-widget-min-max-control'; import EditWidgetColorZonesControl from '../../../components/dialog/edit-widget-color-zones-control'; import EditWidgetHTMLContent from '../../../components/dialog/edit-widget-html-content'; -import editWidgetSimulatorControl from '../../../components/dialog/edit-widget-simulator-control'; -import editWidgetSignalControl from '../../../components/dialog/edit-widget-signal-control'; describe('edit widget control creator', () => { it('should not return null', () => { @@ -38,7 +36,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, { args: { widgetType: 'HTML' }, result: { controlNumber: 1, controlTypes: [EditWidgetHTMLContent] } }, - { args: { widgetType: 'NumberInput'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, editWidgetSimulatorControl, editWidgetSignalControl] } } + { args: { widgetType: 'NumberInput'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } } ]; runs.forEach( (run) => { From ab326eb4dec7b2e11e27b515fd4559ba1da00fa7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 29 Mar 2018 10:53:21 +0200 Subject: [PATCH 405/556] Squashed: Add villas-controller simulator support Removed nodes completely from the ui and replace with simulators directly. Data management changed: A seperate connection is established for each simulator on its own Removed nodes tree view and replace with table simulator list --- package-lock.json | 43 +- package.json | 1 + src/api/websocket-api.js | 8 +- .../dialog/edit-simulation-model.js | 19 +- src/components/dialog/edit-simulator.js | 44 +- src/components/dialog/import-node.js | 4 +- .../dialog/import-simulation-model.js | 18 +- src/components/dialog/import-simulator.js | 146 +++++++ src/components/dialog/new-simulation-model.js | 18 +- src/components/dialog/new-simulator.js | 43 +- src/components/table.js | 41 +- src/components/widget-gauge.js | 9 +- src/components/widget-lamp.js | 7 +- src/components/widget-plot-table.js | 6 +- src/components/widget-plot.js | 6 +- src/components/widget-table.js | 13 +- src/components/widget-value.js | 9 +- src/containers/app.js | 8 +- src/containers/simulation.js | 32 +- src/containers/simulators.js | 380 +++++++----------- src/data-managers/simulations-data-manager.js | 14 +- .../simulator-data-data-manager.js | 39 +- src/data-managers/simulators-data-manager.js | 46 +++ src/stores/simulator-data-store.js | 52 +-- src/stores/simulator-store.js | 71 ++++ 25 files changed, 633 insertions(+), 444 deletions(-) create mode 100644 src/components/dialog/import-simulator.js create mode 100644 src/data-managers/simulators-data-manager.js create mode 100644 src/stores/simulator-store.js diff --git a/package-lock.json b/package-lock.json index e3c97f0..38683b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -251,7 +251,7 @@ "version": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "async-each": { @@ -315,7 +315,7 @@ "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", @@ -342,7 +342,7 @@ "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" } @@ -382,7 +382,7 @@ "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "babel-helper-explode-assignable-expression": { @@ -435,7 +435,7 @@ "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "babel-helper-remap-async-to-generator": { @@ -596,7 +596,7 @@ "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "babel-plugin-transform-es2015-classes": { @@ -938,7 +938,7 @@ "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "home-or-tmp": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "source-map-support": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz" }, @@ -960,7 +960,7 @@ "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", @@ -996,7 +996,7 @@ "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "babel-traverse": { @@ -1011,7 +1011,7 @@ "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "babel-types": { @@ -1020,7 +1020,7 @@ "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" } }, @@ -2504,7 +2504,7 @@ "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -2563,7 +2563,7 @@ "version": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", "integrity": "sha1-uYdfMUZS5QgWI8nSsYo0a7t1nAk=", "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" } }, "eslint-plugin-import": { @@ -4229,7 +4229,7 @@ "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", "html-minifier": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "pretty-error": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "toposort": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz" }, @@ -4317,7 +4317,7 @@ "requires": { "http-proxy": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" }, "dependencies": { @@ -4420,7 +4420,7 @@ "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "readline2": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", "run-async": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", @@ -5224,8 +5224,9 @@ } }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash._reinterpolate": { "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -7532,7 +7533,7 @@ "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", "external-editor": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", "figures": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "run-async": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -9217,7 +9218,7 @@ "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "lodash": "4.17.5", "slice-ansi": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" }, @@ -9864,7 +9865,7 @@ "integrity": "sha1-a2xxiq3oolN5lXhLRr0umDYFfKo=", "requires": { "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash": "4.17.5" }, "dependencies": { "fs-extra": { diff --git a/package.json b/package.json index f1125c4..0d4d4f6 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "flux": "^3.1.2", "gaugeJS": "^1.3.2", "immutable": "^3.8.1", + "lodash": "^4.17.5", "rc-slider": "^8.3.0", "react": "^15.4.2", "react-bootstrap": "^0.31.1", diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index a5ceba1..79da2f7 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -20,9 +20,9 @@ ******************************************************************************/ class WebsocketAPI { - addSocket(node, callbacks) { + addSocket(endpoint, callbacks) { // create web socket client - const socket = new WebSocket(this.getURL(node), 'live'); + const socket = new WebSocket(this.getURL(endpoint), 'live'); socket.binaryType = 'arraybuffer'; // register callbacks @@ -34,10 +34,10 @@ class WebsocketAPI { return socket; } - getURL(node) { + getURL(endpoint) { // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); - link.href = node.endpoint; + link.href = endpoint; if (link.protocol === 'https:') link.protocol = 'wss:'; diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 9aacadd..3450a54 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -27,14 +27,14 @@ import TableColumn from '../table-column'; import Dialog from './dialog'; class EditSimulationModelDialog extends React.Component { - valid: false; + valid = false; constructor(props) { super(props); this.state = { name: '', - simulator: { node: '', simulator: '' }, + simulator: '', outputLength: 1, inputLength: 1, outputMapping: [{ name: 'Signal', type: 'Type' }], @@ -74,12 +74,7 @@ class EditSimulationModelDialog extends React.Component { } } - if (e.target.id === 'simulator') { - var value = e.target.value.split("/"); - this.setState({ simulator: { node: value[0], simulator: value[1] } }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } + this.setState({ [e.target.id]: e.target.value }); } handleMappingChange(key, event, row, column) { @@ -143,11 +138,9 @@ class EditSimulationModelDialog extends React.Component { Simulator - this.handleChange(e)}> - {this.props.nodes.map(node => ( - node.simulators.map((simulator, index) => ( - - )) + this.handleChange(e)}> + {this.props.simulators.map(simulator => ( + ))} diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index c3db013..6002226 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -21,24 +21,36 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import _ from 'lodash'; import Dialog from './dialog'; class EditSimulatorDialog extends React.Component { - valid: false; + valid = true; constructor(props) { super(props); this.state = { - name: '' + name: '', + endpoint: '' }; } onClose(canceled) { if (canceled === false) { if (this.valid) { - this.props.onClose(this.state); + let data = {}; + + if (this.state.name != null && this.state.name !== "" && this.state.name !== _.get(this.props.simulator, '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')) { + data.endpoint = this.state.endpoint; + } + + this.props.onClose(data); } } else { this.props.onClose(); @@ -51,31 +63,23 @@ class EditSimulatorDialog extends React.Component { resetState() { this.setState({ - name: this.props.simulator.name + 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') }); } - validateForm(target) { - // check all controls - var name = true; - - if (this.state.name === '' || this.props.node.simulators.find(simulator => this.props.simulator.name !== this.state.name && simulator.name === this.state.name) !== undefined) { - name = false; - } - - this.valid = name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - } - render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + Name - this.handleChange(e)} /> + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js index 5401745..c91f772 100644 --- a/src/components/dialog/import-node.js +++ b/src/components/dialog/import-node.js @@ -68,8 +68,8 @@ class ImportNodeDialog extends React.Component { } // create file reader - var reader = new FileReader(); - var self = this; + const reader = new FileReader(); + const self = this; reader.onload = function(event) { // read simulator diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialog/import-simulation-model.js index 196e885..b333bd3 100644 --- a/src/components/dialog/import-simulation-model.js +++ b/src/components/dialog/import-simulation-model.js @@ -35,7 +35,7 @@ class ImportSimulationModelDialog extends React.Component { this.state = { name: '', - simulator: { node: '', simulator: '' }, + simulator: '', outputLength: '1', inputLength: '1', outputMapping: [ { name: 'Signal', type: 'Type' } ], @@ -54,7 +54,7 @@ class ImportSimulationModelDialog extends React.Component { resetState() { this.setState({ name: '', - simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, + simulator: '', outputLength: '1', inputLength: '1', outputMapping: [{ name: 'Signal', type: 'Type' }], @@ -86,11 +86,7 @@ class ImportSimulationModelDialog extends React.Component { } } - if (e.target.id === 'simulator') { - this.setState({ simulator: JSON.parse(e.target.value) }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } + this.setState({ [e.target.id]: e.target.value }); } handleMappingChange(key, event, row, column) { @@ -177,11 +173,9 @@ class ImportSimulationModelDialog extends React.Component {
    Simulator - this.handleChange(e)}> - {this.props.nodes.map(node => ( - node.simulators.map((simulator, index) => ( - - )) + this.handleChange(e)}> + {this.props.simulators.map(simulator => ( + ))} diff --git a/src/components/dialog/import-simulator.js b/src/components/dialog/import-simulator.js new file mode 100644 index 0000000..8320572 --- /dev/null +++ b/src/components/dialog/import-simulator.js @@ -0,0 +1,146 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; +import _ from 'lodash'; + +import Dialog from './dialog'; + +class ImportSimulatorDialog extends React.Component { + valid = false; + imported = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + endpoint: '', + uuid: '' + }; + } + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + const data = { + properties: { + name: this.state.name + }, + uuid: this.state.uuid + }; + + if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== 'http://') { + data.properties.endpoint = this.state.endpoint; + } + + this.props.onClose(data); + } + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + } + + resetState() { + this.setState({ name: '', endpoint: 'http://', uuid: '' }); + } + + loadFile(fileList) { + // get file + const file = fileList[0]; + if (!file.type.match('application/json')) { + return; + } + + // create file reader + const reader = new FileReader(); + const self = this; + + reader.onload = function(event) { + // read simulator + const simulator = 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 + }); + }; + + reader.readAsText(file); + } + + validateForm(target) { + // check all controls + let name = true; + let uuid = true; + + if (this.state.name === '') { + name = false; + } + + if (this.state.uuid === '') { + uuid = false; + } + + this.valid = name || uuid; + + // return state to control + if (target === 'name') return name ? "success" : "error"; + if (target === 'uuid') return uuid ? "success" : "error"; + } + + render() { + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Simulator File + this.loadFile(e.target.files)} /> + + + + Name + this.handleChange(e)} /> + + + + Endpoint + this.handleChange(e)} /> + + + + UUID + this.handleChange(e)} /> + + +
    +
    + ); + } +} + +export default ImportSimulatorDialog; \ No newline at end of file diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index e94f562..5106355 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -34,7 +34,7 @@ class NewSimulationModelDialog extends React.Component { this.state = { name: '', - simulator: { node: '', simulator: '' }, + simulator: '', outputLength: '1', inputLength: '1', outputMapping: [ { name: 'Signal', type: 'Type' } ], @@ -74,11 +74,7 @@ class NewSimulationModelDialog extends React.Component { } } - if (e.target.id === 'simulator') { - this.setState({ simulator: JSON.parse(e.target.value) }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } + this.setState({ [e.target.id]: e.target.value }); } handleMappingChange(key, event, row, column) { @@ -96,7 +92,7 @@ class NewSimulationModelDialog extends React.Component { resetState() { this.setState({ name: '', - simulator: { node: this.props.nodes[0] ? this.props.nodes[0]._id : '', simulator: this.props.nodes[0].simulators[0] ? 0 : '' }, + simulator: '', outputLength: '1', inputLength: '1', outputMapping: [{ name: 'Signal', type: 'Type' }], @@ -148,11 +144,9 @@ class NewSimulationModelDialog extends React.Component { Simulator - this.handleChange(e)}> - {this.props.nodes.map(node => ( - node.simulators.map((simulator, index) => ( - - )) + this.handleChange(e)}> + {this.props.simulators.map(simulator => ( + ))} diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index de8eb90..ff3ea08 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -25,20 +25,33 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; class NewSimulatorDialog extends React.Component { - valid: false; + valid = false; constructor(props) { super(props); this.state = { - name: '' + name: '', + endpoint: '', + uuid: '' }; } onClose(canceled) { if (canceled === false) { if (this.valid) { - this.props.onClose(this.state); + const data = { + properties: { + name: this.state.name + }, + uuid: this.state.uuid + }; + + if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== 'http://') { + data.properties.endpoint = this.state.endpoint; + } + + this.props.onClose(data); } } else { this.props.onClose(); @@ -50,21 +63,27 @@ class NewSimulatorDialog extends React.Component { } resetState() { - this.setState({ name: '' }); + this.setState({ name: '', endpoint: 'http://', uuid: '' }); } validateForm(target) { // check all controls - var name = true; + let name = true; + let uuid = true; - if (this.state.name === '' || this.props.node.simulators == null || this.props.node.simulators.find(simulator => simulator.name === this.state.name) !== undefined) { + if (this.state.name === '') { name = false; } - this.valid = name; + if (this.state.uuid === '') { + uuid = false; + } + + this.valid = name || uuid; // return state to control if (target === 'name') return name ? "success" : "error"; + if (target === 'uuid') return uuid ? "success" : "error"; } render() { @@ -76,6 +95,16 @@ class NewSimulatorDialog extends React.Component { this.handleChange(e)} /> + + Endpoint + this.handleChange(e)} /> + + + + UUID + this.handleChange(e)} /> + +
    ); diff --git a/src/components/table.js b/src/components/table.js index 3d5ac85..df2b7fe 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -20,6 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; +import _ from 'lodash'; import { Table, Button, Glyphicon, FormControl, Label, Checkbox } from 'react-bootstrap'; import { Link } from 'react-router-dom'; @@ -46,19 +47,27 @@ class CustomTable extends Component { addCell(data, index, child) { // add data to cell - const dataKey = child.props.dataKey; - var cell = []; + let content = null; - if (dataKey && data[dataKey] != null) { - // get content - var content; - const modifier = child.props.modifier; - - if (modifier) { - content = modifier(data[dataKey]); - } else { - content = data[dataKey].toString(); + if ('dataKeys' in child.props) { + for (let key of child.props.dataKeys) { + if (_.get(data, key) != null) { + content = _.get(data, key); + break; + } } + } else if ('dataKey' in child.props) { + content = _.get(data, child.props.dataKey); + } + + const modifier = child.props.modifier; + if (modifier && content != null) { + content = modifier(content); + } + + let cell = []; + if (content != null) { + content = content.toString(); // check if cell should be a link const linkKey = child.props.linkKey; @@ -89,21 +98,21 @@ 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) { const checkboxKey = this.props.checkboxKey; - cell.push( child.props.onChecked(index, e)}>); + cell.push( child.props.onChecked(index, e)} />); } if (child.props.exportButton) { - cell.push(); + cell.push(); } return cell; @@ -155,7 +164,7 @@ class CustomTable extends Component { render() { // get children - var children = this.props.children; + let children = this.props.children; if (Array.isArray(this.props.children) === false) { children = [ children ]; } diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index cb23d31..0f2b7bd 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -38,16 +38,15 @@ class WidgetGauge extends Component { // update value const simulator = nextProps.widget.simulator; - if (nextProps.data == null || nextProps.data[simulator.node] == null - || nextProps.data[simulator.node][simulator.simulator] == null - || nextProps.data[simulator.node][simulator.simulator].output.values.length === 0 - || nextProps.data[simulator.node][simulator.simulator].output.values[0].length === 0) { + if (nextProps.data == null || nextProps.data[simulator] == null + || nextProps.data[simulator].output.values.length === 0 + || nextProps.data[simulator].output.values[0].length === 0) { this.setState({ value: 0 }); return; } // check if value has changed - const signal = nextProps.data[simulator.node][simulator.simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[simulator].output.values[nextProps.widget.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) { diff --git a/src/components/widget-lamp.js b/src/components/widget-lamp.js index db2fa06..60f3b73 100644 --- a/src/components/widget-lamp.js +++ b/src/components/widget-lamp.js @@ -35,16 +35,15 @@ class WidgetLamp extends Component { componentWillReceiveProps(nextProps) { // update value - const simulator = nextProps.widget.simulator.simulator; - const node = nextProps.widget.simulator.node; + const simulator = nextProps.widget.simulator; - if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].output.values == null) { + if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output.values == null) { this.setState({ value: '' }); return; } // check if value has changed - const signal = nextProps.data[node][simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 3cba4c7..55992b1 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -64,7 +64,7 @@ class WidgetPlotTable extends Component { // get simulation model const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); + return (model.simulator === simulator); }); let preselectedSignals = []; @@ -106,8 +106,8 @@ class WidgetPlotTable extends Component { let simulator = this.props.widget.simulator; let simulatorData = []; - if (this.props.data[simulator.node] != null && this.props.data[simulator.node][simulator.simulator] != null) { - simulatorData = this.props.data[simulator.node][simulator.simulator].output.values.filter((values, index) => ( + if (this.props.data[simulator] != null) { + simulatorData = this.props.data[simulator].output.values.filter((values, index) => ( this.props.widget.signals.findIndex(value => value === index) !== -1 )); } diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index c492f3f..b6cf423 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -39,11 +39,11 @@ class WidgetPlot extends React.Component { const simulation = nextProps.simulation; // Proceed if a simulation with models and a simulator are available - if (simulator && nextProps.data[simulator.node] != null && nextProps.data[simulator.node][simulator.simulator] != null && simulation && simulation.models.length > 0) { - const model = simulation.models.find(model => model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); + if (simulator && nextProps.data[simulator] != null && nextProps.data[simulator] != null && simulation && simulation.models.length > 0) { + const model = simulation.models.find(model => model.simulator === simulator); const chosenSignals = nextProps.widget.signals; - const data = nextProps.data[simulator.node][simulator.simulator].output.values.filter((values, index) => ( + const data = nextProps.data[simulator].output.values.filter((values, index) => ( nextProps.widget.signals.findIndex(value => value === index) !== -1 )); diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 625b84b..a5ec93a 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -38,11 +38,10 @@ class WidgetTable extends Component { // check data const simulator = nextProps.widget.simulator; - if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator.node] == null - || nextProps.data[simulator.node][simulator.simulator] == null - || nextProps.data[simulator.node][simulator.simulator].output.length === 0 - || nextProps.data[simulator.node][simulator.simulator].output.values.length === 0 - || nextProps.data[simulator.node][simulator.simulator].output.values[0].length === 0) { + if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null + || nextProps.data[simulator].output.length === 0 + || nextProps.data[simulator].output.values.length === 0 + || nextProps.data[simulator].output.values[0].length === 0) { // clear values this.setState({ rows: [], sequence: null }); return; @@ -61,7 +60,7 @@ class WidgetTable extends Component { // get rows var rows = []; - nextProps.data[simulator.node][simulator.simulator].output.values.forEach((signal, index) => { + nextProps.data[simulator].output.values.forEach((signal, index) => { if (index < simulationModel.outputMapping.length) { rows.push({ name: simulationModel.outputMapping[index].name, @@ -70,7 +69,7 @@ class WidgetTable extends Component { } }); - this.setState({ rows: rows, sequence: nextProps.data[simulator.node][simulator.simulator].output.sequence }); + this.setState({ rows: rows, sequence: nextProps.data[simulator].output.sequence }); } render() { diff --git a/src/components/widget-value.js b/src/components/widget-value.js index fc8b6d0..b0531c6 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -33,10 +33,7 @@ class WidgetValue extends Component { componentWillReceiveProps(nextProps) { // update value - const simulator = nextProps.widget.simulator.simulator; - const node = nextProps.widget.simulator.node; - - if (nextProps.data == null || nextProps.data[node] == null || nextProps.data[node][simulator] == null || nextProps.data[node][simulator].output.values == null) { + if (nextProps.data == null || nextProps.data[nextProps.widget.simulator] == null || nextProps.data[nextProps.widget.simulator].output == null || nextProps.data[nextProps.widget.simulator].output.values == null) { this.setState({ value: '' }); return; } @@ -45,7 +42,7 @@ class WidgetValue extends Component { let unit = ''; if (nextProps.simulation) { - const simulationModel = nextProps.simulation.models.find(model => model.simulator.node === node && model.simulator.simulator === simulator); + const simulationModel = nextProps.simulation.models.find(model => model.simulator === nextProps.widget.simulator); if (nextProps.widget.signal < simulationModel.outputMapping.length) { unit = simulationModel.outputMapping[nextProps.widget.signal].type; @@ -53,7 +50,7 @@ class WidgetValue extends Component { } // check if value has changed - const signal = nextProps.data[node][simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[nextProps.widget.simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y, unit }); } diff --git a/src/containers/app.js b/src/containers/app.js index 9df9f57..bb70935 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -29,7 +29,7 @@ import { Col } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; -import NodeStore from '../stores/node-store'; +import SimulatorStore from '../stores/simulator-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -51,14 +51,14 @@ import '../styles/app.css'; class App extends React.Component { static getStores() { - return [ NodeStore, UserStore, SimulationStore ]; + return [ SimulatorStore, UserStore, SimulationStore ]; } static calculateState(prevState) { let currentUser = UserStore.getState().currentUser; return { - nodes: NodeStore.getState(), + simulators: SimulatorStore.getState(), simulations: SimulationStore.getState(), currentRole: currentUser ? currentUser.role : '', token: UserStore.getState().token, @@ -85,7 +85,7 @@ class App extends React.Component { componentDidMount() { // load all simulators and simulations to fetch simulation data AppDispatcher.dispatch({ - type: 'nodes/start-load', + type: 'simulators/start-load', token: this.state.token }); diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 6d28515..2900857 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -25,7 +25,7 @@ import { Button, Modal, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import SimulationStore from '../stores/simulation-store'; -import NodeStore from '../stores/node-store'; +import SimulatorStore from '../stores/simulator-store'; import UserStore from '../stores/user-store'; import AppDispatcher from '../app-dispatcher'; @@ -37,13 +37,13 @@ import ImportSimulationModelDialog from '../components/dialog/import-simulation- class Simulation extends React.Component { static getStores() { - return [ SimulationStore, NodeStore, UserStore ]; + return [ SimulationStore, SimulatorStore, UserStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), - nodes: NodeStore.getState(), + simulators: SimulatorStore.getState(), sessionToken: UserStore.getState().token, newModal: false, @@ -64,7 +64,7 @@ class Simulation extends React.Component { }); AppDispatcher.dispatch({ - type: 'nodes/start-load', + type: 'simulators/start-load', token: this.state.sessionToken }); } @@ -143,16 +143,16 @@ class Simulation extends React.Component { } } - getSimulatorName(simulator) { - var name = "undefined"; - - this.state.nodes.forEach(node => { - if (node._id === simulator.node) { - name = node.name + '/' + node.simulators[simulator.simulator].name; + getSimulatorName(simulatorId) { + for (let simulator of this.state.simulators) { + if (simulator._id === simulatorId) { + if ('name' in simulator.rawProperties) { + return simulator.rawProperties.name; + } else { + return simulator.uuid; + } } - }); - - return name; + } } exportModel(index) { @@ -197,9 +197,9 @@ class Simulation extends React.Component { - this.closeNewModal(data)} nodes={this.state.nodes} /> - this.closeEditModal(data)} data={this.state.modalData} nodes={this.state.nodes} /> - this.closeImportModal(data)} nodes={this.state.nodes} /> + this.closeNewModal(data)} simulators={this.state.simulators} /> + this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> + this.closeImportModal(data)} simulators={this.state.simulators} /> this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 31ed312..00e1ce9 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -21,256 +21,170 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Modal, Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; import FileSaver from 'file-saver'; +import _ from 'lodash'; import AppDispatcher from '../app-dispatcher'; -import NodeStore from '../stores/node-store'; +import SimulatorStore from '../stores/simulator-store'; import UserStore from '../stores/user-store'; -import NewNodeDialog from '../components/dialog/new-node'; -import EditNodeDialog from '../components/dialog/edit-node'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; -import NodeTree from '../components/node-tree'; -import ImportNodeDialog from '../components/dialog/import-node'; +import ImportSimulatorDialog from '../components/dialog/import-simulator'; class Simulators extends Component { static getStores() { - return [ NodeStore, UserStore ]; + return [ UserStore, SimulatorStore ]; } static calculateState() { return { - nodes: NodeStore.getState(), sessionToken: UserStore.getState().token, + simulators: SimulatorStore.getState(), - newNodeModal: false, - deleteNodeModal: false, - editNodeModal: false, - importModal: false, - exportModal: false, + modalSimulator: {}, + deleteModal: false, - addSimulatorModal: false, - editSimulatorModal: false, - deleteSimulatorModal: false, - - modalData: {}, - modalIndex: 0, - modalName: '' + runAction: 0, + runTitle: 'Reset', + selectedSimulators: [] }; } componentWillMount() { AppDispatcher.dispatch({ - type: 'nodes/start-load', + type: 'simulators/start-load', token: this.state.sessionToken }); } - closeNewNodeModal(data) { - this.setState({ newNodeModal: false }); + closeNewModal(data) { + this.setState({ newModal : false }); if (data) { AppDispatcher.dispatch({ - type: 'nodes/start-add', - data: data, - token: this.state.sessionToken - }); - } - } - - showEditNodeModal(data) { - // find node with id - var node = this.state.nodes.find((element) => { - return element._id === data.id; - }); - - this.setState({ editNodeModal: true, modalData: node }); - } - - closeEditNodeModal(data) { - this.setState({ editNodeModal: false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'nodes/start-edit', - data: data, - token: this.state.sessionToken - }); - } - } - - showDeleteNodeModal(data) { - // find node with id - var node = this.state.nodes.find((element) => { - return element._id === data.id; - }); - - this.setState({ deleteNodeModal: true, modalData: node }); - } - - confirmDeleteNodeModal() { - this.setState({ deleteModal: false }); - - AppDispatcher.dispatch({ - type: 'nodes/start-remove', - data: this.state.modalData, - token: this.state.sessionToken - }); - } - - showAddSimulatorModal(data) { - // find node with id - var node = this.state.nodes.find((element) => { - return element._id === data.id; - }); - - this.setState({ addSimulatorModal: true, modalData: node }); - } - - closeAddSimulatorModal(data) { - this.setState({ addSimulatorModal: false }); - - if (data) { - var node = this.state.modalData; - node.simulators.push(data); - - AppDispatcher.dispatch({ - type: 'nodes/start-edit', - data: node, - token: this.state.sessionToken - }); - } - } - - showEditSimulatorModal(data, index) { - // find node with id - var node = this.state.nodes.find((element) => { - return element._id === data.id; - }); - - this.setState({ editSimulatorModal: true, modalData: node, modalIndex: index }); - } - - closeEditSimulatorModal(data) { - this.setState({ editSimulatorModal: false }); - - if (data) { - var node = this.state.modalData; - node.simulators[this.state.modalIndex] = data; - - AppDispatcher.dispatch({ - type: 'nodes/start-edit', - data: node, - token: this.state.sessionToken - }); - } - } - - showDeleteSimulatorModal(data, index) { - // find node with id - var node = this.state.nodes.find((element) => { - return element._id === data.id; - }); - - this.setState({ deleteSimulatorModal: true, modalData: node, modalIndex: index, modalName: data.children[index].title }); - } - - confirmDeleteSimulatorModal() { - this.setState({ deleteSimulatorModal: false }); - - // remove simulator - var node = this.state.modalData; - node.simulators.splice(this.state.modalIndex); - - AppDispatcher.dispatch({ - type: 'nodes/start-edit', - data: node, - token: this.state.sessionToken - }); - } - - closeImportNodeModal(data) { - this.setState({ importNodeModal: false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'nodes/start-add', + type: 'simulators/start-add', data, token: this.state.sessionToken }); } } - exportNode(data) { - const node = this.state.nodes.find((element) => { - return element._id === data.id; - }); + closeEditModal(data) { + this.setState({ editModal : false }); + if (data) { + let simulator = this.state.simulators[this.state.modalIndex]; + simulator.properties = data; + this.setState({ simulator }); + + AppDispatcher.dispatch({ + type: 'simulators/start-edit', + data: simulator, + token: this.state.sessionToken + }); + } + } + + confirmDeleteModal() { + this.setState({ deleteModal: false }); + + AppDispatcher.dispatch({ + type: 'simulators/start-remove', + data: this.state.modalSimulator, + token: this.state.sessionToken + }); + } + + exportSimulator(index) { // filter properties - let simulator = Object.assign({}, node); + let simulator = Object.assign({}, this.state.simulators[index]); delete simulator._id; - simulator.simulators.forEach(simulator => { - delete simulator.id; - }); - // show save dialog const blob = new Blob([JSON.stringify(simulator, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'node - ' + node.name + '.json'); + FileSaver.saveAs(blob, 'simulator - ' + (simulator.properties.name || simulator.rawProperties.name || 'undefined') + '.json'); } - labelStyle(value) { - if (value === true) return 'success'; - else return 'warning'; - } + closeImportModal(data) { + this.setState({ importModal: false }); - onTreeDataChange(nodes) { - // update all at once - nodes.forEach((node) => { + if (data) { AppDispatcher.dispatch({ - type: 'nodes/start-edit', - data: node, + type: 'simulators/start-add', + data, token: this.state.sessionToken }); - }); - } - - onNodeModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteNodeModal(); } } - onSimulatorModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteSimulatorModal(); - } - } + onSimulatorChecked(index, event) { + const selectedSimulators = this.state.selectedSimulators; + for (let key in selectedSimulators) { + if (selectedSimulators[key] === index) { + // update existing entry + if (event.target.checked) { + return; + } - loadFile(fileList) { - // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { + selectedSimulators.splice(key, 1); + + this.setState({ selectedSimulators }); + return; + } + } + + // add new entry + if (event.target.checked === false) { return; } - // create file reader - var reader = new FileReader(); - var self = this; + selectedSimulators.push(index); + this.setState({ selectedSimulators }); + } - reader.onload = function(event) { - // read simulator - const simulator = JSON.parse(event.target.result); - self.setState({ importModal: true, modalSimulator: simulator }); - }; + setRunAction(index) { + let runTitle = ''; + switch (index) { + case '0': + runTitle = 'Reset'; + break; - reader.readAsText(file); + case '1': + runTitle = 'Shutdown'; + break; + + default: + console.log('Unknown index ' + index); + break; + } + + this.setState({ runAction: index, runTitle }); + } + + runAction() { + for (let index of this.state.selectedSimulators) { + let data; + switch (this.state.runAction) { + case '0': + data = { action: 'reset' }; + break; + + case '1': + data = { action: 'shutdown' }; + break; + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator: this.state.simulators[index], + data, + token: this.state.sessionToken + }); + } } render() { @@ -278,61 +192,55 @@ class Simulators extends Component {

    Simulators

    - - + + this.onSimulatorChecked(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 })} + /> +
    -
    - Hint: Node names must be unique. Simulator names must be unique on a node. +
    + this.setRunAction(index)}> + Reset + Shutdown + - this.onTreeDataChange(treeData)} - onNodeDelete={(node) => this.showDeleteNodeModal(node)} - onNodeEdit={(node) => this.showEditNodeModal(node)} - onNodeAdd={(node) => this.showAddSimulatorModal(node)} - onNodeExport={node => this.exportNode(node)} - onSimulatorEdit={(node, index) => this.showEditSimulatorModal(node, index)} - onSimulatorDelete={(node, index) => this.showDeleteSimulatorModal(node, index)} - /> + +
    - this.closeNewNodeModal(data)} nodes={this.state.nodes} /> - this.closeEditNodeModal(data)} nodes={this.state.nodes} /> - this.closeAddSimulatorModal(data)} node={this.state.modalData}/> - this.closeImportNodeModal(data)} nodes={this.state.nodes} /> +
    + + +
    - {this.state.editSimulatorModal && - this.closeEditSimulatorModal(data)} node={this.state.modalData} /> - } + this.closeNewModal(data)} /> + this.closeEditModal(data)} simulator={this.state.modalSimulator} /> + this.closeImportModal(data)} /> - this.setState({ deleteNodeModal: false })} onKeyPress={this.onNodeModalKeyPress}> - - Delete Node - - - - Are you sure you want to delete the node '{this.state.modalData.name}'? -
    - This will delete all simulators assigned to this node. -
    - - - - - -
    - - this.setState({ deleteSimulatorModal: false })} onKeyPress={this.onSimulatorModalKeyPress}> + this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> Delete Simulator - Are you sure you want to delete the simulator '{this.state.modalName}'? + Are you sure you want to delete the simulator'{_.get(this.state.modalSimulator, 'properties.name') || _.get(this.state.modalSimulator, 'rawProperties.name') || 'Unknown'}'? - - + +
    diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index bb9a6ba..4ded924 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -29,13 +29,23 @@ class SimulationsDataManager extends RestDataManager { this.onLoad = this.onSimulationsLoad; } - onSimulationsLoad(simulation) { + onSimulationsLoad(data) { + if (Array.isArray(data)) { + for (let simulation of data) { + this.loadSimulationData(simulation); + } + } else { + this.loadSimulationData(data); + } + } + + loadSimulationData(simulation) { for (let model of simulation.models) { AppDispatcher.dispatch({ type: 'simulatorData/prepare', inputLength: parseInt(model.inputLength, 10), outputLength: parseInt(model.outputLength, 10), - node: model.simulator + id: model.simulator }); } } diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index eee8e03..c697f36 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -30,22 +30,17 @@ class SimulatorDataDataManager { this._sockets = {}; } - open(endpoint, node) { + open(endpoint, identifier) { // pass signals to onOpen callback - if (this._sockets[node._id] != null) { - if (this._sockets[node._id].url !== WebsocketAPI.getURL(node)) { + if (this._sockets[identifier] != null) { + if (this._sockets[identifier].url !== WebsocketAPI.getURL(endpoint)) { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node), onError: (error) => this.onError(error, node) }); + this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } } else { - // set flag if a socket to this simulator was already create before - if (this._sockets[node._id] === null) { - this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node), onError: (error) => this.onError(error, node) }); - } else { - this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node), onError: (error) => this.onError(error, node) }); - } + this._sockets[identifier] = WebsocketAPI.addSocket(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) }); } } @@ -59,8 +54,8 @@ class SimulatorDataDataManager { } } - send(message, nodeId) { - const socket = this._sockets[nodeId]; + send(message, identifier) { + const socket = this._sockets[identifier]; if (socket == null) { return false; } @@ -68,40 +63,42 @@ class SimulatorDataDataManager { const data = this.messageToBuffer(message); socket.send(data); + console.log(data); + return true; } - onOpen(event, node, firstOpen) { + onOpen(event, identifier, firstOpen) { AppDispatcher.dispatch({ type: 'simulatorData/opened', - node: node, + id: identifier, firstOpen: firstOpen }); } - onClose(event, node) { + onClose(event, identifier) { AppDispatcher.dispatch({ type: 'simulatorData/closed', - node: node, + id: identifier, notification: (event.code !== 4000) }); // remove from list, keep null reference for flag detection - delete this._sockets[node._id]; + delete this._sockets[identifier]; } - onError(error, node) { - console.error('Error on ' + node._id + ':' + error); + onError(error, identifier) { + console.error('Error on ' + identifier + ':' + error); } - onMessage(event, node) { + onMessage(event, identifier) { var msgs = this.bufferToMessageArray(event.data); if (msgs.length > 0) { AppDispatcher.dispatch({ type: 'simulatorData/data-changed', data: msgs, - node: node + id: identifier }); } } diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js new file mode 100644 index 0000000..42ddec3 --- /dev/null +++ b/src/data-managers/simulators-data-manager.js @@ -0,0 +1,46 @@ +/** + * 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 + * 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 SimulatorsDataManager extends RestDataManager { + constructor() { + super('simulator', '/simulators'); + } + + doAction(simulator, action, token = null) { + RestAPI.post(this.makeURL(this.url + '/' + simulator._id), action, token).then(response => { + AppDispatcher.dispatch({ + type: 'simulators/action-started', + data: response + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'simulators/action-error', + error + }); + }); + } +} + +export default new SimulatorsDataManager(); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 61864bf..1c303cc 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -36,24 +36,14 @@ class SimulationDataStore extends ReduceStore { } reduce(state, action) { - var i, j; - switch (action.type) { - case 'simulatorData/open': - SimulatorDataDataManager.open(action.endpoint, action.node); - return state; - case 'simulatorData/opened': // create entry for simulator - state[action.node._id] = {}; + state[action.id] = {}; return state; case 'simulatorData/prepare': - if (state[action.node.node] == null) { - return state; - } - - state[action.node.node][action.node.simulator] = { + state[action.id] = { output: { sequence: -1, length: action.outputLength, @@ -64,47 +54,49 @@ class SimulationDataStore extends ReduceStore { length: action.inputLength, version: 2, type: 0, - id: action.node.simulator, + id: 0, timestamp: Date.now(), values: new Array(action.inputLength).fill(0) } }; - + + this.__emitChange(); return state; case 'simulatorData/data-changed': // get index for simulator id - if (state[action.node._id] == null) { + if (state[action.id] == null) { return state; } + if (state[action.id].output == null) { + state[action.id].output = { + values: [] + }; + } + // loop over all samples in a vector - for (j = 0; j < action.data.length; j++) { + for (let j = 0; j < action.data.length; j++) { let smp = action.data[j]; - let index = action.node.simulators.findIndex(simulator => simulator.id === smp.id); - if (index === -1 || state[action.node._id][index] == null) { - return state; - } - // add data to simulator - for (i = 0; i < smp.length; i++) { - while (state[action.node._id][index].output.values.length < i + 1) { - state[action.node._id][index].output.values.push([]); + for (let i = 0; i < smp.length; i++) { + while (state[action.id].output.values.length < i + 1) { + state[action.id].output.values.push([]); } - state[action.node._id][index].output.values[i].push({ x: smp.timestamp, y: smp.values[i] }); + state[action.id].output.values[i].push({ x: smp.timestamp, y: smp.values[i] }); // erase old values - if (state[action.node._id][index].output.values[i].length > MAX_VALUES) { - const pos = state[action.node._id][index].output.values[i].length - MAX_VALUES; - state[action.node._id][index].output.values[i].splice(0, pos); + if (state[action.id].output.values[i].length > MAX_VALUES) { + const pos = state[action.id].output.values[i].length - MAX_VALUES; + state[action.id].output.values[i].splice(0, pos); } } // update metadata - state[action.node._id][index].output.timestamp = smp.timestamp; - state[action.node._id][index].output.sequence = smp.sequence; + state[action.id].output.timestamp = smp.timestamp; + state[action.id].output.sequence = smp.sequence; } // explicit call to prevent array copy diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js new file mode 100644 index 0000000..75623c0 --- /dev/null +++ b/src/stores/simulator-store.js @@ -0,0 +1,71 @@ +/** + * 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 + * 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 './array-store'; +import SimulatorsDataManager from '../data-managers/simulators-data-manager'; +import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; + +class SimulatorStore extends ArrayStore { + constructor() { + super('simulators', SimulatorsDataManager); + } + + reduce(state, action) { + switch(action.type) { + case 'simulators/loaded': + // connect to each simulator + for (let simulator of action.data) { + if (simulator.endpoint != null && 'endpoint' in simulator.properties) { + SimulatorDataDataManager.open(simulator.properties.endpoint, simulator._id); + } else if (simulator.rawProperties != null && 'endpoint' in simulator.rawProperties) { + SimulatorDataDataManager.open(simulator.rawProperties.endpoint, simulator._id); + } else { + console.warn('Endpoint not found for simulator'); + console.log(simulator); + } + } + + return super.reduce(state, action); + + case 'simulators/edited': + return super.reduce(state, action); + + case 'simulators/fetched': + return this.updateElements(state, [action.data]); + + case 'simulators/fetch-error': + return state; + + case 'simulators/start-action': + SimulatorsDataManager.doAction(action.simulator, action.data, action.token); + return state; + + case 'simulators/action-error': + console.log(action.error); + return state; + + default: + return super.reduce(state, action); + } + } +} + +export default new SimulatorStore(); From 31005fb1bdb87bd010728553abc3ff8b44932712 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 12 Apr 2018 11:38:16 +0200 Subject: [PATCH 406/556] Add simulator actions to simulation model view --- package-lock.json | 10340 +++++++++++------ src/containers/simulation.js | 124 +- src/data-managers/simulators-data-manager.js | 1 + 3 files changed, 6799 insertions(+), 3666 deletions(-) diff --git a/package-lock.json b/package-lock.json index 38683b8..034bf6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,56 +5,65 @@ "requires": true, "dependencies": { "abab": { - "version": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", - "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" }, "accepts": { - "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + "mime-types": "2.1.18", + "negotiator": "0.6.1" } }, "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" }, "acorn-dynamic-import": { - "version": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + "acorn": "4.0.13" }, "dependencies": { "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-globals": { - "version": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + "acorn": "4.0.13" }, "dependencies": { "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-jsx": { - "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" + "acorn": "3.3.0" }, "dependencies": { "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" } } @@ -65,1026 +74,1563 @@ "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" }, "address": { - "version": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", "integrity": "sha1-SACB6CtYe6MZRZ/vUS9Rb+A9WK8=" }, "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ajv-keywords": { - "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" }, "align-text": { - "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "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.6" + } + } } }, "alphanum-sort": { - "version": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "anser": { - "version": "https://registry.npmjs.org/anser/-/anser-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.1.tgz", "integrity": "sha1-w2QYY6lizr75Qeoshwbyy08HFr0=" }, "ansi-align": { - "version": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", - "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + "string-width": "2.1.1" + }, + "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" + } + } } }, "ansi-escapes": { - "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, "ansi-html": { - "version": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.1" + } }, "anymatch": { - "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "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.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } } }, "append-transform": { - "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "requires": { - "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz" + "default-require-extensions": "1.0.0" } }, "argparse": { - "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "sprintf-js": "1.0.3" } }, "aria-query": { - "version": "https://registry.npmjs.org/aria-query/-/aria-query-0.5.0.tgz", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.5.0.tgz", "integrity": "sha1-heMVLNjMW6sY2+1hzZxPzlT6ecM=", "requires": { - "ast-types-flow": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + "ast-types-flow": "0.0.7" } }, "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { - "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-equal": { - "version": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, "array-filter": { - "version": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "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": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "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": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" }, "array-includes": { - "version": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { - "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz" + "define-properties": "1.1.2", + "es-abstract": "1.11.0" } }, "array-map": { - "version": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" }, "array-reduce": { - "version": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "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": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + "array-uniq": "1.0.3" } }, "array-uniq": { - "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "arrify": { - "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { "version": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "asn1.js": { - "version": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "assert": { - "version": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { - "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz" + "util": "0.10.3" } }, "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types-flow": { - "version": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, "async": { - "version": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { "lodash": "4.17.5" } }, "async-each": { - "version": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "asynckit": { - "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==" + }, "autoprefixer": { "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", - "integrity": "sha1-l7yFTH0Ll5+NZIneVHoNF/swf20=", + "integrity": "sha512-y3U+M3XLC3oKKkShZXcsjdCY6bTWmqOboqx1iDeaMumpqumPbEDUqb9586imSWcy8nboBTjqRu8bNe4KcoYOXA==", "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", - "caniuse-lite": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000709.tgz", - "normalize-range": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "num2fraction": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000827", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.21", + "postcss-value-parser": "3.3.0" } }, "aws-sign2": { - "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, "axobject-query": { - "version": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", "requires": { - "ast-types-flow": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + "ast-types-flow": "0.0.7" } }, "babel-code-frame": { - "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "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": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" } }, "babel-core": { "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "integrity": "sha512-wne6XXFyKIfZSLLXN17Zun5aw8x2WZY5ork2NSa5t0UWGxK2EHsJlPd8W1rQQDgpG0tsvEHNdaqmvygEI7Qmmw==", "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "babel-helpers": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-register": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", "lodash": "4.17.5", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "babel-eslint": { "version": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "integrity": "sha512-i2yKOhjgwUbUrJ8oJm6QqRzltIoFahGNPZ0HF22lUN4H1DW03JQyJm7WSv+I1LURQWjDNhVqFo04acYa07rhOQ==", "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz" + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" } }, "babel-generator": { - "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", "lodash": "4.17.5", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { - "babel-helper-explode-assignable-expression": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "babel-helper-explode-assignable-expression": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-helper-builder-react-jsx": { - "version": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", - "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-helper-call-delegate": { - "version": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { - "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "babel-helper-hoist-variables": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { - "version": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.5" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-helper-explode-assignable-expression": { - "version": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { - "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { - "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "babel-helper-get-function-arity": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { - "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { - "version": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { - "version": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-helper-regex": { - "version": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.5" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-helper-remap-async-to-generator": { - "version": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-helper-function-name": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { - "version": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { - "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { - "version": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + "babel-template": "6.26.0" } }, "babel-jest": { "version": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", + "integrity": "sha512-eAycDKZn+m6jMBv5KMXRKttDeoDUE7Y6eQpeiF4ip0lLaI4uwGNhJIdVK2RptHjO9N9RJ2gONMn2XE67wBdf8A==", "requires": { "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "babel-plugin-istanbul": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", - "babel-preset-jest": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz" + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "20.0.3" } }, "babel-loader": { "version": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", - "integrity": "sha1-LkOma+4f/0RwUz0EAsikUy+vuvc=", + "integrity": "sha512-Kt7ND6R8tB0E372MdnZM9H7ImYYF9VevfVHjAa7Q1JKt4tpwihupfFwFc5BiLDWIsehNY+VQ4zyl2E22y86pbA==", "requires": { - "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "find-cache-dir": "0.1.1", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" } }, "babel-messages": { - "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-check-es2015-constants": { - "version": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-dynamic-import-node": { - "version": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz", "integrity": "sha1-rbW8j0iokxFUA5WunwzD7UsQuy4=", "requires": { - "babel-plugin-syntax-dynamic-import": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-istanbul": { - "version": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", - "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "test-exclude": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz" + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.10.1", + "test-exclude": "4.2.1" } }, "babel-plugin-jest-hoist": { - "version": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" }, "babel-plugin-syntax-async-functions": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-class-properties": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-dynamic-import": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" }, "babel-plugin-syntax-exponentiation-operator": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-flow": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-jsx": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" }, "babel-plugin-transform-async-to-generator": { - "version": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { - "babel-helper-remap-async-to-generator": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "babel-plugin-syntax-async-functions": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-class-properties": { - "version": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-plugin-syntax-class-properties": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-block-scoping": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.5" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-plugin-transform-es2015-classes": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { - "babel-helper-define-map": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-duplicate-keys": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-function-name": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-helper-function-name": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-modules-amd": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "requires": { - "babel-plugin-transform-strict-mode": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-plugin-transform-es2015-modules-systemjs": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { - "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "babel-helper-hoist-variables": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { - "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { - "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "babel-helper-replace-supers": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-parameters": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { - "babel-helper-call-delegate": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-sticky-regex": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { - "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "babel-helper-regex": "6.26.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-typeof-symbol": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-es2015-unicode-regex": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { - "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "babel-helper-regex": "6.26.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "regexpu-core": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { - "version": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "babel-plugin-syntax-exponentiation-operator": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-flow-strip-types": { - "version": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { - "babel-plugin-syntax-flow": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "babel-plugin-syntax-flow": "6.18.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-object-rest-spread": { - "version": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", "requires": { - "babel-plugin-syntax-object-rest-spread": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "babel-plugin-syntax-object-rest-spread": "6.13.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-react-constant-elements": { - "version": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-react-display-name": { - "version": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-react-jsx": { - "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { - "babel-helper-builder-react-jsx": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", - "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-react-jsx-self": { - "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { - "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-plugin-syntax-jsx": "6.18.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-react-jsx-source": { - "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { - "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "babel-plugin-syntax-jsx": "6.18.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-regenerator": { - "version": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", "requires": { - "regenerator-transform": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz" + "regenerator-transform": "0.9.11" } }, "babel-plugin-transform-runtime": { - "version": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" } }, "babel-plugin-transform-strict-mode": { - "version": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" + "babel-types": "6.26.0" } }, "babel-preset-env": { - "version": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", "requires": { - "babel-plugin-check-es2015-constants": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "babel-plugin-syntax-trailing-function-commas": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "babel-plugin-transform-async-to-generator": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "babel-plugin-transform-es2015-arrow-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "babel-plugin-transform-es2015-block-scoped-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "babel-plugin-transform-es2015-block-scoping": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "babel-plugin-transform-es2015-classes": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "babel-plugin-transform-es2015-computed-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "babel-plugin-transform-es2015-destructuring": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "babel-plugin-transform-es2015-duplicate-keys": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "babel-plugin-transform-es2015-for-of": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "babel-plugin-transform-es2015-function-name": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "babel-plugin-transform-es2015-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "babel-plugin-transform-es2015-modules-systemjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "babel-plugin-transform-es2015-modules-umd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "babel-plugin-transform-es2015-object-super": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "babel-plugin-transform-es2015-parameters": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "babel-plugin-transform-es2015-shorthand-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "babel-plugin-transform-es2015-spread": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "babel-plugin-transform-es2015-sticky-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "babel-plugin-transform-es2015-template-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "babel-plugin-transform-es2015-typeof-symbol": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "babel-plugin-transform-es2015-unicode-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "babel-plugin-transform-exponentiation-operator": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "babel-plugin-transform-regenerator": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.24.1", + "browserslist": "2.11.3", + "invariant": "2.2.4", + "semver": "5.5.0" } }, "babel-preset-flow": { - "version": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { - "babel-plugin-transform-flow-strip-types": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz" + "babel-plugin-transform-flow-strip-types": "6.22.0" } }, "babel-preset-jest": { - "version": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { - "babel-plugin-jest-hoist": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz" + "babel-plugin-jest-hoist": "20.0.3" } }, "babel-preset-react": { - "version": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { - "babel-plugin-syntax-jsx": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "babel-plugin-transform-react-display-name": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "babel-plugin-transform-react-jsx": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "babel-plugin-transform-react-jsx-self": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "babel-plugin-transform-react-jsx-source": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "babel-preset-flow": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" } }, "babel-preset-react-app": { "version": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", - "integrity": "sha1-i3RMvkf9V8ho5vkTVSzq4mrjGGA=", + "integrity": "sha512-YjvnkyvQ0lbqzDd+iG2638Eloy8FtPkkhG6Brv3x8UBHFCC1V25KuUrJqAlKMrANIqyccjrKS9YyanjSJ7EySg==", "requires": { - "babel-plugin-dynamic-import-node": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz", - "babel-plugin-syntax-dynamic-import": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "babel-plugin-transform-class-properties": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "babel-plugin-transform-object-rest-spread": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", - "babel-plugin-transform-react-constant-elements": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "babel-plugin-transform-react-jsx": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "babel-plugin-transform-react-jsx-self": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "babel-plugin-transform-react-jsx-source": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "babel-plugin-transform-regenerator": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "babel-plugin-transform-runtime": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "babel-preset-env": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", - "babel-preset-react": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz" + "babel-plugin-dynamic-import-node": "1.0.2", + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.23.0", + "babel-plugin-transform-react-constant-elements": "6.23.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-plugin-transform-regenerator": "6.24.1", + "babel-plugin-transform-runtime": "6.23.0", + "babel-preset-env": "1.5.2", + "babel-preset-react": "6.24.1" } }, "babel-register": { - "version": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "home-or-tmp": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.5", + "home-or-tmp": "2.0.0", "lodash": "4.17.5", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "source-map-support": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz" + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" }, "dependencies": { "babel-core": { - "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "babel-helpers": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-register": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", "lodash": "4.17.5", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "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.5.5", + "regenerator-runtime": "0.11.1" } }, "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "babel-runtime": { "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "integrity": "sha512-9Vdluea/MpskdLsLYTH10Wtc5z2U0THGHVJeqec0EHUbfEt2q3zM1piQ+/GjMl9h0drUY1hF8zHV9nmH8Kl+Og==", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" + "core-js": "2.5.5", + "regenerator-runtime": "0.10.5" }, "dependencies": { "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" } } }, "babel-template": { - "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", "lodash": "4.17.5" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-traverse": { - "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", "lodash": "4.17.5" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babel-types": { - "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "babel-runtime": "6.26.0", + "esutils": "2.0.2", "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" + "to-fast-properties": "1.0.3" + }, + "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.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "babylon": { - "version": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha1-Pot0AriNIsNCPhN6FXeIOxX/hpo=" + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, "base64-js": { - "version": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==" }, "batch": { - "version": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { - "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + "tweetnacl": "0.14.5" } }, "big.js": { - "version": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" }, "binary-extensions": { - "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", - "integrity": "sha1-ZlBsFs5vTWkopbPNajPKQelB43s=" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, "bluebird": { - "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, "bn.js": { - "version": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha1-3bBI5Q2UgnkAlME+s/z8gzznq0Y=" + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } }, "bonjour": { - "version": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { - "array-flatten": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "deep-equal": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "dns-equal": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "dns-txt": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "multicast-dns": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "multicast-dns-service-types": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" } }, "boolbase": { - "version": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boom": { - "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + "hoek": "4.2.1" } }, "bootstrap": { @@ -1092,244 +1638,352 @@ "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" }, "boxen": { - "version": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", - "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "requires": { - "ansi-align": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cli-boxes": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "filled-array": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "widest-line": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.2", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "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=" + }, "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.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=" + }, + "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" + } } } }, "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "balanced-match": "1.0.0", + "concat-map": "0.0.1" } }, "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + "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.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "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.1" + } + } } }, "brorand": { - "version": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-resolve": { - "version": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", "requires": { - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + "resolve": "1.1.7" }, "dependencies": { "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } }, "browserify-aes": { - "version": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "buffer-xor": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "browserify-cipher": { - "version": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "browserify-des": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "des.js": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" } }, "browserify-rsa": { - "version": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + "bn.js": "4.11.8", + "randombytes": "2.0.6" } }, "browserify-sign": { - "version": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" } }, "browserify-zlib": { - "version": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" + "pako": "1.0.6" } }, "browserslist": { - "version": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", - "integrity": "sha1-6bRhi4oBwZP5eGvuoJ9v0Q2+McM=", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000709.tgz", - "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + "caniuse-lite": "1.0.30000827", + "electron-to-chromium": "1.3.42" } }, "bser": { - "version": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { - "node-int64": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + "node-int64": "0.4.0" } }, "buffer": { - "version": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "ieee754": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "base64-js": "1.2.3", + "ieee754": "1.1.11", + "isarray": "1.0.0" } }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" + }, "buffer-indexof": { - "version": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.0.tgz", - "integrity": "sha1-9U9kfE9OJSKLqmVqLlfkPV8nCYI=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, "buffer-xor": { - "version": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { - "version": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { - "version": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } }, "caller-path": { - "version": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { - "callsites": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" + "callsites": "0.2.0" } }, "callsites": { - "version": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" }, "camel-case": { - "version": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", - "upper-case": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "camelcase-keys": { - "version": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + "camelcase": "2.1.1", + "map-obj": "1.0.1" }, "dependencies": { "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" } } }, "caniuse-api": { - "version": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", - "lodash.memoize": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "lodash.uniq": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000827", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" }, "dependencies": { "browserslist": { - "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", - "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + "caniuse-db": "1.0.30000827", + "electron-to-chromium": "1.3.42" } } } }, "caniuse-db": { - "version": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", - "integrity": "sha1-C2AAcrfNu/YzaodYtxua0DJo7eI=" + "version": "1.0.30000827", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000827.tgz", + "integrity": "sha1-vSg53Rlgk7RMKMF/k1ExQMnZJYg=" }, "caniuse-lite": { - "version": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000709.tgz", - "integrity": "sha1-4CfHoN/VraWPkxoQgPxxllN1VZs=" + "version": "1.0.30000827", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000827.tgz", + "integrity": "sha512-j9Q9hP5AhqOARNP6fLdctr3XrGhF921sBSycudf4E+8RCWpFT3rJdTfp/5o8LDp6p0NJTpYWEpBFiM+QEDzA6g==" }, "capture-stack-trace": { - "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "case-sensitive-paths-webpack-plugin": { "version": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", - "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=" + "integrity": "sha512-Zg7Z9IuE0T+Ilg+o0IVpZXHAcN6VHO80BVxak3RIB1pmcbiITr06WlZ45Xa/KGQ7fQ/ar6C1KEkeI93tojBJPQ==" }, "caseless": { - "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { - "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chai": { @@ -1389,568 +2043,772 @@ }, "chalk": { "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, "chokidar": { - "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "requires": { - "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "async-each": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "is-binary-path": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz" + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + }, + "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.10", + "normalize-path": "2.1.1" + } + }, + "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.2" + }, + "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.1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "2.1.1" + } + } } }, "ci-info": { - "version": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==" }, "cipher-base": { - "version": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "circular-json": { - "version": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=" + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" }, "clap": { - "version": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", - "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" } }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, "classnames": { "version": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" }, "clean-css": { - "version": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", - "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "cli-boxes": { - "version": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { - "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "requires": { - "restore-cursor": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" + "restore-cursor": "1.0.1" } }, "cli-width": { - "version": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" }, "dependencies": { "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } }, "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, "co": { - "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { - "version": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { - "q": "https://registry.npmjs.org/q/-/q-1.5.0.tgz" + "q": "1.5.1" } }, "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, "color": { - "version": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "color-string": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" + "clone": "1.0.4", + "color-convert": "1.9.1", + "color-string": "0.3.0" } }, "color-convert": { - "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "color-name": "1.1.3" } }, "color-name": { - "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "color-name": "1.1.3" } }, "colormin": { - "version": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { - "color": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "css-color-names": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + "color": "0.11.4", + "css-color-names": "0.0.4", + "has": "1.0.1" } }, "colors": { - "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "delayed-stream": "1.0.0" } }, "commander": { - "version": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=" + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, "commondir": { - "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "compare-versions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", + "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, "compressible": { - "version": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" + "mime-db": "1.33.0" } }, "compression": { - "version": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "version": "1.7.2", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "compressible": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "vary": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz" + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.13", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" } }, "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { - "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "configstore": { - "version": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "osenv": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz" - }, - "dependencies": { - "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - } + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" } }, "connect-history-api-fallback": { - "version": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=" }, "console-browserify": { - "version": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" + "date-now": "0.1.4" } }, "constants-browserify": { - "version": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { - "version": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, "content-disposition": { - "version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { - "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "content-type-parser": { - "version": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" }, "convert-source-map": { - "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" }, "cookie": { - "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { - "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, "core-js": { "version": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "requires": { - "is-directory": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "require-from-string": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" }, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "create-ecdh": { - "version": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", + "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz" + "bn.js": "4.11.8", + "elliptic": "6.4.0" } }, "create-error-class": { - "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { - "capture-stack-trace": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz" + "capture-stack-trace": "1.0.0" } }, "create-hash": { - "version": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.4", + "ripemd160": "2.0.1", + "sha.js": "2.4.11" } }, "create-hmac": { - "version": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.11" } }, "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + "lru-cache": "4.1.2", + "which": "1.3.0" } }, "cryptiles": { - "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.1" + } + } } }, "crypto-browserify": { - "version": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "browserify-sign": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "create-ecdh": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "diffie-hellman": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "public-encrypt": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, + "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-color-names": { - "version": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, "css-loader": { "version": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", - "integrity": "sha1-bPNXkZLONV6LONX0Ldeh8uyJjQ8=", + "integrity": "sha512-umVjsx1rY6Nozzi01Ni32aicDaZ6fBgMC8X3Xk1hqFgYpS5k3YT30K8cqMVVX8YKpkjMCDDdsQ07uLZCShSAmQ==", "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "css-selector-tokenizer": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "cssnano": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "icss-utils": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "lodash.camelcase": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-modules-extract-imports": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "postcss-modules-local-by-default": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "postcss-modules-scope": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "postcss-modules-values": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz" + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.0", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.1.0", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.0", + "source-list-map": "0.1.8" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "css-select": { - "version": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "css-what": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "domutils": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "nth-check": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz" + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" } }, "css-selector-tokenizer": { - "version": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { - "cssesc": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "fastparse": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "regexpu-core": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz" + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" }, "dependencies": { "regexpu-core": { - "version": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { - "regenerate": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "regjsgen": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "regjsparser": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } } } }, "css-what": { - "version": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "cssesc": { - "version": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" }, "cssnano": { - "version": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { - "autoprefixer": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-calc": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "postcss-colormin": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "postcss-convert-values": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "postcss-discard-comments": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "postcss-discard-duplicates": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "postcss-discard-empty": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "postcss-discard-overridden": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "postcss-discard-unused": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "postcss-filter-plugins": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "postcss-merge-idents": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "postcss-merge-longhand": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "postcss-merge-rules": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "postcss-minify-font-values": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "postcss-minify-gradients": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "postcss-minify-params": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "postcss-minify-selectors": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "postcss-normalize-charset": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "postcss-normalize-url": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "postcss-ordered-values": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "postcss-reduce-idents": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "postcss-reduce-initial": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "postcss-reduce-transforms": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "postcss-svgo": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "postcss-unique-selectors": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "postcss-zindex": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz" + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.1", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.2", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.0", + "postcss-zindex": "2.2.0" }, "dependencies": { "autoprefixer": { - "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", - "normalize-range": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "num2fraction": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000827", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" } }, "browserslist": { - "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", - "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + "caniuse-db": "1.0.30000827", + "electron-to-chromium": "1.3.42" } }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "csso": { - "version": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { - "clap": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "clap": "1.2.3", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "cssom": { - "version": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" }, "cssstyle": { - "version": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { - "cssom": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz" + "cssom": "0.3.2" } }, "currently-unhandled": { - "version": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "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": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + "array-find-index": "1.0.2" } }, "d": { - "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz" + "es5-ext": "0.10.42" } }, "d3": { "version": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + "integrity": "sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==" }, "d3-array": { "version": "1.2.1", @@ -1963,7 +2821,7 @@ }, "d3-path": { "version": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", - "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" + "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" }, "d3-scale": { "version": "1.0.7", @@ -2037,369 +2895,464 @@ } }, "damerau-levenshtein": { - "version": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" }, "dashdash": { - "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } + "assert-plus": "1.0.0" } }, "date-now": { - "version": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "ms": "2.0.0" } }, "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "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=" + }, "deep-equal": { - "version": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deep-extend": { - "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "deep-is": { - "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-require-extensions": { - "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "requires": { - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + "strip-bom": "2.0.0" } }, "define-properties": { - "version": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "object-keys": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz" + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } } }, "defined": { - "version": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { - "version": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { - "globby": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "is-path-cwd": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "is-path-in-cwd": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" } }, "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { - "version": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "destroy": { - "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { - "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + "repeating": "2.0.1" } }, "detect-node": { - "version": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" }, "detect-port-alt": { - "version": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", "requires": { - "address": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz" + "address": "1.0.2", + "debug": "2.6.9" } }, "diff": { - "version": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha1-BWaVFQ16qTI3yn43isOxaCt5Y7k=" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { - "version": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "miller-rabin": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" } }, "dns-equal": { - "version": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.1.1.tgz", - "integrity": "sha1-I2nUUDivBF84mOb6VoYq7T9AKWw=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { - "ip": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + "ip": "1.1.5", + "safe-buffer": "5.1.1" } }, "dns-txt": { - "version": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "buffer-indexof": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.0.tgz" + "buffer-indexof": "1.1.1" } }, "doctrine": { - "version": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "esutils": "2.0.2" } }, "dom-converter": { - "version": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { - "utila": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz" + "utila": "0.3.3" }, "dependencies": { "utila": { - "version": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } }, "dom-helpers": { - "version": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", - "integrity": "sha1-MgPgf+0he9H0JLAZc1WC/Deyglo=" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", + "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" }, "dom-serializer": { - "version": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "entities": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" + "domelementtype": "1.1.3", + "entities": "1.1.1" }, "dependencies": { "domelementtype": { - "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, "dom-urls": { - "version": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { - "urijs": "https://registry.npmjs.org/urijs/-/urijs-1.18.10.tgz" + "urijs": "1.19.1" } }, - "dom-walk": { - "version": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, "domain-browser": { - "version": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { - "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domhandler": { - "version": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + "domelementtype": "1.3.0" } }, "domutils": { - "version": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" } }, "dot-prop": { - "version": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "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==", "requires": { - "is-obj": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + "is-obj": "1.0.1" } }, "dotenv": { "version": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + "integrity": "sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ==" }, "duplexer": { - "version": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, - "duplexer2": { - "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "ecc-jsbn": { - "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + "jsbn": "0.1.1" } }, "ee-first": { - "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz", - "integrity": "sha1-0OAmc1dUdwkBrjAaIWZMukXZL30=" + "version": "1.3.42", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz", + "integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=" }, "elliptic": { - "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "hmac-drbg": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "emoji-regex": { - "version": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha1-m66pKbFVVlwR6kHGYm6qZc75ksI=" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" }, "emojis-list": { - "version": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { - "version": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { - "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz" + "iconv-lite": "0.4.21" + }, + "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.2" + } + } } }, "enhanced-resolve": { - "version": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "tapable": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz" + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" } }, "entities": { - "version": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "errno": { - "version": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" + "prr": "1.0.1" } }, "error-ex": { - "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "is-arrayish": "0.2.1" } }, "es-abstract": { - "version": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", - "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "requires": { - "es-to-primitive": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "is-regex": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" } }, "es-to-primitive": { - "version": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { - "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "is-date-object": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "is-symbol": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz" + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" } }, "es5-ext": { - "version": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "requires": { - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { - "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-symbol": "3.1.1" } }, "es6-map": { - "version": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-set": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -2408,462 +3361,657 @@ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" }, "es6-set": { - "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-symbol": { - "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz" + "d": "1.0.0", + "es5-ext": "0.10.42" } }, "es6-weak-map": { - "version": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-html": { - "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" }, "dependencies": { - "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" - }, - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "optional": true, - "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" - } + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" } } }, "escope": { - "version": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "es6-weak-map": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "esrecurse": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint": { "version": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "integrity": "sha512-x6LJGXWCGB/4YOBhL48yeppZTo+YQUNC37N5qqCpC1b1kkNzydlQHQAtPuUSFoZSxgIadrysQoW2Hq602P+uEA==", "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-code-frame": "6.26.0", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "escope": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "espree": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "esquery": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "file-entry-cache": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "ignore": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "inquirer": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "is-resolvable": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "doctrine": "2.1.0", + "escope": "3.6.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.17.2", + "is-resolvable": "1.1.0", + "js-yaml": "3.7.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", "lodash": "4.17.5", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "pluralize": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "progress": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "require-uncached": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "shelljs": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "table": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "text-table": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "user-home": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" }, "dependencies": { "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "eslint-config-react-app": { "version": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", - "integrity": "sha1-mDN1l7wBzCKZH8vdoHRR87RRFxg=" + "integrity": "sha512-nA3AYTMUGKVYH1goOp72fFdj33mxC1rElATOLDrCMbbhmtVz4K61NxKBc6vj9OwjugROioF2LYXZMZIFAfFozA==" }, "eslint-import-resolver-node": { - "version": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz" + "debug": "2.6.9", + "object-assign": "4.1.1", + "resolve": "1.7.0" } }, "eslint-loader": { "version": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", - "integrity": "sha1-ULFY3WJy3O+5fphCVIN/gaWALOA=", + "integrity": "sha512-4xbtW4Zo5Xpg8fBcx0z4VvWVhdrJJazcNa8yTGrXc4tuppNJEFn5qI/crMORetebvuqkM1W6UhZVKwLklxoSdA==", "requires": { - "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "loader-fs-cache": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "object-hash": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + "find-cache-dir": "0.1.1", + "loader-fs-cache": "1.0.1", + "loader-utils": "1.1.0", + "object-assign": "4.1.1", + "object-hash": "1.3.0", + "rimraf": "2.6.2" } }, "eslint-module-utils": { - "version": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + "debug": "2.6.9", + "pkg-dir": "1.0.0" } }, "eslint-plugin-flowtype": { "version": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", - "integrity": "sha1-uYdfMUZS5QgWI8nSsYo0a7t1nAk=", + "integrity": "sha512-a8EGMRsWMqQe7hScFqrg7GytNazT8LaT8dUWRwxeLkFwE1XuSeNxzGeQn86lX9V756HpDvACLk+SdRz3u9ALmA==", "requires": { "lodash": "4.17.5" } }, "eslint-plugin-import": { "version": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "integrity": "sha512-8HLeIYzOH4eltevxf+iC9Dtz/91yaeOqtlba5srcpQWLrv57F5NNG1RNLqAbpWJWDD4BxKuKjUveJY9W6Tbswg==", "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "contains-path": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "eslint-import-resolver-node": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "eslint-module-utils": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "lodash.cond": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "pkg-up": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz" + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.2.3", + "eslint-module-utils": "2.2.0", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "pkg-up": "1.0.0" }, "dependencies": { "doctrine": { - "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "esutils": "2.0.2", + "isarray": "1.0.0" } } } }, "eslint-plugin-jsx-a11y": { "version": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", - "integrity": "sha1-SpOfduwSUBBSiCMzG/lIzFczgLY=", + "integrity": "sha512-YNIrEw8cepPQlHcPUKLbJF9R4O4duG7ZGZuT0L+jYVdsRmBb6klnpYI0XnuEK3qMirTuuovb4Lg6+Scy4BCwaA==", "requires": { - "aria-query": "https://registry.npmjs.org/aria-query/-/aria-query-0.5.0.tgz", - "array-includes": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "ast-types-flow": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "axobject-query": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "damerau-levenshtein": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "emoji-regex": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "jsx-ast-utils": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz" + "aria-query": "0.5.0", + "array-includes": "3.0.3", + "ast-types-flow": "0.0.7", + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.1", + "jsx-ast-utils": "1.4.1" } }, "eslint-plugin-react": { "version": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", - "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", + "integrity": "sha512-lErfLh7LnbGOnLku3CS6Deep3PJwg8+mwK40PRYQ6ACvZuAGUAt7mI76dCJKDJbfvmctg6dOq41baMVY+xWFEg==", "requires": { - "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "jsx-ast-utils": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz" + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1" } }, "espree": { - "version": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" + "acorn": "5.5.3", + "acorn-jsx": "3.0.1" } }, "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" }, "esquery": { - "version": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "requires": { - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "estraverse": "4.2.0" } }, "esrecurse": { - "version": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "estraverse": "4.2.0" } }, "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { - "version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { - "version": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz" + "d": "1.0.0", + "es5-ext": "0.10.42" } }, "eventemitter3": { - "version": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" }, "events": { - "version": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { - "version": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { - "original": "https://registry.npmjs.org/original/-/original-1.0.0.tgz" + "original": "1.0.0" } }, "evp_bytestokey": { - "version": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz" + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" } }, "exec-sh": { - "version": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", - "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "requires": { - "merge": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz" + "merge": "1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } } }, "exit-hook": { - "version": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" }, "expand-brackets": { - "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "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.1" + } + } } }, "expand-range": { - "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { - "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" + "fill-range": "2.2.3" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "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" + } + }, + "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.6" + } + } } }, "express": { - "version": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", - "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "array-flatten": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "content-disposition": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "etag": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "merge-descriptors": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "proxy-addr": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "send": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", - "serve-static": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", - "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "vary": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz" + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" }, "dependencies": { "array-flatten": { - "version": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - } - }, "path-to-regexp": { - "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "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": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" } } }, "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, - "external-editor": { - "version": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "jschardet": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz", - "tmp": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" } }, "extglob": { - "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "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.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } } }, "extract-text-webpack-plugin": { "version": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", - "integrity": "sha1-dW7076gVXDaBgz+8NNpTuUF0bWw=", + "integrity": "sha512-Dv5Y7okQmgFQiKJUuitKYnmnMOT3Sfg47k/AakBA5a4Wl8QBGZy+Yep0IZxUu5OwktdpaY49mvvoudaKbzbzlA==", "requires": { - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "schema-utils": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "webpack-sources": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz" + "async": "2.6.0", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0", + "webpack-sources": "1.1.0" } }, "extsprintf": { - "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "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=" }, "fast-levenshtein": { - "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastparse": { - "version": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" }, "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" + "websocket-driver": "0.7.0" } }, "fb-watchman": { - "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "requires": { - "bser": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz" + "bser": "2.0.0" } }, "fbemitter": { "version": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", - "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", + "integrity": "sha512-hd8PgD+Q6RQtlcGrkM9oY3MFIjq6CA6wurCK1TKn2eaA76Ww4VAOihmq98NyjRhjJi/axgznZnh9lF8+TcTsNQ==", "requires": { "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz" } }, "fbjs": { "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", - "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=", + "integrity": "sha512-SBiP6XPiWIlX1tE5mvU/UeUFoqzJgbf+ezkl0M8D2xk4urDb+2uyjjGB10HAPluLboUqqVHtgUwwyuWakUfMgQ==", "requires": { "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz" + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } } }, "figures": { - "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, "file-entry-cache": { - "version": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { - "flat-cache": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-loader": { "version": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", - "integrity": "sha1-T/HfKK84cZpgmAk7iMgscdF5SjQ=", + "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", "requires": { - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + "loader-utils": "1.1.0" } }, "file-saver": { @@ -2872,86 +4020,91 @@ "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" }, "filename-regex": { - "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fileset": { - "version": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + "glob": "7.1.2", + "minimatch": "3.0.4" } }, "filesize": { - "version": "https://registry.npmjs.org/filesize/-/filesize-3.3.0.tgz", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.3.0.tgz", "integrity": "sha1-UxSeo0YOOy4CSWKlFkiqVyz5gSI=" }, "fill-range": { - "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - } - }, - "filled-array": { - "version": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=" - }, - "finalhandler": { - "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", - "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", - "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "is-extendable": "0.1.1" } } } }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "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", + "unpipe": "1.0.0" + } + }, "find-cache-dir": { - "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { - "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + "locate-path": "2.0.0" } }, "flat-cache": { - "version": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "requires": { - "circular-json": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "del": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "write": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" } }, "flatten": { - "version": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, "flux": { @@ -2963,64 +4116,87 @@ } }, "for-in": { - "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { - "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + "for-in": "1.0.2" } }, "foreach": { - "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, "forwarded": { - "version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "0.2.2" + } }, "fresh": { - "version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-extra": { "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "universalify": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz" + "graceful-fs": "4.1.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" } }, "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha1-MoK3E/s62A7eDp/PRhG1qm/AM/Q=", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", "optional": true, "requires": { - "nan": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "nan": "2.10.0", "node-pre-gyp": "0.6.36" }, "dependencies": { "abbrev": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "bundled": true, "optional": true }, "ajv": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "bundled": true, "optional": true, "requires": { "co": "4.6.0", @@ -3029,19 +4205,16 @@ }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "bundled": true }, "aproba": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "bundled": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "bundled": true, "optional": true, "requires": { "delegates": "1.0.0", @@ -3050,43 +4223,36 @@ }, "asn1": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "bundled": true, "optional": true }, "assert-plus": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "bundled": true, "optional": true }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "bundled": true, "optional": true }, "aws-sign2": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "bundled": true, "optional": true }, "aws4": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "bundled": true, "optional": true }, "balanced-match": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "bundled": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "bundled": true, "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -3094,24 +4260,21 @@ }, "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=", + "bundled": true, "requires": { "inherits": "2.0.3" } }, "boom": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "bundled": true, "requires": { "hoek": "2.16.3" } }, "brace-expansion": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "bundled": true, "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -3119,53 +4282,44 @@ }, "buffer-shims": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "bundled": true }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "bundled": true, "optional": true }, "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "bundled": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "bundled": true }, "combined-stream": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "bundled": true, "requires": { "delayed-stream": "1.0.0" } }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "bundled": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "bundled": true }, "cryptiles": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "bundled": true, "optional": true, "requires": { "boom": "2.10.1" @@ -3173,8 +4327,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "bundled": true, "optional": true, "requires": { "assert-plus": "1.0.0" @@ -3182,16 +4335,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "debug": { "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "bundled": true, "optional": true, "requires": { "ms": "2.0.0" @@ -3199,25 +4350,21 @@ }, "deep-extend": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "bundled": true, "optional": true }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "bundled": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "bundled": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -3225,25 +4372,21 @@ }, "extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "bundled": true, "optional": true }, "extsprintf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + "bundled": true }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "bundled": true, "optional": true }, "form-data": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "bundled": true, "optional": true, "requires": { "asynckit": "0.4.0", @@ -3253,13 +4396,11 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "bundled": true }, "fstream": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "bundled": true, "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -3269,8 +4410,7 @@ }, "fstream-ignore": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "bundled": true, "optional": true, "requires": { "fstream": "1.0.11", @@ -3280,8 +4420,7 @@ }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "optional": true, "requires": { "aproba": "1.1.1", @@ -3296,8 +4435,7 @@ }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "bundled": true, "optional": true, "requires": { "assert-plus": "1.0.0" @@ -3305,16 +4443,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "bundled": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -3326,19 +4462,16 @@ }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "bundled": true }, "har-schema": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "bundled": true, "optional": true }, "har-validator": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "bundled": true, "optional": true, "requires": { "ajv": "4.11.8", @@ -3347,14 +4480,12 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "optional": true }, "hawk": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "bundled": true, "optional": true, "requires": { "boom": "2.10.1", @@ -3365,13 +4496,11 @@ }, "hoek": { "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "bundled": true }, "http-signature": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "bundled": true, "optional": true, "requires": { "assert-plus": "0.2.0", @@ -3381,8 +4510,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -3390,44 +4518,37 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "bundled": true }, "ini": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "bundled": true, "optional": true }, "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=", + "bundled": true, "requires": { "number-is-nan": "1.0.1" } }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "bundled": true, "optional": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "bundled": true }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "bundled": true, "optional": true }, "jodid25519": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "bundled": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -3435,20 +4556,17 @@ }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "bundled": true, "optional": true }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "bundled": true, "optional": true }, "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=", + "bundled": true, "optional": true, "requires": { "jsonify": "0.0.0" @@ -3456,20 +4574,17 @@ }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "bundled": true, "optional": true }, "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "bundled": true, "optional": true }, "jsprim": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "bundled": true, "optional": true, "requires": { "assert-plus": "1.0.0", @@ -3480,56 +4595,48 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "mime-db": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + "bundled": true }, "mime-types": { "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "bundled": true, "requires": { "mime-db": "1.27.0" } }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "bundled": true }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "optional": true }, "node-pre-gyp": { "version": "0.6.36", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", - "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "bundled": true, "optional": true, "requires": { "mkdirp": "0.5.1", @@ -3545,8 +4652,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "optional": true, "requires": { "abbrev": "1.1.0", @@ -3555,8 +4661,7 @@ }, "npmlog": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "bundled": true, "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -3567,45 +4672,38 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "bundled": true }, "oauth-sign": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "bundled": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "optional": true }, "osenv": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "bundled": true, "optional": true, "requires": { "os-homedir": "1.0.2", @@ -3614,36 +4712,30 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "bundled": true }, "performance-now": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "bundled": true, "optional": true }, "process-nextick-args": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "bundled": true }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "bundled": true, "optional": true }, "qs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "bundled": true, "optional": true }, "rc": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "bundled": true, "optional": true, "requires": { "deep-extend": "0.4.2", @@ -3654,16 +4746,14 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "optional": true } } }, "readable-stream": { "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "bundled": true, "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -3676,8 +4766,7 @@ }, "request": { "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "bundled": true, "optional": true, "requires": { "aws-sign2": "0.6.0", @@ -3706,39 +4795,33 @@ }, "rimraf": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "bundled": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + "bundled": true }, "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bundled": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "optional": true }, "sntp": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "bundled": true, "optional": true, "requires": { "hoek": "2.16.3" @@ -3746,8 +4829,7 @@ }, "sshpk": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "bundled": true, "optional": true, "requires": { "asn1": "0.2.3", @@ -3763,16 +4845,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -3781,36 +4861,31 @@ }, "string_decoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "bundled": true, "requires": { "safe-buffer": "5.0.1" } }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "bundled": true, "optional": true }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "requires": { "ansi-regex": "2.1.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=", + "bundled": true, "optional": true }, "tar": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "bundled": true, "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -3819,8 +4894,7 @@ }, "tar-pack": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "bundled": true, "optional": true, "requires": { "debug": "2.6.8", @@ -3835,8 +4909,7 @@ }, "tough-cookie": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "bundled": true, "optional": true, "requires": { "punycode": "1.4.1" @@ -3844,8 +4917,7 @@ }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "bundled": true, "optional": true, "requires": { "safe-buffer": "5.0.1" @@ -3853,31 +4925,26 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "bundled": true, "optional": true }, "uid-number": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "bundled": true, "optional": true }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "bundled": true }, "uuid": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "bundled": true, "optional": true }, "verror": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "bundled": true, "optional": true, "requires": { "extsprintf": "1.0.2" @@ -3885,8 +4952,7 @@ }, "wide-align": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "bundled": true, "optional": true, "requires": { "string-width": "1.0.2" @@ -3894,8 +4960,7 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "bundled": true } } }, @@ -3908,772 +4973,1118 @@ } }, "function-bind": { - "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gaugeJS": { - "version": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.5.tgz", - "integrity": "sha1-v0ZTn6uuVfVVxRT3XQuEBAx2AdY=" + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.6.tgz", + "integrity": "sha1-ZZEzRNsl/sdeS6kxTHxzlwtRR68=" }, "generate-function": { - "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" }, "generate-object-property": { - "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "requires": { - "is-property": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + "is-property": "1.0.2" } }, "get-caller-file": { - "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-stdin": { - "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, "getpass": { - "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } + "assert-plus": "1.0.0" } }, "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-base": { - "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { - "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "is-glob": "2.0.1" } }, - "global": { - "version": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "min-document": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "process": "https://registry.npmjs.org/process/-/process-0.5.2.tgz" - }, - "dependencies": { - "process": { - "version": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - } + "ini": "1.3.5" } }, "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { - "version": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { - "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "got": { - "version": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { - "create-error-class": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "is-redirect": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "is-retry-allowed": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "lowercase-keys": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "node-status-codes": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "timed-out": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "url-parse-lax": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growly": { - "version": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gzip-size": { - "version": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + "duplexer": "0.1.1" } }, "handle-thing": { - "version": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" }, "handlebars": { - "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { - "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { "async": { - "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + "amdefine": "1.0.1" } }, "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "optional": true } } }, "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" } } } }, "har-schema": { - "version": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "har-schema": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" + "ajv": "5.5.2", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } }, "has": { - "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "requires": { - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" + "function-bind": "1.1.1" } }, "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + "ansi-regex": "2.1.1" } }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } }, "hash-base": { - "version": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "hash.js": { - "version": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "hawk": { - "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" } }, "he": { - "version": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { - "version": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" }, "hoist-non-react-statics": { - "version": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, "home-or-tmp": { - "version": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "hosted-git-info": { - "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "hpack.js": { - "version": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "obuf": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "wbuf": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz" + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" } }, "html-comment-regex": { - "version": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" }, "html-encoding-sniffer": { - "version": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz" + "whatwg-encoding": "1.0.3" } }, "html-entities": { - "version": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { - "version": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", - "integrity": "sha1-SideOxoWY5q7ebTBEZH/DQ/PGrk=", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.14.tgz", + "integrity": "sha512-sZjw6zhQgyUnIlIPU+W80XpRjWjdxHtNcxjfyOskOsCTDKytcfLY04wsQY/83Yqb4ndoiD2FtauiL7Yg6uUQFQ==", "requires": { - "camel-case": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "clean-css": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", - "commander": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "he": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "ncname": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "param-case": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "relateurl": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz" + "camel-case": "3.0.0", + "clean-css": "4.1.11", + "commander": "2.15.1", + "he": "1.1.1", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.20" } }, "html-webpack-plugin": { "version": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", - "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", + "integrity": "sha512-XgOxN8H7nDeLQzD9FQOWWQLVL0GDq5reeREx8jpLZcEZND7kM5j3o/mFhjOcSfZ89HwU3+yBqSQyK7ZvvYFZ/w==", "requires": { - "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "html-minifier": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "bluebird": "3.5.1", + "html-minifier": "3.5.14", + "loader-utils": "0.2.17", "lodash": "4.17.5", - "pretty-error": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "toposort": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz" + "pretty-error": "2.1.1", + "toposort": "1.0.6" }, "dependencies": { "loader-utils": { - "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } } } }, "htmlparser2": { - "version": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "domhandler": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "domutils": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" }, "dependencies": { "domutils": { - "version": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + "domelementtype": "1.3.0" } }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, "http-deceiver": { - "version": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", - "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "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": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" - }, - "dependencies": { - "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" - } + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.4.0" } }, + "http-parser-js": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz", + "integrity": "sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA==" + }, "http-proxy": { - "version": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "requires": { - "eventemitter3": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" } }, "http-proxy-middleware": { - "version": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { - "http-proxy": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "http-proxy": "1.16.2", + "is-glob": "3.1.0", "lodash": "4.17.5", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" + "micromatch": "2.3.11" }, "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + } + } + }, "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "is-extglob": "2.1.1" + } + }, + "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.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + } } } } }, "http-signature": { - "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" } }, "https-browserify": { - "version": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=" + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "icss-replace-symbols": { - "version": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "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": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + "postcss": "6.0.21" } }, "ieee754": { - "version": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==" }, "ignore": { - "version": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=" + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" }, "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, "imurmurhash": { - "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { - "version": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + "repeating": "2.0.1" } }, "indexes-of": { - "version": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, "indexof": { - "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { - "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "requires": { - "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", "lodash": "4.17.5", - "readline2": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "run-async": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" } }, "internal-ip": { - "version": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + "meow": "3.7.0" } }, "interpret": { - "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, "invariant": { - "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" } }, "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { - "version": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { - "version": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, "is-absolute-url": { - "version": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.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.6" + } + } + } + }, "is-arrayish": { - "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { - "version": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "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": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz" + "binary-extensions": "1.11.0" } }, "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { - "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + "builtin-modules": "1.1.1" } }, "is-callable": { - "version": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" }, "is-ci": { - "version": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz" + "ci-info": "1.1.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.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.6" + } + } } }, "is-date-object": { - "version": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "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==" + } + } + }, "is-directory": { - "version": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-dotfile": { - "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { - "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + "is-primitive": "2.0.0" } }, "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-finite": { - "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "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": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + "number-is-nan": "1.0.1" } }, "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "is-extglob": "1.0.0" } }, - "is-my-json-valid": { - "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "requires": { - "generate-function": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "generate-object-property": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "jsonpointer": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" } }, "is-npm": { - "version": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.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.6" + } + } } }, "is-obj": { - "version": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, "is-path-cwd": { - "version": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" }, "is-path-in-cwd": { - "version": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "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==", "requires": { - "is-path-inside": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" + "is-path-inside": "1.0.1" } }, "is-path-inside": { - "version": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "requires": { - "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + "path-is-inside": "1.0.2" } }, "is-plain-obj": { - "version": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "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", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + } + }, "is-posix-bracket": { - "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { - "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { - "version": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-property": { - "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, "is-redirect": { - "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { - "version": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + "has": "1.0.1" } }, "is-resolvable": { - "version": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "requires": { - "tryit": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, "is-retry-allowed": { - "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-root": { - "version": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" }, "is-stream": { - "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { - "version": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { - "html-comment-regex": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" + "html-comment-regex": "1.1.1" } }, "is-symbol": { - "version": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" }, "is-typedarray": { - "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { - "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "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", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, "is-wsl": { - "version": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { - "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", @@ -4684,543 +6095,903 @@ } }, "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-api": { - "version": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", - "integrity": "sha1-/MC0YeKzvaceMFFVE4I4doJX2d4=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "requires": { - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "fileset": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "istanbul-lib-hook": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "istanbul-lib-report": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "istanbul-reports": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "async": "2.6.0", + "compare-versions": "3.1.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + }, + "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" + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "istanbul-lib-coverage": { - "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==" }, "istanbul-lib-hook": { - "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "requires": { - "append-transform": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz" + "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { - "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "requires": { - "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" } }, "istanbul-lib-report": { - "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "requires": { - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "istanbul-reports": { - "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha1-BCvlyJ4XW8P4ZSPKqynAFOd/7k4=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "requires": { - "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz" + "handlebars": "4.0.11" } }, "jest": { "version": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", + "integrity": "sha512-MU1kGBtzhDHwasL1BbuFmlIlwseDXy18p/M3hB7ehifac8FCbj6nJf8ihGtBA594tlUcktotHHd8z42V47ZB1g==", "requires": { - "jest-cli": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz" + "jest-cli": "20.0.4" }, "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, "callsites": { - "version": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, "jest-cli": { - "version": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { - "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "callsites": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "ansi-escapes": "1.4.0", + "callsites": "2.0.0", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "is-ci": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "istanbul-api": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "jest-changed-files": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", - "jest-config": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", - "jest-docblock": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", - "jest-environment-jsdom": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", - "jest-haste-map": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", - "jest-jasmine2": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", - "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "jest-resolve-dependencies": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", - "jest-runtime": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", - "jest-snapshot": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", - "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "node-notifier": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "string-length": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "throat": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "worker-farm": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz" + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "istanbul-api": "1.3.1", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-source-maps": "1.2.3", + "jest-changed-files": "20.0.3", + "jest-config": "20.0.4", + "jest-docblock": "20.0.3", + "jest-environment-jsdom": "20.0.3", + "jest-haste-map": "20.0.5", + "jest-jasmine2": "20.0.4", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve-dependencies": "20.0.3", + "jest-runtime": "20.0.4", + "jest-snapshot": "20.0.3", + "jest-util": "20.0.3", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "pify": "2.3.0", + "slash": "1.0.0", + "string-length": "1.0.1", + "throat": "3.2.0", + "which": "1.3.0", + "worker-farm": "1.6.0", + "yargs": "7.1.0" + } + }, + "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.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } }, "jest-changed-files": { - "version": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" }, "jest-config": { - "version": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "jest-environment-jsdom": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", - "jest-environment-node": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", - "jest-jasmine2": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", - "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "jest-resolve": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", - "jest-validate": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", - "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + "glob": "7.1.2", + "jest-environment-jsdom": "20.0.3", + "jest-environment-node": "20.0.3", + "jest-jasmine2": "20.0.4", + "jest-matcher-utils": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-validate": "20.0.3", + "pretty-format": "20.0.3" } }, "jest-diff": { - "version": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "diff": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + "diff": "3.5.0", + "jest-matcher-utils": "20.0.3", + "pretty-format": "20.0.3" } }, "jest-docblock": { - "version": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" }, "jest-environment-jsdom": { - "version": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { - "jest-mock": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "jsdom": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz" + "jest-mock": "20.0.3", + "jest-util": "20.0.3", + "jsdom": "9.12.0" } }, "jest-environment-node": { - "version": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { - "jest-mock": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz" + "jest-mock": "20.0.3", + "jest-util": "20.0.3" } }, "jest-haste-map": { - "version": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", - "integrity": "sha1-ZT61XIic48Ah97lGk/IKQVm63wM=", + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", + "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", "requires": { - "fb-watchman": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jest-docblock": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "sane": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", - "worker-farm": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz" + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "20.0.3", + "micromatch": "2.3.11", + "sane": "1.6.0", + "worker-farm": "1.6.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "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.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } } }, "jest-jasmine2": { - "version": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jest-diff": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "jest-matchers": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", - "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "jest-snapshot": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz" + "graceful-fs": "4.1.11", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-matchers": "20.0.3", + "jest-message-util": "20.0.3", + "jest-snapshot": "20.0.3", + "once": "1.4.0", + "p-map": "1.2.0" } }, "jest-matcher-utils": { - "version": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + "pretty-format": "20.0.3" } }, "jest-matchers": { - "version": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { - "jest-diff": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz" + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3" } }, "jest-message-util": { - "version": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" + "micromatch": "2.3.11", + "slash": "1.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "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.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } } }, "jest-mock": { - "version": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" }, "jest-regex-util": { - "version": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" }, "jest-resolve": { - "version": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { - "browser-resolve": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz" + "browser-resolve": "1.11.2", + "is-builtin-module": "1.0.0", + "resolve": "1.7.0" } }, "jest-resolve-dependencies": { - "version": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { - "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz" + "jest-regex-util": "20.0.3" } }, "jest-runtime": { - "version": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", "babel-jest": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "babel-plugin-istanbul": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", + "babel-plugin-istanbul": "4.1.6", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jest-config": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", - "jest-haste-map": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", - "jest-regex-util": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "jest-resolve": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", - "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz" + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "jest-config": "20.0.4", + "jest-haste-map": "20.0.5", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-util": "20.0.3", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "strip-bom": "3.0.0", + "yargs": "7.1.0" }, "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "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.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "jest-snapshot": { - "version": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "jest-diff": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "jest-util": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-util": "20.0.3", + "natural-compare": "1.4.0", + "pretty-format": "20.0.3" } }, "jest-util": { - "version": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jest-message-util": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "jest-mock": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "jest-validate": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", - "leven": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "graceful-fs": "4.1.11", + "jest-message-util": "20.0.3", + "jest-mock": "20.0.3", + "jest-validate": "20.0.3", + "leven": "2.1.0", + "mkdirp": "0.5.1" } }, "jest-validate": { - "version": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "jest-matcher-utils": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "leven": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "pretty-format": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz" + "jest-matcher-utils": "20.0.3", + "leven": "2.1.0", + "pretty-format": "20.0.3" } }, "js-base64": { - "version": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" }, "js-tokens": { "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" }, "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + "argparse": "1.0.10", + "esprima": "2.7.3" } }, "jsbn": { - "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, - "jschardet": { - "version": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz", - "integrity": "sha1-ph8xAwalpxGI4bGs0IrdPPuwix4=" - }, "jsdom": { - "version": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { - "abab": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", - "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "acorn-globals": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "array-equal": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "content-type-parser": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "cssom": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "cssstyle": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "escodegen": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "html-encoding-sniffer": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "nwmatcher": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", - "parse5": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "request": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "symbol-tree": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "webidl-conversions": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", - "whatwg-encoding": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "whatwg-url": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "xml-name-validator": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz" + "abab": "1.0.4", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.9.1", + "html-encoding-sniffer": "1.0.2", + "nwmatcher": "1.4.4", + "parse5": "1.5.1", + "request": "2.85.0", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.4", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" }, "dependencies": { "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "jsesc": { - "version": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" }, "json-loader": { - "version": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=" + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" }, "json-schema": { - "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { - "version": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { - "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "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": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + "jsonify": "0.0.0" } }, "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { - "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { - "version": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { - "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "graceful-fs": "4.1.11" } }, "jsonify": { - "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsonpointer": { - "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, "jsprim": { - "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "verror": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, "jsx-ast-utils": { - "version": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "klaw": { - "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "graceful-fs": "4.1.11" } }, "latest-version": { - "version": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz" + "package-json": "4.0.1" } }, "lazy-cache": { - "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lazy-req": { - "version": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=" - }, "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + "invert-kv": "1.0.0" } }, "leven": { - "version": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { - "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "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": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "loader-fs-cache": { - "version": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "requires": { - "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "find-cache-dir": "0.1.1", + "mkdirp": "0.5.1" } }, "loader-runner": { - "version": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" }, "loader-utils": { - "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, "locate-path": { - "version": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -5229,54 +7000,64 @@ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash._reinterpolate": { - "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, "lodash.camelcase": { - "version": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, "lodash.cond": { - "version": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" }, "lodash.defaults": { - "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, "lodash.isequal": { "version": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "lodash.memoize": { - "version": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, "lodash.template": { - "version": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "lodash.templatesettings": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz" + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" } }, "lodash.templatesettings": { - "version": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" + "lodash._reinterpolate": "3.0.0" } }, "lodash.throttle": { - "version": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "lodash.uniq": { - "version": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "longest": { - "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { @@ -5287,1640 +7068,2116 @@ } }, "loud-rejection": { - "version": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { - "currently-unhandled": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" } }, "lower-case": { - "version": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lowercase-keys": { - "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "macaddress": { - "version": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" }, - "makeerror": { - "version": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "requires": { - "tmpl": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz" + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.4" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, "map-obj": { - "version": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "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", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "1.0.1" + } + }, "math-expression-evaluator": { - "version": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, "media-typer": { - "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memory-fs": { - "version": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "meow": { - "version": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { - "camelcase-keys": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "loud-rejection": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "redent": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "trim-newlines": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" }, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "merge": { - "version": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" }, "merge-descriptors": { - "version": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { - "version": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "miller-rabin": { - "version": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + "bn.js": "4.11.8", + "brorand": "1.1.0" } }, "mime": { - "version": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" }, "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" + "mime-db": "1.33.0" } }, "mimic-fn": { - "version": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" - }, - "min-document": { - "version": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimalistic-assert": { - "version": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { - "version": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + "brace-expansion": "1.1.11" } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { - "version": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "requires": { - "dns-packet": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.1.1.tgz", - "thunky": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz" + "dns-packet": "1.3.1", + "thunky": "1.0.2" } }, "multicast-dns-service-types": { - "version": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { - "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" }, "nan": { - "version": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", "optional": true }, - "natural-compare": { - "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "ncname": { - "version": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "requires": { - "xml-char-classes": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "no-case": { - "version": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", - "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" + "lower-case": "1.1.4" } }, "node-fetch": { "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha1-iZyz0KPJL5UsR/G4dvTIrqvUANU=", + "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", "requires": { - "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - } - }, - "node-forge": { - "version": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=" - }, - "node-int64": { - "version": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "requires": { - "assert": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "browserify-zlib": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "buffer": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "console-browserify": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "constants-browserify": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "crypto-browserify": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "domain-browser": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "events": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "https-browserify": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "os-browserify": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "path-browserify": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "process": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "querystring-es3": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "stream-browserify": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "stream-http": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "timers-browserify": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.3.tgz", - "tty-browserify": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "url": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "vm-browserify": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz" + "encoding": "0.1.12", + "is-stream": "1.1.0" }, "dependencies": { - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" } } }, - "node-notifier": { - "version": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", - "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "requires": { - "growly": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "shellwords": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.1", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.6", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" } }, - "node-status-codes": { - "version": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "requires": { + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" + } }, "normalize-package-data": { - "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { - "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "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": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz" + "remove-trailing-separator": "1.1.0" } }, "normalize-range": { - "version": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { - "version": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "query-string": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "sort-keys": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" } }, "nth-check": { - "version": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { - "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + "boolbase": "1.0.0" } }, "num2fraction": { - "version": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwmatcher": { - "version": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", - "integrity": "sha1-eumwew6oBNt+JfBctf5Al9TklJ8=" + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" }, "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "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.6" + } + } + } + }, "object-hash": { - "version": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", - "integrity": "sha1-KKZZz5h9lqTavnhgKJ87UybEoDw=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==" }, "object-keys": { - "version": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "3.0.1" + } + }, "object.omit": { - "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "3.0.1" } }, "obuf": { - "version": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { - "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + "ee-first": "1.1.1" } }, "on-headers": { - "version": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "wrappy": "1.0.2" } }, "onetime": { - "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "opn": { - "version": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "requires": { - "is-wsl": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" + "is-wsl": "1.1.0" } }, "optimist": { - "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + "minimist": "0.0.8", + "wordwrap": "0.0.3" }, "dependencies": { "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, "optionator": { - "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { - "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" } }, "original": { - "version": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "requires": { - "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz" + "url-parse": "1.0.5" }, "dependencies": { "url-parse": { - "version": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "requires": { - "querystringify": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + "querystringify": "0.0.4", + "requires-port": "1.0.0" } } } }, "os-browserify": { - "version": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + "lcid": "1.0.0" } }, "os-tmpdir": { - "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, - "osenv": { - "version": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - } + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { - "version": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "requires": { + "p-try": "1.0.0" + } }, "p-locate": { - "version": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz" + "p-limit": "1.2.0" } }, "p-map": { - "version": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", - "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { - "version": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { - "got": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "registry-auth-token": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "registry-url": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" } }, "pako": { - "version": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, "param-case": { - "version": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz" + "no-case": "2.3.2" } }, "parse-asn1": { - "version": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz" + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" } }, "parse-glob": { - "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { - "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parse-json": { - "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + "error-ex": "1.3.1" } }, "parse5": { - "version": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" }, "parseurl": { - "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { - "version": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { - "version": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, "path-parse": { - "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "path-to-regexp": { - "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "isarray": "0.0.1" }, "dependencies": { "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pbkdf2": { - "version": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "requires": { - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.11" } }, "performance-now": { - "version": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "pinkie": "2.0.4" } }, "pkg-dir": { - "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + "find-up": "1.1.2" }, "dependencies": { "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } } } }, "pkg-up": { - "version": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + "find-up": "1.1.2" }, "dependencies": { "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } } } }, "pluralize": { - "version": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" }, "portfinder": { - "version": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { - "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" }, "dependencies": { "async": { - "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz" + "chalk": "2.3.2", + "source-map": "0.6.1", + "supports-color": "5.3.0" }, "dependencies": { - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" - } - }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha1-2+xJQ20q4V9TYRTnbRRlbNvA9E0=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" } } } }, "postcss-calc": { - "version": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-message-helpers": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "reduce-css-calc": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz" + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-colormin": { - "version": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { - "colormin": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-convert-values": { - "version": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-discard-comments": { - "version": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-discard-duplicates": { - "version": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-discard-empty": { - "version": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-discard-overridden": { - "version": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-discard-unused": { - "version": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-filter-plugins": { - "version": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "uniqid": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" + "postcss": "5.2.18", + "uniqid": "4.1.1" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-flexbugs-fixes": { "version": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", - "integrity": "sha1-ezHLbCfQQXo1pnkUwpX4PEA8ftQ=", + "integrity": "sha512-xWTSRqI3GzrEtboXfqDNyQwyj+P2dRG9EtCMJwqPkhwN4YCp/5J3S6rraQT0S8PrWBmKRT3cpkYAzfVmaZNBkw==", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + "postcss": "6.0.21" } }, "postcss-load-config": { - "version": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { - "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss-load-options": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "postcss-load-plugins": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" } }, "postcss-load-options": { - "version": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { - "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, "postcss-load-plugins": { - "version": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { - "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, "postcss-loader": { "version": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", - "integrity": "sha1-jH4AVaPfGImrxrrVLdRbL0G7xvw=", + "integrity": "sha512-HIq7yy1hh9KI472Y38iSRV4WupZUNy6zObkxQM/ZuInoaE2+PyX4NcO6jjP5HG5mXL7j5kcNEl0fAG4Kva7O9w==", "requires": { - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "postcss-load-config": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "schema-utils": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz" + "loader-utils": "1.1.0", + "postcss": "6.0.21", + "postcss-load-config": "1.2.0", + "schema-utils": "0.3.0" } }, "postcss-merge-idents": { - "version": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-merge-longhand": { - "version": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-merge-rules": { - "version": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "caniuse-api": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "vendors": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz" + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.1" }, "dependencies": { "browserslist": { - "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000709.tgz", - "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz" + "caniuse-db": "1.0.30000827", + "electron-to-chromium": "1.3.42" } }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-message-helpers": { - "version": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" }, "postcss-minify-font-values": { - "version": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-minify-gradients": { - "version": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-minify-params": { - "version": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { - "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-minify-selectors": { - "version": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { - "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz" + "alphanum-sort": "1.0.2", + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-modules-extract-imports": { - "version": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + "postcss": "6.0.21" } }, "postcss-modules-local-by-default": { - "version": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "css-selector-tokenizer": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.21" } }, "postcss-modules-scope": { - "version": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "css-selector-tokenizer": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.21" } }, "postcss-modules-values": { - "version": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-replace-symbols": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz" + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.21" } }, "postcss-normalize-charset": { - "version": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-normalize-url": { - "version": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { - "is-absolute-url": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "normalize-url": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-ordered-values": { - "version": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-reduce-idents": { - "version": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-reduce-initial": { - "version": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-reduce-transforms": { - "version": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-selector-parser": { - "version": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { - "flatten": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "indexes-of": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "uniq": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "postcss-svgo": { - "version": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { - "is-svg": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "svgo": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz" + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "svgo": "0.7.2" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-unique-selectors": { - "version": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { - "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "postcss-value-parser": { - "version": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" }, "postcss-zindex": { - "version": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "has": "1.0.1", + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } } } }, "prelude-ls": { - "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { - "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { - "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "pretty-bytes": { - "version": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" }, "pretty-error": { - "version": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { - "renderkid": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "utila": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + "renderkid": "2.0.1", + "utila": "0.4.0" } }, "pretty-format": { - "version": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz" - }, - "dependencies": { - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" - } - } + "ansi-regex": "2.1.1", + "ansi-styles": "3.2.1" } }, "private": { - "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + "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": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" }, "promise": { @@ -6932,130 +9189,179 @@ }, "prop-types": { "version": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=", + "integrity": "sha512-vCFzoUFaZkVNeFkhK1KbSq4cn97GDrpfBt9K2qLkGnPAEFhEv3M61Lk5t+B7c0QfMLWo0fPkowk/4SuXerh26Q==", "requires": { "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" } }, "proxy-addr": { - "version": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "ipaddr.js": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz" + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" } }, "prr": { - "version": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "pseudomap": { - "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { - "version": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { - "version": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "query-string": { - "version": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "strict-uri-encode": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" } }, "querystring": { - "version": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { - "version": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" }, "raf": { - "version": "https://registry.npmjs.org/raf/-/raf-3.3.2.tgz", - "integrity": "sha1-DBO+C1tJtG921maSSNUnzysC/ic=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + "performance-now": "2.1.0" } }, "randomatic": { - "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { - "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - }, - "dependencies": { - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" - } - } - } - }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + "is-buffer": "1.1.6" } } } }, "randombytes": { - "version": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" } }, "range-parser": { - "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, - "rc": { - "version": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", "requires": { - "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -7079,7 +9385,14 @@ "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "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=" + } } }, "babel-runtime": { @@ -7116,7 +9429,14 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "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=" + } } }, "css-animation": { @@ -7141,7 +9461,7 @@ "core-js": "1.2.7", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7151,6 +9471,11 @@ "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=" } } }, @@ -7187,6 +9512,12 @@ "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + }, + "dependencies": { + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + } } }, "rc-align": { @@ -7287,7 +9618,7 @@ "create-react-class": "15.6.3", "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "prop-types": "15.6.0" }, "dependencies": { @@ -7298,7 +9629,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "fbjs": { @@ -7309,12 +9640,17 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" } }, + "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": { "version": "15.6.0", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", @@ -7322,7 +9658,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "ua-parser-js": { @@ -7376,7 +9712,7 @@ "core-js": "1.2.7", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7386,6 +9722,11 @@ "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=" } } }, @@ -7409,7 +9750,14 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "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": { @@ -7466,7 +9814,7 @@ "integrity": "sha512-DdcO6iLBIJuDVsRpJLG/9N6ine0OVZhuQvnSPCEihfcyJFz+SHU9pQo+w9LWi2PdUxFbFV52BwAuutQkAYJxaA==", "requires": { "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "react-d3": { @@ -7479,117 +9827,140 @@ }, "react-dev-utils": { "version": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", - "integrity": "sha1-GkImPptqoR3LRdad/l6xs1S9VTE=", + "integrity": "sha512-GaAHmCBwvIT1pVUvILK+CSLrYhZeWLsHCrIi/k1dT2JIywkcjRSHw1E9dhsMvzpHf/KTw6ROuTtBt8bK21i6Xw==", "requires": { - "address": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", - "anser": "https://registry.npmjs.org/anser/-/anser-1.4.1.tgz", - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "address": "1.0.2", + "anser": "1.4.1", + "babel-code-frame": "6.22.0", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "detect-port-alt": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "filesize": "https://registry.npmjs.org/filesize/-/filesize-3.3.0.tgz", - "gzip-size": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "html-entities": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "inquirer": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", - "is-root": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "opn": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "recursive-readdir": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "shell-quote": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "sockjs-client": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "text-table": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "cross-spawn": "4.0.2", + "detect-port-alt": "1.1.3", + "escape-string-regexp": "1.0.5", + "filesize": "3.3.0", + "gzip-size": "3.0.0", + "html-entities": "1.2.1", + "inquirer": "3.1.1", + "is-root": "1.0.0", + "opn": "5.1.0", + "recursive-readdir": "2.2.1", + "shell-quote": "1.6.1", + "sockjs-client": "1.1.4", + "strip-ansi": "3.0.1", + "text-table": "0.2.0" }, "dependencies": { "ansi-escapes": { - "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" }, "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "esutils": "2.0.2", + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + } + }, "cli-cursor": { - "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "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": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" + "restore-cursor": "2.0.0" } }, "figures": { - "version": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "escape-string-regexp": "1.0.5" } }, "inquirer": { - "version": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", - "integrity": "sha1-h2IcT7pAcvSKjdccn5328QCy1TQ=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", + "integrity": "sha512-H50sHQwgvvaTBd3HpKMVtL/u6LoHDvYym51gd7bGQe/+9HkCE+J0/3N5FJLfd6O6oz44hHewC2Pc2LodzWVafQ==", "requires": { - "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "ansi-escapes": "2.0.0", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "external-editor": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "figures": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", "lodash": "4.17.5", - "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "run-async": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "rx-lite-aggregates": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "3.0.1", + "through": "2.3.8" } }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "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=" }, "mute-stream": { - "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "onetime": { - "version": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz" + "mimic-fn": "1.2.0" } }, "restore-cursor": { - "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, "run-async": { - "version": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "is-promise": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz" + "is-promise": "2.1.0" } }, "rx-lite": { - "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "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": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + "ansi-regex": "3.0.0" } } } @@ -7597,8 +9968,9 @@ } }, "react-display-name": { - "version": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.0.tgz", - "integrity": "sha1-Dh9whuRaMtB3ZN817TL/FvEll5A=" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.3.tgz", + "integrity": "sha1-9QIE1DDJyoGbwLreAwbpF12NGYc=" }, "react-dnd": { "version": "2.5.4", @@ -7637,7 +10009,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7673,7 +10045,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "redux": { @@ -7716,13 +10088,13 @@ }, "react-dnd-scrollzone": { "version": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", - "integrity": "sha1-1wcXDAzTt6s9mR3WqMwLNxJFQTk=", + "integrity": "sha512-yu9Z/K/7Fy4MtlGYp5eoaZY+Zz+wOccWdC98IeiMvkgoEP+YsC6UCjjMoZMJdeqpi8f1j3agPb4D5uB1OCwuKg==", "requires": { - "hoist-non-react-statics": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "lodash.throttle": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "hoist-non-react-statics": "1.2.0", + "lodash.throttle": "4.1.1", "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "raf": "https://registry.npmjs.org/raf/-/raf-3.3.2.tgz", - "react-display-name": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.0.tgz" + "raf": "3.4.0", + "react-display-name": "0.2.3" } }, "react-dom": { @@ -7732,7 +10104,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "prop-types": "15.6.0" }, "dependencies": { @@ -7744,7 +10116,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7757,7 +10129,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "ua-parser-js": { @@ -7769,19 +10141,35 @@ }, "react-error-overlay": { "version": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", - "integrity": "sha1-mI5I9vNDr6l6cZxN2uUbj+jM/ug=", + "integrity": "sha512-rxzECPwBQ5VeyGcXtasKtXKBWbWdAVAiQCSmWUTgBYeVu9/L7aWeWG3CFFijvNVRTuUjj/FEJ19Y20BMOP+3Ag==", "requires": { - "anser": "https://registry.npmjs.org/anser/-/anser-1.2.5.tgz", - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "anser": "1.2.5", + "babel-code-frame": "6.22.0", "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "react-dev-utils": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", - "settle-promise": "https://registry.npmjs.org/settle-promise/-/settle-promise-1.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "settle-promise": "1.0.0", + "source-map": "0.5.6" }, "dependencies": { "anser": { - "version": "https://registry.npmjs.org/anser/-/anser-1.2.5.tgz", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.2.5.tgz", "integrity": "sha1-Xc/JVuqjc7nCMBDdINq+ws4ZR1s=" + }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "esutils": "2.0.2", + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" } } }, @@ -7808,7 +10196,7 @@ "integrity": "sha1-m52iCw00eGtgBXxStCUW6hKVN0o=", "requires": { "create-react-class": "15.6.3", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "prop-types": "15.6.0" }, "dependencies": { @@ -7819,7 +10207,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "fbjs": { @@ -7830,7 +10218,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7843,7 +10231,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "ua-parser-js": { @@ -7870,7 +10258,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7883,7 +10271,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "react-draggable": { @@ -7929,7 +10317,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -7980,7 +10368,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "resolve-pathname": { @@ -8029,7 +10417,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -8062,7 +10450,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "resolve-pathname": { @@ -8118,7 +10506,7 @@ "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", "html-webpack-plugin": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", "jest": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "postcss-flexbugs-fixes": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", "postcss-loader": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", @@ -8171,7 +10559,7 @@ "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "object-assign": "4.1.1", "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "ua-parser-js": "0.7.17" @@ -8184,7 +10572,7 @@ "requires": { "fbjs": "0.8.16", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "object-assign": "4.1.1" } }, "ua-parser-js": { @@ -8196,802 +10584,1112 @@ }, "react-virtualized": { "version": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", - "integrity": "sha1-eZpvI4Ge64KGDVm4L60z0dQgMl4=", + "integrity": "sha512-TDe2haZiFr5apN3myuumGyeJ7iqHcGcQ648tfNf9x+R6tkE1+o8yAmeh4nKC4ldcs9My1dOHN3x/lmEX9LyOLA==", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "dom-helpers": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "dom-helpers": "3.3.1", "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" } }, - "read-all-stream": { - "version": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } - }, "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "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": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "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": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } } } }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "core-util-is": "1.0.2", + "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.2" } }, "readdirp": { - "version": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" } }, "readline2": { - "version": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" } }, "rechoir": { - "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz" + "resolve": "1.7.0" } }, "recursive-readdir": { - "version": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", "requires": { - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" + "minimatch": "3.0.3" }, "dependencies": { "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + "brace-expansion": "1.1.11" } } } }, "redent": { - "version": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "indent-string": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "strip-indent": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" } }, "reduce-css-calc": { - "version": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "math-expression-evaluator": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "reduce-function-call": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz" + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" }, "dependencies": { "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } }, "reduce-function-call": { - "version": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + "balanced-match": "0.4.2" }, "dependencies": { "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } }, "regenerate": { - "version": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" }, "regenerator-runtime": { - "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" }, "regenerator-transform": { - "version": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", "requires": { "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz" + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-cache": { - "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpu-core": { - "version": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { - "regenerate": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "regjsgen": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "regjsparser": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "registry-auth-token": { - "version": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + "rc": "1.2.6", + "safe-buffer": "5.1.1" } }, "registry-url": { - "version": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz" + "rc": "1.2.6" } }, "regjsgen": { - "version": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" }, "regjsparser": { - "version": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { - "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + "jsesc": "0.5.0" }, "dependencies": { "jsesc": { - "version": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, "relateurl": { - "version": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, "remove-trailing-separator": { - "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { - "css-select": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "dom-converter": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "htmlparser2": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "utila": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz" + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" }, "dependencies": { "utila": { - "version": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } }, "repeat-element": { - "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { - "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { - "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + "is-finite": "1.0.2" } }, "request": { - "version": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "har-validator": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" }, "dependencies": { - "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" - } - }, "performance-now": { - "version": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" } } }, "require-directory": { - "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { - "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" }, "require-main-filename": { - "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "require-uncached": { - "version": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { - "caller-path": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, "requires-port": { - "version": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz", + "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==", "requires": { - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" + "path-parse": "1.0.5" } }, "resolve-from": { - "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, + "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": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "requires": { - "exit-hook": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "onetime": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, "right-align": { - "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + "align-text": "0.1.4" } }, "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + "glob": "7.1.2" } }, "ripemd160": { - "version": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "requires": { - "hash-base": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "hash-base": "2.0.2", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + } } }, "run-async": { - "version": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "once": "1.4.0" } }, "rx-lite": { - "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" }, "rx-lite-aggregates": { - "version": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { - "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" + "rx-lite": "3.1.2" } }, "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { - "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "exec-sh": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", - "fb-watchman": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "walker": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "watch": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz" + "anymatch": "1.3.2", + "exec-sh": "0.2.1", + "fb-watchman": "1.9.2", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.10.0" }, "dependencies": { "bser": { - "version": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { - "node-int64": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + "node-int64": "0.4.0" } }, "fb-watchman": { - "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", "requires": { - "bser": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz" + "bser": "1.0.2" } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "sax": { - "version": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { - "version": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz" + "ajv": "5.5.2" }, "dependencies": { "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "fast-deep-equal": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "json-schema-traverse": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } } } }, "select-hose": { - "version": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.9.1.tgz", - "integrity": "sha1-zdpEktcNSGVw+HxlVGAjVY4d+lo=", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", + "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", "requires": { - "node-forge": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz" + "node-forge": "0.7.1" } }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "semver-diff": { - "version": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + "semver": "5.5.0" } }, "send": { - "version": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", - "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "destroy": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "etag": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" }, "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - } - }, "mime": { - "version": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" } } }, "serve-index": { - "version": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", - "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "batch": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" + "accepts": "1.3.5", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.18", + "parseurl": "1.3.2" } }, "serve-static": { - "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", - "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "send": "https://registry.npmjs.org/send/-/send-0.15.3.tgz" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" } }, "serviceworker-cache-polyfill": { - "version": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" }, "set-blocking": { - "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { - "version": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "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==", + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.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.1" + } + } + } + }, "setimmediate": { "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "settle-promise": { - "version": "https://registry.npmjs.org/settle-promise/-/settle-promise-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/settle-promise/-/settle-promise-1.0.0.tgz", "integrity": "sha1-aXrbWLgh84fOJ1fAbvyd5fDuM9g=" }, "sha.js": { - "version": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, "shell-quote": { - "version": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "requires": { - "array-filter": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "array-map": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "array-reduce": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" } }, "shelljs": { - "version": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" } }, "shellwords": { - "version": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", - "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=" + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { - "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { - "version": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" }, - "slide": { - "version": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "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.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "3.2.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.6" + } + } + } }, "sntp": { - "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + "hoek": "4.2.1" } }, "sockjs": { - "version": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { - "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz" + "faye-websocket": "0.10.0", + "uuid": "2.0.3" }, "dependencies": { "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { - "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" + "websocket-driver": "0.7.0" } }, "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } }, "sockjs-client": { - "version": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "eventsource": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz" + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.3.0" } }, "sort-keys": { - "version": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "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": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + "is-plain-obj": "1.1.0" } }, "source-list-map": { - "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "requires": { + "atob": "2.1.0", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } }, "source-map-support": { - "version": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-map": "0.5.7" + }, + "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-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, "spdx-correct": { - "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, "spdx-expression-parse": { - "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } }, "spdx-license-ids": { - "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "spdy": { - "version": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "handle-thing": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "http-deceiver": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "select-hose": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "spdy-transport": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz" + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" } }, "spdy-transport": { - "version": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "detect-node": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "hpack.js": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "obuf": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "wbuf": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz" + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.1", + "wbuf": "1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "3.0.2" } }, "sprintf-js": { - "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } } } }, "statuses": { - "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, "stream-browserify": { - "version": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "stream-http": { - "version": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "requires": { - "builtin-status-codes": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "to-arraybuffer": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" } }, "strict-uri-encode": { - "version": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "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": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "strip-ansi": "3.0.1" } }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + "safe-buffer": "5.1.1" } }, "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + "ansi-regex": "2.1.1" } }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "is-utf8": "0.2.1" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "strip-indent": { - "version": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + "get-stdin": "4.0.1" } }, "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { "version": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha1-zDFFmvvNbYC3Ig7lSykan9Zv9es=", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", "requires": { - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "schema-utils": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "superagent": { @@ -9155,178 +11853,249 @@ } }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + "has-flag": "3.0.0" } }, "svgo": { - "version": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { - "coa": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "colors": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "csso": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "whet.extend": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" } }, "sw-precache": { - "version": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.0.tgz", - "integrity": "sha1-62IlzlgM6q4UgZRXigrQGrfqGZw=", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", + "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", "requires": { - "dom-urls": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", + "dom-urls": "1.1.0", "es6-promise": "4.2.4", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pretty-bytes": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "sw-toolbox": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", - "update-notifier": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz" + "glob": "7.1.2", + "lodash.defaults": "4.2.0", + "lodash.template": "4.4.0", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "pretty-bytes": "4.0.2", + "sw-toolbox": "3.6.0", + "update-notifier": "2.4.0" } }, "sw-precache-webpack-plugin": { "version": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", - "integrity": "sha1-S1MI6vZPivyLDpUopvUKj5zZ7aw=", + "integrity": "sha512-VThRmVU97VXrxsnqAjd67GIwmxe5Z2R3lWsJjhq88TjN9Ck2iMAOiZIiWqlfnSxp517VgoG7gomg1Vu4v2wPag==", "requires": { - "del": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "sw-precache": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.0.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz" + "del": "2.2.2", + "sw-precache": "5.2.1", + "uglify-js": "3.3.20" } }, "sw-toolbox": { - "version": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { - "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "serviceworker-cache-polyfill": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz" + "path-to-regexp": "1.7.0", + "serviceworker-cache-polyfill": "4.0.0" } }, "symbol-tree": { - "version": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { - "version": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "requires": { - "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "lodash": "4.17.5", - "slice-ansi": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + "slice-ansi": "0.0.4", + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "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": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "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": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "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": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + "ansi-regex": "3.0.0" } } } }, "tapable": { - "version": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", - "integrity": "sha1-5GwNqsuyuKmLmwzqD0BSEFgX7Vw=" + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } }, "test-exclude": { - "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", - "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "requires": { - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" } }, "text-table": { - "version": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { - "version": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha1-UMsGcO28QCN7njR9fh+I5GIK+DY=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" }, "through": { - "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "thunky": { - "version": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" }, "time-stamp": { - "version": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" }, "timed-out": { - "version": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.3.tgz", - "integrity": "sha1-Qf0L3JJqX+7cM6F6jh99SRkl9/w=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", "requires": { - "global": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" } }, "tmp": { - "version": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + "os-tmpdir": "1.0.2" } }, "tmpl": { - "version": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-arraybuffer": { - "version": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { - "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "3.2.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.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.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" + } + }, "toposort": { - "version": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", - "integrity": "sha1-8CzYp0vYvi/A6YYRw7rLlaFxhpw=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=" }, "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "punycode": "1.4.1" } }, "tr46": { - "version": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "transformation-matrix": { @@ -9335,382 +12104,547 @@ "integrity": "sha512-nBXvxh7J2zqNKgKGyLttne3I2iHmEWyywQ+rOHjSSuSEzVT7I+4Cf0H1fyePggG7Y5VFlWM66fd7xwi7rWhCTQ==" }, "trim-newlines": { - "version": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { - "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "tryit": { - "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=" - }, "tty-browserify": { - "version": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + "safe-buffer": "5.1.1" } }, "tweetnacl": { - "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "type-check": { - "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + "prelude-ls": "1.1.2" } }, "type-is": { - "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { - "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" + "media-typer": "0.3.0", + "mime-types": "2.1.18" } }, "typedarray": { - "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "ua-parser-js": { - "version": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz", - "integrity": "sha1-EQ1T+kw/MmwSEpK76skE0uAzh8o=" + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz", - "integrity": "sha1-qX24yLprnbpOL4jYaqlUj6YyADQ=", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.20.tgz", + "integrity": "sha512-WpLkWCf9sGvGZnIvBV0PNID9BATQNT/IXKAmqegfKzIPcTmTV3FP8NQpoogQkt/Y402x2sOFdaHUmqFY9IZp+g==", "requires": { - "commander": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "commander": "2.15.1", + "source-map": "0.6.1" } }, "uglify-to-browserify": { - "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "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.1" + } + }, + "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.4", + "to-object-path": "0.3.0" + } + } + } + }, "uniq": { - "version": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "uniqid": { - "version": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "requires": { - "macaddress": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" + "macaddress": "0.2.8" } }, "uniqs": { - "version": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, + "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": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, "unpipe": { - "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.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" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, "unzip-response": { - "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==" }, "update-notifier": { - "version": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", - "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.4.0.tgz", + "integrity": "sha1-+bTHAPv9TsEsgRWHJYd31WPYyGY=", "requires": { - "boxen": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "configstore": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "is-npm": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "latest-version": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "lazy-req": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "semver-diff": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz" + "boxen": "1.3.0", + "chalk": "2.3.2", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + } } }, "upper-case": { - "version": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, "urijs": { - "version": "https://registry.npmjs.org/urijs/-/urijs-1.18.10.tgz", - "integrity": "sha1-uURj6rpZoaeWA2pGe7YzxmfyIas=" + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", + "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { - "version": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "querystring": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + "punycode": "1.3.2", + "querystring": "0.2.0" }, "dependencies": { "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, "url-loader": { "version": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha1-zI/qgse5Bud3cBklCGnlaemVwpU=", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", "requires": { - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz" + "loader-utils": "1.1.0", + "mime": "1.3.6" } }, "url-parse": { - "version": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", - "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.3.0.tgz", + "integrity": "sha512-zPvPA3T7P6M+0iNsgX+iAcAz4GshKrowtQBHHc/28tVsBc8jK7VRCNX+2GEcoE6zDB6XqXhcyiUWPVZY6C70Cg==", "requires": { - "querystringify": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + "querystringify": "1.0.0", + "requires-port": "1.0.0" }, "dependencies": { "querystringify": { - "version": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" } } }, "url-parse-lax": { - "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + "prepend-http": "1.0.4" + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "requires": { + "kind-of": "6.0.2" } }, "user-home": { - "version": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + "os-homedir": "1.0.2" } }, "util": { - "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "inherits": "2.0.1" }, "dependencies": { "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" } } }, "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utila": { - "version": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" }, "utils-merge": { - "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "validate-npm-package-license": { - "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "vary": { - "version": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { - "version": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" }, "verror": { - "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" } }, "vm-browserify": { - "version": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "requires": { - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" + "indexof": "0.0.1" } }, "walker": { - "version": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { - "makeerror": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz" + "makeerror": "1.0.11" } }, "watch": { - "version": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" }, "watchpack": { - "version": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", "requires": { - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" } }, "wbuf": { - "version": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + "minimalistic-assert": "1.0.1" } }, "webidl-conversions": { - "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", - "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=" + "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==" }, "webpack": { "version": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", - "integrity": "sha1-LgRX8KuxrF3zqxBsacZy8jZ4Xwc=", + "integrity": "sha512-WkoF1vBKbYYFW4oRNeofwidp14CrzIme8OzDfUK6CEHjCj4zzACAdsTTm23MUd4Ui5bn6OO/GPpc1xBlcKOkRQ==", "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "acorn-dynamic-import": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "enhanced-resolve": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "json-loader": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "loader-runner": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "node-libs-browser": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "tapable": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "watchpack": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "webpack-sources": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz" + "acorn": "5.5.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "0.2.17", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "3.2.3", + "tapable": "0.2.8", + "uglify-js": "2.8.29", + "watchpack": "1.5.0", + "webpack-sources": "0.2.3", + "yargs": "6.6.0" }, "dependencies": { "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "loader-utils": { - "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } }, "source-list-map": { - "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } }, "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" } } } }, "webpack-sources": { - "version": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", "requires": { - "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-list-map": "1.1.2", + "source-map": "0.5.7" } }, "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "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": "4.2.1" }, "dependencies": { "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } } } }, "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + "camelcase": "3.0.0" }, "dependencies": { "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } @@ -9718,368 +12652,450 @@ } }, "webpack-dev-middleware": { - "version": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "requires": { - "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "time-stamp": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz" + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + } } }, "webpack-dev-server": { "version": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", - "integrity": "sha1-TTanKLA7iyr6SO0wJCiEfOooQK0=", + "integrity": "sha512-m5vhFvG1vKl0dY3cxgN3FiR6bTsYfjga5w6UkQQu/rQh4aFbMFnXHpfR9kJnduYu5envPsRv+lSZ/fFifbGN9w==", "requires": { - "ansi-html": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "bonjour": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "compression": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "connect-history-api-fallback": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "del": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "express": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", - "html-entities": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "http-proxy-middleware": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "internal-ip": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "opn": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "portfinder": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "selfsigned": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.9.1.tgz", - "serve-index": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", - "sockjs": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "sockjs-client": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", - "spdy": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "webpack-dev-middleware": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz" + "ansi-html": "0.0.7", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "del": "3.0.0", + "express": "4.16.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "internal-ip": "1.2.0", + "opn": "4.0.2", + "portfinder": "1.0.13", + "selfsigned": "1.10.2", + "serve-index": "1.9.1", + "sockjs": "0.3.18", + "sockjs-client": "1.1.2", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "3.2.3", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" }, "dependencies": { "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "del": { - "version": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "globby": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "is-path-cwd": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "is-path-in-cwd": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" } }, "globby": { - "version": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { - "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "opn": { - "version": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" } }, "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "sockjs-client": { - "version": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "eventsource": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz" + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.3.0" } }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" } }, "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "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": "4.2.1" } }, "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + "camelcase": "3.0.0" } } } }, "webpack-manifest-plugin": { "version": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", - "integrity": "sha1-a2xxiq3oolN5lXhLRr0umDYFfKo=", + "integrity": "sha512-54uDakY6RD97sL3jPhWuBw8VrSujVmvcIcnlY/0EfhRUTWTSH4XCbjMbDvDjKfvvicawtuVunbqZp/ogCvEf9A==", "requires": { - "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "fs-extra": "0.30.0", "lodash": "4.17.5" }, "dependencies": { "fs-extra": { - "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" } }, "jsonfile": { - "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "graceful-fs": "4.1.11" } } } }, "webpack-sources": { - "version": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha1-xzVkNqTRMSO+LiQmoF0drZy+Zc8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "requires": { - "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-list-map": "2.0.0", + "source-map": "0.6.1" }, "dependencies": { "source-list-map": { - "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" } } }, "websocket-driver": { - "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "websocket-extensions": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz" + "http-parser-js": "0.4.11", + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "whatwg-encoding": { - "version": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", "requires": { - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" - }, - "dependencies": { - "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" - } + "iconv-lite": "0.4.19" } }, "whatwg-fetch": { "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" }, "whatwg-url": { - "version": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { - "tr46": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "webidl-conversions": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" }, "dependencies": { "webidl-conversions": { - "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" } } }, "whet.extend": { - "version": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" }, "which": { - "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "isexe": "2.0.0" } }, "which-module": { - "version": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "widest-line": { - "version": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + "string-width": "2.1.1" + }, + "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" + } + } } }, "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { - "version": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz", - "integrity": "sha1-pDi8mTp6fRM7y2VHyV7KfP9Il9g=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "errno": "0.1.7" } }, "wrap-ansi": { - "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" } }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "mkdirp": "0.5.1" } }, "write-file-atomic": { - "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "slide": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "xdg-basedir": { - "version": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" - } - }, - "xml-char-classes": { - "version": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml-name-validator": { - "version": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { - "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { - "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "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" }, "dependencies": { "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } } } }, "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "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": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + "camelcase": "3.0.0" }, "dependencies": { "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 2900857..45eb44c 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Modal, Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; import FileSaver from 'file-saver'; import SimulationStore from '../stores/simulation-store'; @@ -53,7 +53,11 @@ class Simulation extends React.Component { modalData: {}, modalIndex: null, - simulation: {} + simulation: {}, + + runAction: 0, + runTitle: 'Start', + selectedSimulationModels: [] } } @@ -173,12 +177,111 @@ class Simulation extends React.Component { } } + onSimulationModelChecked(index, event) { + const selectedSimulationModels = 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 }); + } + + setRunAction(index) { + let runTitle = ''; + switch (index) { + case '0': + runTitle = 'Start'; + break; + + case '1': + runTitle = 'Stop'; + break; + + case '2': + runTitle = 'Pause'; + break; + + case '3': + runTitle = 'Resume'; + break; + + default: + console.log('Unknown index ' + index); + break; + } + + this.setState({ runAction: index, runTitle }); + } + + runAction() { + for (let index of this.state.selectedSimulationModels) { + let data; + switch (this.state.runAction) { + case '0': + data = { action: 'start' }; + break; + + case '1': + data = { action: 'stop' }; + break; + + case '2': + data = { action: 'pause' }; + break; + + case '3': + data = { action: 'resume' }; + break; + + default: + console.warn('Unknown simulator action: ' + this.state.runAction); + return; + } + + // get simulator for model + let simulator = null; + for (let sim of this.state.simulators) { + if (sim._id === this.state.simulation.models[index].simulator) { + simulator = sim; + } + } + + if (simulator == null) { + continue; + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator, + data, + token: this.state.sessionToken + }); + } + } + render() { return (

    {this.state.simulation.name}

    + this.onSimulationModelChecked(index, event)} width='30' /> this.getSimulatorName(simulator)} /> @@ -194,8 +297,21 @@ class Simulation extends React.Component { />
    - - +
    + this.setRunAction(index)}> + Start + Stop + Pause + Resume + + + +
    + +
    + + +
    this.closeNewModal(data)} simulators={this.state.simulators} /> this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index 42ddec3..dc7c879 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -29,6 +29,7 @@ class SimulatorsDataManager extends RestDataManager { } doAction(simulator, action, token = null) { + // TODO: Make only simulator id dependent RestAPI.post(this.makeURL(this.url + '/' + simulator._id), action, token).then(response => { AppDispatcher.dispatch({ type: 'simulators/action-started', From 99954a76620d05cef089f4c0b5f012318f3b5be6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 12 Apr 2018 11:46:04 +0200 Subject: [PATCH 407/556] Add simulator actions to simulations view --- src/containers/simulation.js | 50 ++++++------- src/containers/simulations.js | 132 ++++++++++++++++++++++++++++++++-- 2 files changed, 150 insertions(+), 32 deletions(-) diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 45eb44c..1d40cf4 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -230,30 +230,30 @@ class Simulation extends React.Component { } runAction() { + let data; + switch (this.state.runAction) { + case '0': + data = { action: 'start' }; + break; + + case '1': + data = { action: 'stop' }; + break; + + case '2': + data = { action: 'pause' }; + break; + + case '3': + data = { action: 'resume' }; + break; + + default: + console.warn('Unknown simulator action: ' + this.state.runAction); + return; + } + for (let index of this.state.selectedSimulationModels) { - let data; - switch (this.state.runAction) { - case '0': - data = { action: 'start' }; - break; - - case '1': - data = { action: 'stop' }; - break; - - case '2': - data = { action: 'pause' }; - break; - - case '3': - data = { action: 'resume' }; - break; - - default: - console.warn('Unknown simulator action: ' + this.state.runAction); - return; - } - // get simulator for model let simulator = null; for (let sim of this.state.simulators) { @@ -281,7 +281,7 @@ class Simulation extends React.Component {

    {this.state.simulation.name}

    - this.onSimulationModelChecked(index, event)} width='30' /> + this.onSimulationModelChecked(index, event)} width='30' /> this.getSimulatorName(simulator)} /> @@ -298,7 +298,7 @@ class Simulation extends React.Component {
    - this.setRunAction(index)}> + this.setRunAction(index)}> Start Stop Pause diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 1f9da4c..08cd731 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -21,13 +21,13 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Modal, Glyphicon, DropdownButton, MenuItem } 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 NodeStore from '../stores/node-store'; +import SimulatorStore from '../stores/simulator-store'; import Table from '../components/table'; import TableColumn from '../components/table-column'; @@ -37,20 +37,24 @@ import ImportSimulationDialog from '../components/dialog/import-simulation'; class Simulations extends Component { static getStores() { - return [ SimulationStore, UserStore, NodeStore ]; + return [ SimulationStore, UserStore, SimulatorStore ]; } static calculateState() { return { simulations: SimulationStore.getState(), - nodes: NodeStore.getState(), + simulators: SimulatorStore.getState(), sessionToken: UserStore.getState().token, newModal: false, deleteModal: false, editModal: false, importModal: false, - modalSimulation: {} + modalSimulation: {}, + + runAction: 0, + runTitle: 'Start', + selectedSimulations: [] }; } @@ -158,12 +162,113 @@ class Simulations extends Component { FileSaver.saveAs(blob, 'simulation - ' + simulation.name + '.json'); } + onSimulationChecked(index, event) { + const selectedSimulations = 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 }); + } + + setRunAction(index) { + let runTitle = ''; + switch (index) { + case '0': + runTitle = 'Start'; + break; + + case '1': + runTitle = 'Stop'; + break; + + case '2': + runTitle = 'Pause'; + break; + + case '3': + runTitle = 'Resume'; + break; + + default: + console.log('Unknown index ' + index); + break; + } + + this.setState({ runAction: index, runTitle }); + } + + runAction() { + let data; + switch (this.state.runAction) { + case '0': + data = { action: 'start' }; + break; + + case '1': + data = { action: 'stop' }; + break; + + case '2': + data = { action: 'pause' }; + break; + + case '3': + data = { action: 'resume' }; + break; + + default: + console.warn('Unknown simulator action: ' + this.state.runAction); + return; + } + + for (let index of this.state.selectedSimulations) { + for (let model of this.state.simulations[index].models) { + // get simulator for model + let simulator = null; + for (let sim of this.state.simulators) { + if (sim._id === model.simulator) { + simulator = sim; + } + } + + if (simulator == null) { + continue; + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator, + data, + token: this.state.sessionToken + }); + } + } + } + render() { return (

    Simulations

    + this.onSimulationChecked(index, event)} width='30' />
    - - +
    + this.setRunAction(index)}> + Start + Stop + Pause + Resume + + + +
    + +
    + + +
    this.closeNewModal(data)} /> this.closeEditModal(data)} simulation={this.state.modalSimulation} /> From 32eea44827008ee7b8c762d8848d81780395fce3 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 12 Apr 2018 14:48:54 +0200 Subject: [PATCH 408/556] Add simulator-action component --- src/components/simulator-action.js | 68 ++++++++++++++++++++++++++ src/containers/simulation.js | 76 +++++------------------------- src/containers/simulations.js | 76 +++++------------------------- src/containers/simulators.js | 49 ++++--------------- src/stores/simulator-store.js | 4 +- 5 files changed, 104 insertions(+), 169 deletions(-) create mode 100644 src/components/simulator-action.js diff --git a/src/components/simulator-action.js b/src/components/simulator-action.js new file mode 100644 index 0000000..aef6625 --- /dev/null +++ b/src/components/simulator-action.js @@ -0,0 +1,68 @@ +/** + * 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 + * 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 { Button, DropdownButton, MenuItem } from 'react-bootstrap'; + +class SimulatorAction extends React.Component { + constructor(props) { + super(props); + + this.state = { + selectedAction: null + }; + } + + componentWillReceiveProps(nextProps) { + if (this.state.selectedAction == null) { + if (nextProps.actions != null && nextProps.actions.length > 0) { + this.setState({ selectedAction: nextProps.actions[0] }); + } + } + } + + setAction = id => { + // search action + for (let action of this.props.actions) { + if (action.id === id) { + this.setState({ selectedAction: action }); + } + } + } + + render() { + const actionList = this.props.actions.map(action => ( + + {action.title} + + )); + + return
    + + {actionList} + + + +
    ; + } +} + +export default SimulatorAction; diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 1d40cf4..00a6916 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import SimulationStore from '../stores/simulation-store'; @@ -34,6 +34,7 @@ import TableColumn from '../components/table-column'; import NewSimulationModelDialog from '../components/dialog/new-simulation-model'; import EditSimulationModelDialog from '../components/dialog/edit-simulation-model'; import ImportSimulationModelDialog from '../components/dialog/import-simulation-model'; +import SimulatorAction from '../components/simulator-action'; class Simulation extends React.Component { static getStores() { @@ -55,8 +56,6 @@ class Simulation extends React.Component { simulation: {}, - runAction: 0, - runTitle: 'Start', selectedSimulationModels: [] } } @@ -202,57 +201,7 @@ class Simulation extends React.Component { this.setState({ selectedSimulationModels }); } - setRunAction(index) { - let runTitle = ''; - switch (index) { - case '0': - runTitle = 'Start'; - break; - - case '1': - runTitle = 'Stop'; - break; - - case '2': - runTitle = 'Pause'; - break; - - case '3': - runTitle = 'Resume'; - break; - - default: - console.log('Unknown index ' + index); - break; - } - - this.setState({ runAction: index, runTitle }); - } - - runAction() { - let data; - switch (this.state.runAction) { - case '0': - data = { action: 'start' }; - break; - - case '1': - data = { action: 'stop' }; - break; - - case '2': - data = { action: 'pause' }; - break; - - case '3': - data = { action: 'resume' }; - break; - - default: - console.warn('Unknown simulator action: ' + this.state.runAction); - return; - } - + runAction = action => { for (let index of this.state.selectedSimulationModels) { // get simulator for model let simulator = null; @@ -269,7 +218,7 @@ class Simulation extends React.Component { AppDispatcher.dispatch({ type: 'simulators/start-action', simulator, - data, + data: action.data, token: this.state.sessionToken }); } @@ -298,14 +247,15 @@ class Simulation extends React.Component {
    - this.setRunAction(index)}> - Start - Stop - Pause - Resume - - - +
    diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 08cd731..d762bb9 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; @@ -34,6 +34,7 @@ import TableColumn from '../components/table-column'; import NewSimulationDialog from '../components/dialog/new-simulation'; import EditSimulationDialog from '../components/dialog/edit-simulation'; import ImportSimulationDialog from '../components/dialog/import-simulation'; +import SimulatorAction from '../components/simulator-action'; class Simulations extends Component { static getStores() { @@ -52,8 +53,6 @@ class Simulations extends Component { importModal: false, modalSimulation: {}, - runAction: 0, - runTitle: 'Start', selectedSimulations: [] }; } @@ -187,57 +186,7 @@ class Simulations extends Component { this.setState({ selectedSimulations }); } - setRunAction(index) { - let runTitle = ''; - switch (index) { - case '0': - runTitle = 'Start'; - break; - - case '1': - runTitle = 'Stop'; - break; - - case '2': - runTitle = 'Pause'; - break; - - case '3': - runTitle = 'Resume'; - break; - - default: - console.log('Unknown index ' + index); - break; - } - - this.setState({ runAction: index, runTitle }); - } - - runAction() { - let data; - switch (this.state.runAction) { - case '0': - data = { action: 'start' }; - break; - - case '1': - data = { action: 'stop' }; - break; - - case '2': - data = { action: 'pause' }; - break; - - case '3': - data = { action: 'resume' }; - break; - - default: - console.warn('Unknown simulator action: ' + this.state.runAction); - return; - } - + runAction = action => { for (let index of this.state.selectedSimulations) { for (let model of this.state.simulations[index].models) { // get simulator for model @@ -255,7 +204,7 @@ class Simulations extends Component { AppDispatcher.dispatch({ type: 'simulators/start-action', simulator, - data, + data: action.data, token: this.state.sessionToken }); } @@ -282,14 +231,15 @@ class Simulations extends Component {
    - this.setRunAction(index)}> - Start - Stop - Pause - Resume - - - +
    diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 00e1ce9..36f21dd 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; +import { Button, Modal, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; @@ -34,6 +34,7 @@ import TableColumn from '../components/table-column'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; import ImportSimulatorDialog from '../components/dialog/import-simulator'; +import SimulatorAction from '../components/simulator-action'; class Simulators extends Component { static getStores() { @@ -48,8 +49,6 @@ class Simulators extends Component { modalSimulator: {}, deleteModal: false, - runAction: 0, - runTitle: 'Reset', selectedSimulators: [] }; } @@ -146,42 +145,12 @@ class Simulators extends Component { this.setState({ selectedSimulators }); } - setRunAction(index) { - let runTitle = ''; - switch (index) { - case '0': - runTitle = 'Reset'; - break; - - case '1': - runTitle = 'Shutdown'; - break; - - default: - console.log('Unknown index ' + index); - break; - } - - this.setState({ runAction: index, runTitle }); - } - - runAction() { + runAction = action => { for (let index of this.state.selectedSimulators) { - let data; - switch (this.state.runAction) { - case '0': - data = { action: 'reset' }; - break; - - case '1': - data = { action: 'shutdown' }; - break; - } - AppDispatcher.dispatch({ type: 'simulators/start-action', simulator: this.state.simulators[index], - data, + data: action.data, token: this.state.sessionToken }); } @@ -212,12 +181,10 @@ class Simulators extends Component {
    - this.setRunAction(index)}> - Reset - Shutdown - - - +
    diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 75623c0..58bc3e6 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -38,8 +38,8 @@ class SimulatorStore extends ArrayStore { } else if (simulator.rawProperties != null && 'endpoint' in simulator.rawProperties) { SimulatorDataDataManager.open(simulator.rawProperties.endpoint, simulator._id); } else { - console.warn('Endpoint not found for simulator'); - console.log(simulator); + // console.warn('Endpoint not found for simulator'); + // console.log(simulator); } } From 9c669c611d5190ec69237d0262599d8c447925e1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 12 Apr 2018 15:20:37 +0200 Subject: [PATCH 409/556] Add delete-dialog component --- src/components/dialog/delete-dialog.js | 52 ++++++++++++++++++++++++++ src/containers/project.js | 25 +++++-------- src/containers/projects.js | 25 +++++-------- src/containers/simulation.js | 44 ++++++++-------------- src/containers/simulations.js | 25 +++++-------- src/containers/simulators.js | 25 +++++-------- src/containers/users.js | 26 +++++-------- 7 files changed, 113 insertions(+), 109 deletions(-) create mode 100644 src/components/dialog/delete-dialog.js diff --git a/src/components/dialog/delete-dialog.js b/src/components/dialog/delete-dialog.js new file mode 100644 index 0000000..13ece5e --- /dev/null +++ b/src/components/dialog/delete-dialog.js @@ -0,0 +1,52 @@ +/** + * 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 { Button, Modal } from 'react-bootstrap'; + +class DeleteDialog extends React.Component { + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.props.onClose(false); + } + } + + render() { + return this.props.onClose(false)} onKeyPress={this.onModalKeyPress}> + + Delete {this.props.title} + + + + Are you sure you want to delete the {this.props.title} '{this.props.name}'? + + + + + + + ; + } +} + +export default DeleteDialog; diff --git a/src/containers/project.js b/src/containers/project.js index df39dce..359fcfd 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; @@ -36,6 +36,8 @@ import NewVisualzationDialog from '../components/dialog/new-visualization'; import EditVisualizationDialog from '../components/dialog/edit-visualization'; import ImportVisualizationDialog from '../components/dialog/import-visualization'; +import DeleteDialog from '../components/dialog/delete-dialog'; + class Visualizations extends Component { static getStores() { return [ ProjectStore, VisualizationStore, UserStore, SimulationStore ]; @@ -113,9 +115,13 @@ class Visualizations extends Component { this.setState({ newModal: false }); } - confirmDeleteModal() { + closeDeleteModal = confirmDelete => { this.setState({ deleteModal: false }); + if (confirmDelete === false) { + return; + } + AppDispatcher.dispatch({ type: 'visualizations/start-remove', data: this.state.modalData, @@ -206,20 +212,7 @@ class Visualizations extends Component { this.closeEditModal(data)} visualization={this.state.modalData} /> this.closeImportModal(data)} simulation={this.state.simulation} /> - this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> - - Delete Visualization - - - - Are you sure you want to delete the visualization '{this.state.modalData.name}'? - - - - - - - +
    ); } diff --git a/src/containers/projects.js b/src/containers/projects.js index 1f02f80..37cb384 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import ProjectStore from '../stores/project-store'; @@ -33,6 +33,8 @@ import TableColumn from '../components/table-column'; import NewProjectDialog from '../components/dialog/new-project'; import EditProjectDialog from '../components/dialog/edit-project'; +import DeleteDialog from '../components/dialog/delete-dialog'; + class Projects extends React.Component { static getStores() { return [ ProjectStore, SimulationStore, UserStore ]; @@ -75,9 +77,13 @@ class Projects extends React.Component { } } - confirmDeleteModal() { + closeDeleteModal = confirmDelete => { this.setState({ deleteModal: false }); + if (confirmDelete === false) { + return; + } + AppDispatcher.dispatch({ type: 'projects/start-remove', data: this.state.modalData, @@ -143,20 +149,7 @@ class Projects extends React.Component { this.closeNewModal(data)} simulations={this.state.simulations} /> this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> - this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> - - Delete Project - - - - Are you sure you want to delete the project '{this.state.modalData.name}'? - - - - - - - +
    ); } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 00a6916..4c45e6b 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import SimulationStore from '../stores/simulation-store'; @@ -34,7 +34,9 @@ import TableColumn from '../components/table-column'; import NewSimulationModelDialog from '../components/dialog/new-simulation-model'; import EditSimulationModelDialog from '../components/dialog/edit-simulation-model'; import ImportSimulationModelDialog from '../components/dialog/import-simulation-model'; + import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialog/delete-dialog'; class Simulation extends React.Component { static getStores() { @@ -102,12 +104,19 @@ class Simulation extends React.Component { } } - confirmDeleteModal() { + closeDeleteModal = confirmDelete => { + console.log('closeDeleteModal called'); + + if (confirmDelete === false) { + this.setState({ deleteModal: false }); + return; + } + // remove model from simulation - var simulation = this.state.simulation; + const simulation = this.state.simulation; simulation.models.splice(this.state.modalIndex, 1); - this.setState({ deleteModal: false, simulation: simulation }); + this.setState({ deleteModal: false, simulation }); AppDispatcher.dispatch({ type: 'simulations/start-edit', @@ -168,14 +177,6 @@ class Simulation extends React.Component { FileSaver.saveAs(blob, 'simulation model - ' + simulationModel.name + '.json'); } - onModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteModal(); - } - } - onSimulationModelChecked(index, event) { const selectedSimulationModels = this.state.selectedSimulationModels; for (let key in selectedSimulationModels) { @@ -263,24 +264,11 @@ class Simulation extends React.Component {
    - this.closeNewModal(data)} simulators={this.state.simulators} /> - this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> + this.closeNewModal(data)} simulators={this.state.simulators} /> + this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> this.closeImportModal(data)} simulators={this.state.simulators} /> - this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> - - Delete Simulation Model - - - - Are you sure you want to delete the simulation model '{this.state.modalData.name}'? - - - - - - - +
    ); } diff --git a/src/containers/simulations.js b/src/containers/simulations.js index d762bb9..17319fc 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; @@ -34,7 +34,9 @@ import TableColumn from '../components/table-column'; import NewSimulationDialog from '../components/dialog/new-simulation'; import EditSimulationDialog from '../components/dialog/edit-simulation'; import ImportSimulationDialog from '../components/dialog/import-simulation'; + import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialog/delete-dialog'; class Simulations extends Component { static getStores() { @@ -89,9 +91,13 @@ class Simulations extends Component { this.setState({ deleteModal: true, modalSimulation: deleteSimulation }); } - confirmDeleteModal() { + closeDeleteModal = confirmDelete => { this.setState({ deleteModal: false }); + if (confirmDelete === false) { + return; + } + AppDispatcher.dispatch({ type: 'simulations/start-remove', data: this.state.modalSimulation, @@ -251,20 +257,7 @@ class Simulations extends Component { this.closeEditModal(data)} simulation={this.state.modalSimulation} /> this.closeImportModal(data)} nodes={this.state.nodes} /> - this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> - - Delete Simulation - - - - Are you sure you want to delete the simulation '{this.state.modalSimulation.name}'? - - - - - - - +
    ); } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 36f21dd..37402eb 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; @@ -34,7 +34,9 @@ import TableColumn from '../components/table-column'; import NewSimulatorDialog from '../components/dialog/new-simulator'; import EditSimulatorDialog from '../components/dialog/edit-simulator'; import ImportSimulatorDialog from '../components/dialog/import-simulator'; + import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialog/delete-dialog'; class Simulators extends Component { static getStores() { @@ -88,9 +90,13 @@ class Simulators extends Component { } } - confirmDeleteModal() { + closeDeleteModal = confirmDelete => { this.setState({ deleteModal: false }); + if (confirmDelete === false) { + return; + } + AppDispatcher.dispatch({ type: 'simulators/start-remove', data: this.state.modalSimulator, @@ -196,20 +202,7 @@ class Simulators extends Component { this.closeEditModal(data)} simulator={this.state.modalSimulator} /> this.closeImportModal(data)} /> - this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> - - Delete Simulator - - - - Are you sure you want to delete the simulator'{_.get(this.state.modalSimulator, 'properties.name') || _.get(this.state.modalSimulator, 'rawProperties.name') || 'Unknown'}'? - - - - - - - +
    ); } diff --git a/src/containers/users.js b/src/containers/users.js index fd742b7..edf4162 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Modal, Glyphicon } from 'react-bootstrap'; +import { Button, Glyphicon } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import UserStore from '../stores/user-store'; @@ -32,6 +32,8 @@ import TableColumn from '../components/table-column'; import NewUserDialog from '../components/dialog/new-user'; import EditUserDialog from '../components/dialog/edit-user'; +import DeleteDialog from '../components/dialog/delete-dialog'; + class Users extends Component { static getStores() { return [ UserStore, UsersStore ]; @@ -72,9 +74,13 @@ class Users extends Component { } } - confirmDeleteModal() { + closeDeleteModal = confirmDelete => { this.setState({ deleteModal: false }); + if (confirmDelete === false) { + return; + } + AppDispatcher.dispatch({ type: 'users/start-remove', data: this.state.modalData, @@ -124,23 +130,9 @@ class Users extends Component { this.closeNewModal(data)} /> - this.closeEditModal(data)} user={this.state.modalData} /> - this.setState({ deleteModal: false })} onKeyPress={this.onModalKeyPress}> - - Delete user - - - - Are you sure you want to delete the user '{this.state.modalData.username}'? - - - - - - - +
    ); } From bc71cf1ff23f5b51e846ba6ee3d24e28dede4ed1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 12 Apr 2018 15:35:21 +0200 Subject: [PATCH 410/556] Disable run button when no item selected --- src/containers/simulation.js | 4 ++-- src/containers/simulations.js | 4 ++-- src/containers/simulators.js | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 4c45e6b..109066d 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -178,7 +178,7 @@ class Simulation extends React.Component { } onSimulationModelChecked(index, event) { - const selectedSimulationModels = this.state.selectedSimulationModels; + const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); for (let key in selectedSimulationModels) { if (selectedSimulationModels[key] === index) { // update existing entry @@ -249,7 +249,7 @@ class Simulation extends React.Component {
    @@ -198,8 +198,8 @@ class Simulators extends Component {
    - this.closeNewModal(data)} /> - this.closeEditModal(data)} simulator={this.state.modalSimulator} /> + this.closeNewModal(data)} /> + this.closeEditModal(data)} simulator={this.state.modalSimulator} /> this.closeImportModal(data)} /> From 74e75f4674664f258c6138576b218436c212d84e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 20 Apr 2018 10:35:04 +0200 Subject: [PATCH 411/556] Fix simulation model simulator name --- src/components/dialog/edit-simulation-model.js | 3 ++- src/components/dialog/import-simulation-model.js | 3 ++- src/components/dialog/new-simulation-model.js | 3 ++- src/containers/simulation.js | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 3450a54..6b73a8c 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -21,6 +21,7 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import _ from 'lodash'; import Table from '../table'; import TableColumn from '../table-column'; @@ -140,7 +141,7 @@ class EditSimulationModelDialog extends React.Component { Simulator this.handleChange(e)}> {this.props.simulators.map(simulator => ( - + ))} diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialog/import-simulation-model.js index b333bd3..1f9a2ff 100644 --- a/src/components/dialog/import-simulation-model.js +++ b/src/components/dialog/import-simulation-model.js @@ -21,6 +21,7 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import _ from 'lodash'; import Table from '../table'; import TableColumn from '../table-column'; @@ -175,7 +176,7 @@ class ImportSimulationModelDialog extends React.Component { Simulator this.handleChange(e)}> {this.props.simulators.map(simulator => ( - + ))} diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 5106355..33efbed 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -21,6 +21,7 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import _ from 'lodash'; import Table from '../table'; import TableColumn from '../table-column'; @@ -146,7 +147,7 @@ class NewSimulationModelDialog extends React.Component { Simulator this.handleChange(e)}> {this.props.simulators.map(simulator => ( - + ))} diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 109066d..df19dd6 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -23,6 +23,7 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button, Glyphicon } from 'react-bootstrap'; import FileSaver from 'file-saver'; +import _ from 'lodash'; import SimulationStore from '../stores/simulation-store'; import SimulatorStore from '../stores/simulator-store'; @@ -159,7 +160,7 @@ class Simulation extends React.Component { for (let simulator of this.state.simulators) { if (simulator._id === simulatorId) { if ('name' in simulator.rawProperties) { - return simulator.rawProperties.name; + return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'); } else { return simulator.uuid; } From 3d253dfe8c293eb258d6d1a110f12f8ddf18f097 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 20 Apr 2018 10:58:21 +0200 Subject: [PATCH 412/556] Fix simulator endpoint calculcation --- src/stores/simulator-store.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 58bc3e6..8cf3c16 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -19,6 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ +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'; @@ -33,12 +35,12 @@ class SimulatorStore extends ArrayStore { case 'simulators/loaded': // connect to each simulator for (let simulator of action.data) { - if (simulator.endpoint != null && 'endpoint' in simulator.properties) { - SimulatorDataDataManager.open(simulator.properties.endpoint, simulator._id); - } else if (simulator.rawProperties != null && 'endpoint' in simulator.rawProperties) { - SimulatorDataDataManager.open(simulator.rawProperties.endpoint, simulator._id); + const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); + + if (endpoint != null && endpoint !== '') { + SimulatorDataDataManager.open(endpoint, simulator._id); } else { - // console.warn('Endpoint not found for simulator'); + console.warn('Endpoint not found for simulator at ' + endpoint); // console.log(simulator); } } From e91afc1ea42527eb8cff0defb38e0b42ddd4929b Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 26 Apr 2018 15:15:49 +0200 Subject: [PATCH 413/556] Add simulation model store and data manager --- .../dialog/edit-simulation-model.js | 4 + src/containers/simulation.js | 112 ++++++++++-------- .../simulation-models-data-manager.js | 24 ++++ src/stores/simulation-model-store.js | 25 ++++ src/stores/simulator-store.js | 2 +- 5 files changed, 118 insertions(+), 49 deletions(-) create mode 100644 src/data-managers/simulation-models-data-manager.js create mode 100644 src/stores/simulation-model-store.js diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js index 6b73a8c..a194ea6 100644 --- a/src/components/dialog/edit-simulation-model.js +++ b/src/components/dialog/edit-simulation-model.js @@ -34,8 +34,10 @@ class EditSimulationModelDialog extends React.Component { super(props); this.state = { + _id: '', name: '', simulator: '', + simulation: '', outputLength: 1, inputLength: 1, outputMapping: [{ name: 'Signal', type: 'Type' }], @@ -92,6 +94,8 @@ class EditSimulationModelDialog extends React.Component { resetState() { this.setState({ + _id: this.props.data._id, + simulation: this.props.data.simulation, name: this.props.data.name, simulator: this.props.data.simulator, outputLength: this.props.data.outputLength, diff --git a/src/containers/simulation.js b/src/containers/simulation.js index df19dd6..e1c88eb 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -27,6 +27,7 @@ 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'; @@ -41,14 +42,36 @@ import DeleteDialog from '../components/dialog/delete-dialog'; class Simulation extends React.Component { static getStores() { - return [ SimulationStore, SimulatorStore, UserStore ]; + return [ SimulationStore, SimulatorStore, SimulationModelStore, UserStore ]; } - static calculateState() { + static calculateState(prevState, props) { + // get selected simulation + const sessionToken = UserStore.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 => simulation.models.includes(m._id)); + } + return { - simulations: SimulationStore.getState(), + simulationModels, + simulation, + simulators: SimulatorStore.getState(), - sessionToken: UserStore.getState().token, + sessionToken, newModal: false, deleteModal: false, @@ -57,8 +80,6 @@ class Simulation extends React.Component { modalData: {}, modalIndex: null, - simulation: {}, - selectedSimulationModels: [] } } @@ -70,24 +91,13 @@ class Simulation extends React.Component { }); AppDispatcher.dispatch({ - type: 'simulators/start-load', + type: 'simulationModels/start-load', token: this.state.sessionToken }); - } - componentDidUpdate() { - if (this.state.simulation._id !== this.props.match.params.simulation) { - this.reloadSimulation(); - } - } - - reloadSimulation() { - // select simulation by param id - this.state.simulations.forEach((simulation) => { - if (simulation._id === this.props.match.params.simulation) { - // JSON.parse(JSON.stringify(obj)) = deep clone to make also copy of widget objects inside - this.setState({ simulation: JSON.parse(JSON.stringify(simulation)) }); - } + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken }); } @@ -95,33 +105,34 @@ class Simulation extends React.Component { this.setState({ newModal : false }); if (data) { - this.state.simulation.models.push(data); + data.simulation = this.state.simulation._id; AppDispatcher.dispatch({ - type: 'simulations/start-edit', - data: this.state.simulation, + type: 'simulationModels/start-add', + data, 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 => { - console.log('closeDeleteModal called'); + this.setState({ deleteModal: false }); if (confirmDelete === false) { - this.setState({ deleteModal: false }); return; } - // remove model from simulation - const simulation = this.state.simulation; - simulation.models.splice(this.state.modalIndex, 1); - - this.setState({ deleteModal: false, simulation }); - AppDispatcher.dispatch({ - type: 'simulations/start-edit', - data: simulation, + type: 'simulationModels/start-remove', + data: this.state.modalData, token: this.state.sessionToken }); } @@ -130,13 +141,9 @@ class Simulation extends React.Component { this.setState({ editModal : false }); if (data) { - var simulation = this.state.simulation; - simulation.models[this.state.modalIndex] = data; - this.setState({ simulation: simulation }); - AppDispatcher.dispatch({ - type: 'simulations/start-edit', - data: simulation, + type: 'simulationModels/start-edit', + data, token: this.state.sessionToken }); } @@ -146,13 +153,21 @@ class Simulation extends React.Component { this.setState({ importModal: false }); if (data) { - this.state.simulation.models.push(data); + data.simulation = this.state.simulation._id; AppDispatcher.dispatch({ - type: 'simulations/start-edit', - data: this.state.simulation, + type: 'simulationModels/start-add', + data, token: this.state.sessionToken }); + + this.setState({ simulation: {} }, () => { + AppDispatcher.dispatch({ + type: 'simulations/start-load', + data: this.props.match.params.simulation, + token: this.state.sessionToken + }); + }); } } @@ -231,19 +246,20 @@ class Simulation extends React.Component {

    {this.state.simulation.name}

    - +
    this.onSimulationModelChecked(index, event)} width='30' /> this.getSimulatorName(simulator)} /> - + + this.setState({ editModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulation.models[index], modalIndex: index })} + onEdit={(index) => this.setState({ editModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} onExport={index => this.exportModel(index)} />
    @@ -275,4 +291,4 @@ class Simulation extends React.Component { } } -export default Container.create(Simulation); +export default Container.create(Simulation, { withProps: true }); diff --git a/src/data-managers/simulation-models-data-manager.js b/src/data-managers/simulation-models-data-manager.js new file mode 100644 index 0000000..79e6c4e --- /dev/null +++ b/src/data-managers/simulation-models-data-manager.js @@ -0,0 +1,24 @@ +/** + * 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 + * 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'; + +export default new RestDataManager('simulationModel', '/models'); diff --git a/src/stores/simulation-model-store.js b/src/stores/simulation-model-store.js new file mode 100644 index 0000000..73d3dd2 --- /dev/null +++ b/src/stores/simulation-model-store.js @@ -0,0 +1,25 @@ +/** + * 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 + * 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 './array-store'; +import SimulationModelsDataManager from '../data-managers/simulation-models-data-manager'; + +export default new ArrayStore('simulationModels', SimulationModelsDataManager); diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 8cf3c16..8406944 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -40,7 +40,7 @@ class SimulatorStore extends ArrayStore { if (endpoint != null && endpoint !== '') { SimulatorDataDataManager.open(endpoint, simulator._id); } else { - console.warn('Endpoint not found for simulator at ' + endpoint); + // console.warn('Endpoint not found for simulator at ' + endpoint); // console.log(simulator); } } From 703f4fbf6a7e33f1227349225078715edc243c6f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 26 Apr 2018 15:20:07 +0200 Subject: [PATCH 414/556] Fix simulation model references --- src/containers/simulation.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/containers/simulation.js b/src/containers/simulation.js index e1c88eb..6028a56 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -185,12 +185,13 @@ class Simulation extends React.Component { exportModel(index) { // filter properties - let simulationModel = Object.assign({}, this.state.simulation.models[index]); - delete simulationModel.simulator; + const model = Object.assign({}, this.state.simulationModels[index]); + delete model.simulator; + delete model.simulation; // show save dialog - const blob = new Blob([JSON.stringify(simulationModel, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'simulation model - ' + simulationModel.name + '.json'); + const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); } onSimulationModelChecked(index, event) { @@ -223,7 +224,7 @@ class Simulation extends React.Component { // get simulator for model let simulator = null; for (let sim of this.state.simulators) { - if (sim._id === this.state.simulation.models[index].simulator) { + if (sim._id === this.state.simulationModels[index].simulator) { simulator = sim; } } From b5fa267dc42f20e9a5f3bfc5d7144d888631a0ea Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 26 Apr 2018 15:25:50 +0200 Subject: [PATCH 415/556] Change default widget simulator to simulation model --- src/components/widget-factory.js | 20 ++++++++++---------- src/containers/visualization.js | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 87f31dd..b59c6fa 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -12,7 +12,7 @@ import WidgetSlider from './widget-slider'; class WidgetFactory { - static createWidgetOfType(type, position, defaultSimulator = null) { + static createWidgetOfType(type, position, defaultSimulationModel = null) { let widget = { name: 'Name', @@ -28,7 +28,7 @@ class WidgetFactory { // set type specific properties switch(type) { case 'Lamp': - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signal = 0; widget.minWidth = 5; widget.minHeight = 5; @@ -39,7 +39,7 @@ class WidgetFactory { widget.threshold = 0.5; break; case 'Value': - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signal = 0; widget.minWidth = 70; widget.minHeight = 20; @@ -50,7 +50,7 @@ class WidgetFactory { widget.showUnit = false; break; case 'Plot': - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signals = [ 0 ]; widget.ylabel = ''; widget.time = 60; @@ -63,7 +63,7 @@ class WidgetFactory { widget.yUseMinMax = false; break; case 'Table': - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.minWidth = 200; widget.width = 300; widget.height = 200; @@ -78,7 +78,7 @@ class WidgetFactory { widget.fontColor = 0; break; case 'PlotTable': - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.preselectedSignals = []; widget.signals = []; // initialize selected signals widget.ylabel = ''; @@ -105,7 +105,7 @@ class WidgetFactory { widget.height = 100; widget.background_color = 1; widget.font_color = 0; - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signal = 0; break; case 'NumberInput': @@ -113,7 +113,7 @@ class WidgetFactory { widget.minHeight = 50; widget.width = 200; widget.height = 50; - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signal = 0; break; case 'Slider': @@ -122,11 +122,11 @@ class WidgetFactory { widget.width = 400; widget.height = 50; widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signal = 0; break; case 'Gauge': - widget.simulator = defaultSimulator; + widget.simulationModel = defaultSimulationModel; widget.signal = 0; widget.minWidth = 100; widget.minHeight = 150; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index b42720f..532d856 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -192,12 +192,12 @@ class Visualization extends React.Component { handleDrop(item, position) { let widget = null; - let defaultSimulator = null; + let defaultSimulationModel = null; if (this.state.simulation.models && this.state.simulation.models.length === 0) { NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); } else { - defaultSimulator = this.state.simulation.models[0].simulator; + defaultSimulationModel = this.state.simulation.models[0]; } // snap position to grid @@ -205,7 +205,7 @@ class Visualization extends React.Component { position.y = this.snapToGrid(position.y); // create new widget - widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulator); + widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulationModel); var new_widgets = this.state.visualization.widgets; From f6832a383ad6ba5db29ba8891440a57647f88f6b Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 26 Apr 2018 15:33:16 +0200 Subject: [PATCH 416/556] Add default selected simulator to new simulation model --- src/components/dialog/new-simulation-model.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js index 33efbed..40daf9c 100644 --- a/src/components/dialog/new-simulation-model.js +++ b/src/components/dialog/new-simulation-model.js @@ -93,7 +93,7 @@ class NewSimulationModelDialog extends React.Component { resetState() { this.setState({ name: '', - simulator: '', + simulator: this.props.simulators[0]._id || '', outputLength: '1', inputLength: '1', outputMapping: [{ name: 'Signal', type: 'Type' }], @@ -106,16 +106,11 @@ class NewSimulationModelDialog extends React.Component { let name = true; let inputLength = true; let outputLength = true; - let simulator = true; if (this.state.name === '') { name = false; } - if (this.state.simulator === '') { - simulator = false; - } - // test if simulatorid is a number (in a string, not type of number) if (!/^\d+$/.test(this.state.outputLength)) { outputLength = false; @@ -125,13 +120,12 @@ class NewSimulationModelDialog extends React.Component { inputLength = false; } - this.valid = name && inputLength && outputLength && simulator; + this.valid = name && inputLength && outputLength; // return state to control if (target === 'name') return name ? "success" : "error"; else if (target === 'outputLength') return outputLength ? "success" : "error"; else if (target === 'inputLength') return inputLength ? "success" : "error"; - else if (target === 'simulator') return simulator ? "success" : "error"; } render() { @@ -143,7 +137,7 @@ class NewSimulationModelDialog extends React.Component { this.handleChange(e)} /> - + Simulator this.handleChange(e)}> {this.props.simulators.map(simulator => ( From a9c0c04397f4ce0dc617430b0fc13d8c555d88b2 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 26 Apr 2018 15:36:52 +0200 Subject: [PATCH 417/556] Add visualization load after created --- src/containers/project.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 359fcfd..3fbfc89 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -101,6 +101,8 @@ class Visualizations extends Component { } closeNewModal(data) { + this.setState({ newModal: false }); + if (data) { // add project to visualization data.project = this.state.project._id; @@ -110,9 +112,15 @@ class Visualizations extends Component { data: data, token: this.state.sessionToken }); - } - this.setState({ newModal: false }); + this.setState({ project: {} }, () => { + AppDispatcher.dispatch({ + type: 'projects/start-load', + data: this.props.match.params.project, + token: this.state.sessionToken + }); + }); + } } closeDeleteModal = confirmDelete => { From cfdef87d011dbba33d861eb7011244c89c157849 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 09:56:55 +0200 Subject: [PATCH 418/556] Add simulation model link to widget container --- src/components/widget-value.js | 15 +++------------ src/containers/widget.js | 28 ++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/components/widget-value.js b/src/components/widget-value.js index b0531c6..2a5c765 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -33,24 +33,15 @@ class WidgetValue extends Component { componentWillReceiveProps(nextProps) { // update value - if (nextProps.data == null || nextProps.data[nextProps.widget.simulator] == null || nextProps.data[nextProps.widget.simulator].output == null || nextProps.data[nextProps.widget.simulator].output.values == null) { + if (nextProps.data == null || nextProps.simulationModel == null || nextProps.data[nextProps.simulationModel.simulator] == null || nextProps.data[nextProps.simulationModel.simulator].output == null || nextProps.data[nextProps.simulationModel.simulator].output.values == null) { this.setState({ value: '' }); return; } - // get unit from simulation model - let unit = ''; - - if (nextProps.simulation) { - const simulationModel = nextProps.simulation.models.find(model => model.simulator === nextProps.widget.simulator); - - if (nextProps.widget.signal < simulationModel.outputMapping.length) { - unit = simulationModel.outputMapping[nextProps.widget.signal].type; - } - } + const unit = nextProps.simulationModel.outputMapping[nextProps.widget.signal].type; // check if value has changed - const signal = nextProps.data[nextProps.widget.simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[nextProps.simulationModel.simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y, unit }); } diff --git a/src/containers/widget.js b/src/containers/widget.js index bab9d79..3e74cef 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -28,6 +28,7 @@ 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 WidgetLamp from '../components/widget-lamp'; @@ -49,7 +50,7 @@ import '../styles/widgets.css'; class Widget extends React.Component { static getStores() { - return [ SimulatorDataStore, FileStore, UserStore ]; + return [ SimulatorDataStore, SimulationModelStore, FileStore, UserStore ]; } static calculateState(prevState, props) { @@ -70,14 +71,18 @@ class Widget extends React.Component { sessionToken, simulatorData, files: FileStore.getState(), - sequence: prevState.sequence + 1 + sequence: prevState.sequence + 1, + + simulationModels: SimulationModelStore.getState() }; } else { return { sessionToken, simulatorData, files: FileStore.getState(), - sequence: 0 + sequence: 0, + + simulationModels: SimulationModelStore.getState() }; } } @@ -96,6 +101,11 @@ class Widget extends React.Component { type: 'files/start-load', token: this.state.sessionToken }); + + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + token: this.state.sessionToken + }); } } @@ -171,11 +181,21 @@ class Widget extends React.Component { let borderedWidget = false; let element = null; + let simulationModel = null; + + for (let model of this.state.simulationModels) { + if (model._id !== widget.simulationModel) { + continue; + } + + simulationModel = model; + } + // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Lamp') { element = } else if (widget.type === 'Value') { - element = + element = } else if (widget.type === 'Plot') { element = } else if (widget.type === 'Table') { From ac91e65fe9086de05fc2ab7a604b446bf22b558c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 10:02:41 +0200 Subject: [PATCH 419/556] Upgrade table widget to simulation model --- src/components/widget-table.js | 16 ++++++---------- src/containers/widget.js | 10 +++++----- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/components/widget-table.js b/src/components/widget-table.js index a5ec93a..a69cfc3 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -36,9 +36,10 @@ class WidgetTable extends Component { componentWillReceiveProps(nextProps) { // check data - const simulator = nextProps.widget.simulator; + const simulator = nextProps.simulationModel.simulator; - if (nextProps.simulation == null || nextProps.data == null || nextProps.data[simulator] == null + if (nextProps.data == null || nextProps.simulationModel == null + || nextProps.data[simulator] == null || nextProps.data[simulator].output.length === 0 || nextProps.data[simulator].output.values.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { @@ -52,18 +53,13 @@ class WidgetTable extends Component { return; }*/ - // get simulation model - const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator.node === simulator.node && model.simulator.simulator === simulator.simulator); - }); - // get rows - var rows = []; + const rows = []; nextProps.data[simulator].output.values.forEach((signal, index) => { - if (index < simulationModel.outputMapping.length) { + if (index < nextProps.simulationModel.outputMapping.length) { rows.push({ - name: simulationModel.outputMapping[index].name, + name: nextProps.simulationModel.outputMapping[index].name, value: signal[signal.length - 1].y.toFixed(3) }); } diff --git a/src/containers/widget.js b/src/containers/widget.js index 3e74cef..9c51bcb 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -193,17 +193,17 @@ class Widget extends React.Component { // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'Lamp') { - element = + element = } else if (widget.type === 'Value') { element = } else if (widget.type === 'Plot') { - element = + element = } else if (widget.type === 'Table') { - element = + element = } else if (widget.type === 'Label') { element = } else if (widget.type === 'PlotTable') { - element = this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + element = this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { element = } else if (widget.type === 'Button') { @@ -213,7 +213,7 @@ class Widget extends React.Component { } else if (widget.type === 'Slider') { element = this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={(value) => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { - element = + element = } else if (widget.type === 'Box') { element = } else if (widget.type === 'HTML') { From 00ce63c7a0440c52450d5cefcfb5d3571d80bad9 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 10:06:55 +0200 Subject: [PATCH 420/556] Upgrade gauge widget to simulation model --- src/components/widget-gauge.js | 13 ++++++++----- src/components/widget-table.js | 8 ++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 0f2b7bd..91add2b 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -35,9 +35,13 @@ class WidgetGauge extends Component { } componentWillReceiveProps(nextProps) { - // update value - const simulator = nextProps.widget.simulator; + if (nextProps.simulationModel == null) { + return; + } + const simulator = nextProps.simulationModel.simulator; + + // update value if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output.values.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { @@ -176,9 +180,8 @@ class WidgetGauge extends Component { const componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; let signalType = null; - if (this.props.simulation) { - const simulationModel = this.props.simulation.models.filter((model) => model.simulator.node === this.props.widget.simulator.node && model.simulator.simulator === this.props.widget.simulator.simulator)[0]; - signalType = (simulationModel != null && simulationModel.length > 0 && this.props.widget.signal < simulationModel.length) ? simulationModel.outputMapping[this.props.widget.signal].type : ''; + 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 : ''; } return ( diff --git a/src/components/widget-table.js b/src/components/widget-table.js index a69cfc3..0e4b2ef 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -35,10 +35,14 @@ class WidgetTable extends Component { } componentWillReceiveProps(nextProps) { - // check data + if (nextProps.simulationModel == null) { + return; + } + const simulator = nextProps.simulationModel.simulator; - if (nextProps.data == null || nextProps.simulationModel == null + // check data + if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output.length === 0 || nextProps.data[simulator].output.values.length === 0 From f794d14aad24088694620b9b027d7e487142af59 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 10:14:05 +0200 Subject: [PATCH 421/556] Upgrade missing widgets to simulation model data --- src/components/widget-lamp.js | 8 +++-- src/components/widget-plot-table.js | 55 +++++++++++++---------------- src/components/widget-plot.js | 12 ++++--- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/components/widget-lamp.js b/src/components/widget-lamp.js index 60f3b73..c969fa0 100644 --- a/src/components/widget-lamp.js +++ b/src/components/widget-lamp.js @@ -34,9 +34,13 @@ class WidgetLamp extends Component { } componentWillReceiveProps(nextProps) { - // update value - const simulator = nextProps.widget.simulator; + if (nextProps.simulationModel == null) { + return; + } + const simulator = nextProps.simulationModel.simulator; + + // update value if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output.values == null) { this.setState({ value: '' }); return; diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 55992b1..59d729b 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -37,13 +37,17 @@ class WidgetPlotTable extends Component { } componentWillReceiveProps(nextProps) { + if (nextProps.simulationModel == null) { + return; + } + // Update internal selected signals state with props (different array objects) if (this.props.widget.signals !== nextProps.widget.signals) { this.setState( {signals: nextProps.widget.signals}); } // Identify if there was a change in the preselected signals - if (nextProps.simulation && (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.preselectedSignals) || this.state.preselectedSignals.length === 0)) { + if (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.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); @@ -60,35 +64,24 @@ class WidgetPlotTable extends Component { } updatePreselectedSignalsState(nextProps) { - const simulator = nextProps.widget.simulator; + // Create checkboxes using the signal indices from simulation model + const preselectedSignals = nextProps.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.preselectedSignals.indexOf(signal_index) > -1) { + accum.push( + { + index: signal_index, + name: model_signal.name, + type: model_signal.type + } + ) + } + return accum; + }, []); - // get simulation model - const simulationModel = nextProps.simulation.models.find((model) => { - return (model.simulator === simulator); - }); - - let preselectedSignals = []; - // Proceed if a simulation model is available - if (simulationModel) { - // Create checkboxes using the signal indices from simulation model - preselectedSignals = 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.preselectedSignals.indexOf(signal_index) > -1) { - accum.push( - { - index: signal_index, - name: model_signal.name, - type: model_signal.type - } - ) - } - return accum; - }, []); - } - - this.setState({ preselectedSignals: preselectedSignals }); + this.setState({ preselectedSignals }); } updateSignalSelection(signal_index, checked) { @@ -100,10 +93,10 @@ class WidgetPlotTable extends Component { } render() { - var checkBoxes = []; + let checkBoxes = []; // Data passed to plot - let simulator = this.props.widget.simulator; + const simulator = this.props.simulationModel.simulator; let simulatorData = []; if (this.props.data[simulator] != null) { diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index b6cf423..7187829 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -35,12 +35,14 @@ class WidgetPlot extends React.Component { } componentWillReceiveProps(nextProps) { - const simulator = nextProps.widget.simulator; - const simulation = nextProps.simulation; + if (nextProps.simulationModel == null) { + return; + } + + const simulator = nextProps.simulationModel.simulator; // Proceed if a simulation with models and a simulator are available - if (simulator && nextProps.data[simulator] != null && nextProps.data[simulator] != null && simulation && simulation.models.length > 0) { - const model = simulation.models.find(model => model.simulator === simulator); + if (simulator && nextProps.data[simulator] != null && nextProps.data[simulator] != null) { const chosenSignals = nextProps.widget.signals; const data = nextProps.data[simulator].output.values.filter((values, index) => ( @@ -48,7 +50,7 @@ class WidgetPlot extends React.Component { )); // Query the signals that will be displayed in the legend - const legend = model.outputMapping.reduce( (accum, model_signal, signal_index) => { + const legend = nextProps.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 }); } From f702c2062c7aa81074ac896bcadbc97c098a86d2 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 10:55:32 +0200 Subject: [PATCH 422/556] Fix simulator and signal selection in widget edit --- .../dialog/edit-widget-control-creator.js | 46 +++++++++---------- .../dialog/edit-widget-signal-control.js | 11 ++--- .../dialog/edit-widget-simulator-control.js | 12 ++--- src/components/dialog/edit-widget.js | 14 ++---- src/components/widget-gauge.js | 1 + src/components/widget-lamp.js | 1 + src/components/widget-plot.js | 1 + src/components/widget-table.js | 2 + src/containers/visualization.js | 15 ++++-- 9 files changed, 53 insertions(+), 50 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 99ef3ba..1f033c0 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -36,7 +36,7 @@ import EditWidgetColorZonesControl from './edit-widget-color-zones-control'; import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; -export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulation, 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 = []; @@ -47,8 +47,8 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); @@ -58,8 +58,8 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: 0}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => lampBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + 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)} />, @@ -70,23 +70,23 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signals', value: []}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => plotBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + 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)} /> ); break; case 'Table': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} 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( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; @@ -96,8 +96,8 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => gaugeBoundOnChange(e) } />, - validateForm(id)} simulation={simulation} 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)} /> @@ -108,26 +108,26 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); } dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => plotTableBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotTableBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; case 'Slider': dialogControls.push( - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; case 'Button': dialogControls.push( validateForm(id)} handleChange={(e) => handleChange(e)} />, validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; case 'Box': @@ -151,15 +151,15 @@ 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)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; case 'NumberInput': dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulation={simulation} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialog/edit-widget-signal-control.js index b0deda1..4664936 100644 --- a/src/components/dialog/edit-widget-signal-control.js +++ b/src/components/dialog/edit-widget-signal-control.js @@ -28,7 +28,7 @@ class EditWidgetSignalControl extends Component { this.state = { widget: { - simulator: {} + simulationModel: '' } }; } @@ -39,19 +39,16 @@ class EditWidgetSignalControl extends Component { } render() { + const simulationModel = this.props.simulationModels.find(m => m._id === this.state.widget.simulationModel); + let signalsToRender = []; - if (this.props.simulation) { - // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); - - // If simulation model update the signals to render + if (simulationModel != null) { if (this.props.input) { signalsToRender = simulationModel ? simulationModel.inputMapping : []; } else { signalsToRender = simulationModel ? simulationModel.outputMapping : []; } - } return ( diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialog/edit-widget-simulator-control.js index ec4cec5..b0a2ea9 100644 --- a/src/components/dialog/edit-widget-simulator-control.js +++ b/src/components/dialog/edit-widget-simulator-control.js @@ -28,7 +28,7 @@ class EditWidgetSimulatorControl extends Component { this.state = { widget: { - simulator: {} + simulationModel: '' } }; } @@ -40,15 +40,15 @@ class EditWidgetSimulatorControl extends Component { render() { return ( - + Simulation Model - this.props.handleChange(e)}> + this.props.handleChange(e)}> { - this.props.simulation.models.length === 0? ( + this.props.simulationModels.length === 0 ? ( ) : ( - this.props.simulation.models.map((model, index) => ( - + this.props.simulationModels.map((model, index) => ( + ))) } diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index daf51fe..95e20c7 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -35,7 +35,7 @@ class EditWidgetDialog extends React.Component { this.state = { temporal: { name: '', - simulator: {}, + simulationModel: '', signal: 0 } }; @@ -66,11 +66,7 @@ class EditWidgetDialog extends React.Component { if (e.constructor === Array) { // Every property in the array will be updated let changes = e.reduce( (changesObject, event) => { - if (event.target.id === 'simulator') { - changesObject[event.target.id] = JSON.parse(event.target.value); - } else { - changesObject[event.target.id] = event.target.value; - } + changesObject[event.target.id] = event.target.value; return changesObject; }, {}); @@ -78,9 +74,7 @@ class EditWidgetDialog extends React.Component { this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } else { let changeObject = {}; - if (e.target.id === 'simulator') { - changeObject[e.target.id] = JSON.parse(e.target.value); - } else if (e.target.id === 'lockAspect') { + if (e.target.id === 'lockAspect') { changeObject[e.target.id] = e.target.checked; // correct image aspect if turned on @@ -135,7 +129,7 @@ class EditWidgetDialog extends React.Component { this.props.sessionToken, this.props.files, (id) => this.validateForm(id), - this.props.simulation, + this.props.simulationModels, (e) => this.handleChange(e)); } diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 91add2b..be1ba9c 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -36,6 +36,7 @@ class WidgetGauge extends Component { componentWillReceiveProps(nextProps) { if (nextProps.simulationModel == null) { + this.setState({ value: 0 }); return; } diff --git a/src/components/widget-lamp.js b/src/components/widget-lamp.js index c969fa0..baefe98 100644 --- a/src/components/widget-lamp.js +++ b/src/components/widget-lamp.js @@ -35,6 +35,7 @@ class WidgetLamp extends Component { componentWillReceiveProps(nextProps) { if (nextProps.simulationModel == null) { + this.setState({ value: '' }); return; } diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 7187829..5ccfa5f 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -36,6 +36,7 @@ class WidgetPlot extends React.Component { componentWillReceiveProps(nextProps) { if (nextProps.simulationModel == null) { + this.setState({ data: [], legend: [] }); return; } diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 0e4b2ef..52d98d3 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -36,6 +36,7 @@ class WidgetTable extends Component { componentWillReceiveProps(nextProps) { if (nextProps.simulationModel == null) { + this.setState({ rows: [], sequence: null }); return; } @@ -44,6 +45,7 @@ class WidgetTable extends Component { // check data if (nextProps.data == null || nextProps.data[simulator] == null + || nextProps.data[simulator].output == null || nextProps.data[simulator].output.length === 0 || nextProps.data[simulator].output.values.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 532d856..1c41118 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -38,6 +38,7 @@ 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'; @@ -47,14 +48,19 @@ import '../styles/context-menu.css'; class Visualization extends React.Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; } - static calculateState(prevState) { + static calculateState(prevState, props) { if (prevState == null) { prevState = {}; } + let simulationModels = []; + if (prevState.simulation != null) { + simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); + } + return { sessionToken: UserStore.getState().token, visualizations: VisualizationStore.getState(), @@ -65,6 +71,7 @@ class Visualization extends React.Component { visualization: prevState.visualization || {}, project: prevState.project || null, simulation: prevState.simulation || null, + simulationModels, editing: prevState.editing || false, paused: prevState.paused || false, @@ -529,11 +536,11 @@ class Visualization extends React.Component { ))} - this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} files={this.state.files} /> + this.closeEdit(data)} widget={this.state.modalData} simulationModels={this.state.simulationModels} files={this.state.files} />
    ); } } -export default Fullscreenable()(Container.create(Visualization)); +export default Fullscreenable()(Container.create(Visualization, { withProps: true })); From cdafc62aa398c936af9d48a1cab2b90791baa646 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 10:57:56 +0200 Subject: [PATCH 423/556] Fix multiple signal selection in widget edit dialog --- src/components/dialog/edit-widget-signals-control.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialog/edit-widget-signals-control.js index 7a0a595..0b55312 100644 --- a/src/components/dialog/edit-widget-signals-control.js +++ b/src/components/dialog/edit-widget-signals-control.js @@ -54,14 +54,13 @@ class EditWidgetSignalsControl extends Component { } render() { + const simulationModel = this.props.simulationModels.find(m => m._id === this.state.widget.simulationModel); + let signalsToRender = []; - if (this.props.simulation) { - // get selected simulation model - const simulationModel = this.props.simulation.models.find( model => model.simulator.node === this.state.widget.simulator.node && model.simulator.simulator === this.state.widget.simulator.simulator ); - + if (simulationModel != null) { // If simulation model update the signals to render - signalsToRender = simulationModel? simulationModel.outputMapping : []; + signalsToRender = simulationModel ? simulationModel.outputMapping : []; } return ( From 0b1ad61b20ad07f71cc3b5759f3b2694bc22145f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 11:05:55 +0200 Subject: [PATCH 424/556] Fix plot table widget --- src/components/widget-plot-table.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 59d729b..02d11be 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -96,6 +96,10 @@ class WidgetPlotTable extends Component { let checkBoxes = []; // Data passed to plot + if (this.props.simulationModel == null) { + return
    ; + } + const simulator = this.props.simulationModel.simulator; let simulatorData = []; From cfa2ac74a6439df5dd7d1b752d1af58c2627ec2a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 11:43:20 +0200 Subject: [PATCH 425/556] Replace react-contextmenu with react-contexify --- package-lock.json | 8509 ++++++++++++++++--------------- package.json | 4 +- src/containers/visualization.js | 32 +- src/containers/widget.js | 6 +- 4 files changed, 4418 insertions(+), 4133 deletions(-) diff --git a/package-lock.json b/package-lock.json index 034bf6a..5ce72e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -25,45 +25,39 @@ }, "acorn-dynamic-import": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-globals": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.4" }, "dependencies": { "acorn": { "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-jsx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" } } @@ -75,31 +69,27 @@ }, "address": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.2.tgz", "integrity": "sha1-SACB6CtYe6MZRZ/vUS9Rb+A9WK8=" }, "ajv": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ajv-keywords": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" }, "align-text": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" }, "dependencies": { "kind-of": { @@ -107,24 +97,21 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, "alphanum-sort": { "version": "1.0.2", - "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=" }, "anser": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.1.tgz", "integrity": "sha1-w2QYY6lizr75Qeoshwbyy08HFr0=" }, "ansi-align": { @@ -132,7 +119,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -150,8 +137,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -159,24 +146,21 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, "ansi-escapes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, "ansi-html": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { @@ -184,7 +168,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -192,8 +176,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" }, "dependencies": { "arr-diff": { @@ -201,7 +185,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -214,9 +198,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -224,7 +208,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -232,7 +216,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -240,7 +224,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -248,29 +232,28 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } }, "append-transform": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "argparse": { @@ -278,12 +261,11 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "aria-query": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.5.0.tgz", "integrity": "sha1-heMVLNjMW6sY2+1hzZxPzlT6ecM=", "requires": { "ast-types-flow": "0.0.7" @@ -306,54 +288,45 @@ }, "array-equal": { "version": "1.0.0", - "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.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" }, "array-includes": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "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", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { @@ -363,7 +336,6 @@ }, "arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { @@ -372,7 +344,6 @@ }, "asn1": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "asn1.js": { @@ -380,14 +351,13 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { "util": "0.10.3" @@ -405,7 +375,6 @@ }, "ast-types-flow": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, "async": { @@ -413,17 +382,15 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.5" + "lodash": "^4.14.0" } }, "async-each": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { @@ -435,12 +402,12 @@ "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", "integrity": "sha512-y3U+M3XLC3oKKkShZXcsjdCY6bTWmqOboqx1iDeaMumpqumPbEDUqb9586imSWcy8nboBTjqRu8bNe4KcoYOXA==", "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000827", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.21", - "postcss-value-parser": "3.3.0" + "browserslist": "^2.1.3", + "caniuse-lite": "^1.0.30000670", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3" } }, "aws-sign2": { @@ -455,7 +422,6 @@ }, "axobject-query": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", "requires": { "ast-types-flow": "0.0.7" @@ -466,34 +432,34 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "2.0.2", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", "integrity": "sha512-wne6XXFyKIfZSLLXN17Zun5aw8x2WZY5ork2NSa5t0UWGxK2EHsJlPd8W1rQQDgpG0tsvEHNdaqmvygEI7Qmmw==", "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.22.0", + "babel-generator": "^6.25.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.25.0", + "babel-traverse": "^6.25.0", + "babel-types": "^6.25.0", + "babylon": "^6.17.2", + "convert-source-map": "^1.1.0", + "debug": "^2.1.1", + "json5": "^0.5.0", + "lodash": "^4.2.0", + "minimatch": "^3.0.2", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "slash": "^1.0.0", + "source-map": "^0.5.0" }, "dependencies": { "source-map": { @@ -507,10 +473,10 @@ "version": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha512-i2yKOhjgwUbUrJ8oJm6QqRzltIoFahGNPZ0HF22lUN4H1DW03JQyJm7WSv+I1LURQWjDNhVqFo04acYa07rhOQ==", "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0" + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" } }, "babel-generator": { @@ -518,14 +484,14 @@ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "babel-runtime": { @@ -533,8 +499,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -556,12 +522,11 @@ }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-builder-react-jsx": { @@ -569,9 +534,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" }, "dependencies": { "babel-runtime": { @@ -579,8 +544,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -597,13 +562,12 @@ }, "babel-helper-call-delegate": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -611,10 +575,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -622,8 +586,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -640,51 +604,46 @@ }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -692,9 +651,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -702,8 +661,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -720,80 +679,74 @@ }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-jest": { "version": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", "integrity": "sha512-eAycDKZn+m6jMBv5KMXRKttDeoDUE7Y6eQpeiF4ip0lLaI4uwGNhJIdVK2RptHjO9N9RJ2gONMn2XE67wBdf8A==", "requires": { - "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "babel-plugin-istanbul": "4.1.6", - "babel-preset-jest": "20.0.3" + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^20.0.3" } }, "babel-loader": { "version": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", "integrity": "sha512-Kt7ND6R8tB0E372MdnZM9H7ImYYF9VevfVHjAa7Q1JKt4tpwihupfFwFc5BiLDWIsehNY+VQ4zyl2E22y86pbA==", "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" + "find-cache-dir": "^0.1.1", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" } }, "babel-messages": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz", "integrity": "sha1-rbW8j0iokxFUA5WunwzD7UsQuy4=", "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-istanbul": { @@ -801,92 +754,79 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.10.1", - "test-exclude": "4.2.1" + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" } }, "babel-plugin-jest-hoist": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-dynamic-import": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -894,11 +834,11 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -906,8 +846,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -924,80 +864,72 @@ }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -1005,10 +937,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" }, "dependencies": { "babel-runtime": { @@ -1016,8 +948,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -1034,174 +966,155 @@ }, "babel-plugin-transform-es2015-modules-systemjs": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-constant-elements": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-display-name": { "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-source": { "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", "requires": { "regenerator-transform": "0.9.11" @@ -1209,85 +1122,79 @@ }, "babel-plugin-transform-runtime": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-env": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1", - "browserslist": "2.11.3", - "invariant": "2.2.4", - "semver": "5.5.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-preset-flow": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "babel-preset-jest": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { - "babel-plugin-jest-hoist": "20.0.3" + "babel-plugin-jest-hoist": "^20.0.3" } }, "babel-preset-react": { "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" } }, "babel-preset-react-app": { @@ -1313,13 +1220,13 @@ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.5", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { "babel-core": { @@ -1327,25 +1234,25 @@ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" } }, "babel-runtime": { @@ -1353,8 +1260,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -1378,8 +1285,8 @@ "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", "integrity": "sha512-9Vdluea/MpskdLsLYTH10Wtc5z2U0THGHVJeqec0EHUbfEt2q3zM1piQ+/GjMl9h0drUY1hF8zHV9nmH8Kl+Og==", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.10.5" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" }, "dependencies": { "core-js": { @@ -1394,11 +1301,11 @@ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -1406,8 +1313,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -1427,15 +1334,15 @@ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -1443,8 +1350,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -1464,10 +1371,10 @@ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" }, "dependencies": { "babel-runtime": { @@ -1475,8 +1382,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -1498,7 +1405,6 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { @@ -1506,13 +1412,13 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1520,7 +1426,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1528,7 +1434,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1536,7 +1442,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1544,9 +1450,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1558,16 +1464,14 @@ }, "batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -1596,33 +1500,31 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" } }, "bonjour": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" } }, "boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boom": { @@ -1630,7 +1532,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "bootstrap": { @@ -1642,13 +1544,13 @@ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -1666,9 +1568,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "is-fullwidth-code-point": { @@ -1681,8 +1583,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -1690,7 +1592,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1700,7 +1602,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1709,16 +1611,16 @@ "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.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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": { @@ -1726,19 +1628,17 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-resolve": { "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", "requires": { "resolve": "1.1.7" @@ -1746,7 +1646,6 @@ "dependencies": { "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } @@ -1756,12 +1655,12 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -1769,9 +1668,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1779,32 +1678,30 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "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" } }, "browserify-zlib": { @@ -1812,7 +1709,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { @@ -1820,26 +1717,24 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "1.0.30000827", - "electron-to-chromium": "1.3.42" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } }, "bser": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-from": { @@ -1854,17 +1749,14 @@ }, "buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { @@ -1877,78 +1769,70 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "caller-path": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" }, "camel-case": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "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.1.1", - "map-obj": "1.0.1" + "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": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000827", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" }, "dependencies": { "browserslist": { "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000827", - "electron-to-chromium": "1.3.42" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -1965,7 +1849,6 @@ }, "capture-stack-trace": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "case-sensitive-paths-webpack-plugin": { @@ -1974,16 +1857,14 @@ }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -1992,12 +1873,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" }, "dependencies": { "assertion-error": { @@ -2018,7 +1899,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, "get-func-name": { @@ -2045,11 +1926,11 @@ "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" }, "dependencies": { "ansi-styles": { @@ -2059,7 +1940,6 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } @@ -2074,18 +1954,18 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.0.4" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" }, "dependencies": { "anymatch": { @@ -2093,8 +1973,470 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "fsevents": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", + "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.9.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "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.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.2", + "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.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "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.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.9.1", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.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 + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": 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.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.6", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.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.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "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, + "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, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } } }, "glob-parent": { @@ -2102,8 +2444,8 @@ "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.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -2111,7 +2453,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -2126,7 +2468,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } } } @@ -2141,8 +2483,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "circular-json": { @@ -2155,7 +2497,7 @@ "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + "chalk": "^1.1.3" } }, "class-utils": { @@ -2163,10 +2505,10 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -2174,7 +2516,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -2188,7 +2530,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "0.5.7" + "source-map": "0.5.x" }, "dependencies": { "source-map": { @@ -2200,15 +2542,13 @@ }, "cli-boxes": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-width": { @@ -2218,17 +2558,15 @@ }, "cliui": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { "wordwrap": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } @@ -2240,20 +2578,17 @@ }, "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { - "q": "1.5.1" + "q": "^1.1.2" } }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { @@ -2261,18 +2596,17 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { - "clone": "1.0.4", - "color-convert": "1.9.1", - "color-string": "0.3.0" + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" } }, "color-convert": { @@ -2280,35 +2614,31 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colormin": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { - "color": "0.11.4", + "color": "^0.11.0", "css-color-names": "0.0.4", - "has": "1.0.1" + "has": "^1.0.1" } }, "colors": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { @@ -2316,7 +2646,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -2326,7 +2656,6 @@ }, "commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "compare-versions": { @@ -2344,7 +2673,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": "1.33.0" + "mime-db": ">= 1.33.0 < 2" } }, "compression": { @@ -2352,18 +2681,17 @@ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "bytes": "3.0.0", - "compressible": "2.0.13", + "compressible": "~2.0.13", "debug": "2.6.9", - "on-headers": "1.0.1", + "on-headers": "~1.0.1", "safe-buffer": "5.1.1", - "vary": "1.1.2" + "vary": "~1.1.2" } }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -2371,10 +2699,10 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -2382,12 +2710,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "connect-history-api-fallback": { @@ -2397,25 +2725,21 @@ }, "console-browserify": { "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" + "date-now": "^0.1.4" } }, "constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "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=" }, "content-type": { @@ -2435,12 +2759,10 @@ }, "cookie": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-descriptor": { @@ -2454,7 +2776,6 @@ }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { @@ -2462,18 +2783,17 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" }, "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2483,16 +2803,15 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-error-class": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "create-hash": { @@ -2500,11 +2819,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.1", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -2512,21 +2831,20 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "requires": { - "lru-cache": "4.1.2", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "cryptiles": { @@ -2534,7 +2852,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -2542,7 +2860,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -2552,17 +2870,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "crypto-random-string": { @@ -2572,32 +2890,30 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, "css-loader": { "version": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", "integrity": "sha512-umVjsx1rY6Nozzi01Ni32aicDaZ6fBgMC8X3Xk1hqFgYpS5k3YT30K8cqMVVX8YKpkjMCDDdsQ07uLZCShSAmQ==", "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "0.1.8" + "babel-code-frame": "^6.11.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": ">=2.6.1 <4", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.0.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.0.0", + "postcss-modules-local-by-default": "^1.0.1", + "postcss-modules-scope": "^1.0.0", + "postcss-modules-values": "^1.1.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^0.1.7" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -2605,10 +2921,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -2618,121 +2934,111 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "css-select": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.1" + "nth-check": "~1.0.1" } }, "css-selector-tokenizer": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" }, "dependencies": { "regexpu-core": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } } } }, "css-what": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "cssesc": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" }, "cssnano": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" }, "dependencies": { "autoprefixer": { "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000827", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" } }, "browserslist": { "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000827", - "electron-to-chromium": "1.3.42" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } }, "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -2740,10 +3046,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -2753,21 +3059,19 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "csso": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "clap": "^1.0.9", + "source-map": "^0.5.3" }, "dependencies": { "source-map": { @@ -2779,31 +3083,27 @@ }, "cssom": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" }, "cssstyle": { "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "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.2" + "array-find-index": "^1.0.1" } }, "d": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.42" + "es5-ext": "^0.10.9" } }, "d3": { @@ -2828,13 +3128,13 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", "requires": { - "d3-array": "1.2.1", - "d3-collection": "1.0.4", - "d3-color": "1.0.3", - "d3-format": "1.2.2", - "d3-interpolate": "1.1.6", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1" + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" }, "dependencies": { "d3-collection": { @@ -2857,7 +3157,7 @@ "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.0.3" + "d3-color": "1" } }, "d3-time": { @@ -2876,7 +3176,7 @@ "version": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { - "d3-path": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz" + "d3-path": "1" } }, "d3-time-format": { @@ -2884,7 +3184,7 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { - "d3-time": "1.0.8" + "d3-time": "1" }, "dependencies": { "d3-time": { @@ -2896,20 +3196,17 @@ }, "damerau-levenshtein": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-now": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, "debug": { @@ -2922,7 +3219,6 @@ }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { @@ -2932,34 +3228,29 @@ }, "deep-equal": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deep-extend": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "deep-is": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-require-extensions": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "define-properties": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "define-property": { @@ -2967,8 +3258,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2976,7 +3267,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2984,7 +3275,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2992,35 +3283,32 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, "defined": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { @@ -3030,38 +3318,33 @@ }, "des.js": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-node": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" }, "detect-port-alt": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", "requires": { - "address": "1.0.2", - "debug": "2.6.9" + "address": "^1.0.1", + "debug": "^2.6.0" } }, "diff": { @@ -3074,14 +3357,13 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dns-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { @@ -3089,16 +3371,15 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "doctrine": { @@ -3106,20 +3387,18 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "dom-converter": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { - "utila": "0.3.3" + "utila": "~0.3" }, "dependencies": { "utila": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } @@ -3131,26 +3410,23 @@ }, "dom-serializer": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, "dom-urls": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { - "urijs": "1.19.1" + "urijs": "^1.16.1" } }, "domain-browser": { @@ -3160,24 +3436,21 @@ }, "domelementtype": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domhandler": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { @@ -3185,7 +3458,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -3194,7 +3467,6 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, "duplexer3": { @@ -3204,16 +3476,14 @@ }, "ecc-jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { @@ -3223,16 +3493,15 @@ }, "elliptic": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emoji-regex": { @@ -3242,7 +3511,6 @@ }, "emojis-list": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { @@ -3252,10 +3520,9 @@ }, "encoding": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.21" + "iconv-lite": "~0.4.13" }, "dependencies": { "iconv-lite": { @@ -3263,25 +3530,23 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } } } }, "enhanced-resolve": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "entities": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "errno": { @@ -3289,15 +3554,14 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -3305,21 +3569,20 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -3327,9 +3590,9 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -3337,22 +3600,21 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-promise": { @@ -3362,44 +3624,39 @@ }, "es6-set": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { @@ -3407,11 +3664,11 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -3423,59 +3680,57 @@ }, "escope": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { "version": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha512-x6LJGXWCGB/4YOBhL48yeppZTo+YQUNC37N5qqCpC1b1kkNzydlQHQAtPuUSFoZSxgIadrysQoW2Hq602P+uEA==", "requires": { - "babel-code-frame": "6.26.0", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "concat-stream": "1.6.2", - "debug": "2.6.9", - "doctrine": "2.1.0", - "escope": "3.6.0", - "espree": "3.5.4", - "esquery": "1.0.1", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.2", - "is-resolvable": "1.1.0", - "js-yaml": "3.7.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" }, "dependencies": { "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } @@ -3486,24 +3741,23 @@ }, "eslint-import-resolver-node": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "requires": { - "debug": "2.6.9", - "object-assign": "4.1.1", - "resolve": "1.7.0" + "debug": "^2.2.0", + "object-assign": "^4.0.1", + "resolve": "^1.1.6" } }, "eslint-loader": { "version": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", "integrity": "sha512-4xbtW4Zo5Xpg8fBcx0z4VvWVhdrJJazcNa8yTGrXc4tuppNJEFn5qI/crMORetebvuqkM1W6UhZVKwLklxoSdA==", "requires": { - "find-cache-dir": "0.1.1", - "loader-fs-cache": "1.0.1", - "loader-utils": "1.1.0", - "object-assign": "4.1.1", - "object-hash": "1.3.0", - "rimraf": "2.6.2" + "find-cache-dir": "^0.1.1", + "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" } }, "eslint-module-utils": { @@ -3511,40 +3765,39 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" } }, "eslint-plugin-flowtype": { "version": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", "integrity": "sha512-a8EGMRsWMqQe7hScFqrg7GytNazT8LaT8dUWRwxeLkFwE1XuSeNxzGeQn86lX9V756HpDvACLk+SdRz3u9ALmA==", "requires": { - "lodash": "4.17.5" + "lodash": "^4.15.0" } }, "eslint-plugin-import": { "version": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", "integrity": "sha512-8HLeIYzOH4eltevxf+iC9Dtz/91yaeOqtlba5srcpQWLrv57F5NNG1RNLqAbpWJWDD4BxKuKjUveJY9W6Tbswg==", "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.2.0", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.2.3", - "eslint-module-utils": "2.2.0", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "pkg-up": "1.0.0" + "eslint-import-resolver-node": "^0.2.0", + "eslint-module-utils": "^2.0.0", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "pkg-up": "^1.0.0" }, "dependencies": { "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -3553,22 +3806,22 @@ "version": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", "integrity": "sha512-YNIrEw8cepPQlHcPUKLbJF9R4O4duG7ZGZuT0L+jYVdsRmBb6klnpYI0XnuEK3qMirTuuovb4Lg6+Scy4BCwaA==", "requires": { - "aria-query": "0.5.0", - "array-includes": "3.0.3", + "aria-query": "^0.5.0", + "array-includes": "^3.0.3", "ast-types-flow": "0.0.7", - "axobject-query": "0.1.0", - "damerau-levenshtein": "1.0.4", - "emoji-regex": "6.5.1", - "jsx-ast-utils": "1.4.1" + "axobject-query": "^0.1.0", + "damerau-levenshtein": "^1.0.0", + "emoji-regex": "^6.1.0", + "jsx-ast-utils": "^1.4.0" } }, "eslint-plugin-react": { "version": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", "integrity": "sha512-lErfLh7LnbGOnLku3CS6Deep3PJwg8+mwK40PRYQ6ACvZuAGUAt7mI76dCJKDJbfvmctg6dOq41baMVY+xWFEg==", "requires": { - "doctrine": "2.1.0", - "has": "1.0.1", - "jsx-ast-utils": "1.4.1" + "doctrine": "^2.0.0", + "has": "^1.0.1", + "jsx-ast-utils": "^1.4.1" } }, "espree": { @@ -3576,13 +3829,12 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "requires": { - "acorn": "5.5.3", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" }, "esquery": { @@ -3590,7 +3842,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -3598,17 +3850,15 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { @@ -3618,29 +3868,25 @@ }, "event-emitter": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "eventemitter3": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { - "original": "1.0.0" + "original": ">=0.0.5" } }, "evp_bytestokey": { @@ -3648,8 +3894,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "exec-sh": { @@ -3657,7 +3903,7 @@ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "requires": { - "merge": "1.2.0" + "merge": "^1.1.3" } }, "execa": { @@ -3665,13 +3911,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { "cross-spawn": { @@ -3679,16 +3925,15 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } }, "exit-hook": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" }, "expand-brackets": { @@ -3696,13 +3941,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -3710,7 +3955,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -3718,17 +3963,16 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "expand-range": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { @@ -3736,11 +3980,11 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { @@ -3748,7 +3992,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "isobject": { @@ -3764,7 +4008,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3774,53 +4018,50 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" } } }, "extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "extend-shallow": { @@ -3828,8 +4069,8 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3837,7 +4078,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -3847,9 +4088,9 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -3857,14 +4098,14 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -3872,7 +4113,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -3880,7 +4121,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -3888,7 +4129,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -3896,7 +4137,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -3904,9 +4145,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -3915,10 +4156,10 @@ "version": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", "integrity": "sha512-Dv5Y7okQmgFQiKJUuitKYnmnMOT3Sfg47k/AakBA5a4Wl8QBGZy+Yep0IZxUu5OwktdpaY49mvvoudaKbzbzlA==", "requires": { - "async": "2.6.0", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.1.0" + "async": "^2.1.2", + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" } }, "extsprintf": { @@ -3938,48 +4179,44 @@ }, "fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastparse": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" }, "faye-websocket": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": "0.7.0" + "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=", "requires": { - "bser": "2.0.0" + "bser": "^2.0.0" } }, "fbemitter": { "version": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", "integrity": "sha512-hd8PgD+Q6RQtlcGrkM9oY3MFIjq6CA6wurCK1TKn2eaA76Ww4VAOihmq98NyjRhjJi/axgznZnh9lF8+TcTsNQ==", "requires": { - "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz" + "fbjs": "^0.8.4" } }, "fbjs": { "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", "integrity": "sha512-SBiP6XPiWIlX1tE5mvU/UeUFoqzJgbf+ezkl0M8D2xk4urDb+2uyjjGB10HAPluLboUqqVHtgUwwyuWakUfMgQ==", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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": { "object-assign": { @@ -3991,27 +4228,25 @@ }, "figures": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-loader": { "version": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", "requires": { - "loader-utils": "1.1.0" + "loader-utils": "^1.0.2" } }, "file-saver": { @@ -4021,21 +4256,18 @@ }, "filename-regex": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fileset": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, "filesize": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.3.0.tgz", "integrity": "sha1-UxSeo0YOOy4CSWKlFkiqVyz5gSI=" }, "fill-range": { @@ -4043,10 +4275,10 @@ "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.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -4054,7 +4286,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -4065,30 +4297,28 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "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", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, "find-cache-dir": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^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" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -4096,46 +4326,41 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "flatten": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, "flux": { "version": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", "integrity": "sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io=", "requires": { - "fbemitter": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", - "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz" + "fbemitter": "^2.0.0", + "fbjs": "^0.8.0" } }, "for-in": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { @@ -4143,9 +4368,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "forwarded": { @@ -4158,7 +4383,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -4170,800 +4395,15 @@ "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, "fullscreen": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fullscreen/-/fullscreen-1.1.1.tgz", @@ -4984,25 +4424,21 @@ }, "generate-function": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" }, "generate-object-property": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "get-caller-file": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "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": { @@ -5017,10 +4453,9 @@ }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -5028,29 +4463,27 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } }, "glob-base": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "global-dirs": { @@ -5058,7 +4491,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "globals": { @@ -5068,15 +4501,14 @@ }, "globby": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "got": { @@ -5084,40 +4516,36 @@ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growly": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gzip-size": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "0.1.1" + "duplexer": "^0.1.1" } }, "handle-thing": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" }, "handlebars": { @@ -5125,34 +4553,31 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "source-map": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "uglify-js": { "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "source-map": { @@ -5165,13 +4590,12 @@ }, "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -5187,8 +4611,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" }, "dependencies": { "ajv": { @@ -5196,28 +4620,26 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } } } }, "has": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -5230,9 +4652,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -5240,8 +4662,8 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -5249,7 +4671,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5259,8 +4681,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -5268,8 +4690,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -5277,25 +4699,23 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "he": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -5305,16 +4725,14 @@ }, "hoist-non-react-statics": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, "home-or-tmp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -5324,18 +4742,16 @@ }, "hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { - "inherits": "2.0.3", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, "html-comment-regex": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" }, "html-encoding-sniffer": { @@ -5343,12 +4759,11 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "html-entities": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { @@ -5356,85 +4771,78 @@ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.14.tgz", "integrity": "sha512-sZjw6zhQgyUnIlIPU+W80XpRjWjdxHtNcxjfyOskOsCTDKytcfLY04wsQY/83Yqb4ndoiD2FtauiL7Yg6uUQFQ==", "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.11", - "commander": "2.15.1", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.3.20" + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.15.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.3.x" } }, "html-webpack-plugin": { "version": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", "integrity": "sha512-XgOxN8H7nDeLQzD9FQOWWQLVL0GDq5reeREx8jpLZcEZND7kM5j3o/mFhjOcSfZ89HwU3+yBqSQyK7ZvvYFZ/w==", "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.14", - "loader-utils": "0.2.17", - "lodash": "4.17.5", - "pretty-error": "2.1.1", - "toposort": "1.0.6" + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" }, "dependencies": { "loader-utils": { "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } }, "htmlparser2": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" }, "dependencies": { "domutils": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, "http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { @@ -5442,10 +4850,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "http-parser-js": { @@ -5455,22 +4863,20 @@ }, "http-proxy": { "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" } }, "http-proxy-middleware": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { - "http-proxy": "1.16.2", - "is-glob": "3.1.0", - "lodash": "4.17.5", - "micromatch": "2.3.11" + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" }, "dependencies": { "arr-diff": { @@ -5478,7 +4884,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -5491,9 +4897,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -5501,7 +4907,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -5509,7 +4915,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" }, "dependencies": { "is-extglob": { @@ -5521,15 +4927,13 @@ }, "is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "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.1" + "is-extglob": "^2.1.0" } }, "kind-of": { @@ -5537,7 +4941,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -5545,19 +4949,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" }, "dependencies": { "is-extglob": { @@ -5570,7 +4974,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -5582,9 +4986,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -5599,15 +5003,13 @@ }, "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": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "postcss": "6.0.21" + "postcss": "^6.0.1" } }, "ieee754": { @@ -5632,39 +5034,33 @@ }, "imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "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.1" + "repeating": "^2.0.0" } }, "indexes-of": { "version": "1.0.1", - "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", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { @@ -5674,30 +5070,28 @@ }, "inquirer": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.5", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, "internal-ip": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { - "meow": "3.7.0" + "meow": "^3.3.0" } }, "interpret": { @@ -5710,17 +5104,15 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } }, "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=" }, "ip": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { @@ -5730,7 +5122,6 @@ }, "is-absolute-url": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, "is-accessor-descriptor": { @@ -5738,7 +5129,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5746,22 +5137,20 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, "is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "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=", "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -5771,15 +5160,13 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" }, "is-ci": { @@ -5787,7 +5174,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -5795,7 +5182,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5803,14 +5190,13 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, "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=" }, "is-descriptor": { @@ -5818,9 +5204,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -5832,54 +5218,46 @@ }, "is-directory": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-dotfile": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "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.1" + "number-is-nan": "^1.0.0" } }, "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.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-installed-globally": { @@ -5887,8 +5265,8 @@ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-my-ip-valid": { @@ -5901,16 +5279,15 @@ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-npm": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-number": { @@ -5918,7 +5295,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5926,14 +5303,13 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-odd": { @@ -5941,7 +5317,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -5953,7 +5329,6 @@ }, "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=" }, "is-path-in-cwd": { @@ -5961,7 +5336,7 @@ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -5969,12 +5344,11 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "requires": { - "path-is-inside": "1.0.2" + "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": { @@ -5982,40 +5356,34 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-posix-bracket": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-property": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, "is-redirect": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -6025,40 +5393,33 @@ }, "is-retry-allowed": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-root": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { - "html-comment-regex": "1.1.1" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" }, "is-typedarray": { "version": "1.0.0", - "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": { @@ -6068,17 +5429,14 @@ }, "is-wsl": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { @@ -6090,13 +5448,12 @@ "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-api": { @@ -6104,18 +5461,18 @@ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", - "istanbul-reports": "1.3.0", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" }, "dependencies": { "debug": { @@ -6131,11 +5488,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" } }, "source-map": { @@ -6155,7 +5512,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -6163,13 +5520,13 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -6177,23 +5534,21 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -6203,11 +5558,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -6230,14 +5585,14 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "jest": { "version": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", "integrity": "sha512-MU1kGBtzhDHwasL1BbuFmlIlwseDXy18p/M3hB7ehifac8FCbj6nJf8ihGtBA594tlUcktotHHd8z42V47ZB1g==", "requires": { - "jest-cli": "20.0.4" + "jest-cli": "^20.0.4" }, "dependencies": { "arr-diff": { @@ -6245,7 +5600,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6258,14 +5613,13 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "expand-brackets": { @@ -6273,7 +5627,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6281,44 +5635,43 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "jest-cli": { "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { - "ansi-escapes": "1.4.0", - "callsites": "2.0.0", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "istanbul-api": "1.3.1", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "20.0.3", - "jest-config": "20.0.4", - "jest-docblock": "20.0.3", - "jest-environment-jsdom": "20.0.3", - "jest-haste-map": "20.0.5", - "jest-jasmine2": "20.0.4", - "jest-message-util": "20.0.3", - "jest-regex-util": "20.0.3", - "jest-resolve-dependencies": "20.0.3", - "jest-runtime": "20.0.4", - "jest-snapshot": "20.0.3", - "jest-util": "20.0.3", - "micromatch": "2.3.11", - "node-notifier": "5.2.1", - "pify": "2.3.0", - "slash": "1.0.0", - "string-length": "1.0.1", - "throat": "3.2.0", - "which": "1.3.0", - "worker-farm": "1.6.0", - "yargs": "7.1.0" + "ansi-escapes": "^1.4.0", + "callsites": "^2.0.0", + "chalk": "^1.1.3", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^20.0.3", + "jest-config": "^20.0.4", + "jest-docblock": "^20.0.3", + "jest-environment-jsdom": "^20.0.3", + "jest-haste-map": "^20.0.4", + "jest-jasmine2": "^20.0.4", + "jest-message-util": "^20.0.3", + "jest-regex-util": "^20.0.3", + "jest-resolve-dependencies": "^20.0.3", + "jest-runtime": "^20.0.4", + "jest-snapshot": "^20.0.3", + "jest-util": "^20.0.3", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^2.3.0", + "slash": "^1.0.0", + "string-length": "^1.0.1", + "throat": "^3.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^7.0.2" } }, "kind-of": { @@ -6326,7 +5679,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6334,78 +5687,72 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } }, "jest-changed-files": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" }, "jest-config": { "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "glob": "7.1.2", - "jest-environment-jsdom": "20.0.3", - "jest-environment-node": "20.0.3", - "jest-jasmine2": "20.0.4", - "jest-matcher-utils": "20.0.3", - "jest-regex-util": "20.0.3", - "jest-resolve": "20.0.4", - "jest-validate": "20.0.3", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "glob": "^7.1.1", + "jest-environment-jsdom": "^20.0.3", + "jest-environment-node": "^20.0.3", + "jest-jasmine2": "^20.0.4", + "jest-matcher-utils": "^20.0.3", + "jest-regex-util": "^20.0.3", + "jest-resolve": "^20.0.4", + "jest-validate": "^20.0.3", + "pretty-format": "^20.0.3" } }, "jest-diff": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "diff": "3.5.0", - "jest-matcher-utils": "20.0.3", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "diff": "^3.2.0", + "jest-matcher-utils": "^20.0.3", + "pretty-format": "^20.0.3" } }, "jest-docblock": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" }, "jest-environment-jsdom": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { - "jest-mock": "20.0.3", - "jest-util": "20.0.3", - "jsdom": "9.12.0" + "jest-mock": "^20.0.3", + "jest-util": "^20.0.3", + "jsdom": "^9.12.0" } }, "jest-environment-node": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { - "jest-mock": "20.0.3", - "jest-util": "20.0.3" + "jest-mock": "^20.0.3", + "jest-util": "^20.0.3" } }, "jest-haste-map": { @@ -6413,12 +5760,12 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "20.0.3", - "micromatch": "2.3.11", - "sane": "1.6.0", - "worker-farm": "1.6.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^20.0.3", + "micromatch": "^2.3.11", + "sane": "~1.6.0", + "worker-farm": "^1.3.1" }, "dependencies": { "arr-diff": { @@ -6426,7 +5773,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6439,9 +5786,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6449,7 +5796,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6457,7 +5804,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -6465,7 +5812,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6473,67 +5820,63 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } }, "jest-jasmine2": { "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "graceful-fs": "4.1.11", - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-matchers": "20.0.3", - "jest-message-util": "20.0.3", - "jest-snapshot": "20.0.3", - "once": "1.4.0", - "p-map": "1.2.0" + "chalk": "^1.1.3", + "graceful-fs": "^4.1.11", + "jest-diff": "^20.0.3", + "jest-matcher-utils": "^20.0.3", + "jest-matchers": "^20.0.3", + "jest-message-util": "^20.0.3", + "jest-snapshot": "^20.0.3", + "once": "^1.4.0", + "p-map": "^1.1.1" } }, "jest-matcher-utils": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "pretty-format": "^20.0.3" } }, "jest-matchers": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-message-util": "20.0.3", - "jest-regex-util": "20.0.3" + "jest-diff": "^20.0.3", + "jest-matcher-utils": "^20.0.3", + "jest-message-util": "^20.0.3", + "jest-regex-util": "^20.0.3" } }, "jest-message-util": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "micromatch": "2.3.11", - "slash": "1.0.0" + "chalk": "^1.1.3", + "micromatch": "^2.3.11", + "slash": "^1.0.0" }, "dependencies": { "arr-diff": { @@ -6541,7 +5884,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6554,9 +5897,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6564,7 +5907,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6572,7 +5915,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -6580,7 +5923,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6588,71 +5931,66 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } }, "jest-mock": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" }, "jest-regex-util": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" }, "jest-resolve": { "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { - "browser-resolve": "1.11.2", - "is-builtin-module": "1.0.0", - "resolve": "1.7.0" + "browser-resolve": "^1.11.2", + "is-builtin-module": "^1.0.0", + "resolve": "^1.3.2" } }, "jest-resolve-dependencies": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { - "jest-regex-util": "20.0.3" + "jest-regex-util": "^20.0.3" } }, "jest-runtime": { "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { - "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "babel-jest": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "babel-plugin-istanbul": "4.1.6", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "convert-source-map": "1.5.1", - "graceful-fs": "4.1.11", - "jest-config": "20.0.4", - "jest-haste-map": "20.0.5", - "jest-regex-util": "20.0.3", - "jest-resolve": "20.0.4", - "jest-util": "20.0.3", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", + "babel-core": "^6.0.0", + "babel-jest": "^20.0.3", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^1.1.3", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^20.0.4", + "jest-haste-map": "^20.0.4", + "jest-regex-util": "^20.0.3", + "jest-resolve": "^20.0.4", + "jest-util": "^20.0.3", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", "strip-bom": "3.0.0", - "yargs": "7.1.0" + "yargs": "^7.0.2" }, "dependencies": { "arr-diff": { @@ -6660,7 +5998,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6673,9 +6011,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6683,7 +6021,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6691,7 +6029,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -6699,7 +6037,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6707,64 +6045,60 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "jest-snapshot": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-util": "20.0.3", - "natural-compare": "1.4.0", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "jest-diff": "^20.0.3", + "jest-matcher-utils": "^20.0.3", + "jest-util": "^20.0.3", + "natural-compare": "^1.4.0", + "pretty-format": "^20.0.3" } }, "jest-util": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "graceful-fs": "4.1.11", - "jest-message-util": "20.0.3", - "jest-mock": "20.0.3", - "jest-validate": "20.0.3", - "leven": "2.1.0", - "mkdirp": "0.5.1" + "chalk": "^1.1.3", + "graceful-fs": "^4.1.11", + "jest-message-util": "^20.0.3", + "jest-mock": "^20.0.3", + "jest-validate": "^20.0.3", + "leven": "^2.1.0", + "mkdirp": "^0.5.1" } }, "jest-validate": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "jest-matcher-utils": "20.0.3", - "leven": "2.1.0", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "jest-matcher-utils": "^20.0.3", + "leven": "^2.1.0", + "pretty-format": "^20.0.3" } }, "js-base64": { @@ -6778,55 +6112,50 @@ }, "js-yaml": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "jsdom": { "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { - "abab": "1.0.4", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.2", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "nwmatcher": "1.4.4", - "parse5": "1.5.1", - "request": "2.85.0", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" }, "dependencies": { "acorn": { "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" }, "json-loader": { @@ -6836,53 +6165,44 @@ }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "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" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsonpointer": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, "jsprim": { @@ -6898,7 +6218,6 @@ }, "jsx-ast-utils": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" }, "kind-of": { @@ -6908,10 +6227,9 @@ }, "klaw": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "latest-version": { @@ -6919,79 +6237,70 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-cache": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "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" + "invert-kv": "^1.0.0" } }, "leven": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "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" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "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.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-fs-cache": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "requires": { - "find-cache-dir": "0.1.1", + "find-cache-dir": "^0.1.1", "mkdirp": "0.5.1" } }, "loader-runner": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" }, "loader-utils": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.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-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -7001,22 +6310,18 @@ }, "lodash._reinterpolate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, "lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, "lodash.cond": { "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" }, "lodash.defaults": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, "lodash.isequal": { @@ -7025,60 +6330,52 @@ }, "lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, "lodash.template": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.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=", "requires": { - "lodash._reinterpolate": "3.0.0" + "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", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "longest": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + "js-tokens": "^3.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.2" + "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", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lowercase-keys": { @@ -7091,13 +6388,12 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "macaddress": { "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" }, "make-dir": { @@ -7105,7 +6401,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -7117,10 +6413,9 @@ }, "makeerror": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { - "tmpl": "1.0.4" + "tmpl": "1.0.x" } }, "map-cache": { @@ -7130,7 +6425,6 @@ }, "map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-visit": { @@ -7138,12 +6432,11 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "math-expression-evaluator": { "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, "md5.js": { @@ -7151,61 +6444,54 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memory-fs": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "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.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "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": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "merge": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" }, "merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { @@ -7213,19 +6499,19 @@ "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.2", - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } }, "miller-rabin": { @@ -7233,13 +6519,12 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" }, "mime-db": { @@ -7252,7 +6537,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -7267,7 +6552,6 @@ }, "minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { @@ -7275,12 +6559,11 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { @@ -7288,8 +6571,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -7297,14 +6580,13 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -7312,7 +6594,6 @@ }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { @@ -7320,18 +6601,16 @@ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.2" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" }, "nan": { @@ -7345,28 +6624,26 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { @@ -7384,15 +6661,15 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-fetch": { "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" }, "dependencies": { "is-stream": { @@ -7409,7 +6686,6 @@ }, "node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { @@ -7417,28 +6693,28 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.1", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.6", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" } }, @@ -7447,10 +6723,10 @@ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "requires": { - "growly": "1.3.0", - "semver": "5.5.0", - "shellwords": "0.1.1", - "which": "1.3.0" + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, "normalize-package-data": { @@ -7458,34 +6734,31 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "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.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-run-path": { @@ -7493,25 +6766,22 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "nth-check": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwmatcher": { @@ -7521,12 +6791,10 @@ }, "oauth-sign": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -7534,9 +6802,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -7544,7 +6812,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "kind-of": { @@ -7552,7 +6820,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7564,7 +6832,6 @@ }, "object-keys": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, "object-visit": { @@ -7572,16 +6839,15 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.omit": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -7589,7 +6855,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "obuf": { @@ -7599,7 +6865,6 @@ }, "on-finished": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" @@ -7607,20 +6872,17 @@ }, "on-headers": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "opn": { @@ -7628,53 +6890,48 @@ "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "requires": { - "is-wsl": "1.1.0" + "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.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, "optionator": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "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", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "original": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "requires": { - "url-parse": "1.0.5" + "url-parse": "1.0.x" }, "dependencies": { "url-parse": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" + "querystringify": "0.0.x", + "requires-port": "1.0.x" } } } @@ -7686,20 +6943,17 @@ }, "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": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { @@ -7712,15 +6966,14 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "1.0.0" + "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.2.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -7738,10 +6991,10 @@ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "pako": { @@ -7751,10 +7004,9 @@ }, "param-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { @@ -7762,35 +7014,32 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.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.3.1" + "error-ex": "^1.2.0" } }, "parse5": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" }, "parseurl": { @@ -7805,7 +7054,6 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" }, "path-dirname": { @@ -7815,17 +7063,14 @@ }, "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { @@ -7835,12 +7080,10 @@ }, "path-parse": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "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=", "requires": { "isarray": "0.0.1" @@ -7848,19 +7091,17 @@ "dependencies": { "isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, "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.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { @@ -7868,108 +7109,95 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^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.1.2" + "find-up": "^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.1.0", - "pinkie-promise": "2.0.1" + "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.1" + "pinkie-promise": "^2.0.0" } } } }, "pkg-up": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", "requires": { - "find-up": "1.1.2" + "find-up": "^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.1.0", - "pinkie-promise": "2.0.1" + "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.1" + "pinkie-promise": "^2.0.0" } } } }, "pluralize": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" }, "portfinder": { "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } @@ -7984,9 +7212,9 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "requires": { - "chalk": "2.3.2", - "source-map": "0.6.1", - "supports-color": "5.3.0" + "chalk": "^2.3.2", + "source-map": "^0.6.1", + "supports-color": "^5.3.0" }, "dependencies": { "chalk": { @@ -7994,26 +7222,24 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } }, "postcss-calc": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8021,10 +7247,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8034,27 +7260,24 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-colormin": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8062,10 +7285,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8075,26 +7298,23 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-convert-values": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8102,10 +7322,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8115,25 +7335,22 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-discard-comments": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8141,10 +7358,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8154,25 +7371,22 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-discard-duplicates": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8180,10 +7394,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8193,25 +7407,22 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-discard-empty": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8219,10 +7430,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8232,25 +7443,22 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-discard-overridden": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.16" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8258,10 +7466,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8271,26 +7479,23 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-discard-unused": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8298,10 +7503,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8311,26 +7516,23 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-filter-plugins": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" + "postcss": "^5.0.4", + "uniqid": "^4.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8338,10 +7540,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8351,10 +7553,9 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -8363,61 +7564,56 @@ "version": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", "integrity": "sha512-xWTSRqI3GzrEtboXfqDNyQwyj+P2dRG9EtCMJwqPkhwN4YCp/5J3S6rraQT0S8PrWBmKRT3cpkYAzfVmaZNBkw==", "requires": { - "postcss": "6.0.21" + "postcss": "^6.0.1" } }, "postcss-load-config": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" } }, "postcss-load-options": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" } }, "postcss-load-plugins": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" } }, "postcss-loader": { "version": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", "integrity": "sha512-HIq7yy1hh9KI472Y38iSRV4WupZUNy6zObkxQM/ZuInoaE2+PyX4NcO6jjP5HG5mXL7j5kcNEl0fAG4Kva7O9w==", "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.21", - "postcss-load-config": "1.2.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.1.0", + "postcss": "^6.0.2", + "postcss-load-config": "^1.2.0", + "schema-utils": "^0.3.0" } }, "postcss-merge-idents": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8425,10 +7621,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8438,25 +7634,22 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-merge-longhand": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8464,10 +7657,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8477,38 +7670,34 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-merge-rules": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" }, "dependencies": { "browserslist": { "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000827", - "electron-to-chromium": "1.3.42" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } }, "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8516,10 +7705,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8529,32 +7718,28 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-message-helpers": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" }, "postcss-minify-font-values": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8562,10 +7747,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8575,26 +7760,23 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-minify-gradients": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8602,10 +7784,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8615,28 +7797,25 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-minify-params": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8644,10 +7823,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8657,28 +7836,25 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-minify-selectors": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8686,10 +7862,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8699,60 +7875,53 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-modules-extract-imports": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { - "postcss": "6.0.21" + "postcss": "^6.0.1" } }, "postcss-modules-local-by-default": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.21" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-scope": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.21" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-values": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.21" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" } }, "postcss-normalize-charset": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.5" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8760,10 +7929,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8773,28 +7942,25 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-normalize-url": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8802,10 +7968,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8815,26 +7981,23 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-ordered-values": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8842,10 +8005,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8855,26 +8018,23 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-reduce-idents": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8882,10 +8042,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8895,25 +8055,22 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-reduce-initial": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8921,10 +8078,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8934,27 +8091,24 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-reduce-transforms": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8962,10 +8116,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -8975,38 +8129,34 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-selector-parser": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -9014,10 +8164,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -9027,27 +8177,24 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-unique-selectors": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -9055,10 +8202,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -9068,32 +8215,28 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-value-parser": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" }, "postcss-zindex": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -9101,10 +8244,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -9114,50 +8257,43 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "prelude-ls": { "version": "1.1.2", - "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=" }, "preserve": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "pretty-bytes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" }, "pretty-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "pretty-format": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { - "ansi-regex": "2.1.1", - "ansi-styles": "3.2.1" + "ansi-regex": "^2.1.1", + "ansi-styles": "^3.0.0" } }, "private": { @@ -9167,7 +8303,6 @@ }, "process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { @@ -9177,22 +8312,21 @@ }, "progress": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" }, "promise": { "version": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + "asap": "~2.0.3" } }, "prop-types": { "version": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", "integrity": "sha512-vCFzoUFaZkVNeFkhK1KbSq4cn97GDrpfBt9K2qLkGnPAEFhEv3M61Lk5t+B7c0QfMLWo0fPkowk/4SuXerh26Q==", "requires": { - "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1" } }, "proxy-addr": { @@ -9200,7 +8334,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -9211,7 +8345,6 @@ }, "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { @@ -9219,16 +8352,15 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { @@ -9243,26 +8375,22 @@ }, "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.1", - "strict-uri-encode": "1.1.0" + "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", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" }, "raf": { @@ -9270,7 +8398,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "2.1.0" + "performance-now": "^2.1.0" } }, "randomatic": { @@ -9278,16 +8406,15 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -9297,7 +8424,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -9305,13 +8432,12 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { @@ -9338,7 +8464,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "setprototypeof": { @@ -9353,15 +8479,14 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -9371,13 +8496,13 @@ "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.0.tgz", "integrity": "sha512-Ek68lWlMZm2b9N0AevvBvd/1GRG+n/kvf2wpvSz4xkXawc2SXpF64auU2qF6eyvv98qhGFoDeyCELMATYddJkA==", "requires": { - "babel-runtime": "6.26.0", - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "prop-types": "15.6.0", - "rc-tooltip": "3.7.0", - "rc-util": "4.3.1", - "shallowequal": "1.0.2", - "warning": "3.0.0" + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.4", + "rc-tooltip": "^3.7.0", + "rc-util": "^4.0.4", + "shallowequal": "^1.0.1", + "warning": "^3.0.0" }, "dependencies": { "add-dom-event-listener": { @@ -9385,7 +8510,7 @@ "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", "requires": { - "object-assign": "4.1.1" + "object-assign": "4.x" }, "dependencies": { "object-assign": { @@ -9400,8 +8525,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "component-classes": { @@ -9427,9 +8552,9 @@ "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.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" }, "dependencies": { "object-assign": { @@ -9444,8 +8569,8 @@ "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.4.1.tgz", "integrity": "sha1-W4gTEl3g+7uwu+G0cq6EIhRpt6g=", "requires": { - "babel-runtime": "6.26.0", - "component-classes": "1.2.6" + "babel-runtime": "6.x", + "component-classes": "^1.2.5" } }, "dom-align": { @@ -9458,13 +8583,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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": { @@ -9499,9 +8624,9 @@ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "prop-types": { @@ -9509,9 +8634,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" }, "dependencies": { "object-assign": { @@ -9525,10 +8650,10 @@ "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.5.tgz", "integrity": "sha512-V1AN/gMNiJ3vOzbY/H3CTxhzYH+Ri2KlsEpo1SN8/SYmI4I/ZfQpScFAgmERuIGcLStA2sOEeBNVpH2FaOd2hA==", "requires": { - "babel-runtime": "6.26.0", - "dom-align": "1.6.7", - "prop-types": "15.6.0", - "rc-util": "4.3.1" + "babel-runtime": "^6.26.0", + "dom-align": "1.x", + "prop-types": "^15.5.8", + "rc-util": "^4.0.4" } }, "rc-animate": { @@ -9536,9 +8661,9 @@ "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.4.tgz", "integrity": "sha512-DjJLTUQj7XKKcuS8cczN0uOLfuSmgrVXFGieP1SZc87xUUTFGh8B/KjNmEtlfvxkSrSuVfb2rrEPER4SqKUtEA==", "requires": { - "babel-runtime": "6.26.0", - "css-animation": "1.4.1", - "prop-types": "15.6.0" + "babel-runtime": "6.x", + "css-animation": "^1.3.2", + "prop-types": "15.x" } }, "rc-tooltip": { @@ -9546,9 +8671,9 @@ "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.0.tgz", "integrity": "sha512-xEoUMatXp8OEL61UFH0+NrC39nkKzpOBhLrJCnnRpDRduU8L3DOhF6CNlIMkvg68hxlGGdquFtFw2t+1xNLX5A==", "requires": { - "babel-runtime": "6.26.0", - "prop-types": "15.6.0", - "rc-trigger": "2.3.3" + "babel-runtime": "6.x", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.2" } }, "rc-trigger": { @@ -9556,12 +8681,12 @@ "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.3.3.tgz", "integrity": "sha512-j8MHq0jES4vXShFbSExyty/WVR238lrZzUfsSaIDeiziBIiUAOP6SR2HBEi2gSGK239Jm3bWIJvwGA85kFMgmQ==", "requires": { - "babel-runtime": "6.26.0", - "create-react-class": "15.6.3", - "prop-types": "15.6.0", - "rc-align": "2.3.5", - "rc-animate": "2.4.4", - "rc-util": "4.3.1" + "babel-runtime": "6.x", + "create-react-class": "15.x", + "prop-types": "15.x", + "rc-align": "2.x", + "rc-animate": "2.x", + "rc-util": "^4.3.0" } }, "rc-util": { @@ -9569,10 +8694,10 @@ "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.3.1.tgz", "integrity": "sha512-OVNMKLePnwn0dCX/Gpc+/kGEDpmMo1Rfesg9xFcAckRd+D+YwVqV+dUJMHugP+4nRtbXi55o0HwPlkKIApYfQA==", "requires": { - "add-dom-event-listener": "1.0.2", - "babel-runtime": "6.26.0", - "prop-types": "15.6.0", - "shallowequal": "0.2.2" + "add-dom-event-listener": "1.x", + "babel-runtime": "6.x", + "prop-types": "^15.5.10", + "shallowequal": "^0.2.2" }, "dependencies": { "shallowequal": { @@ -9580,7 +8705,7 @@ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "requires": { - "lodash.keys": "3.1.2" + "lodash.keys": "^3.1.2" } } } @@ -9605,21 +8730,26 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } } } }, + "re-resizable": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-4.4.8.tgz", + "integrity": "sha512-5Nm4FL5wz41/5SYz8yJIM1kCcftxNPXxv3Yfa5qhkrGasHPgYzmzbbu1pcYM9vuCHog79EVwKWuz7zxDH52Gfw==" + }, "react": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { - "create-react-class": "15.6.3", - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" }, "dependencies": { "create-react-class": { @@ -9627,9 +8757,9 @@ "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.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "fbjs": { @@ -9637,13 +8767,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "object-assign": { @@ -9656,9 +8786,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "ua-parser-js": { @@ -9673,16 +8803,16 @@ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.5.tgz", "integrity": "sha512-xgDihgX4QvYHmHzL87faDBMDnGfYyqcrqV0TEbWY+JizePOG1vfb8M3xJN+6MJ3kUYqDtQSZ7v/Q6Y5YDrkMdA==", "requires": { - "babel-runtime": "6.26.0", - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "dom-helpers": "3.3.1", - "invariant": "2.2.2", - "keycode": "2.1.9", - "prop-types": "15.6.0", - "prop-types-extra": "1.0.1", - "react-overlays": "0.7.4", - "uncontrollable": "4.1.0", - "warning": "3.0.0" + "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": { @@ -9690,8 +8820,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "core-js": { @@ -9709,13 +8839,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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": { @@ -9735,7 +8865,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } }, "keycode": { @@ -9748,9 +8878,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" }, "dependencies": { "object-assign": { @@ -9765,7 +8895,7 @@ "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" + "warning": "^3.0.0" } }, "react-overlays": { @@ -9773,11 +8903,11 @@ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.4.tgz", "integrity": "sha512-7vsooMx3siLAuEfTs8FYeP/lAORWWFXTO8PON3KgX0Htq1Oa+po6ioSjGyO0/GO5CVSMNhpWt6V2opeexHgBuQ==", "requires": { - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "dom-helpers": "3.3.1", - "prop-types": "15.6.0", - "prop-types-extra": "1.0.1", - "warning": "3.0.0" + "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": { @@ -9795,7 +8925,7 @@ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", "requires": { - "invariant": "2.2.2" + "invariant": "^2.1.0" } }, "warning": { @@ -9803,26 +8933,52 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } } } }, - "react-contextmenu": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.9.2.tgz", - "integrity": "sha512-DdcO6iLBIJuDVsRpJLG/9N6ine0OVZhuQvnSPCEihfcyJFz+SHU9pQo+w9LWi2PdUxFbFV52BwAuutQkAYJxaA==", + "react-contexify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-3.0.0.tgz", + "integrity": "sha512-34C3tDh/zmzt9Tk0VlWodJrLeGtsWvYIFYxi+k/RJgHAidFBdDqqXmxVlz4kfly6x/MqXuu/Dwmioij7IMM1bw==", "requires": { - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "object-assign": "4.1.1" + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + }, + "dependencies": { + "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" + } + }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } } }, "react-d3": { "version": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", "integrity": "sha1-3s7c7ZZ/SM2JzNeftAjUfw8qy+I=", "requires": { - "d3": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "react": "15.6.2" + "d3": "^3.5.0", + "react": ">0.12.0" } }, "react-dev-utils": { @@ -9832,7 +8988,7 @@ "address": "1.0.2", "anser": "1.4.1", "babel-code-frame": "6.22.0", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "chalk": "1.1.3", "cross-spawn": "4.0.2", "detect-port-alt": "1.1.3", "escape-string-regexp": "1.0.5", @@ -9851,12 +9007,10 @@ "dependencies": { "ansi-escapes": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" }, "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "babel-code-frame": { @@ -9864,25 +9018,23 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "2.0.2", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + "chalk": "^1.1.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" } }, "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" + "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" + "escape-string-regexp": "^1.0.5" } }, "inquirer": { @@ -9890,60 +9042,54 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", "integrity": "sha512-H50sHQwgvvaTBd3HpKMVtL/u6LoHDvYym51gd7bGQe/+9HkCE+J0/3N5FJLfd6O6oz44hHewC2Pc2LodzWVafQ==", "requires": { - "ansi-escapes": "2.0.0", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.5", + "ansi-escapes": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.0.0", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, "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=" }, "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": { - "mimic-fn": "1.2.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.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "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" + "is-promise": "^2.1.0" } }, "rx-lite": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "string-width": { @@ -9951,16 +9097,15 @@ "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" + "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" + "ansi-regex": "^3.0.0" } } } @@ -9977,12 +9122,12 @@ "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.5.4.tgz", "integrity": "sha512-y9YmnusURc+3KPgvhYKvZ9oCucj51MSZWODyaeV0KFU0cquzA7dCD1g/OIYUKtNoZ+MXtacDngkdud2TklMSjw==", "requires": { - "disposables": "1.0.2", - "dnd-core": "2.5.4", - "hoist-non-react-statics": "2.3.1", - "invariant": "2.2.2", - "lodash": "4.17.5", - "prop-types": "15.6.0" + "disposables": "^1.0.1", + "dnd-core": "^2.5.4", + "hoist-non-react-statics": "^2.1.0", + "invariant": "^2.1.0", + "lodash": "^4.2.0", + "prop-types": "^15.5.10" }, "dependencies": { "disposables": { @@ -9995,10 +9140,10 @@ "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.5.4.tgz", "integrity": "sha512-BcI782MfTm3wCxeIS5c7tAutyTwEIANtuu3W6/xkoJRwiqhRXKX3BbGlycUxxyzMsKdvvoavxgrC3EMPFNYL9A==", "requires": { - "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "invariant": "2.2.2", - "lodash": "4.17.5", - "redux": "3.7.2" + "asap": "^2.0.6", + "invariant": "^2.0.0", + "lodash": "^4.2.0", + "redux": "^3.7.1" } }, "fbjs": { @@ -10006,13 +9151,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "hoist-non-react-statics": { @@ -10025,7 +9170,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } }, "lodash": { @@ -10043,9 +9188,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "redux": { @@ -10053,10 +9198,10 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "lodash": "4.17.5", - "lodash-es": "4.17.5", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "symbol-observable": "1.2.0" + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" } }, "symbol-observable": { @@ -10076,7 +9221,7 @@ "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.5.4.tgz", "integrity": "sha512-jDqAkm/hI8Tl4HcsbhkBgB6HgpJR1e+ML1SbfxaegXYiuMxEVQm0FOwEH5WxUoo6fmIG4N+H0rSm59POuZOCaA==", "requires": { - "lodash": "4.17.5" + "lodash": "^4.2.0" }, "dependencies": { "lodash": { @@ -10090,11 +9235,11 @@ "version": "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.1.1", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "raf": "3.4.0", - "react-display-name": "0.2.3" + "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" } }, "react-dom": { @@ -10102,10 +9247,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" }, "dependencies": { "fbjs": { @@ -10113,13 +9258,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "prop-types": { @@ -10127,9 +9272,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "ua-parser-js": { @@ -10139,21 +9284,114 @@ } } }, + "react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + }, + "dependencies": { + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "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" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "node-fetch": { + "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" + } + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, "react-error-overlay": { "version": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", "integrity": "sha512-rxzECPwBQ5VeyGcXtasKtXKBWbWdAVAiQCSmWUTgBYeVu9/L7aWeWG3CFFijvNVRTuUjj/FEJ19Y20BMOP+3Ag==", "requires": { "anser": "1.2.5", "babel-code-frame": "6.22.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "react-dev-utils": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", + "babel-runtime": "6.23.0", + "react-dev-utils": "^3.0.2", "settle-promise": "1.0.0", "source-map": "0.5.6" }, "dependencies": { "anser": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.2.5.tgz", "integrity": "sha1-Xc/JVuqjc7nCMBDdINq+ws4ZR1s=" }, "babel-code-frame": { @@ -10161,9 +9399,9 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "2.0.2", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + "chalk": "^1.1.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" } }, "source-map": { @@ -10178,9 +9416,9 @@ "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.4.3.tgz", "integrity": "sha512-SJtFN90hkVp18HnfS0CXodHzVByAK66JRSxAhMXNnE95q4Z3prBpZkh0G724uVi4NBRRPI4znHeTNFQStSdtJA==", "requires": { - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "fullscreen": "1.1.1", - "react-display-name": "0.2.3" + "classnames": "^2.2.5", + "fullscreen": "^1.1.1", + "react-display-name": "^0.2.0" }, "dependencies": { "react-display-name": { @@ -10195,9 +9433,9 @@ "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.16.tgz", "integrity": "sha1-m52iCw00eGtgBXxStCUW6hKVN0o=", "requires": { - "create-react-class": "15.6.3", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "create-react-class": "^15.5.1", + "object-assign": "^4.0.1", + "prop-types": "^15.5.6" }, "dependencies": { "create-react-class": { @@ -10205,9 +9443,9 @@ "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.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "fbjs": { @@ -10215,13 +9453,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "prop-types": { @@ -10229,9 +9467,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "ua-parser-js": { @@ -10242,57 +9480,12 @@ } }, "react-rnd": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-5.1.3.tgz", - "integrity": "sha512-NDzuA0HcL94bev9E5GppsXWKAqco+bNfLV75HexKZY+2ZbgvAbplN/Mf0jd2/b5ZJ2P7vjEvIVhwuUFGHveZgw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-7.4.0.tgz", + "integrity": "sha512-za9maWDiG4dV6GG2nFyMlV4eI2jBvAhcjH6o+dOoiyOclH4IH6OR/rqIopAkTdg/MqiLDMZQsnPNzpgrJZW7jw==", "requires": { - "react-draggable": "3.0.5", - "react-resizable-box": "2.1.0" - }, - "dependencies": { - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" - } - }, - "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": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" - } - }, - "react-draggable": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", - "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", - "requires": { - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "prop-types": "15.6.0" - } - }, - "react-resizable-box": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-resizable-box/-/react-resizable-box-2.1.0.tgz", - "integrity": "sha1-i7oIG1rb4q8L5HaMTx3mqEpCOq0=" - }, - "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==" - } + "re-resizable": "^4.4.5", + "react-draggable": "^3.0.5" } }, "react-router": { @@ -10300,13 +9493,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", "requires": { - "history": "4.7.2", - "hoist-non-react-statics": "2.3.1", - "invariant": "2.2.2", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "path-to-regexp": "1.7.0", - "prop-types": "15.6.0", - "warning": "3.0.0" + "history": "^4.7.2", + "hoist-non-react-statics": "^2.3.0", + "invariant": "^2.2.2", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.5.4", + "warning": "^3.0.0" }, "dependencies": { "fbjs": { @@ -10314,13 +9507,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "history": { @@ -10328,11 +9521,11 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", "requires": { - "invariant": "2.2.2", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "resolve-pathname": "2.2.0", - "value-equal": "0.4.0", - "warning": "3.0.0" + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" } }, "hoist-non-react-statics": { @@ -10345,7 +9538,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } }, "isarray": { @@ -10366,9 +9559,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "resolve-pathname": { @@ -10391,7 +9584,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } } } @@ -10401,12 +9594,12 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", "requires": { - "history": "4.7.2", - "invariant": "2.2.2", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "prop-types": "15.6.0", - "react-router": "4.2.0", - "warning": "3.0.0" + "history": "^4.7.2", + "invariant": "^2.2.2", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.4", + "react-router": "^4.2.0", + "warning": "^3.0.0" }, "dependencies": { "fbjs": { @@ -10414,13 +9607,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "history": { @@ -10428,11 +9621,11 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", "requires": { - "invariant": "2.2.2", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "resolve-pathname": "2.2.0", - "value-equal": "0.4.0", - "warning": "3.0.0" + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" } }, "invariant": { @@ -10440,7 +9633,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } }, "prop-types": { @@ -10448,9 +9641,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "resolve-pathname": { @@ -10473,7 +9666,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + "loose-envify": "^1.0.0" } } } @@ -10482,50 +9675,835 @@ "version": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.0.10.tgz", "integrity": "sha1-h2A1WUdCIg9A/7hlpMfo3A+nriM=", "requires": { - "autoprefixer": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", - "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "babel-eslint": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "babel-jest": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "babel-loader": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", - "babel-preset-react-app": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "case-sensitive-paths-webpack-plugin": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "css-loader": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", - "dotenv": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "eslint": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "eslint-config-react-app": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", - "eslint-loader": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", - "eslint-plugin-flowtype": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", - "eslint-plugin-import": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "eslint-plugin-jsx-a11y": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", - "eslint-plugin-react": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", - "extract-text-webpack-plugin": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", - "file-loader": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", - "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "html-webpack-plugin": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", - "jest": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", + "autoprefixer": "7.1.1", + "babel-core": "6.25.0", + "babel-eslint": "7.2.3", + "babel-jest": "20.0.3", + "babel-loader": "7.0.0", + "babel-preset-react-app": "^3.0.1", + "babel-runtime": "6.23.0", + "case-sensitive-paths-webpack-plugin": "2.1.1", + "chalk": "1.1.3", + "css-loader": "0.28.4", + "dotenv": "4.0.0", + "eslint": "3.19.0", + "eslint-config-react-app": "^1.0.5", + "eslint-loader": "1.7.1", + "eslint-plugin-flowtype": "2.34.0", + "eslint-plugin-import": "2.2.0", + "eslint-plugin-jsx-a11y": "5.0.3", + "eslint-plugin-react": "7.1.0", + "extract-text-webpack-plugin": "2.1.2", + "file-loader": "0.11.2", + "fs-extra": "3.0.1", + "fsevents": "1.1.2", + "html-webpack-plugin": "2.29.0", + "jest": "20.0.4", "object-assign": "4.1.1", - "postcss-flexbugs-fixes": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", - "postcss-loader": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", - "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", - "react-dev-utils": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", - "react-error-overlay": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", - "style-loader": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "sw-precache-webpack-plugin": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", - "url-loader": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "webpack": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", - "webpack-dev-server": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", - "webpack-manifest-plugin": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", - "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" + "postcss-flexbugs-fixes": "3.0.0", + "postcss-loader": "2.0.6", + "promise": "7.1.1", + "react-dev-utils": "^3.0.2", + "react-error-overlay": "^1.0.9", + "style-loader": "0.18.2", + "sw-precache-webpack-plugin": "0.11.3", + "url-loader": "0.5.9", + "webpack": "2.6.1", + "webpack-dev-server": "2.5.0", + "webpack-manifest-plugin": "1.1.0", + "whatwg-fetch": "2.0.3" }, "dependencies": { + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": 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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "optional": true, + "requires": { + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "^2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "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 + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": 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.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.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.2.9", + "bundled": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, "promise": { "version": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=", "requires": { - "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + "asap": "~2.0.3" } } } @@ -10534,12 +10512,12 @@ "version": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", "integrity": "sha512-+yRojiLuh/jHI3qLV9sGYRIYuF7dPm0r2HyCvlnVBV6sYHKslNvNg3dyWa+owqhOfHiIlTArqP1AK9ELFzlZLg==", "requires": { - "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "react-dnd": "2.5.4", - "react-dnd-html5-backend": "2.5.4", - "react-dnd-scrollzone": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", - "react-virtualized": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz" + "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" } }, "react-svg-pan-zoom": { @@ -10547,8 +10525,8 @@ "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.15.1.tgz", "integrity": "sha512-A5zlNKO9Q77oP9jnGE+GG423RB3hg28ZyDrULciexu78rU9WaR4IiqR+egzZA+qUKYYyP7oJiedYspzekAqbtg==", "requires": { - "prop-types": "15.6.0", - "transformation-matrix": "1.7.0" + "prop-types": "^15.5.10", + "transformation-matrix": "^1.7.0" }, "dependencies": { "fbjs": { @@ -10556,13 +10534,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.17" + "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" } }, "prop-types": { @@ -10570,9 +10548,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "ua-parser-js": { @@ -10586,47 +10564,43 @@ "version": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", "integrity": "sha512-TDe2haZiFr5apN3myuumGyeJ7iqHcGcQ648tfNf9x+R6tkE1+o8yAmeh4nKC4ldcs9My1dOHN3x/lmEX9LyOLA==", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "dom-helpers": "3.3.1", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "prop-types": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz" + "babel-runtime": "^6.11.6", + "classnames": "^2.2.3", + "dom-helpers": "^2.4.0 || ^3.0.0", + "loose-envify": "^1.3.0", + "prop-types": "^15.5.4" } }, "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.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "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.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^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.1.0", - "pinkie-promise": "2.0.1" + "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.1" + "pinkie-promise": "^2.0.0" } } } @@ -10636,47 +10610,43 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "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.2" + "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" } }, "readdirp": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "readline2": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, "rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "resolve": "1.7.0" + "resolve": "^1.1.6" } }, "recursive-readdir": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", "requires": { "minimatch": "3.0.3" @@ -10684,51 +10654,45 @@ "dependencies": { "minimatch": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.0.0" } } } }, "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" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "reduce-css-calc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } }, "reduce-function-call": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { - "balanced-match": "0.4.2" + "balanced-match": "^0.4.2" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } @@ -10740,17 +10704,15 @@ }, "regenerator-runtime": { "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" }, "regenerator-transform": { "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -10758,7 +10720,7 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -10766,18 +10728,17 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -10785,41 +10746,36 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "1.2.6", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "1.2.6" + "rc": "^1.0.1" } }, "regjsgen": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" }, "regjsparser": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, "relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, "remove-trailing-separator": { @@ -10829,39 +10785,34 @@ }, "renderkid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" }, "dependencies": { "utila": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } }, "repeat-element": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", - "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.2" + "is-finite": "^1.0.0" } }, "request": { @@ -10869,28 +10820,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "performance-now": { @@ -10902,31 +10853,26 @@ }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" }, "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=" }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { @@ -10934,12 +10880,11 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz", "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==", "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-from": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, "resolve-url": { @@ -10949,11 +10894,10 @@ }, "restore-cursor": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "ret": { @@ -10963,10 +10907,9 @@ }, "right-align": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -10974,16 +10917,15 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" }, "dependencies": { "hash-base": { @@ -10991,30 +10933,27 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } } } }, "run-async": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "rx-lite": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" }, "rx-lite-aggregates": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { - "rx-lite": "3.1.2" + "rx-lite": "*" } }, "safe-buffer": { @@ -11027,7 +10966,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -11037,29 +10976,26 @@ }, "sane": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { - "anymatch": "1.3.2", - "exec-sh": "0.2.1", - "fb-watchman": "1.9.2", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.10.0" + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^1.8.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.10.0" }, "dependencies": { "bser": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "fb-watchman": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", "requires": { "bser": "1.0.2" @@ -11067,7 +11003,6 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -11079,10 +11014,9 @@ }, "schema-utils": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" }, "dependencies": { "ajv": { @@ -11090,17 +11024,16 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } } } }, "select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { @@ -11118,10 +11051,9 @@ }, "semver-diff": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "send": { @@ -11130,18 +11062,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "mime": { @@ -11156,13 +11088,13 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.18", - "parseurl": "1.3.2" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" } }, "serve-static": { @@ -11170,25 +11102,22 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, "serviceworker-cache-polyfill": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "set-value": { @@ -11196,10 +11125,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -11207,7 +11136,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -11223,7 +11152,6 @@ }, "settle-promise": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/settle-promise/-/settle-promise-1.0.0.tgz", "integrity": "sha1-aXrbWLgh84fOJ1fAbvyd5fDuM9g=" }, "sha.js": { @@ -11231,8 +11159,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -11240,7 +11168,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -11250,23 +11178,21 @@ }, "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.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "shelljs": { "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "shellwords": { @@ -11276,17 +11202,14 @@ }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" }, "snapdragon": { @@ -11294,14 +11217,14 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -11309,7 +11232,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -11317,7 +11240,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "source-map": { @@ -11332,9 +11255,9 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -11342,7 +11265,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -11350,7 +11273,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -11358,7 +11281,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -11366,9 +11289,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -11378,7 +11301,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -11386,7 +11309,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11396,57 +11319,51 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "sockjs": { "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" + "faye-websocket": "^0.10.0", + "uuid": "^2.0.2" }, "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.7.0" + "websocket-driver": ">=0.5.1" } }, "uuid": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } }, "sockjs-client": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { - "debug": "2.6.9", + "debug": "^2.6.6", "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.3.0" + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" } }, "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.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" }, "source-map": { @@ -11459,11 +11376,11 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "requires": { - "atob": "2.1.0", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -11471,7 +11388,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -11491,8 +11408,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -11505,8 +11422,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -11516,15 +11433,14 @@ }, "spdy": { "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.1.0" + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" } }, "spdy-transport": { @@ -11532,13 +11448,13 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "safe-buffer": "5.1.1", - "wbuf": "1.7.3" + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" } }, "split-string": { @@ -11546,12 +11462,11 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { @@ -11559,14 +11474,14 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -11574,8 +11489,8 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -11583,7 +11498,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -11595,11 +11510,10 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -11607,34 +11521,31 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "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": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { - "strip-ansi": "3.0.1" + "strip-ansi": "^3.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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -11642,28 +11553,25 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "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.1.1" + "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.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -11673,23 +11581,21 @@ }, "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" + "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=" }, "style-loader": { "version": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, "superagent": { @@ -11697,16 +11603,16 @@ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.1", - "readable-stream": "2.3.3" + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.1.1", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.0.5" }, "dependencies": { "asynckit": { @@ -11719,7 +11625,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "component-emitter": { @@ -11760,9 +11666,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "formidable": { @@ -11800,7 +11706,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "ms": { @@ -11823,13 +11729,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -11842,7 +11748,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "util-deprecate": { @@ -11857,21 +11763,20 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svgo": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" } }, "sw-precache": { @@ -11879,62 +11784,57 @@ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", "requires": { - "dom-urls": "1.1.0", - "es6-promise": "4.2.4", - "glob": "7.1.2", - "lodash.defaults": "4.2.0", - "lodash.template": "4.4.0", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "pretty-bytes": "4.0.2", - "sw-toolbox": "3.6.0", - "update-notifier": "2.4.0" + "dom-urls": "^1.1.0", + "es6-promise": "^4.0.5", + "glob": "^7.1.1", + "lodash.defaults": "^4.2.0", + "lodash.template": "^4.4.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "pretty-bytes": "^4.0.2", + "sw-toolbox": "^3.4.0", + "update-notifier": "^2.3.0" } }, "sw-precache-webpack-plugin": { "version": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", "integrity": "sha512-VThRmVU97VXrxsnqAjd67GIwmxe5Z2R3lWsJjhq88TjN9Ck2iMAOiZIiWqlfnSxp517VgoG7gomg1Vu4v2wPag==", "requires": { - "del": "2.2.2", - "sw-precache": "5.2.1", - "uglify-js": "3.3.20" + "del": "^2.2.2", + "sw-precache": "^5.1.1", + "uglify-js": "^3.0.13" } }, "sw-toolbox": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { - "path-to-regexp": "1.7.0", - "serviceworker-cache-polyfill": "4.0.0" + "path-to-regexp": "^1.0.1", + "serviceworker-cache-polyfill": "^4.0.0" } }, "symbol-tree": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "lodash": "4.17.5", + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "string-width": "^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=" }, "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": { @@ -11942,16 +11842,15 @@ "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" + "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" + "ansi-regex": "^3.0.0" } } } @@ -11966,7 +11865,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "test-exclude": { @@ -11974,16 +11873,15 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.10", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" } }, "text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { @@ -11993,7 +11891,6 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "thunky": { @@ -12003,7 +11900,6 @@ }, "time-stamp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" }, "timed-out": { @@ -12016,7 +11912,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", "requires": { - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -12024,22 +11920,19 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tmpl": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-arraybuffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "to-object-path": { @@ -12047,7 +11940,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12055,7 +11948,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12065,10 +11958,10 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -12076,8 +11969,8 @@ "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" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toposort": { @@ -12090,12 +11983,11 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "transformation-matrix": { @@ -12105,39 +11997,33 @@ }, "trim-newlines": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "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" + "prelude-ls": "~1.1.2" } }, "type-is": { @@ -12146,12 +12032,11 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, "typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "ua-parser-js": { @@ -12164,13 +12049,12 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.20.tgz", "integrity": "sha512-WpLkWCf9sGvGZnIvBV0PNID9BATQNT/IXKAmqegfKzIPcTmTV3FP8NQpoogQkt/Y402x2sOFdaHUmqFY9IZp+g==", "requires": { - "commander": "2.15.1", - "source-map": "0.6.1" + "commander": "~2.15.0", + "source-map": "~0.6.1" } }, "uglify-to-browserify": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, @@ -12179,10 +12063,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -12190,7 +12074,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -12198,30 +12082,27 @@ "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.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, "uniq": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "uniqid": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "requires": { - "macaddress": "0.2.8" + "macaddress": "^0.2.8" } }, "uniqs": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, "unique-string": { @@ -12229,17 +12110,15 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, "unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { @@ -12247,8 +12126,8 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -12256,9 +12135,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -12293,16 +12172,16 @@ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.4.0.tgz", "integrity": "sha1-+bTHAPv9TsEsgRWHJYd31WPYyGY=", "requires": { - "boxen": "1.3.0", - "chalk": "2.3.2", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "chalk": { @@ -12310,16 +12189,15 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } }, "upper-case": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, "urijs": { @@ -12334,7 +12212,6 @@ }, "url": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", @@ -12343,7 +12220,6 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } @@ -12352,8 +12228,8 @@ "version": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", "requires": { - "loader-utils": "1.1.0", - "mime": "1.3.6" + "loader-utils": "^1.0.2", + "mime": "1.3.x" } }, "url-parse": { @@ -12361,23 +12237,21 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.3.0.tgz", "integrity": "sha512-zPvPA3T7P6M+0iNsgX+iAcAz4GshKrowtQBHHc/28tVsBc8jK7VRCNX+2GEcoE6zDB6XqXhcyiUWPVZY6C70Cg==", "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" + "querystringify": "~1.0.0", + "requires-port": "~1.0.0" }, "dependencies": { "querystringify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" } } }, "url-parse-lax": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "use": { @@ -12385,20 +12259,18 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" } }, "user-home": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "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" @@ -12406,19 +12278,16 @@ "dependencies": { "inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" } } }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" }, "utils-merge": { @@ -12436,8 +12305,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vary": { @@ -12447,7 +12316,6 @@ }, "vendors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" }, "verror": { @@ -12455,14 +12323,13 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "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" @@ -12470,15 +12337,13 @@ }, "walker": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { - "makeerror": "1.0.11" + "makeerror": "1.0.x" } }, "watch": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" }, "watchpack": { @@ -12486,9 +12351,9 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "wbuf": { @@ -12496,7 +12361,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "1.0.1" + "minimalistic-assert": "^1.0.0" } }, "webidl-conversions": { @@ -12508,48 +12373,45 @@ "version": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", "integrity": "sha512-WkoF1vBKbYYFW4oRNeofwidp14CrzIme8OzDfUK6CEHjCj4zzACAdsTTm23MUd4Ui5bn6OO/GPpc1xBlcKOkRQ==", "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "0.2.17", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "3.2.3", - "tapable": "0.2.8", - "uglify-js": "2.8.29", - "watchpack": "1.5.0", - "webpack-sources": "0.2.3", - "yargs": "6.6.0" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.0.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^0.2.3", + "yargs": "^6.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "loader-utils": { "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "source-list-map": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" }, "source-map": { @@ -12559,30 +12421,27 @@ }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "uglify-js": { "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -12590,61 +12449,55 @@ }, "webpack-sources": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", "requires": { - "source-list-map": "1.1.2", - "source-map": "0.5.7" + "source-list-map": "^1.1.1", + "source-map": "~0.5.3" } }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "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": "4.2.1" + "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": "^4.2.0" }, "dependencies": { "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.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } } } }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } @@ -12656,11 +12509,11 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" }, "dependencies": { "mime": { @@ -12675,31 +12528,30 @@ "integrity": "sha512-m5vhFvG1vKl0dY3cxgN3FiR6bTsYfjga5w6UkQQu/rQh4aFbMFnXHpfR9kJnduYu5envPsRv+lSZ/fFifbGN9w==", "requires": { "ansi-html": "0.0.7", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.2", - "connect-history-api-fallback": "1.5.0", - "del": "3.0.0", - "express": "4.16.3", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "internal-ip": "1.2.0", + "bonjour": "^3.5.0", + "chokidar": "^1.6.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "del": "^3.0.0", + "express": "^4.13.3", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "internal-ip": "^1.2.0", "opn": "4.0.2", - "portfinder": "1.0.13", - "selfsigned": "1.10.2", - "serve-index": "1.9.1", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", "sockjs": "0.3.18", "sockjs-client": "1.1.2", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "3.2.3", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^3.1.1", + "webpack-dev-middleware": "^1.10.2", + "yargs": "^6.0.0" }, "dependencies": { "camelcase": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "chokidar": { @@ -12707,125 +12559,576 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "cliui": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "del": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" + "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" + } + }, + "fsevents": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", + "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.9.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "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.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.2", + "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.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "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.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.9.1", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.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 + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": 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.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.6", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.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.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "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, + "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, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } } }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "opn": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } }, "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "sockjs-client": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", "requires": { - "debug": "2.6.9", + "debug": "^2.2.0", "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.3.0" + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.1" } }, "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "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": "4.2.1" + "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": "^4.2.0" } }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" } } } @@ -12834,28 +13137,26 @@ "version": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", "integrity": "sha512-54uDakY6RD97sL3jPhWuBw8VrSujVmvcIcnlY/0EfhRUTWTSH4XCbjMbDvDjKfvvicawtuVunbqZp/ogCvEf9A==", "requires": { - "fs-extra": "0.30.0", - "lodash": "4.17.5" + "fs-extra": "^0.30.0", + "lodash": ">=3.5 <5" }, "dependencies": { "fs-extra": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, "jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } } } @@ -12865,8 +13166,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-list-map": { @@ -12881,8 +13182,8 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "http-parser-js": "0.4.11", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -12904,23 +13205,20 @@ }, "whatwg-url": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" }, "dependencies": { "webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" } } }, "whet.extend": { "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" }, "which": { @@ -12928,12 +13226,11 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "widest-line": { @@ -12941,7 +13238,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { @@ -12959,8 +13256,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -12968,19 +13265,17 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, "window-size": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { @@ -12988,29 +13283,26 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "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.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -13018,9 +13310,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -13030,72 +13322,63 @@ }, "xml-name-validator": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" }, "xtend": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "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.2.0", - "get-caller-file": "1.0.2", - "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" + "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" }, "dependencies": { "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.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.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" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } diff --git a/package.json b/package.json index 0d4d4f6..a05a1eb 100644 --- a/package.json +++ b/package.json @@ -20,14 +20,14 @@ "rc-slider": "^8.3.0", "react": "^15.4.2", "react-bootstrap": "^0.31.1", - "react-contextmenu": "^2.3.0", + "react-contexify": "^3.0.0", "react-d3": "^0.4.0", "react-dnd": "^2.2.4", "react-dnd-html5-backend": "^2.2.4", "react-dom": "^15.4.2", "react-fullscreenable": "^2.4.3", "react-notification-system": "^0.2.13", - "react-rnd": "^5.0.9", + "react-rnd": "^7.4.0", "react-router": "^4.1.2", "react-router-dom": "^4.1.2", "react-scripts": "1.0.10", diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 1c41118..2bf0f4b 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button, Glyphicon } from 'react-bootstrap'; -import { ContextMenu, MenuItem } from 'react-contextmenu'; +import { ContextMenu, Item, Separator } from 'react-contexify'; import Fullscreenable from 'react-fullscreenable'; import Slider from 'rc-slider'; import classNames from 'classnames'; @@ -44,7 +44,7 @@ import AppDispatcher from '../app-dispatcher'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; import NotificationsFactory from '../data-managers/notifications-factory'; -import '../styles/context-menu.css'; +import 'react-contexify/dist/ReactContexify.min.css'; class Visualization extends React.Component { static getStores() { @@ -521,20 +521,22 @@ class Visualization extends React.Component { {current_widgets != null && - Object.keys(current_widgets).map( (widget_key) => ( - - 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 + Object.keys(current_widgets).map(widget_key => { + const data = { key: widget_key }; + + 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} />
    diff --git a/src/containers/widget.js b/src/containers/widget.js index 9c51bcb..6006484 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { ContextMenuTrigger } from 'react-contextmenu'; +import { ContextMenuProvider } from 'react-contexify'; import Rnd from 'react-rnd'; import classNames from 'classnames'; @@ -252,9 +252,9 @@ class Widget extends React.Component { enableResizing={resizing} disableDragging={widget.locked} > - this.contextMenuTriggerViaDraggable = c} > + {element} - + ); } else { From 66f00767d767c6b3eac633dd0da4110dcc00084e Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 12:41:25 +0200 Subject: [PATCH 426/556] Improve value widget data fetching --- src/components/widget-value.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/widget-value.js b/src/components/widget-value.js index 2a5c765..aa056da 100644 --- a/src/components/widget-value.js +++ b/src/components/widget-value.js @@ -32,8 +32,15 @@ class WidgetValue extends Component { } componentWillReceiveProps(nextProps) { + if (nextProps.simulationModel == null) { + this.setState({ value: '' }); + return; + } + + const simulator = nextProps.simulationModel.simulator; + // update value - if (nextProps.data == null || nextProps.simulationModel == null || nextProps.data[nextProps.simulationModel.simulator] == null || nextProps.data[nextProps.simulationModel.simulator].output == null || nextProps.data[nextProps.simulationModel.simulator].output.values == null) { + if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output == null || nextProps.data[simulator].output.values == null) { this.setState({ value: '' }); return; } @@ -41,7 +48,7 @@ class WidgetValue extends Component { const unit = nextProps.simulationModel.outputMapping[nextProps.widget.signal].type; // check if value has changed - const signal = nextProps.data[nextProps.simulationModel.simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y, unit }); } From 9d869daa0f2a15812e397d18dc7f741cf9474817 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 12:43:37 +0200 Subject: [PATCH 427/556] Add proper data checks output widgets --- src/components/widget-gauge.js | 2 ++ src/components/widget-lamp.js | 2 +- src/components/widget-plot.js | 2 +- src/components/widget-table.js | 1 - 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index be1ba9c..344fbbf 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -44,6 +44,8 @@ class WidgetGauge extends Component { // 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 }); diff --git a/src/components/widget-lamp.js b/src/components/widget-lamp.js index baefe98..2ed2f0e 100644 --- a/src/components/widget-lamp.js +++ b/src/components/widget-lamp.js @@ -42,7 +42,7 @@ class WidgetLamp extends Component { const simulator = nextProps.simulationModel.simulator; // update value - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output.values == null) { + if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output == null || nextProps.data[simulator].output.values == null) { this.setState({ value: '' }); return; } diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index 5ccfa5f..cb8271c 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -43,7 +43,7 @@ class WidgetPlot extends React.Component { const simulator = nextProps.simulationModel.simulator; // Proceed if a simulation with models and a simulator are available - if (simulator && nextProps.data[simulator] != null && nextProps.data[simulator] != null) { + 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 data = nextProps.data[simulator].output.values.filter((values, index) => ( diff --git a/src/components/widget-table.js b/src/components/widget-table.js index 52d98d3..b266a23 100644 --- a/src/components/widget-table.js +++ b/src/components/widget-table.js @@ -46,7 +46,6 @@ class WidgetTable extends Component { if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output == null - || nextProps.data[simulator].output.length === 0 || nextProps.data[simulator].output.values.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { // clear values From 14309aba065cc0e02f8a2c0efaf2cec5136fbbf6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 12:45:14 +0200 Subject: [PATCH 428/556] Fix plot table widget data checks --- src/components/widget-plot-table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 02d11be..9e9f353 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -103,7 +103,7 @@ class WidgetPlotTable extends Component { const simulator = this.props.simulationModel.simulator; let simulatorData = []; - if (this.props.data[simulator] != null) { + 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 )); From b8f988e3d554163343178a0a52e980b3afa39015 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 13:03:26 +0200 Subject: [PATCH 429/556] Add proper margin to plot y-axis --- src/components/widget-plot/plot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 702940d..a8e03f2 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -149,7 +149,7 @@ class Plot extends React.Component { // create scale functions for both axes const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([0, this.props.width - leftMargin - this.state.labelMargin - rightMargin]); - const yScale = scaleLinear().domain(yRange).range([this.props.height - bottomMargin, 0]); + const yScale = scaleLinear().domain(yRange).range([this.props.height - bottomMargin, 5]); const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); const yAxis = axisLeft().scale(yScale).ticks(5); From eaa84207a272644428aa9b6c41835e6279bebdf6 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 13:05:49 +0200 Subject: [PATCH 430/556] Add spacing between table-plot buttons and plot axis --- src/styles/widgets.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index e1f16ca..e364a81 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -155,6 +155,7 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input display: flex; flex-direction: column; justify-content: center; + margin-right: 10px; } .plot-table-widget small { From 4dc2175196ff2d9b98aaaf8f7933482a76ce8ab5 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 4 May 2018 13:09:55 +0200 Subject: [PATCH 431/556] Fix plot pausing --- src/components/widget-plot/plot.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 702940d..c48c81b 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -126,11 +126,15 @@ class Plot extends React.Component { } tick = () => { - if (this.state.data == null || this.props.paused === true) { + if (this.state.data == null) { this.setState({ lines: null }); return; } + if (this.props.paused === true) { + return; + } + // calculate yRange let yRange = [0, 0]; From cfed860ea57af95b84b10b628b4f823b48c92209 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 7 May 2018 01:25:03 +0200 Subject: [PATCH 432/556] do not access simulator.rawProperties without checking for it --- src/containers/simulation.js | 38 ++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 6028a56..d772a61 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -154,7 +154,7 @@ class Simulation extends React.Component { if (data) { data.simulation = this.state.simulation._id; - + AppDispatcher.dispatch({ type: 'simulationModels/start-add', data, @@ -174,11 +174,7 @@ class Simulation extends React.Component { getSimulatorName(simulatorId) { for (let simulator of this.state.simulators) { if (simulator._id === simulatorId) { - if ('name' in simulator.rawProperties) { - return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'); - } else { - return simulator.uuid; - } + return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; } } } @@ -232,7 +228,7 @@ class Simulation extends React.Component { if (simulator == null) { continue; } - + AppDispatcher.dispatch({ type: 'simulators/start-action', simulator, @@ -253,27 +249,27 @@ class Simulation extends React.Component { this.getSimulatorName(simulator)} /> - this.setState({ editModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onEdit={(index) => this.setState({ editModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} onExport={index => this.exportModel(index)} />
    -
    From f39d23c42c46caaa4afec646fd389614722a3060 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 7 May 2018 01:36:07 +0200 Subject: [PATCH 433/556] refactor simulator-data-store to use new simulator model --- src/stores/simulator-data-store.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 1c303cc..8544e75 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -43,7 +43,7 @@ class SimulationDataStore extends ReduceStore { return state; case 'simulatorData/prepare': - state[action.id] = { + state[action.id] = { output: { sequence: -1, length: action.outputLength, @@ -106,17 +106,17 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/inputChanged': // find simulator in node array - if (state[action.simulator.node] == null || state[action.simulator.node][action.simulator.simulator] == null) { + if (state[action.simulator] == null) { return state; } // update message properties - state[action.simulator.node][action.simulator.simulator].input.timestamp = Date.now(); - state[action.simulator.node][action.simulator.simulator].input.sequence++; - state[action.simulator.node][action.simulator.simulator].input.values[action.signal] = action.data; + state[action.simulator].input.timestamp = Date.now(); + state[action.simulator].input.sequence++; + state[action.simulator].input.values[action.signal] = action.data; + + SimulatorDataDataManager.send(state[action.simulator].input, action.simulator); - SimulatorDataDataManager.send(state[action.simulator.node][action.simulator.simulator].input, action.simulator.node); - return state; case 'simulatorData/closed': From f1031df8e97cb4cc7bb96c76a044afd1d42405e6 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 15 May 2018 21:20:03 +0200 Subject: [PATCH 434/556] widget-slider: add missing name field to dialog --- src/components/dialog/edit-widget-control-creator.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 1f033c0..a829de2 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -117,9 +117,10 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Slider': dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> + 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)} /> ); break; case 'Button': From 769eb9458fcb46e86a4a6288e9d5ccc1450a71e1 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 15 May 2018 21:20:22 +0200 Subject: [PATCH 435/556] whitespace cleanup --- src/components/widget-slider.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index d242de9..baf79b0 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -14,7 +14,7 @@ import 'rc-slider/assets/index.css'; class WidgetSlider extends Component { - static get OrientationTypes() { + static get OrientationTypes() { return ({ HORIZONTAL: {value: 0, name: 'Horizontal'}, VERTICAL: {value: 1, name: 'Vertical'} @@ -38,7 +38,7 @@ class WidgetSlider extends Component { if (this.props.widget.orientation !== nextProps.widget.orientation) { let baseWidget = nextProps.widget; // Exchange dimensions and constraints - let newWidget = Object.assign({}, baseWidget, { + let newWidget = Object.assign({}, baseWidget, { width: baseWidget.height, height: baseWidget.width, minWidth: baseWidget.minHeight, @@ -61,7 +61,6 @@ class WidgetSlider extends Component { } render() { - let isVertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; let fields = { @@ -95,4 +94,4 @@ class WidgetSlider extends Component { } } -export default WidgetSlider; \ No newline at end of file +export default WidgetSlider; From b3e54243dace3ced462460db44137adc33e02850 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 15 May 2018 21:20:55 +0200 Subject: [PATCH 436/556] add missing dependency: babel-runtime --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index a05a1eb..f09ae20 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "babel-runtime": "^6.26.0", "bootstrap": "^3.3.7", "classnames": "^2.2.5", "d3-array": "^1.2.0", From aee2c7d569d3f9270a46a2aba160f073e260c1be Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 24 May 2018 08:42:17 +0200 Subject: [PATCH 437/556] remove obsolete node store and data manager --- src/data-managers/nodes-data-manager.js | 101 ------------------------ src/stores/node-store.js | 61 -------------- 2 files changed, 162 deletions(-) delete mode 100644 src/data-managers/nodes-data-manager.js delete mode 100644 src/stores/node-store.js diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js deleted file mode 100644 index 2374a1f..0000000 --- a/src/data-managers/nodes-data-manager.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * File: nodes-data-manager.js - * Author: Markus Grigull - * Date: 26.06.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 './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; - -class NodesDataManager extends RestDataManager { - constructor() { - super('node', '/nodes'); - } - - getURL(node) { - // create an anchor element (note: no need to append this element to the document) - var link = document.createElement('a'); - link.href = node.endpoint; - link.pathname = link.pathname + 'api/v1'; - - return link.href; - } - - getSimulators(node) { - RestAPI.post(this.getURL(node), { - action: 'nodes', - id: node._id - }).then(response => { - // assign IDs to simulators - response.response.forEach(element => { - if (element.type === "websocket") { - // add the (villas-node) node ID to the simulator - node.simulators = node.simulators.map(simulator => { - if (simulator.name === element.name) { - simulator.id = element.id; - } - - return simulator; - }); - } - }); - - AppDispatcher.dispatch({ - type: 'nodes/simulatorsFetched', - data: node - }); - - AppDispatcher.dispatch({ - type: 'simulatorData/open', - node: node, - endpoint: node.endpoint, - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'nodes/simulatorsFetch-error', - error: error - }); - }); - } - - update(object, token = null) { - var obj = {}; - obj[this.type] = this.filterKeys(object); - - // filter simulator IDs - obj[this.type].simulators = obj[this.type].simulators.map(simulator => { - delete simulator.id; - return simulator; - }); - - RestAPI.put(this.makeURL(this.url + '/' + object._id), obj, token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/edited', - data: Object.assign({}, object, response[this.type]) - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/edit-error', - error: error - }); - }); - } -} - -export default new NodesDataManager(); diff --git a/src/stores/node-store.js b/src/stores/node-store.js deleted file mode 100644 index f871791..0000000 --- a/src/stores/node-store.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * File: node-store.js - * Author: Markus Grigull - * Date: 26.06.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 './array-store'; -import NodesDataManager from '../data-managers/nodes-data-manager'; - -class NodeStore extends ArrayStore { - constructor() { - super('nodes', NodesDataManager); - } - - reduce(state, action) { - switch(action.type) { - case 'nodes/loaded': - // get simulator IDs - if (Array.isArray(action.data)) { - action.data.forEach(node => { - NodesDataManager.getSimulators(node); - }); - } else { - NodesDataManager.getSimulators(action.data); - } - - return super.reduce(state, action); - - case 'nodes/edited': - NodesDataManager.getSimulators(action.data); - - return super.reduce(state, action); - - case 'nodes/simulatorsFetched': - return this.updateElements(state, [action.data]); - - case 'nodes/simulatorsFetch-error': - return state; - - default: - return super.reduce(state, action); - } - } -} - -export default new NodeStore(); From 67c4bbc791d9856b9f2cf1da490ad1c6efab9b94 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 24 May 2018 08:43:07 +0200 Subject: [PATCH 438/556] remove node id from websocket payload --- src/data-managers/simulator-data-data-manager.js | 1 - src/stores/simulator-data-store.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index c697f36..69becc4 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -156,7 +156,6 @@ class SimulatorDataDataManager { const nsec = (message.timestamp - sec * 1e3) * 1e6; view.setUint8(0x00, bits, true); - view.setUint8(0x01, message.id, true); view.setUint16(0x02, message.length, true); view.setUint32(0x04, message.sequence, true); view.setUint32(0x08, sec, true); diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 8544e75..d5cdd8c 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -54,7 +54,6 @@ class SimulationDataStore extends ReduceStore { length: action.inputLength, version: 2, type: 0, - id: 0, timestamp: Date.now(), values: new Array(action.inputLength).fill(0) } From 1c76184ccd81a1588cc07c6a39e8ba5068c64c54 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 24 May 2018 08:44:11 +0200 Subject: [PATCH 439/556] use new simulation model data manager for initialising simulator data store (closes #169) --- .../simulation-models-data-manager.js | 28 +++++++++++++++- src/data-managers/simulations-data-manager.js | 32 +------------------ 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/data-managers/simulation-models-data-manager.js b/src/data-managers/simulation-models-data-manager.js index 79e6c4e..5496268 100644 --- a/src/data-managers/simulation-models-data-manager.js +++ b/src/data-managers/simulation-models-data-manager.js @@ -20,5 +20,31 @@ ******************************************************************************/ import RestDataManager from './rest-data-manager'; +import AppDispatcher from '../app-dispatcher'; -export default new RestDataManager('simulationModel', '/models'); +class SimulationModelDataManager extends RestDataManager { + constructor() { + super('simulationModel', '/models'); + + this.onLoad = this.onModelsLoad; + } + + onModelsLoad(data) { + if (!Array.isArray(data)) + data = [ data ]; + + for (let model of data) + this.loadModelData(model); + } + + loadModelData(model) { + AppDispatcher.dispatch({ + type: 'simulatorData/prepare', + inputLength: parseInt(model.inputLength, 10), + outputLength: parseInt(model.outputLength, 10), + id: model.simulator + }); + } +} + +export default new SimulationModelDataManager(); diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index 4ded924..d5fdfde 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -20,35 +20,5 @@ ******************************************************************************/ import RestDataManager from './rest-data-manager'; -import AppDispatcher from '../app-dispatcher'; -class SimulationsDataManager extends RestDataManager { - constructor() { - super('simulation', '/simulations', [ '_id', 'name', 'projects', 'models' ]); - - this.onLoad = this.onSimulationsLoad; - } - - onSimulationsLoad(data) { - if (Array.isArray(data)) { - for (let simulation of data) { - this.loadSimulationData(simulation); - } - } else { - this.loadSimulationData(data); - } - } - - loadSimulationData(simulation) { - for (let model of simulation.models) { - AppDispatcher.dispatch({ - type: 'simulatorData/prepare', - inputLength: parseInt(model.inputLength, 10), - outputLength: parseInt(model.outputLength, 10), - id: model.simulator - }); - } - } -} - -export default new SimulationsDataManager(); +export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models' ]); From 6b06798c76edd9554a5a7f3c181bfba5ee8b6376 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 24 May 2018 08:44:40 +0200 Subject: [PATCH 440/556] do not log all outgoing websocket data --- src/data-managers/simulator-data-data-manager.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 69becc4..728a6a0 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -63,8 +63,6 @@ class SimulatorDataDataManager { const data = this.messageToBuffer(message); socket.send(data); - console.log(data); - return true; } From d56fc4c5d55162d7d65506a9d4df9e65463c5cf8 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 24 May 2018 08:44:51 +0200 Subject: [PATCH 441/556] whitespace cleanup --- src/api/websocket-api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index 79da2f7..43d2e65 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -35,7 +35,7 @@ class WebsocketAPI { } getURL(endpoint) { - // create an anchor element (note: no need to append this element to the document) + // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); link.href = endpoint; From 5f0aed670be7fbead5ecc762c51941d0dac2a578 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 10 May 2018 11:09:59 +0200 Subject: [PATCH 442/556] Start with simulation model view, add selectSimulator component --- src/containers/app.js | 2 + src/containers/selectSimulator.js | 86 +++++++++++++++++++++++++++++++ src/containers/simulation.js | 2 +- src/containers/simulationModel.js | 79 ++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/containers/selectSimulator.js create mode 100644 src/containers/simulationModel.js diff --git a/src/containers/app.js b/src/containers/app.js index bb70935..420442f 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -45,6 +45,7 @@ import Simulators from './simulators'; import Visualization from './visualization'; import Simulations from './simulations'; import Simulation from './simulation'; +import SimulationModel from './simulationModel'; import Users from './users'; import '../styles/app.css'; @@ -134,6 +135,7 @@ class App extends React.Component { +
    diff --git a/src/containers/selectSimulator.js b/src/containers/selectSimulator.js new file mode 100644 index 0000000..2a74fcb --- /dev/null +++ b/src/containers/selectSimulator.js @@ -0,0 +1,86 @@ +/** + * File: selectSimulator.js + * Author: Markus Grigull + * Date: 10.08.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, ControlLabel } from 'react-bootstrap'; +import _ from 'lodash'; + +import SimulatorStore from '../stores/simulator-store'; +import UserStore from '../stores/user-store'; + +class SelectSimulator extends React.Component { + static getStores() { + return [ SimulatorStore, UserStore ]; + } + + static calculateState() { + return { + simulators: SimulatorStore.getState(), + sessionToken: UserStore.getState().token, + selectedSimulator: '' + }; + } + + componentWillReceiveProps(nextProps) { + if (nextProps.value === this.state.selectedSimulator) { + return; + } + + let selectedSimulator = nextProps.value; + if (selectedSimulator == null) { + if (this.state.simulators.length > 0) { + selectedSimulator = this.state.simulators[0]._id; + } else { + selectedSimulator = ''; + } + } + + this.setState({ selectedSimulator }); + } + + handleChange = event => { + // update selection + this.setState({ selectedSimulator: event.target.value }); + + // send complete simulator to callback + const simulator = this.state.simulators.find(s => s._id === event.target.value); + + if (this.props.onChange != null) { + this.props.onChange(simulator); + } + } + + render() { + const simulatorOptions = this.state.simulators.map(s => + + ); + + return + Simulator + + {simulatorOptions} + + ; + } +} + +export default Container.create(SelectSimulator); diff --git a/src/containers/simulation.js b/src/containers/simulation.js index d772a61..74e5702 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -245,7 +245,7 @@ class Simulation extends React.Component { this.onSimulationModelChecked(index, event)} width='30' /> - + this.getSimulatorName(simulator)} /> diff --git a/src/containers/simulationModel.js b/src/containers/simulationModel.js new file mode 100644 index 0000000..77a0193 --- /dev/null +++ b/src/containers/simulationModel.js @@ -0,0 +1,79 @@ +/** + * File: simulationModel.js + * Author: Markus Grigull + * Date: 10.08.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 } from 'react-bootstrap'; + +import SimulationModelStore from '../stores/simulation-model-store'; +import UserStore from '../stores/user-store'; +import AppDispatcher from '../app-dispatcher'; + +import SelectSimulator from './selectSimulator'; + +class SimulationModel extends React.Component { + static getStores() { + return [ SimulationModelStore, UserStore ]; + } + + static calculateState(prevState, props) { + const simulationModel = SimulationModelStore.getState().find(m => m._id === props.match.params.simulationModel); + + return { + simulationModel: simulationModel || {}, + sessionToken: UserStore.getState().token + }; + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + data: this.props.match.params.simulationModel, + token: this.state.sessionToken + }); + } + + submitForm = event => { + event.preventDefault(); + } + + saveChanges = () => { + + } + + handleSimulatorChange = simulator => { + console.log(simulator); + } + + render() { + return
    +

    {this.state.simulationModel.name}

    + +
    + + + + +
    ; + } +} + +export default Container.create(SimulationModel, { withProps: true }); From 78c7fbfa0bcf89068b676158951c073bb5c6172d Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 10 May 2018 12:34:05 +0200 Subject: [PATCH 443/556] Add select file component --- src/containers/selectFile.js | 133 ++++++++++++++++++++++++ src/containers/selectSimulator.js | 9 +- src/containers/simulationModel.js | 13 +++ src/data-managers/files-data-manager.js | 4 +- 4 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 src/containers/selectFile.js diff --git a/src/containers/selectFile.js b/src/containers/selectFile.js new file mode 100644 index 0000000..1461989 --- /dev/null +++ b/src/containers/selectFile.js @@ -0,0 +1,133 @@ +/** + * File: selectFile.js + * Author: Markus Grigull + * Date: 10.08.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, ControlLabel, Button, ProgressBar } from 'react-bootstrap'; + +import FileStore from '../stores/file-store'; +import UserStore from '../stores/user-store'; + +import AppDispatcher from '../app-dispatcher'; + +class SelectFile extends React.Component { + static getStores() { + return [ FileStore, UserStore ]; + } + + static calculateState() { + return { + files: FileStore.getState(), + sessionToken: UserStore.getState().token, + selectedFile: '', + uploadFile: null, + uploadProgress: 0 + }; + } + + componentDidMount() { + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); + } + + componentWillReceiveProps(nextProps) { + if (nextProps.value === this.state.selectedSimulator) { + return; + } + + let selectedSimulator = nextProps.value; + if (selectedSimulator == null) { + if (this.state.simulators.length > 0) { + selectedSimulator = this.state.simulators[0]._id; + } else { + selectedSimulator = ''; + } + } + + this.setState({ selectedSimulator }); + } + + handleChange = event => { + this.setState({ selectedFile: event.target.value }); + + // send file to callback + if (this.props.onChange != null) { + const file = this.state.files.find(f => f._id === event.target.value); + + this.props.onChange(file); + } + } + + selectUploadFile = event => { + this.setState({ uploadFile: event.target.files[0] }); + } + + startFileUpload = () => { + // upload file + const formData = new FormData(); + formData.append(0, this.state.uploadFile); + + AppDispatcher.dispatch({ + type: 'files/start-upload', + data: formData, + token: this.state.sessionToken, + progressCallback: this.updateUploadProgress, + finishedCallback: this.clearProgress + }); + } + + updateUploadProgress = event => { + 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 }); + } + + render() { + const fileOptions = this.state.files.map(f => + + ); + + return
    + + {this.props.name} + + {fileOptions} + + + + + Upload {this.props.name} + + + + + +
    ; + } +} + +export default Container.create(SelectFile); diff --git a/src/containers/selectSimulator.js b/src/containers/selectSimulator.js index 2a74fcb..3df40ad 100644 --- a/src/containers/selectSimulator.js +++ b/src/containers/selectSimulator.js @@ -25,17 +25,15 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import _ from 'lodash'; import SimulatorStore from '../stores/simulator-store'; -import UserStore from '../stores/user-store'; class SelectSimulator extends React.Component { static getStores() { - return [ SimulatorStore, UserStore ]; + return [ SimulatorStore ]; } static calculateState() { return { simulators: SimulatorStore.getState(), - sessionToken: UserStore.getState().token, selectedSimulator: '' }; } @@ -58,13 +56,12 @@ class SelectSimulator extends React.Component { } handleChange = event => { - // update selection this.setState({ selectedSimulator: event.target.value }); // send complete simulator to callback - const simulator = this.state.simulators.find(s => s._id === event.target.value); - if (this.props.onChange != null) { + const simulator = this.state.simulators.find(s => s._id === event.target.value); + this.props.onChange(simulator); } } diff --git a/src/containers/simulationModel.js b/src/containers/simulationModel.js index 77a0193..db68ae3 100644 --- a/src/containers/simulationModel.js +++ b/src/containers/simulationModel.js @@ -28,6 +28,7 @@ import UserStore from '../stores/user-store'; import AppDispatcher from '../app-dispatcher'; import SelectSimulator from './selectSimulator'; +import SelectFile from './selectFile'; class SimulationModel extends React.Component { static getStores() { @@ -63,6 +64,14 @@ class SimulationModel extends React.Component { console.log(simulator); } + handleModelChange = file => { + console.log(file); + } + + handleConfigurationChange = file => { + console.log(file); + } + render() { return

    {this.state.simulationModel.name}

    @@ -70,6 +79,10 @@ class SimulationModel extends React.Component {
    + + + +
    ; diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js index c63f895..60cbdad 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/data-managers/files-data-manager.js @@ -30,8 +30,10 @@ class FilesDataManager extends RestDataManager { upload(file, token = null, progressCallback = null, finishedCallback = null) { RestAPI.upload(this.makeURL('/upload'), file, token, progressCallback).then(response => { + console.log(response); + AppDispatcher.dispatch({ - type: 'files/uploaded' + type: 'files/uploaded', }); // Trigger a files reload From b52655a1c71a821d2fc1e4511cf48f96a7d06f0c Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 16 May 2018 15:27:34 +0200 Subject: [PATCH 444/556] Add signal mapping component Rename files to match naming conventions --- package-lock.json | 31 ++++- package.json | 4 +- src/components/signal-mapping.js | 125 ++++++++++++++++++ src/containers/app.js | 2 +- .../{selectFile.js => select-file.js} | 0 ...selectSimulator.js => select-simulator.js} | 0 ...simulationModel.js => simulation-model.js} | 22 ++- 7 files changed, 173 insertions(+), 11 deletions(-) create mode 100644 src/components/signal-mapping.js rename src/containers/{selectFile.js => select-file.js} (100%) rename src/containers/{selectSimulator.js => select-simulator.js} (100%) rename src/containers/{simulationModel.js => simulation-model.js} (71%) diff --git a/package-lock.json b/package-lock.json index 5ce72e9..b8e396b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8322,11 +8322,29 @@ } }, "prop-types": { - "version": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "integrity": "sha512-vCFzoUFaZkVNeFkhK1KbSq4cn97GDrpfBt9K2qLkGnPAEFhEv3M61Lk5t+B7c0QfMLWo0fPkowk/4SuXerh26Q==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "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" + } + } } }, "proxy-addr": { @@ -12309,6 +12327,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.2.0.tgz", + "integrity": "sha512-gz/uknWtNfZTj1BLUzYHDxOoiQ7A4wZ6xPuuE6RpxswR4cNyT4I5kN9jmU0AQr7IBEap9vfYChI2TpssTN6Itg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index f09ae20..f54e1a9 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "gaugeJS": "^1.3.2", "immutable": "^3.8.1", "lodash": "^4.17.5", + "prop-types": "^15.6.1", "rc-slider": "^8.3.0", "react": "^15.4.2", "react-bootstrap": "^0.31.1", @@ -34,7 +35,8 @@ "react-scripts": "1.0.10", "react-sortable-tree": "^0.1.19", "react-svg-pan-zoom": "^2.14.1", - "superagent": "^3.5.0" + "superagent": "^3.5.0", + "validator": "^10.2.0" }, "devDependencies": { "chai": "^4.1.0" diff --git a/src/components/signal-mapping.js b/src/components/signal-mapping.js new file mode 100644 index 0000000..3c975b8 --- /dev/null +++ b/src/components/signal-mapping.js @@ -0,0 +1,125 @@ +/** + * File: signalMapping.js + * Author: Markus Grigull + * Date: 10.08.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 { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import validator from 'validator'; + +import Table from './table'; +import TableColumn from './table-column'; + +class SignalMapping extends React.Component { + constructor(props) { + super(props); + + this.state = { + length: props.length, + signals: props.signals + }; + } + + componentWillReceiveProps(nextProps) { + if (nextProps.length === this.state.length && nextProps.signals === this.state.signals) { + return; + } + + this.setState({ length: nextProps.length, signals: nextProps.signals }); + } + + validateLength(){ + const valid = validator.isInt(this.state.length + '', { min: 1, max: 100 }); + + return valid ? 'success' : 'error'; + } + + handleLengthChange = event => { + const length = event.target.value; + + // update signals to represent length + const signals = this.state.signals; + + if (this.state.length < length) { + while (signals.length < length) { + signals.push({ name: 'Signal', type: 'Type' }); + } + } else { + signals.splice(length, signals.length - length); + } + + // save updated state + this.setState({ length, signals }); + + if (this.props.onChange != null) { + this.props.onChange(length, signals); + } + } + + handleMappingChange = (event, row, column) => { + const signals = this.state.signals; + + if (column === 1) { + signals[row].name = event.target.value; + } else if (column === 2) { + signals[row].type = event.target.value; + } + + this.setState({ signals }); + + if (this.props.onChange != null) { + this.props.onChange(this.state.length, signals); + } + } + + render() { + return
    + + {this.props.name} Length + + + + + + {this.props.name} Mapping + Click name or type cell to edit +
    + + + +
    + +
    ; + } +} + +SignalMapping.propTypes = { + name: PropTypes.string, + length: PropTypes.number, + signals: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string.isRequired, + type: PropTypes.string.isRequired + }) + ), + onChange: PropTypes.func +}; + +export default SignalMapping; diff --git a/src/containers/app.js b/src/containers/app.js index 420442f..4199935 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -45,7 +45,7 @@ import Simulators from './simulators'; import Visualization from './visualization'; import Simulations from './simulations'; import Simulation from './simulation'; -import SimulationModel from './simulationModel'; +import SimulationModel from './simulation-model'; import Users from './users'; import '../styles/app.css'; diff --git a/src/containers/selectFile.js b/src/containers/select-file.js similarity index 100% rename from src/containers/selectFile.js rename to src/containers/select-file.js diff --git a/src/containers/selectSimulator.js b/src/containers/select-simulator.js similarity index 100% rename from src/containers/selectSimulator.js rename to src/containers/select-simulator.js diff --git a/src/containers/simulationModel.js b/src/containers/simulation-model.js similarity index 71% rename from src/containers/simulationModel.js rename to src/containers/simulation-model.js index db68ae3..f2558db 100644 --- a/src/containers/simulationModel.js +++ b/src/containers/simulation-model.js @@ -27,8 +27,9 @@ import SimulationModelStore from '../stores/simulation-model-store'; import UserStore from '../stores/user-store'; import AppDispatcher from '../app-dispatcher'; -import SelectSimulator from './selectSimulator'; -import SelectFile from './selectFile'; +import SelectSimulator from './select-simulator'; +import SelectFile from './select-file'; +import SignalMapping from '../components/signal-mapping'; class SimulationModel extends React.Component { static getStores() { @@ -72,16 +73,27 @@ class SimulationModel extends React.Component { console.log(file); } + handleOutputMappingChange = (length, signals) => { + console.log(length); + console.log(signals); + } + render() { return

    {this.state.simulationModel.name}

    - +
    + - + - + +
    + +
    + +
    From b5d6749ebd69e358f88883ddba0396dca60d8613 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 25 May 2018 10:03:15 +0200 Subject: [PATCH 445/556] Update simulation model view --- src/containers/select-file.js | 42 ++++++++++++++++++++++-------- src/containers/select-simulator.js | 15 +++++++---- src/containers/simulation-model.js | 29 ++++++++++++++++----- src/styles/app.css | 5 ++++ 4 files changed, 68 insertions(+), 23 deletions(-) diff --git a/src/containers/select-file.js b/src/containers/select-file.js index 1461989..47613d9 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 } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Button, ProgressBar, Col } from 'react-bootstrap'; import FileStore from '../stores/file-store'; import UserStore from '../stores/user-store'; @@ -39,7 +39,7 @@ class SelectFile extends React.Component { sessionToken: UserStore.getState().token, selectedFile: '', uploadFile: null, - uploadProgress: 0 + uploadProgress: 100 }; } @@ -111,21 +111,41 @@ class SelectFile extends React.Component { ); - return
    + const divStyle = { + + }; + + return
    - {this.props.name} - - {fileOptions} - + + {this.props.name} + + + + + {fileOptions} + + - Upload {this.props.name} - + + + - - + + + + + + + + + +
    ; } } diff --git a/src/containers/select-simulator.js b/src/containers/select-simulator.js index 3df40ad..ad42000 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 } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; import _ from 'lodash'; import SimulatorStore from '../stores/simulator-store'; @@ -72,10 +72,15 @@ class SelectSimulator extends React.Component { ); return - Simulator - - {simulatorOptions} - + + Simulator + + + + + {simulatorOptions} + + ; } } diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index f2558db..a1929d2 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 } from 'react-bootstrap'; +import { Button, Col, Form } from 'react-bootstrap'; import SimulationModelStore from '../stores/simulation-model-store'; import UserStore from '../stores/user-store'; @@ -78,25 +78,40 @@ class SimulationModel extends React.Component { console.log(signals); } + handleInputMappingChange = (length, signals) => { + console.log(length); + console.log(signals); + } + render() { + const sectionStyle = { + + }; + return

    {this.state.simulationModel.name}

    -
    -
    + + -
    + -
    + -
    + + + + + + +
    - +
    ; } } diff --git a/src/styles/app.css b/src/styles/app.css index 16f8a65..52cb3bd 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -386,3 +386,8 @@ body { .section-buttons-group-right .rc-slider { margin-left: 12px; } + +.form-horizontal .form-group { + margin-left: 0 !important; + margin-right: 0 !important; +} From 7acad6a6d10fb6f365b11b04b5f758cbe7eaf973 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Fri, 25 May 2018 10:20:34 +0200 Subject: [PATCH 446/556] Place progress bar at correct position --- src/containers/select-file.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/containers/select-file.js b/src/containers/select-file.js index 47613d9..1940736 100644 --- a/src/containers/select-file.js +++ b/src/containers/select-file.js @@ -111,11 +111,12 @@ class SelectFile extends React.Component { ); - const divStyle = { - + const progressBarStyle = { + marginLeft: '100px', + marginTop: '-25px' }; - return
    + return
    {this.props.name} @@ -140,12 +141,9 @@ class SelectFile extends React.Component { Upload file - + - - -
    ; } } From b94f73377b9285b5947594baeccdead4f6ab44b1 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 11:12:56 +0200 Subject: [PATCH 447/556] Add editable header component --- src/components/editable-header.js | 81 ++++++++++++++++++++++++++++++ src/containers/select-file.js | 4 +- src/containers/select-simulator.js | 2 +- src/containers/simulation-model.js | 5 +- 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 src/components/editable-header.js diff --git a/src/components/editable-header.js b/src/components/editable-header.js new file mode 100644 index 0000000..3995a25 --- /dev/null +++ b/src/components/editable-header.js @@ -0,0 +1,81 @@ +/** + * 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 + * 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 { Glyphicon, FormControl } from 'react-bootstrap'; + +class EditableHeader extends React.Component { + constructor(props) { + super(props); + + this.state = { + editing: false, + title: props.title + }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ title: nextProps.title }); + } + + startEditing = () => { + this.setState({ editing: true }); + } + + stopEditing = () => { + this.setState({ editing: false }); + } + + onChange = event => { + + } + + render() { + if (this.state.editing) { + const editStyle = { + maxWidth: '500px' + }; + + return
    +
    + + + + +
    ; + } + + return
    +

    + {this.state.title} +

    + + +
    ; + } +} + +EditableHeader.PropTypes = { + title: PropTypes.string +}; + +export default EditableHeader; diff --git a/src/containers/select-file.js b/src/containers/select-file.js index 1940736..aeca543 100644 --- a/src/containers/select-file.js +++ b/src/containers/select-file.js @@ -1,7 +1,7 @@ /** * File: selectFile.js * Author: Markus Grigull - * Date: 10.08.2018 + * Date: 10.05.2018 * * This file is part of VILLASweb. * @@ -39,7 +39,7 @@ class SelectFile extends React.Component { sessionToken: UserStore.getState().token, selectedFile: '', uploadFile: null, - uploadProgress: 100 + uploadProgress: 0 }; } diff --git a/src/containers/select-simulator.js b/src/containers/select-simulator.js index ad42000..bcf7719 100644 --- a/src/containers/select-simulator.js +++ b/src/containers/select-simulator.js @@ -1,7 +1,7 @@ /** * File: selectSimulator.js * Author: Markus Grigull - * Date: 10.08.2018 + * Date: 10.05.2018 * * This file is part of VILLASweb. * diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index a1929d2..1e1379a 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -1,7 +1,7 @@ /** * File: simulationModel.js * Author: Markus Grigull - * Date: 10.08.2018 + * Date: 10.05.2018 * * This file is part of VILLASweb. * @@ -30,6 +30,7 @@ import AppDispatcher from '../app-dispatcher'; import SelectSimulator from './select-simulator'; import SelectFile from './select-file'; import SignalMapping from '../components/signal-mapping'; +import EditableHeader from '../components/editable-header'; class SimulationModel extends React.Component { static getStores() { @@ -89,7 +90,7 @@ class SimulationModel extends React.Component { }; return
    -

    {this.state.simulationModel.name}

    +
    From 25b0f011514d56fb25fd1770073252425df8a06a Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 11:43:31 +0200 Subject: [PATCH 448/556] Finish editable header component --- src/components/editable-header.js | 42 ++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 3995a25..1b83755 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -37,45 +37,69 @@ class EditableHeader extends React.Component { this.setState({ title: nextProps.title }); } - startEditing = () => { + edit = () => { this.setState({ editing: true }); } - stopEditing = () => { + save = () => { this.setState({ editing: false }); + + if (this.props.onChange != null) { + this.props.onChange(this.state.title); + } + } + + cancel = () => { + this.setState({ editing: false, title: this.props.title }); } onChange = event => { - + this.setState({ title: event.target.value }); } render() { + const wrapperStyle= { + float: 'left' + }; + + const glyphStyle = { + float: 'left', + + marginLeft: '10px', + marginTop: '25px', + marginBottom: '20px' + }; + if (this.state.editing) { const editStyle = { - maxWidth: '500px' + maxWidth: '500px', + + marginTop: '10px' }; return
    - + - + +
    ; } return
    -

    +

    {this.state.title}

    - +
    ; } } EditableHeader.PropTypes = { - title: PropTypes.string + title: PropTypes.string.isRequired, + onChange: PropTypes.func }; export default EditableHeader; From 4964a5f79fc567a95c7efcf6085746fcc92794e9 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 11:57:12 +0200 Subject: [PATCH 449/556] Add save and cancel button functionallity --- src/containers/simulation-model.js | 55 +++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 1e1379a..b3652bd 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -59,11 +59,25 @@ class SimulationModel extends React.Component { } saveChanges = () => { + AppDispatcher.dispatch({ + type: 'simulationModels/start-edit', + data: this.state.simulationModel, + token: this.state.sessionToken + }); + this.props.history.push('/simulations/' + this.state.simulationModel.simulation); + } + + discardChanges = () => { + this.props.history.push('/simulations/' + this.state.simulationModel.simulation); } handleSimulatorChange = simulator => { - console.log(simulator); + const simulationModel = this.state.simulationModel; + + simulationModel.simulator = simulator; + + this.setState({ simulationModel }); } handleModelChange = file => { @@ -75,25 +89,41 @@ class SimulationModel extends React.Component { } handleOutputMappingChange = (length, signals) => { - console.log(length); - console.log(signals); + const simulationModel = this.state.simulationModel; + + simulationModel.outputMapping = signals; + simulationModel.outputLength = length; + + this.setState({ simulationModel }); } handleInputMappingChange = (length, signals) => { - console.log(length); - console.log(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 }); } render() { - const sectionStyle = { - + const buttonStyle = { + marginRight: '10px' }; return
    - +
    - + @@ -101,17 +131,18 @@ class SimulationModel extends React.Component { - + - +
    - + +
    ; } From ce1972dd45d8885cd3c8ce60db29779c65c27c6b Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 12:04:19 +0200 Subject: [PATCH 450/556] Fix props loading in table component --- src/components/table.js | 52 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/components/table.js b/src/components/table.js index df2b7fe..9d593fe 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -24,15 +24,14 @@ import _ from 'lodash'; import { Table, Button, Glyphicon, FormControl, Label, Checkbox } from 'react-bootstrap'; import { Link } from 'react-router-dom'; -//import TableColumn from './table-column'; - class CustomTable extends Component { constructor(props) { super(props); this.activeInput = null; + this.state = { - rows: [], + rows: this.getRows(props), editCell: [ -1, -1 ] }; } @@ -119,30 +118,9 @@ class CustomTable extends Component { } componentWillReceiveProps(nextProps) { - // check if data exists - if (nextProps.data == null) { - this.setState({ rows: [] }); - return; - } + const rows = this.getRows(nextProps); - // create row data - var rows = nextProps.data.map((data, index) => { - // check if multiple columns - if (Array.isArray(nextProps.children)) { - var row = []; - - nextProps.children.forEach(child => { - row.push(this.addCell(data, index, child)); - }); - - return row; - } else { - // table only has a single column - return [ this.addCell(data, index, nextProps.children) ]; - } - }); - - this.setState({ rows: rows }); + this.setState({ rows }); } componentDidUpdate() { @@ -162,6 +140,28 @@ class CustomTable extends Component { this.setState({ editCell: [ -1, -1 ] }); } + getRows(props) { + if (props.data == null) { + return []; + } + + return props.data.map((data, index) => { + // check if multiple columns + if (Array.isArray(props.children) === false) { + // table only has a single column + return [ this.addCell(data, index, props.children) ]; + } + + const row = []; + + for (let child of props.children) { + row.push(this.addCell(data, index, child)); + } + + return row; + }); + } + render() { // get children let children = this.props.children; From c5a9ccdf75cc379cd28b524eeb3fa107c7039ebc Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 12:56:52 +0200 Subject: [PATCH 451/556] Remove old simulation model dialogs --- .../dialog/edit-simulation-model.js | 186 ------------------ src/components/dialog/new-simulation-model.js | 182 ----------------- src/containers/simulation.js | 135 ++++++------- 3 files changed, 61 insertions(+), 442 deletions(-) delete mode 100644 src/components/dialog/edit-simulation-model.js delete mode 100644 src/components/dialog/new-simulation-model.js diff --git a/src/components/dialog/edit-simulation-model.js b/src/components/dialog/edit-simulation-model.js deleted file mode 100644 index a194ea6..0000000 --- a/src/components/dialog/edit-simulation-model.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * File: edit-simulation-model.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, ControlLabel, HelpBlock } from 'react-bootstrap'; -import _ from 'lodash'; - -import Table from '../table'; -import TableColumn from '../table-column'; -import Dialog from './dialog'; - -class EditSimulationModelDialog extends React.Component { - valid = false; - - constructor(props) { - super(props); - - this.state = { - _id: '', - name: '', - simulator: '', - simulation: '', - outputLength: 1, - inputLength: 1, - outputMapping: [{ name: 'Signal', type: 'Type' }], - inputMapping: [{ name: 'Signal', type: 'Type' }] - } - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - handleChange(e) { - let mapping = null; - - if (e.target.id === 'outputLength') { - mapping = this.state.outputMapping; - } else if (e.target.id === 'inputLength') { - mapping = this.state.inputMapping; - } - - if (mapping != null) { - // change mapping size - if (e.target.value > mapping.length) { - // add missing signals - while (mapping.length < e.target.value) { - mapping.push({ name: 'Signal', type: 'Type' }); - } - } else { - // remove signals - mapping.splice(e.target.value, mapping.length - e.target.value); - } - } - - this.setState({ [e.target.id]: e.target.value }); - } - - handleMappingChange(key, event, row, column) { - const mapping = this.state[key]; - - if (column === 1) { - mapping[row].name = event.target.value; - } else if (column === 2) { - mapping[row].type = event.target.value; - } - - this.setState({ [key]: mapping }); - } - - resetState() { - this.setState({ - _id: this.props.data._id, - simulation: this.props.data.simulation, - name: this.props.data.name, - simulator: this.props.data.simulator, - outputLength: this.props.data.outputLength, - inputLength: this.props.data.inputLength, - outputMapping: this.props.data.outputMapping, - inputMapping: this.props.data.inputMapping - }); - } - - validateForm(target) { - // check all controls - var name = true; - let inputLength = true; - let outputLength = true; - - if (this.state.name === '') { - name = false; - } - - // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.outputLength)) { - outputLength = false; - } - - if (!/^\d+$/.test(this.state.inputLength)) { - inputLength = false; - } - - this.valid = name && inputLength && outputLength; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else if (target === 'outputLength') return outputLength ? "success" : "error"; - else if (target === 'inputLength') return inputLength ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Simulator - this.handleChange(e)}> - {this.props.simulators.map(simulator => ( - - ))} - - - - Output Length - this.handleChange(e)} /> - - - - Output Mapping - Click Name or Type cell to edit - - - this.handleMappingChange('outputMapping', event, row, column)} /> - this.handleMappingChange('outputMapping', event, row, column)} /> -
    -
    - - Input Length - this.handleChange(e)} /> - - - - Input Mapping - Click Name or Type cell to edit - - - this.handleMappingChange('inputMapping', event, row, column)} /> - this.handleMappingChange('inputMapping', event, row, column)} /> -
    -
    -
    -
    - ); - } -} - -export default EditSimulationModelDialog; diff --git a/src/components/dialog/new-simulation-model.js b/src/components/dialog/new-simulation-model.js deleted file mode 100644 index 40daf9c..0000000 --- a/src/components/dialog/new-simulation-model.js +++ /dev/null @@ -1,182 +0,0 @@ -/** - * File: new-simulation-model.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, ControlLabel, HelpBlock } from 'react-bootstrap'; -import _ from 'lodash'; - -import Table from '../table'; -import TableColumn from '../table-column'; -import Dialog from './dialog'; - -class NewSimulationModelDialog extends React.Component { - valid = false; - - constructor(props) { - super(props); - - this.state = { - name: '', - simulator: '', - outputLength: '1', - inputLength: '1', - outputMapping: [ { name: 'Signal', type: 'Type' } ], - inputMapping: [ { name: 'Signal', type: 'Type' } ] - }; - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - handleChange(e) { - let mapping = null; - - if (e.target.id === 'outputLength') { - mapping = this.state.outputMapping; - } else if (e.target.id === 'inputLength') { - mapping = this.state.inputMapping; - } - - if (mapping != null) { - // change mapping size - if (e.target.value > mapping.length) { - // add missing signals - while (mapping.length < e.target.value) { - mapping.push({ name: 'Signal', type: 'Type' }); - } - } else { - // remove signals - mapping.splice(e.target.value, mapping.length - e.target.value); - } - } - - this.setState({ [e.target.id]: e.target.value }); - } - - handleMappingChange(key, event, row, column) { - const mapping = this.state[key]; - - if (column === 1) { - mapping[row].name = event.target.value; - } else if (column === 2) { - mapping[row].type = event.target.value; - } - - this.setState({ [key]: mapping }); - } - - resetState() { - this.setState({ - name: '', - simulator: this.props.simulators[0]._id || '', - outputLength: '1', - inputLength: '1', - outputMapping: [{ name: 'Signal', type: 'Type' }], - inputMapping: [{ name: 'Signal', type: 'Type' }] - }); - } - - validateForm(target) { - // check all controls - let name = true; - let inputLength = true; - let outputLength = true; - - if (this.state.name === '') { - name = false; - } - - // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.outputLength)) { - outputLength = false; - } - - if (!/^\d+$/.test(this.state.inputLength)) { - inputLength = false; - } - - this.valid = name && inputLength && outputLength; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else if (target === 'outputLength') return outputLength ? "success" : "error"; - else if (target === 'inputLength') return inputLength ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Simulator - this.handleChange(e)}> - {this.props.simulators.map(simulator => ( - - ))} - - - - Output Length - this.handleChange(e)} /> - - - - Output Mapping - Click Name or Type cell to edit - - - this.handleMappingChange('outputMapping', event, row, column)} /> - this.handleMappingChange('outputMapping', event, row, column)} /> -
    -
    - - Input Length - this.handleChange(e)} /> - - - - Input Mapping - Click Name or Type cell to edit - - - this.handleMappingChange('inputMapping', event, row, column)} /> - this.handleMappingChange('inputMapping', event, row, column)} /> -
    -
    -
    -
    - ); - } -} - -export default NewSimulationModelDialog; diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 74e5702..181b7a5 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -33,8 +33,6 @@ import AppDispatcher from '../app-dispatcher'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -import NewSimulationModelDialog from '../components/dialog/new-simulation-model'; -import EditSimulationModelDialog from '../components/dialog/edit-simulation-model'; import ImportSimulationModelDialog from '../components/dialog/import-simulation-model'; import SimulatorAction from '../components/simulator-action'; @@ -73,12 +71,9 @@ class Simulation extends React.Component { simulators: SimulatorStore.getState(), sessionToken, - newModal: false, deleteModal: false, - editModal: false, importModal: false, modalData: {}, - modalIndex: null, selectedSimulationModels: [] } @@ -101,26 +96,30 @@ class Simulation extends React.Component { }); } - closeNewModal(data) { - this.setState({ newModal : false }); + 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' }] + }; - if (data) { - data.simulation = this.state.simulation._id; + AppDispatcher.dispatch({ + type: 'simulationModels/start-add', + data: simulationModel, + token: this.state.sessionToken + }); + this.setState({ simulation: {} }, () => { AppDispatcher.dispatch({ - type: 'simulationModels/start-add', - data, + type: 'simulations/start-load', + data: this.props.match.params.simulation, 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 => { @@ -137,18 +136,6 @@ class Simulation extends React.Component { }); } - closeEditModal(data) { - this.setState({ editModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'simulationModels/start-edit', - data, - token: this.state.sessionToken - }); - } - } - closeImportModal(data) { this.setState({ importModal: false }); @@ -239,52 +226,52 @@ class Simulation extends React.Component { } render() { - return ( -
    -

    {this.state.simulation.name}

    + const buttonStyle = { + marginLeft: '10px' + }; - - this.onSimulationModelChecked(index, event)} width='30' /> - - this.getSimulatorName(simulator)} /> - - - this.setState({ editModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} - onExport={index => this.exportModel(index)} - /> -
    + 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)} + /> +
    -
    - - -
    - - this.closeNewModal(data)} simulators={this.state.simulators} /> - this.closeEditModal(data)} data={this.state.modalData} simulators={this.state.simulators} /> - this.closeImportModal(data)} simulators={this.state.simulators} /> - - +
    +
    - ); + +
    + + +
    + +
    + + this.closeImportModal(data)} simulators={this.state.simulators} /> + + +
    ; } } From ca20df0b3bd61edd098a2efcf9702fd6fb4b4995 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 13:04:23 +0200 Subject: [PATCH 452/556] Add autofocus to editable header --- src/components/editable-header.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 1b83755..77a4293 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -24,6 +24,8 @@ import PropTypes from 'prop-types'; import { Glyphicon, FormControl } from 'react-bootstrap'; class EditableHeader extends React.Component { + titleInput = null; + constructor(props) { super(props); @@ -79,7 +81,7 @@ class EditableHeader extends React.Component { return
    - + From b6207cf80b496f5f38e3df4f8d807ef2f7b056cf Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 13:31:43 +0200 Subject: [PATCH 453/556] Update simulation model import dialog --- .../dialog/import-simulation-model.js | 165 ++++-------------- src/containers/simulation.js | 35 ++-- 2 files changed, 50 insertions(+), 150 deletions(-) diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialog/import-simulation-model.js index 1f9a2ff..137dfe9 100644 --- a/src/components/dialog/import-simulation-model.js +++ b/src/components/dialog/import-simulation-model.js @@ -20,194 +20,89 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Table from '../table'; -import TableColumn from '../table-column'; import Dialog from './dialog'; class ImportSimulationModelDialog extends React.Component { - valid = false; imported = false; constructor(props) { super(props); this.state = { - name: '', - simulator: '', - outputLength: '1', - inputLength: '1', - outputMapping: [ { name: 'Signal', type: 'Type' } ], - inputMapping: [{ name: 'Signal', type: 'Type' }] + model: {} }; } - onClose(canceled) { - if (canceled === false) { - this.props.onClose(this.state); - } else { + onClose = canceled => { + if (canceled) { this.props.onClose(); + + return; } + + this.props.onClose(this.state.model); } - resetState() { + resetState = () => { this.setState({ - name: '', - simulator: '', - outputLength: '1', - inputLength: '1', - outputMapping: [{ name: 'Signal', type: 'Type' }], - inputMapping: [{ name: 'Signal', type: 'Type' }] + model: {} }); this.imported = false; } - handleChange(e) { - let mapping = null; - - if (e.target.id === 'outputLength') { - mapping = this.state.outputMapping; - } else if (e.target.id === 'inputLength') { - mapping = this.state.inputMapping; - } - - if (mapping != null) { - // change mapping size - if (e.target.value > mapping.length) { - // add missing signals - while (mapping.length < e.target.value) { - mapping.push({ name: 'Signal', type: 'Type' }); - } - } else { - // remove signals - mapping.splice(e.target.value, mapping.length - e.target.value); - } - } - - this.setState({ [e.target.id]: e.target.value }); - } - - handleMappingChange(key, event, row, column) { - const mapping = this.state[key]; - - if (column === 1) { - mapping[row].name = event.target.value; - } else if (column === 2) { - mapping[row].type = event.target.value; - } - - this.setState({ [key]: mapping }); - } - - loadFile(fileList) { + loadFile = event => { // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { + const file = event.target.files[0]; + if (file.type.match('application/json') === false) { return; } // create file reader - var reader = new FileReader(); - var self = this; + const reader = new FileReader(); + const self = this; - reader.onload = function(event) { - // read simulator + reader.onload = event => { const model = JSON.parse(event.target.result); + model.simulator = this.props.simulators.length > 0 ? this.props.simulators[0]._id : null; + self.imported = true; - self.valid = true; - self.setState({ name: model.name, mapping: model.mapping, length: model.length, simulator: { node: self.props.nodes[0]._id, simulator: 0 } }); + + this.setState({ model }); }; reader.readAsText(file); } - validateForm(target) { - // check all controls - var name = true; - let inputLength = true; - let outputLength = true; - var simulator = true; + handleSimulatorChange = event => { + const model = this.state.model; - if (this.state.name === '') { - name = false; - } + model.simulator = event.target.value; - if (this.state.simulator === '') { - simulator = false; - } - - // test if simulatorid is a number (in a string, not type of number) - if (!/^\d+$/.test(this.state.outputLength)) { - outputLength = false; - } - - if (!/^\d+$/.test(this.state.inputLength)) { - inputLength = false; - } - - this.valid = name && inputLength && outputLength && simulator; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else if (target === 'outputLength') return outputLength ? "success" : "error"; - else if (target === 'inputLength') return inputLength ? "success" : "error"; - else if (target === 'simulator') return simulator ? "success" : "error"; + this.setState({ model }); } render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    - + Simulation Model File - this.loadFile(e.target.files)} /> + - - Name - this.handleChange(e)} /> - - - + Simulator - this.handleChange(e)}> + {this.props.simulators.map(simulator => ( - + ))} - - Output Length - this.handleChange(e)} /> - - - - Output Mapping - Click Name or Type cell to edit - - - this.handleMappingChange('outputMapping', event, row, column)} /> - this.handleMappingChange('outputMapping', event, row, column)} /> -
    -
    - - Input Length - this.handleChange(e)} /> - - - - Input Mapping - Click Name or Type cell to edit - - - this.handleMappingChange('inputMapping', event, row, column)} /> - this.handleMappingChange('inputMapping', event, row, column)} /> -
    -
    ); diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 181b7a5..77d6d1d 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -136,26 +136,30 @@ class Simulation extends React.Component { }); } - closeImportModal(data) { + importSimulationModel = simulationModel => { this.setState({ importModal: false }); - if (data) { - data.simulation = this.state.simulation._id; + 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: 'simulationModels/start-add', - data, + type: 'simulations/start-load', + data: this.props.match.params.simulation, 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) { @@ -169,6 +173,7 @@ class Simulation extends React.Component { exportModel(index) { // filter properties const model = Object.assign({}, this.state.simulationModels[index]); + delete model.simulator; delete model.simulation; @@ -268,7 +273,7 @@ class Simulation extends React.Component {
    - this.closeImportModal(data)} simulators={this.state.simulators} /> +
    ; From 472af5c1266df49f75b93b9eb3c8ad339833d3fc Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 13:33:54 +0200 Subject: [PATCH 454/556] Disable model and configuration controls while not usable --- src/containers/select-file.js | 6 +++--- src/containers/simulation-model.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/containers/select-file.js b/src/containers/select-file.js index aeca543..755356d 100644 --- a/src/containers/select-file.js +++ b/src/containers/select-file.js @@ -123,7 +123,7 @@ class SelectFile extends React.Component { - + {fileOptions} @@ -131,13 +131,13 @@ class SelectFile extends React.Component { - + - diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index b3652bd..172ef72 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -126,9 +126,9 @@ class SimulationModel extends React.Component { - + - + From 444efaf6e07f3dff5d75afc83bc8d5af81a892a9 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 19:06:26 +0200 Subject: [PATCH 455/556] Fix ui test for slider widget --- src/__tests__/components/dialog/edit-widget-control-creator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index ef02578..d9915bb 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -31,7 +31,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Slider' }, result: { controlNumber: 3, controlTypes: [EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Slider' }, result: { controlNumber: 4, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, From 536b5e41fa849fd958430110bc1f098d4c9e6176 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 30 May 2018 19:23:53 +0200 Subject: [PATCH 456/556] Add clear after floating buttons and spacing between --- src/containers/project.js | 8 ++++++-- src/containers/simulations.js | 10 ++++++++-- src/containers/simulators.js | 10 ++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/containers/project.js b/src/containers/project.js index 3fbfc89..f649303 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -196,6 +196,10 @@ class Visualizations extends Component { } render() { + const buttonStyle = { + marginRight: '10px' + }; + return (

    {this.state.project.name}

    @@ -213,8 +217,8 @@ class Visualizations extends Component { /> - - + + this.closeNewModal(data)} /> this.closeEditModal(data)} visualization={this.state.modalData} /> diff --git a/src/containers/simulations.js b/src/containers/simulations.js index a92a23e..c2c7e11 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -218,6 +218,10 @@ class Simulations extends Component { } render() { + const buttonStyle = { + marginLeft: '10px' + }; + return (

    Simulations

    @@ -249,10 +253,12 @@ class Simulations extends Component {
    - - + +
    +
    + this.closeNewModal(data)} /> this.closeEditModal(data)} simulation={this.state.modalSimulation} /> this.closeImportModal(data)} nodes={this.state.nodes} /> diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 794c9d3..fb62dab 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -163,6 +163,10 @@ class Simulators extends Component { } render() { + const buttonStyle = { + marginLeft: '10px' + }; + return (

    Simulators

    @@ -194,10 +198,12 @@ class Simulators extends Component {
    - - + +
    +
    + this.closeNewModal(data)} /> this.closeEditModal(data)} simulator={this.state.modalSimulator} /> this.closeImportModal(data)} /> From 0b1420bce0354c37efd89a832ded2a996f5f4917 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 31 May 2018 22:21:53 +0200 Subject: [PATCH 457/556] use simulation model in inputDataChanged() --- src/containers/widget.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 6006484..039ae21 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -164,9 +164,19 @@ class Widget extends React.Component { } inputDataChanged(widget, data) { + let simulationModel = null; + + for (let model of this.state.simulationModels) { + if (model._id !== widget.simulationModel) { + continue; + } + + simulationModel = model; + } + AppDispatcher.dispatch({ type: 'simulatorData/inputChanged', - simulator: widget.simulator, + simulator: simulationModel.simulator, signal: widget.signal, data }); From 6f7d0f29bbc95954cf617c09dd6850aa5035381c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 31 May 2018 22:22:22 +0200 Subject: [PATCH 458/556] pass simulationModel to widget --- src/containers/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 039ae21..2879498 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -219,9 +219,9 @@ class Widget extends React.Component { } else if (widget.type === 'Button') { element = } else if (widget.type === 'NumberInput') { - element = + element = } else if (widget.type === 'Slider') { - element = this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={(value) => this.inputDataChanged(widget, value)} /> + element = this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={(value) => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { element = } else if (widget.type === 'Box') { From cd8f27575eb93ec2d68dcc5091799b8338981e3a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 13:35:09 +0200 Subject: [PATCH 459/556] update list of signals in simulation module only onBlur instead of onChange --- src/components/signal-mapping.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/signal-mapping.js b/src/components/signal-mapping.js index 3c975b8..815d90c 100644 --- a/src/components/signal-mapping.js +++ b/src/components/signal-mapping.js @@ -31,8 +31,12 @@ class SignalMapping extends React.Component { constructor(props) { super(props); + var length = props.length; + if (length === undefined) + length = 1; + this.state = { - length: props.length, + length: length, signals: props.signals }; } @@ -56,7 +60,7 @@ class SignalMapping extends React.Component { // update signals to represent length const signals = this.state.signals; - + if (this.state.length < length) { while (signals.length < length) { signals.push({ name: 'Signal', type: 'Type' }); @@ -76,13 +80,15 @@ class SignalMapping extends React.Component { handleMappingChange = (event, row, column) => { const signals = this.state.signals; + const length = this.state.length; + if (column === 1) { signals[row].name = event.target.value; } else if (column === 2) { signals[row].type = event.target.value; } - this.setState({ signals }); + this.setState({ length, signals }); if (this.props.onChange != null) { this.props.onChange(this.state.length, signals); @@ -93,7 +99,7 @@ class SignalMapping extends React.Component { return
    {this.props.name} Length - + From 41a6f5ee30d557c4117cb5b8f44839d2b259615e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 17:47:38 +0200 Subject: [PATCH 460/556] do not clear simulator-data-data-store after opening ws connection --- src/stores/simulator-data-store.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index d5cdd8c..15ac857 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -39,7 +39,9 @@ class SimulationDataStore extends ReduceStore { switch (action.type) { case 'simulatorData/opened': // create entry for simulator - state[action.id] = {}; + if (state[action.id] === undefined) + state[action.id] = {}; + return state; case 'simulatorData/prepare': From 235f3e249d9320b935b0b3d14e67be9d03a4a3f5 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 17:49:10 +0200 Subject: [PATCH 461/556] be more robust when handling simulato-data-data-store --- src/stores/simulator-data-store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 15ac857..1486558 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -107,7 +107,7 @@ class SimulationDataStore extends ReduceStore { case 'simulatorData/inputChanged': // find simulator in node array - if (state[action.simulator] == null) { + if (state[action.simulator] == null || state[action.simulator].input == null) { return state; } From 832b6390908e5e98c55878c5f431395d4038d3ca Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 18:07:03 +0200 Subject: [PATCH 462/556] slider: add new property to continously update values --- src/components/dialog/edit-widget-control-creator.js | 3 ++- src/components/widget-slider.js | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index a829de2..0d94bcd 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -120,7 +120,8 @@ export default function createControls(widgetType = null, widget = null, session 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)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Button': diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index baf79b0..7f823fe 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -51,6 +51,9 @@ class WidgetSlider extends Component { } valueIsChanging(newValue) { + if (this.props.widget.continous_update) + this.valueChanged(newValue); + this.setState({ value: newValue }); } From 5dcbb0985478abf57fd7c8d8ec59c294ae65e857 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 19:49:15 +0200 Subject: [PATCH 463/556] remove obsolete test file --- src/Header.test.js | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 src/Header.test.js diff --git a/src/Header.test.js b/src/Header.test.js deleted file mode 100644 index db2da16..0000000 --- a/src/Header.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import Header from './components/header'; - -it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(
    , div); -}); From 302dac284e8f7639bd6b3ff5c7ac55b69d25b32f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 20:30:15 +0200 Subject: [PATCH 464/556] websocket: handle reconnects --- src/api/websocket-api.js | 63 +++++++++++++++---- .../simulator-data-data-manager.js | 4 +- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index 43d2e65..ee952dd 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -20,21 +20,60 @@ ******************************************************************************/ class WebsocketAPI { - addSocket(endpoint, callbacks) { - // create web socket client - const socket = new WebSocket(this.getURL(endpoint), 'live'); - socket.binaryType = 'arraybuffer'; + constructor(endpoint, callbacks) { + this.endpoint = endpoint; + this.callbacks = callbacks; - // register callbacks - if (callbacks.onOpen) socket.onopen = callbacks.onOpen; - if (callbacks.onClose) socket.onclose = callbacks.onClose; - if (callbacks.onMessage) socket.onmessage = callbacks.onMessage; - if (callbacks.onError) socket.onerror = callbacks.onError; + this.isClosing = false; - return socket; + this.connect(endpoint, callbacks); } - getURL(endpoint) { + connect(endpoint, callbacks) { + // create web socket client + this.socket = new WebSocket(WebsocketAPI.getURL(endpoint), 'live'); + this.socket.binaryType = 'arraybuffer'; + this.socket.onclose = this.onClose; + + // register callbacks + if (callbacks.onOpen) + this.socket.onopen = callbacks.onOpen; + if (callbacks.onMessage) + this.socket.onmessage = callbacks.onMessage; + if (callbacks.onError) + this.socket.onerror = callbacks.onError; + } + + reconnect() { + //console.log("Reconnecting: " + this.endpoint); + this.connect(this.endpoint, this.callbacks); + } + + get url() { + return WebsocketAPI.getURL(this.endpoint); + } + + send(data) { + this.socket.send(data); + } + + close(code, reason) { + this.isClosing = true; + this.socket.close(code, reason); + } + + onClose = e => { + if (this.isClosing) { + if (this.callbacks.onClose) + this.callbacks.onClose(e); + } + else { + //console.log("Connection to " + this.endpoint + " dropped. Attempt reconnect in 1 sec"); + window.setTimeout(() => { this.reconnect(); }, 500); + } + } + + static getURL(endpoint) { // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); link.href = endpoint; @@ -48,4 +87,4 @@ class WebsocketAPI { } } -export default new WebsocketAPI(); +export default WebsocketAPI; diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 728a6a0..29e36c0 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -37,10 +37,10 @@ class SimulatorDataDataManager { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + this._sockets[identifier] = new WebsocketAPI(endpoint, { onOpen: (event) => this.onOpen(event, identifier), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } } else { - this._sockets[identifier] = WebsocketAPI.addSocket(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(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) }); } } From d7afa7efb9ab7a119a0bb66c42482b2ed8f9817e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 20:31:00 +0200 Subject: [PATCH 465/556] websocket: handle endpoint changes --- .../simulator-data-data-manager.js | 25 +++++++++++-------- src/stores/simulator-store.js | 8 ++++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 29e36c0..518d69b 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -32,24 +32,27 @@ class SimulatorDataDataManager { open(endpoint, identifier) { // pass signals to onOpen callback - if (this._sockets[identifier] != null) { - if (this._sockets[identifier].url !== WebsocketAPI.getURL(endpoint)) { - // replace connection, since endpoint changed - this._sockets.close(); + if (this._sockets[identifier] != null) + return; // already open? - this._sockets[identifier] = new WebsocketAPI(endpoint, { onOpen: (event) => this.onOpen(event, identifier), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + 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), onError: (error) => this.onError(error, identifier) }); + } + + update(endpoint, identifier) { + if (this._sockets[identifier] != null) { + if (this._sockets[identifier].endpoint !== endpoint) { + 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) }); } - } else { - 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) }); } } closeAll() { // close every open socket - for (var key in this._sockets) { - if (this._sockets.hasOwnProperty(key)) { - this._sockets[key].close(4000); - delete this._sockets[key]; + for (var identifier in this._sockets) { + if (this._sockets.hasOwnProperty(identifier)) { + this._sockets[identifier].close(4000); + delete this._sockets[identifier]; } } } diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 8406944..2bd4410 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -48,6 +48,14 @@ class SimulatorStore extends ArrayStore { 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'); + + if (endpoint != null && endpoint !== '') { + SimulatorDataDataManager.update(endpoint, simulator._id); + } + return super.reduce(state, action); case 'simulators/fetched': From fb1fdd5b37d5d0091df1e9346eb987cbc327603f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 20:38:19 +0200 Subject: [PATCH 466/556] Pre-fill UUID field in new simulator dialog with a random UUID (closes #152) --- src/components/dialog/new-simulator.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/dialog/new-simulator.js b/src/components/dialog/new-simulator.js index ff3ea08..3ddd80d 100644 --- a/src/components/dialog/new-simulator.js +++ b/src/components/dialog/new-simulator.js @@ -40,7 +40,7 @@ class NewSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - const data = { + const data = { properties: { name: this.state.name }, @@ -86,6 +86,14 @@ class NewSimulatorDialog extends React.Component { if (target === 'uuid') return uuid ? "success" : "error"; } + 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); + }); + } + render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> @@ -102,7 +110,7 @@ class NewSimulatorDialog extends React.Component { UUID - this.handleChange(e)} /> + this.handleChange(e)} /> From e5858e0c9683b91d5cba6dc9d1d546723a81845a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 4 Jun 2018 20:42:16 +0200 Subject: [PATCH 467/556] access rawProperties always with _.get() (closes #158 & #153) --- src/containers/simulators.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index fb62dab..4c92992 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -111,7 +111,7 @@ class Simulators extends Component { // show save dialog const blob = new Blob([JSON.stringify(simulator, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'simulator - ' + (simulator.properties.name || simulator.rawProperties.name || 'undefined') + '.json'); + FileSaver.saveAs(blob, 'simulator - ' + (_.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || 'undefined') + '.json'); } closeImportModal(data) { @@ -179,20 +179,20 @@ class Simulators extends Component { - this.setState({ editModal: true, modalSimulator: this.state.simulators[index], modalIndex: index })} + onEdit={index => 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 })} />
    -
    From 3371847f0dd3c4219653abc63fe0d6aec1c74bb1 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 5 Jun 2018 18:16:27 +0200 Subject: [PATCH 468/556] add new component for editing numbers --- .../dialog/edit-widget-number-control.js | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/components/dialog/edit-widget-number-control.js diff --git a/src/components/dialog/edit-widget-number-control.js b/src/components/dialog/edit-widget-number-control.js new file mode 100644 index 0000000..0977756 --- /dev/null +++ b/src/components/dialog/edit-widget-number-control.js @@ -0,0 +1,50 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; + +class EditWidgetNumberControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + return ( + + {this.props.label} + this.props.handleChange(e)} /> + + + ); + } +} + +export default EditWidgetNumberControl; From 87c0b5b95f1f843d636067b042bcb8d1b8fc1414 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 5 Jun 2018 18:16:48 +0200 Subject: [PATCH 469/556] add more properties to slider widget --- .../dialog/edit-widget-control-creator.js | 7 ++++- src/components/widget-slider.js | 26 ++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 0d94bcd..9f593ec 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -22,6 +22,7 @@ import React from 'react'; 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'; @@ -121,7 +122,11 @@ export default function createControls(widgetType = null, widget = null, session 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)} />, + handleChange(e)} /> ); break; case 'Button': diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index 7f823fe..b6b8647 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -25,15 +25,30 @@ class WidgetSlider extends Component { super(props); this.state = { - value: 50 + value: Number.parseFloat(this.props.widget.default_value), + unit: '' }; } componentWillReceiveProps(nextProps) { + if (nextProps.simulationModel == null) { + return; + } + // Update value if (nextProps.widget.value && this.state.value !== nextProps.widget.value) { - this.setState({ value: nextProps.widget.value }) + this.setState({ + value: nextProps.widget.value, + }); } + + // Update unit + if (nextProps.widget.simulationModel && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.signal].type) { + this.setState({ + unit: nextProps.simulationModel.inputMapping[nextProps.widget.signal].type + }); + } + // Check if the orientation changed, update the size if it did if (this.props.widget.orientation !== nextProps.widget.orientation) { let baseWidget = nextProps.widget; @@ -68,10 +83,13 @@ class WidgetSlider extends Component { let fields = { 'name': this.props.widget.name, - 'control': this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, - 'value': this.state.value + 'control': this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, + 'value': Number.parseFloat(this.state.value).toPrecision(3) } + if (this.props.widget.showUnit) + fields.value += ' [' + this.state.unit + ']'; + var widgetClasses = classNames({ 'slider-widget': true, 'full': true, From bc5c66b218a7e74f404b9b46f5bdf34adc41a0c7 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 6 Jun 2018 13:17:27 +0200 Subject: [PATCH 470/556] Add start parameters json editor in simulation model --- package-lock.json | 1099 ++++++++++++++++++++++++--- package.json | 1 + src/components/parameters-editor.js | 86 +++ src/containers/simulation-model.js | 11 + 4 files changed, 1101 insertions(+), 96 deletions(-) create mode 100644 src/components/parameters-editor.js diff --git a/package-lock.json b/package-lock.json index b8e396b..15360b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ }, "acorn-dynamic-import": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { "acorn": "^4.0.3" @@ -32,12 +33,14 @@ "dependencies": { "acorn": { "version": "4.0.13", + "resolved": false, "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-globals": { "version": "3.1.0", + "resolved": false, "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { "acorn": "^4.0.4" @@ -45,12 +48,14 @@ "dependencies": { "acorn": { "version": "4.0.13", + "resolved": false, "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-jsx": { "version": "3.0.1", + "resolved": false, "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { "acorn": "^3.0.4" @@ -58,6 +63,7 @@ "dependencies": { "acorn": { "version": "3.3.0", + "resolved": false, "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" } } @@ -69,10 +75,12 @@ }, "address": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-SACB6CtYe6MZRZ/vUS9Rb+A9WK8=" }, "ajv": { "version": "4.11.8", + "resolved": false, "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { "co": "^4.6.0", @@ -81,10 +89,12 @@ }, "ajv-keywords": { "version": "1.5.1", + "resolved": false, "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" }, "align-text": { "version": "0.1.4", + "resolved": false, "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { "kind-of": "^3.0.2", @@ -104,14 +114,17 @@ }, "alphanum-sort": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "amdefine": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "anser": { "version": "1.4.1", + "resolved": false, "integrity": "sha1-w2QYY6lizr75Qeoshwbyy08HFr0=" }, "ansi-align": { @@ -153,14 +166,17 @@ }, "ansi-escapes": { "version": "1.4.0", + "resolved": false, "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, "ansi-html": { "version": "0.0.7", + "resolved": false, "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { @@ -251,6 +267,7 @@ }, "append-transform": { "version": "0.4.0", + "resolved": false, "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "requires": { "default-require-extensions": "^1.0.0" @@ -266,6 +283,7 @@ }, "aria-query": { "version": "0.5.0", + "resolved": false, "integrity": "sha1-heMVLNjMW6sY2+1hzZxPzlT6ecM=", "requires": { "ast-types-flow": "0.0.7" @@ -288,22 +306,27 @@ }, "array-equal": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, "array-filter": { "version": "0.0.1", + "resolved": false, "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" }, "array-find-index": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" }, "array-includes": { "version": "3.0.3", + "resolved": false, "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { "define-properties": "^1.1.2", @@ -312,14 +335,17 @@ }, "array-map": { "version": "0.0.0", + "resolved": false, "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" }, "array-reduce": { "version": "0.0.0", + "resolved": false, "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, "array-union": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { "array-uniq": "^1.0.1" @@ -327,6 +353,7 @@ }, "array-uniq": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { @@ -336,14 +363,17 @@ }, "arrify": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { - "version": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "version": "2.0.6", + "resolved": false, "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1": { "version": "0.2.3", + "resolved": false, "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "asn1.js": { @@ -358,6 +388,7 @@ }, "assert": { "version": "1.4.1", + "resolved": false, "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { "util": "0.10.3" @@ -375,6 +406,7 @@ }, "ast-types-flow": { "version": "0.0.7", + "resolved": false, "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, "async": { @@ -387,10 +419,12 @@ }, "async-each": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "asynckit": { "version": "0.4.0", + "resolved": false, "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { @@ -399,7 +433,8 @@ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==" }, "autoprefixer": { - "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", "integrity": "sha512-y3U+M3XLC3oKKkShZXcsjdCY6bTWmqOboqx1iDeaMumpqumPbEDUqb9586imSWcy8nboBTjqRu8bNe4KcoYOXA==", "requires": { "browserslist": "^2.1.3", @@ -422,6 +457,7 @@ }, "axobject-query": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", "requires": { "ast-types-flow": "0.0.7" @@ -438,7 +474,8 @@ } }, "babel-core": { - "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", "integrity": "sha512-wne6XXFyKIfZSLLXN17Zun5aw8x2WZY5ork2NSa5t0UWGxK2EHsJlPd8W1rQQDgpG0tsvEHNdaqmvygEI7Qmmw==", "requires": { "babel-code-frame": "^6.22.0", @@ -470,8 +507,9 @@ } }, "babel-eslint": { - "version": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha512-i2yKOhjgwUbUrJ8oJm6QqRzltIoFahGNPZ0HF22lUN4H1DW03JQyJm7WSv+I1LURQWjDNhVqFo04acYa07rhOQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "requires": { "babel-code-frame": "^6.22.0", "babel-traverse": "^6.23.1", @@ -522,6 +560,7 @@ }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { "babel-helper-explode-assignable-expression": "^6.24.1", @@ -562,6 +601,7 @@ }, "babel-helper-call-delegate": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { "babel-helper-hoist-variables": "^6.24.1", @@ -604,6 +644,7 @@ }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { "babel-runtime": "^6.22.0", @@ -613,6 +654,7 @@ }, "babel-helper-function-name": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { "babel-helper-get-function-arity": "^6.24.1", @@ -624,6 +666,7 @@ }, "babel-helper-get-function-arity": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { "babel-runtime": "^6.22.0", @@ -632,6 +675,7 @@ }, "babel-helper-hoist-variables": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { "babel-runtime": "^6.22.0", @@ -640,6 +684,7 @@ }, "babel-helper-optimise-call-expression": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { "babel-runtime": "^6.22.0", @@ -679,6 +724,7 @@ }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { "babel-helper-function-name": "^6.24.1", @@ -690,6 +736,7 @@ }, "babel-helper-replace-supers": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { "babel-helper-optimise-call-expression": "^6.24.1", @@ -702,6 +749,7 @@ }, "babel-helpers": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { "babel-runtime": "^6.22.0", @@ -709,8 +757,9 @@ } }, "babel-jest": { - "version": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "integrity": "sha512-eAycDKZn+m6jMBv5KMXRKttDeoDUE7Y6eQpeiF4ip0lLaI4uwGNhJIdVK2RptHjO9N9RJ2gONMn2XE67wBdf8A==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", + "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", "requires": { "babel-core": "^6.0.0", "babel-plugin-istanbul": "^4.0.0", @@ -718,7 +767,8 @@ } }, "babel-loader": { - "version": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", "integrity": "sha512-Kt7ND6R8tB0E372MdnZM9H7ImYYF9VevfVHjAa7Q1JKt4tpwihupfFwFc5BiLDWIsehNY+VQ4zyl2E22y86pbA==", "requires": { "find-cache-dir": "^0.1.1", @@ -728,6 +778,7 @@ }, "babel-messages": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { "babel-runtime": "^6.22.0" @@ -735,6 +786,7 @@ }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { "babel-runtime": "^6.22.0" @@ -742,6 +794,7 @@ }, "babel-plugin-dynamic-import-node": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-rbW8j0iokxFUA5WunwzD7UsQuy4=", "requires": { "babel-plugin-syntax-dynamic-import": "^6.18.0", @@ -762,42 +815,52 @@ }, "babel-plugin-jest-hoist": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", + "resolved": false, "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", + "resolved": false, "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-dynamic-import": { "version": "6.18.0", + "resolved": false, "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", + "resolved": false, "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-flow": { "version": "6.18.0", + "resolved": false, "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", + "resolved": false, "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", + "resolved": false, "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { "babel-helper-remap-async-to-generator": "^6.24.1", @@ -807,6 +870,7 @@ }, "babel-plugin-transform-class-properties": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { "babel-helper-function-name": "^6.24.1", @@ -817,6 +881,7 @@ }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { "babel-runtime": "^6.22.0" @@ -824,6 +889,7 @@ }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { "babel-runtime": "^6.22.0" @@ -864,6 +930,7 @@ }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { "babel-helper-define-map": "^6.24.1", @@ -879,6 +946,7 @@ }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { "babel-runtime": "^6.22.0", @@ -887,6 +955,7 @@ }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { "babel-runtime": "^6.22.0" @@ -894,6 +963,7 @@ }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { "babel-runtime": "^6.22.0", @@ -902,6 +972,7 @@ }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { "babel-runtime": "^6.22.0" @@ -909,6 +980,7 @@ }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { "babel-helper-function-name": "^6.24.1", @@ -918,6 +990,7 @@ }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { "babel-runtime": "^6.22.0" @@ -925,6 +998,7 @@ }, "babel-plugin-transform-es2015-modules-amd": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", @@ -966,6 +1040,7 @@ }, "babel-plugin-transform-es2015-modules-systemjs": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { "babel-helper-hoist-variables": "^6.24.1", @@ -975,6 +1050,7 @@ }, "babel-plugin-transform-es2015-modules-umd": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { "babel-plugin-transform-es2015-modules-amd": "^6.24.1", @@ -984,6 +1060,7 @@ }, "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { "babel-helper-replace-supers": "^6.24.1", @@ -992,6 +1069,7 @@ }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { "babel-helper-call-delegate": "^6.24.1", @@ -1004,6 +1082,7 @@ }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { "babel-runtime": "^6.22.0", @@ -1012,6 +1091,7 @@ }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { "babel-runtime": "^6.22.0" @@ -1019,6 +1099,7 @@ }, "babel-plugin-transform-es2015-sticky-regex": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { "babel-helper-regex": "^6.24.1", @@ -1028,6 +1109,7 @@ }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { "babel-runtime": "^6.22.0" @@ -1035,6 +1117,7 @@ }, "babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { "babel-runtime": "^6.22.0" @@ -1042,6 +1125,7 @@ }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { "babel-helper-regex": "^6.24.1", @@ -1051,6 +1135,7 @@ }, "babel-plugin-transform-exponentiation-operator": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", @@ -1060,6 +1145,7 @@ }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { "babel-plugin-syntax-flow": "^6.18.0", @@ -1068,6 +1154,7 @@ }, "babel-plugin-transform-object-rest-spread": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", "requires": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", @@ -1076,6 +1163,7 @@ }, "babel-plugin-transform-react-constant-elements": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { "babel-runtime": "^6.22.0" @@ -1083,6 +1171,7 @@ }, "babel-plugin-transform-react-display-name": { "version": "6.25.0", + "resolved": false, "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { "babel-runtime": "^6.22.0" @@ -1090,6 +1179,7 @@ }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { "babel-helper-builder-react-jsx": "^6.24.1", @@ -1099,6 +1189,7 @@ }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { "babel-plugin-syntax-jsx": "^6.8.0", @@ -1107,6 +1198,7 @@ }, "babel-plugin-transform-react-jsx-source": { "version": "6.22.0", + "resolved": false, "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { "babel-plugin-syntax-jsx": "^6.8.0", @@ -1115,6 +1207,7 @@ }, "babel-plugin-transform-regenerator": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", "requires": { "regenerator-transform": "0.9.11" @@ -1122,6 +1215,7 @@ }, "babel-plugin-transform-runtime": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { "babel-runtime": "^6.22.0" @@ -1129,6 +1223,7 @@ }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { "babel-runtime": "^6.22.0", @@ -1137,6 +1232,7 @@ }, "babel-preset-env": { "version": "1.5.2", + "resolved": false, "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", "requires": { "babel-plugin-check-es2015-constants": "^6.22.0", @@ -1173,6 +1269,7 @@ }, "babel-preset-flow": { "version": "6.23.0", + "resolved": false, "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { "babel-plugin-transform-flow-strip-types": "^6.22.0" @@ -1180,6 +1277,7 @@ }, "babel-preset-jest": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { "babel-plugin-jest-hoist": "^20.0.3" @@ -1187,6 +1285,7 @@ }, "babel-preset-react": { "version": "6.24.1", + "resolved": false, "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { "babel-plugin-syntax-jsx": "^6.3.13", @@ -1198,7 +1297,8 @@ } }, "babel-preset-react-app": { - "version": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", "integrity": "sha512-YjvnkyvQ0lbqzDd+iG2638Eloy8FtPkkhG6Brv3x8UBHFCC1V25KuUrJqAlKMrANIqyccjrKS9YyanjSJ7EySg==", "requires": { "babel-plugin-dynamic-import-node": "1.0.2", @@ -1282,17 +1382,18 @@ } }, "babel-runtime": { - "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha512-9Vdluea/MpskdLsLYTH10Wtc5z2U0THGHVJeqec0EHUbfEt2q3zM1piQ+/GjMl9h0drUY1hF8zHV9nmH8Kl+Og==", + "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.10.0" + "regenerator-runtime": "^0.11.0" }, "dependencies": { "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" } } }, @@ -1405,6 +1506,7 @@ }, "balanced-match": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { @@ -1457,6 +1559,11 @@ } } }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, "base64-js": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", @@ -1464,10 +1571,12 @@ }, "batch": { "version": "0.6.1", + "resolved": false, "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { @@ -1513,6 +1622,7 @@ }, "bonjour": { "version": "3.5.0", + "resolved": false, "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { "array-flatten": "^2.1.0", @@ -1525,6 +1635,7 @@ }, "boolbase": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boom": { @@ -1536,7 +1647,8 @@ } }, "bootstrap": { - "version": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" }, "boxen": { @@ -1635,10 +1747,12 @@ }, "brorand": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-resolve": { "version": "1.11.2", + "resolved": false, "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", "requires": { "resolve": "1.1.7" @@ -1646,6 +1760,7 @@ "dependencies": { "resolve": { "version": "1.1.7", + "resolved": false, "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } @@ -1685,6 +1800,7 @@ }, "browserify-rsa": { "version": "4.0.1", + "resolved": false, "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { "bn.js": "^4.1.0", @@ -1693,6 +1809,7 @@ }, "browserify-sign": { "version": "4.0.4", + "resolved": false, "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { "bn.js": "^4.1.1", @@ -1723,6 +1840,7 @@ }, "bser": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { "node-int64": "^0.4.0" @@ -1730,6 +1848,7 @@ }, "buffer": { "version": "4.9.1", + "resolved": false, "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -1749,14 +1868,17 @@ }, "buffer-xor": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { @@ -1782,6 +1904,7 @@ }, "caller-path": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { "callsites": "^0.2.0" @@ -1789,10 +1912,12 @@ }, "callsites": { "version": "0.2.0", + "resolved": false, "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" }, "camel-case": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { "no-case": "^2.2.0", @@ -1801,10 +1926,12 @@ }, "camelcase": { "version": "1.2.1", + "resolved": false, "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "camelcase-keys": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { "camelcase": "^2.0.0", @@ -1813,12 +1940,14 @@ "dependencies": { "camelcase": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" } } }, "caniuse-api": { "version": "1.6.1", + "resolved": false, "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { "browserslist": "^1.3.6", @@ -1829,6 +1958,7 @@ "dependencies": { "browserslist": { "version": "1.7.7", + "resolved": false, "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { "caniuse-db": "^1.0.30000639", @@ -1849,18 +1979,22 @@ }, "capture-stack-trace": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "case-sensitive-paths-webpack-plugin": { - "version": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", - "integrity": "sha512-Zg7Z9IuE0T+Ilg+o0IVpZXHAcN6VHO80BVxak3RIB1pmcbiITr06WlZ45Xa/KGQ7fQ/ar6C1KEkeI93tojBJPQ==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", + "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=" }, "caseless": { "version": "0.12.0", + "resolved": false, "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", + "resolved": false, "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { "align-text": "^0.1.3", @@ -1923,8 +2057,9 @@ } }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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", @@ -1940,6 +2075,7 @@ }, "supports-color": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } @@ -2522,7 +2658,8 @@ } }, "classnames": { - "version": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" }, "clean-css": { @@ -2542,10 +2679,12 @@ }, "cli-boxes": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "requires": { "restore-cursor": "^1.0.1" @@ -2558,6 +2697,7 @@ }, "cliui": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { "center-align": "^0.1.1", @@ -2567,6 +2707,7 @@ "dependencies": { "wordwrap": { "version": "0.0.2", + "resolved": false, "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } @@ -2578,10 +2719,12 @@ }, "co": { "version": "4.6.0", + "resolved": false, "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { "q": "^1.1.2" @@ -2589,6 +2732,7 @@ }, "code-point-at": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { @@ -2602,6 +2746,7 @@ }, "color": { "version": "0.11.4", + "resolved": false, "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { "clone": "^1.0.2", @@ -2619,10 +2764,12 @@ }, "color-name": { "version": "1.1.3", + "resolved": false, "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "0.3.0", + "resolved": false, "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { "color-name": "^1.0.0" @@ -2630,6 +2777,7 @@ }, "colormin": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { "color": "^0.11.0", @@ -2639,6 +2787,7 @@ }, "colors": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { @@ -2656,6 +2805,7 @@ }, "commondir": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "compare-versions": { @@ -2692,6 +2842,7 @@ }, "concat-map": { "version": "0.0.1", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -2725,6 +2876,7 @@ }, "console-browserify": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { "date-now": "^0.1.4" @@ -2732,14 +2884,17 @@ }, "constants-browserify": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, "content-disposition": { "version": "0.5.2", + "resolved": false, "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { @@ -2759,10 +2914,12 @@ }, "cookie": { "version": "0.3.1", + "resolved": false, "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", + "resolved": false, "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-descriptor": { @@ -2771,11 +2928,13 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "version": "1.2.7", + "resolved": false, "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, "core-util-is": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { @@ -2794,6 +2953,7 @@ "dependencies": { "minimist": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2809,6 +2969,7 @@ }, "create-error-class": { "version": "3.0.2", + "resolved": false, "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" @@ -2841,6 +3002,7 @@ }, "cross-spawn": { "version": "4.0.2", + "resolved": false, "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "requires": { "lru-cache": "^4.0.1", @@ -2890,10 +3052,12 @@ }, "css-color-names": { "version": "0.0.4", + "resolved": false, "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, "css-loader": { - "version": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", + "version": "0.28.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", "integrity": "sha512-umVjsx1rY6Nozzi01Ni32aicDaZ6fBgMC8X3Xk1hqFgYpS5k3YT30K8cqMVVX8YKpkjMCDDdsQ07uLZCShSAmQ==", "requires": { "babel-code-frame": "^6.11.0", @@ -2914,6 +3078,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -2934,6 +3099,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -2943,6 +3109,7 @@ }, "css-select": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { "boolbase": "~1.0.0", @@ -2953,6 +3120,7 @@ }, "css-selector-tokenizer": { "version": "0.7.0", + "resolved": false, "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { "cssesc": "^0.1.0", @@ -2962,6 +3130,7 @@ "dependencies": { "regexpu-core": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { "regenerate": "^1.2.1", @@ -2973,14 +3142,17 @@ }, "css-what": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "cssesc": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" }, "cssnano": { "version": "3.10.0", + "resolved": false, "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { "autoprefixer": "^6.3.1", @@ -3019,6 +3191,7 @@ "dependencies": { "autoprefixer": { "version": "6.7.7", + "resolved": false, "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { "browserslist": "^1.7.6", @@ -3031,6 +3204,7 @@ }, "browserslist": { "version": "1.7.7", + "resolved": false, "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { "caniuse-db": "^1.0.30000639", @@ -3039,6 +3213,7 @@ }, "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -3059,6 +3234,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -3068,6 +3244,7 @@ }, "csso": { "version": "2.3.2", + "resolved": false, "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { "clap": "^1.0.9", @@ -3083,10 +3260,12 @@ }, "cssom": { "version": "0.3.2", + "resolved": false, "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" }, "cssstyle": { "version": "0.2.37", + "resolved": false, "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { "cssom": "0.3.x" @@ -3094,6 +3273,7 @@ }, "currently-unhandled": { "version": "0.4.1", + "resolved": false, "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { "array-find-index": "^1.0.1" @@ -3101,13 +3281,15 @@ }, "d": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { "es5-ext": "^0.10.9" } }, "d3": { - "version": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "version": "3.5.17", + "resolved": false, "integrity": "sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==" }, "d3-array": { @@ -3116,11 +3298,13 @@ "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" }, "d3-axis": { - "version": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" }, "d3-path": { - "version": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", + "version": "1.0.5", + "resolved": false, "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" }, "d3-scale": { @@ -3173,7 +3357,8 @@ "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" }, "d3-shape": { - "version": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { "d3-path": "1" @@ -3196,10 +3381,12 @@ }, "damerau-levenshtein": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" }, "dashdash": { "version": "1.14.1", + "resolved": false, "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" @@ -3207,6 +3394,7 @@ }, "date-now": { "version": "0.1.4", + "resolved": false, "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, "debug": { @@ -3219,6 +3407,7 @@ }, "decamelize": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { @@ -3228,18 +3417,22 @@ }, "deep-equal": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deep-extend": { "version": "0.4.2", + "resolved": false, "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "deep-is": { "version": "0.1.3", + "resolved": false, "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-require-extensions": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "requires": { "strip-bom": "^2.0.0" @@ -3247,6 +3440,7 @@ }, "define-properties": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { "foreach": "^2.0.5", @@ -3292,10 +3486,12 @@ }, "defined": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { "version": "2.2.2", + "resolved": false, "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { "globby": "^5.0.0", @@ -3309,6 +3505,7 @@ }, "delayed-stream": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { @@ -3318,6 +3515,7 @@ }, "des.js": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { "inherits": "^2.0.1", @@ -3326,10 +3524,12 @@ }, "destroy": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", + "resolved": false, "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { "repeating": "^2.0.0" @@ -3337,10 +3537,12 @@ }, "detect-node": { "version": "2.0.3", + "resolved": false, "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" }, "detect-port-alt": { "version": "1.1.3", + "resolved": false, "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", "requires": { "address": "^1.0.1", @@ -3364,6 +3566,7 @@ }, "dns-equal": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { @@ -3377,6 +3580,7 @@ }, "dns-txt": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { "buffer-indexof": "^1.0.0" @@ -3392,6 +3596,7 @@ }, "dom-converter": { "version": "0.1.4", + "resolved": false, "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { "utila": "~0.3" @@ -3399,6 +3604,7 @@ "dependencies": { "utila": { "version": "0.3.3", + "resolved": false, "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } @@ -3410,6 +3616,7 @@ }, "dom-serializer": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { "domelementtype": "~1.1.1", @@ -3418,12 +3625,14 @@ "dependencies": { "domelementtype": { "version": "1.1.3", + "resolved": false, "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, "dom-urls": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { "urijs": "^1.16.1" @@ -3436,10 +3645,12 @@ }, "domelementtype": { "version": "1.3.0", + "resolved": false, "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domhandler": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { "domelementtype": "1" @@ -3447,6 +3658,7 @@ }, "domutils": { "version": "1.5.1", + "resolved": false, "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { "dom-serializer": "0", @@ -3462,11 +3674,13 @@ } }, "dotenv": { - "version": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" }, "duplexer": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, "duplexer3": { @@ -3476,6 +3690,7 @@ }, "ecc-jsbn": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { @@ -3484,6 +3699,7 @@ }, "ee-first": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { @@ -3493,6 +3709,7 @@ }, "elliptic": { "version": "6.4.0", + "resolved": false, "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { "bn.js": "^4.4.0", @@ -3511,6 +3728,7 @@ }, "emojis-list": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { @@ -3520,6 +3738,7 @@ }, "encoding": { "version": "0.1.12", + "resolved": false, "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" @@ -3537,6 +3756,7 @@ }, "enhanced-resolve": { "version": "3.4.1", + "resolved": false, "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { "graceful-fs": "^4.1.2", @@ -3547,6 +3767,7 @@ }, "entities": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "errno": { @@ -3559,6 +3780,7 @@ }, "error-ex": { "version": "1.3.1", + "resolved": false, "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { "is-arrayish": "^0.2.1" @@ -3578,6 +3800,7 @@ }, "es-to-primitive": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { "is-callable": "^1.1.1", @@ -3607,6 +3830,7 @@ }, "es6-map": { "version": "0.1.5", + "resolved": false, "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { "d": "1", @@ -3624,6 +3848,7 @@ }, "es6-set": { "version": "0.1.5", + "resolved": false, "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { "d": "1", @@ -3635,6 +3860,7 @@ }, "es6-symbol": { "version": "3.1.1", + "resolved": false, "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { "d": "1", @@ -3643,6 +3869,7 @@ }, "es6-weak-map": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { "d": "1", @@ -3653,10 +3880,12 @@ }, "escape-html": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", + "resolved": false, "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { @@ -3680,6 +3909,7 @@ }, "escope": { "version": "3.6.0", + "resolved": false, "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { "es6-map": "^0.1.3", @@ -3689,7 +3919,8 @@ } }, "eslint": { - "version": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha512-x6LJGXWCGB/4YOBhL48yeppZTo+YQUNC37N5qqCpC1b1kkNzydlQHQAtPuUSFoZSxgIadrysQoW2Hq602P+uEA==", "requires": { "babel-code-frame": "^6.16.0", @@ -3731,16 +3962,19 @@ "dependencies": { "strip-bom": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "eslint-config-react-app": { - "version": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", "integrity": "sha512-nA3AYTMUGKVYH1goOp72fFdj33mxC1rElATOLDrCMbbhmtVz4K61NxKBc6vj9OwjugROioF2LYXZMZIFAfFozA==" }, "eslint-import-resolver-node": { "version": "0.2.3", + "resolved": false, "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "requires": { "debug": "^2.2.0", @@ -3749,7 +3983,8 @@ } }, "eslint-loader": { - "version": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", "integrity": "sha512-4xbtW4Zo5Xpg8fBcx0z4VvWVhdrJJazcNa8yTGrXc4tuppNJEFn5qI/crMORetebvuqkM1W6UhZVKwLklxoSdA==", "requires": { "find-cache-dir": "^0.1.1", @@ -3770,14 +4005,16 @@ } }, "eslint-plugin-flowtype": { - "version": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", "integrity": "sha512-a8EGMRsWMqQe7hScFqrg7GytNazT8LaT8dUWRwxeLkFwE1XuSeNxzGeQn86lX9V756HpDvACLk+SdRz3u9ALmA==", "requires": { "lodash": "^4.15.0" } }, "eslint-plugin-import": { - "version": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", "integrity": "sha512-8HLeIYzOH4eltevxf+iC9Dtz/91yaeOqtlba5srcpQWLrv57F5NNG1RNLqAbpWJWDD4BxKuKjUveJY9W6Tbswg==", "requires": { "builtin-modules": "^1.1.1", @@ -3794,6 +4031,7 @@ "dependencies": { "doctrine": { "version": "1.5.0", + "resolved": false, "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { "esutils": "^2.0.2", @@ -3803,7 +4041,8 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", "integrity": "sha512-YNIrEw8cepPQlHcPUKLbJF9R4O4duG7ZGZuT0L+jYVdsRmBb6klnpYI0XnuEK3qMirTuuovb4Lg6+Scy4BCwaA==", "requires": { "aria-query": "^0.5.0", @@ -3816,7 +4055,8 @@ } }, "eslint-plugin-react": { - "version": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", "integrity": "sha512-lErfLh7LnbGOnLku3CS6Deep3PJwg8+mwK40PRYQ6ACvZuAGUAt7mI76dCJKDJbfvmctg6dOq41baMVY+xWFEg==", "requires": { "doctrine": "^2.0.0", @@ -3835,6 +4075,7 @@ }, "esprima": { "version": "2.7.3", + "resolved": false, "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" }, "esquery": { @@ -3855,10 +4096,12 @@ }, "estraverse": { "version": "4.2.0", + "resolved": false, "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { @@ -3868,6 +4111,7 @@ }, "event-emitter": { "version": "0.3.5", + "resolved": false, "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { "d": "1", @@ -3876,14 +4120,17 @@ }, "eventemitter3": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" }, "events": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { "version": "0.1.6", + "resolved": false, "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { "original": ">=0.0.5" @@ -3934,6 +4181,7 @@ }, "exit-hook": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" }, "expand-brackets": { @@ -3970,6 +4218,7 @@ }, "expand-range": { "version": "1.8.2", + "resolved": false, "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { "fill-range": "^2.1.0" @@ -4052,16 +4301,19 @@ "dependencies": { "array-flatten": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "path-to-regexp": { "version": "0.1.7", + "resolved": false, "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" } } }, "extend": { "version": "3.0.1", + "resolved": false, "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "extend-shallow": { @@ -4153,7 +4405,8 @@ } }, "extract-text-webpack-plugin": { - "version": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", "integrity": "sha512-Dv5Y7okQmgFQiKJUuitKYnmnMOT3Sfg47k/AakBA5a4Wl8QBGZy+Yep0IZxUu5OwktdpaY49mvvoudaKbzbzlA==", "requires": { "async": "^2.1.2", @@ -4179,14 +4432,17 @@ }, "fast-levenshtein": { "version": "2.0.6", + "resolved": false, "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastparse": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" }, "faye-websocket": { "version": "0.11.1", + "resolved": false, "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { "websocket-driver": ">=0.5.1" @@ -4194,20 +4450,23 @@ }, "fb-watchman": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "requires": { "bser": "^2.0.0" } }, "fbemitter": { - "version": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "version": "2.1.1", + "resolved": false, "integrity": "sha512-hd8PgD+Q6RQtlcGrkM9oY3MFIjq6CA6wurCK1TKn2eaA76Ww4VAOihmq98NyjRhjJi/axgznZnh9lF8+TcTsNQ==", "requires": { "fbjs": "^0.8.4" } }, "fbjs": { - "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "version": "0.8.12", + "resolved": false, "integrity": "sha512-SBiP6XPiWIlX1tE5mvU/UeUFoqzJgbf+ezkl0M8D2xk4urDb+2uyjjGB10HAPluLboUqqVHtgUwwyuWakUfMgQ==", "requires": { "core-js": "^1.0.0", @@ -4228,6 +4487,7 @@ }, "figures": { "version": "1.7.0", + "resolved": false, "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "requires": { "escape-string-regexp": "^1.0.5", @@ -4236,6 +4496,7 @@ }, "file-entry-cache": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { "flat-cache": "^1.2.1", @@ -4243,7 +4504,8 @@ } }, "file-loader": { - "version": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", "requires": { "loader-utils": "^1.0.2" @@ -4256,10 +4518,12 @@ }, "filename-regex": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fileset": { "version": "2.0.3", + "resolved": false, "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { "glob": "^7.0.3", @@ -4268,6 +4532,7 @@ }, "filesize": { "version": "3.3.0", + "resolved": false, "integrity": "sha1-UxSeo0YOOy4CSWKlFkiqVyz5gSI=" }, "fill-range": { @@ -4307,6 +4572,7 @@ }, "find-cache-dir": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { "commondir": "^1.0.1", @@ -4316,6 +4582,7 @@ }, "find-up": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { "locate-path": "^2.0.0" @@ -4334,10 +4601,12 @@ }, "flatten": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, "flux": { - "version": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", "integrity": "sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io=", "requires": { "fbemitter": "^2.0.0", @@ -4346,10 +4615,12 @@ }, "for-in": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", + "resolved": false, "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { "for-in": "^1.0.1" @@ -4357,10 +4628,12 @@ }, "foreach": { "version": "2.0.5", + "resolved": false, "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { "version": "0.6.1", + "resolved": false, "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { @@ -4392,8 +4665,9 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-extra": { - "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^3.0.0", @@ -4402,6 +4676,7 @@ }, "fs.realpath": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fullscreen": { @@ -4424,10 +4699,12 @@ }, "generate-function": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" }, "generate-object-property": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "requires": { "is-property": "^1.0.0" @@ -4435,10 +4712,12 @@ }, "get-caller-file": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-stdin": { "version": "4.0.1", + "resolved": false, "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { @@ -4453,6 +4732,7 @@ }, "getpass": { "version": "0.1.7", + "resolved": false, "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "^1.0.0" @@ -4473,6 +4753,7 @@ }, "glob-base": { "version": "0.3.0", + "resolved": false, "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { "glob-parent": "^2.0.0", @@ -4481,6 +4762,7 @@ }, "glob-parent": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { "is-glob": "^2.0.0" @@ -4501,6 +4783,7 @@ }, "globby": { "version": "5.0.0", + "resolved": false, "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { "array-union": "^1.0.1", @@ -4531,14 +4814,17 @@ }, "graceful-fs": { "version": "4.1.11", + "resolved": false, "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growly": { "version": "1.3.0", + "resolved": false, "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gzip-size": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { "duplexer": "^0.1.1" @@ -4546,6 +4832,7 @@ }, "handle-thing": { "version": "1.2.5", + "resolved": false, "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" }, "handlebars": { @@ -4561,10 +4848,12 @@ "dependencies": { "async": { "version": "1.5.2", + "resolved": false, "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "source-map": { "version": "0.4.4", + "resolved": false, "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { "amdefine": ">=0.0.4" @@ -4572,6 +4861,7 @@ }, "uglify-js": { "version": "2.8.29", + "resolved": false, "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { @@ -4590,6 +4880,7 @@ }, "yargs": { "version": "3.10.0", + "resolved": false, "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { @@ -4630,6 +4921,7 @@ }, "has": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "requires": { "function-bind": "^1.0.2" @@ -4637,6 +4929,7 @@ }, "has-ansi": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -4707,10 +5000,12 @@ }, "he": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", @@ -4725,10 +5020,12 @@ }, "hoist-non-react-statics": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, "home-or-tmp": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { "os-homedir": "^1.0.0", @@ -4742,6 +5039,7 @@ }, "hpack.js": { "version": "2.1.6", + "resolved": false, "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { "inherits": "^2.0.1", @@ -4752,6 +5050,7 @@ }, "html-comment-regex": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" }, "html-encoding-sniffer": { @@ -4764,6 +5063,7 @@ }, "html-entities": { "version": "1.2.1", + "resolved": false, "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { @@ -4781,8 +5081,9 @@ } }, "html-webpack-plugin": { - "version": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", - "integrity": "sha512-XgOxN8H7nDeLQzD9FQOWWQLVL0GDq5reeREx8jpLZcEZND7kM5j3o/mFhjOcSfZ89HwU3+yBqSQyK7ZvvYFZ/w==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", + "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", "requires": { "bluebird": "^3.4.7", "html-minifier": "^3.2.3", @@ -4794,6 +5095,7 @@ "dependencies": { "loader-utils": { "version": "0.2.17", + "resolved": false, "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { "big.js": "^3.1.3", @@ -4806,6 +5108,7 @@ }, "htmlparser2": { "version": "3.3.0", + "resolved": false, "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { "domelementtype": "1", @@ -4816,6 +5119,7 @@ "dependencies": { "domutils": { "version": "1.1.6", + "resolved": false, "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { "domelementtype": "1" @@ -4823,10 +5127,12 @@ }, "isarray": { "version": "0.0.1", + "resolved": false, "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.0.34", + "resolved": false, "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { "core-util-is": "~1.0.0", @@ -4837,12 +5143,14 @@ }, "string_decoder": { "version": "0.10.31", + "resolved": false, "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, "http-deceiver": { "version": "1.2.7", + "resolved": false, "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { @@ -4863,6 +5171,7 @@ }, "http-proxy": { "version": "1.16.2", + "resolved": false, "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "requires": { "eventemitter3": "1.x.x", @@ -4871,6 +5180,7 @@ }, "http-proxy-middleware": { "version": "0.17.4", + "resolved": false, "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { "http-proxy": "^1.16.2", @@ -4927,10 +5237,12 @@ }, "is-extglob": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "3.1.0", + "resolved": false, "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { "is-extglob": "^2.1.0" @@ -5003,10 +5315,12 @@ }, "icss-replace-symbols": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" }, "icss-utils": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { "postcss": "^6.0.1" @@ -5034,10 +5348,12 @@ }, "imurmurhash": { "version": "0.1.4", + "resolved": false, "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { "repeating": "^2.0.0" @@ -5045,14 +5361,17 @@ }, "indexes-of": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, "indexof": { "version": "0.0.1", + "resolved": false, "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inflight": { "version": "1.0.6", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", @@ -5061,6 +5380,7 @@ }, "inherits": { "version": "2.0.3", + "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { @@ -5070,6 +5390,7 @@ }, "inquirer": { "version": "0.12.0", + "resolved": false, "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "requires": { "ansi-escapes": "^1.1.0", @@ -5089,6 +5410,7 @@ }, "internal-ip": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { "meow": "^3.3.0" @@ -5109,10 +5431,12 @@ }, "invert-kv": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", + "resolved": false, "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { @@ -5122,6 +5446,7 @@ }, "is-absolute-url": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, "is-accessor-descriptor": { @@ -5144,10 +5469,12 @@ }, "is-arrayish": { "version": "0.2.1", + "resolved": false, "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { "binary-extensions": "^1.0.0" @@ -5160,6 +5487,7 @@ }, "is-builtin-module": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -5167,6 +5495,7 @@ }, "is-callable": { "version": "1.1.3", + "resolved": false, "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" }, "is-ci": { @@ -5197,6 +5526,7 @@ }, "is-date-object": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-descriptor": { @@ -5218,14 +5548,17 @@ }, "is-directory": { "version": "0.3.1", + "resolved": false, "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-dotfile": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", + "resolved": false, "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { "is-primitive": "^2.0.0" @@ -5233,14 +5566,17 @@ }, "is-extendable": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-finite": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { "number-is-nan": "^1.0.0" @@ -5248,6 +5584,7 @@ }, "is-fullwidth-code-point": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -5255,6 +5592,7 @@ }, "is-glob": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { "is-extglob": "^1.0.0" @@ -5288,6 +5626,7 @@ }, "is-npm": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-number": { @@ -5310,6 +5649,7 @@ }, "is-obj": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-odd": { @@ -5329,6 +5669,7 @@ }, "is-path-cwd": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" }, "is-path-in-cwd": { @@ -5349,6 +5690,7 @@ }, "is-plain-obj": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { @@ -5361,26 +5703,32 @@ }, "is-posix-bracket": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-property": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, "is-redirect": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { "has": "^1.0.1" @@ -5393,18 +5741,22 @@ }, "is-retry-allowed": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-root": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" }, "is-stream": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { "html-comment-regex": "^1.1.0" @@ -5412,14 +5764,17 @@ }, "is-symbol": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" }, "is-typedarray": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", + "resolved": false, "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-windows": { @@ -5429,14 +5784,17 @@ }, "is-wsl": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { @@ -5445,7 +5803,8 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { - "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "version": "2.2.1", + "resolved": false, "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { "node-fetch": "^1.0.1", @@ -5454,6 +5813,7 @@ }, "isstream": { "version": "0.1.2", + "resolved": false, "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-api": { @@ -5542,10 +5902,12 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -5589,8 +5951,9 @@ } }, "jest": { - "version": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "integrity": "sha512-MU1kGBtzhDHwasL1BbuFmlIlwseDXy18p/M3hB7ehifac8FCbj6nJf8ihGtBA594tlUcktotHHd8z42V47ZB1g==", + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", + "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", "requires": { "jest-cli": "^20.0.4" }, @@ -5620,6 +5983,7 @@ }, "callsites": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "expand-brackets": { @@ -5640,6 +6004,7 @@ }, "jest-cli": { "version": "20.0.4", + "resolved": false, "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { "ansi-escapes": "^1.4.0", @@ -5706,10 +6071,12 @@ }, "jest-changed-files": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" }, "jest-config": { "version": "20.0.4", + "resolved": false, "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { "chalk": "^1.1.3", @@ -5726,6 +6093,7 @@ }, "jest-diff": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { "chalk": "^1.1.3", @@ -5736,10 +6104,12 @@ }, "jest-docblock": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" }, "jest-environment-jsdom": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { "jest-mock": "^20.0.3", @@ -5749,6 +6119,7 @@ }, "jest-environment-node": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { "jest-mock": "^20.0.3", @@ -5839,6 +6210,7 @@ }, "jest-jasmine2": { "version": "20.0.4", + "resolved": false, "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { "chalk": "^1.1.3", @@ -5854,6 +6226,7 @@ }, "jest-matcher-utils": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { "chalk": "^1.1.3", @@ -5862,6 +6235,7 @@ }, "jest-matchers": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { "jest-diff": "^20.0.3", @@ -5872,6 +6246,7 @@ }, "jest-message-util": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { "chalk": "^1.1.3", @@ -5950,14 +6325,17 @@ }, "jest-mock": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" }, "jest-regex-util": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" }, "jest-resolve": { "version": "20.0.4", + "resolved": false, "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { "browser-resolve": "^1.11.2", @@ -5967,6 +6345,7 @@ }, "jest-resolve-dependencies": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { "jest-regex-util": "^20.0.3" @@ -5974,6 +6353,7 @@ }, "jest-runtime": { "version": "20.0.4", + "resolved": false, "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { "babel-core": "^6.0.0", @@ -6062,12 +6442,14 @@ }, "strip-bom": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "jest-snapshot": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { "chalk": "^1.1.3", @@ -6080,6 +6462,7 @@ }, "jest-util": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { "chalk": "^1.1.3", @@ -6093,6 +6476,7 @@ }, "jest-validate": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { "chalk": "^1.1.3", @@ -6107,11 +6491,13 @@ "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" }, "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "version": "3.0.2", + "resolved": false, "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" }, "js-yaml": { "version": "3.7.0", + "resolved": false, "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { "argparse": "^1.0.7", @@ -6120,11 +6506,13 @@ }, "jsbn": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "jsdom": { "version": "9.12.0", + "resolved": false, "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { "abab": "^1.0.3", @@ -6150,12 +6538,14 @@ "dependencies": { "acorn": { "version": "4.0.13", + "resolved": false, "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "jsesc": { "version": "1.3.0", + "resolved": false, "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" }, "json-loader": { @@ -6165,14 +6555,17 @@ }, "json-schema": { "version": "0.2.3", + "resolved": false, "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", + "resolved": false, "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" @@ -6180,18 +6573,22 @@ }, "json-stringify-safe": { "version": "5.0.1", + "resolved": false, "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.2", + "resolved": false, "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { "version": "0.5.1", + "resolved": false, "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { "version": "3.0.1", + "resolved": false, "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { "graceful-fs": "^4.1.6" @@ -6199,10 +6596,12 @@ }, "jsonify": { "version": "0.0.0", + "resolved": false, "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsonpointer": { "version": "4.0.1", + "resolved": false, "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, "jsprim": { @@ -6218,6 +6617,7 @@ }, "jsx-ast-utils": { "version": "1.4.1", + "resolved": false, "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" }, "kind-of": { @@ -6227,6 +6627,7 @@ }, "klaw": { "version": "1.3.1", + "resolved": false, "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { "graceful-fs": "^4.1.9" @@ -6242,10 +6643,12 @@ }, "lazy-cache": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { "invert-kv": "^1.0.0" @@ -6253,10 +6656,12 @@ }, "leven": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { "version": "0.3.0", + "resolved": false, "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { "prelude-ls": "~1.1.2", @@ -6265,6 +6670,7 @@ }, "load-json-file": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { "graceful-fs": "^4.1.2", @@ -6276,6 +6682,7 @@ }, "loader-fs-cache": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "requires": { "find-cache-dir": "^0.1.1", @@ -6284,10 +6691,12 @@ }, "loader-runner": { "version": "2.3.0", + "resolved": false, "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" }, "loader-utils": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { "big.js": "^3.1.3", @@ -6297,6 +6706,7 @@ }, "locate-path": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { "p-locate": "^2.0.0", @@ -6310,30 +6720,47 @@ }, "lodash._reinterpolate": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, "lodash.camelcase": { "version": "4.3.0", + "resolved": false, "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, "lodash.cond": { "version": "4.5.2", + "resolved": false, "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, "lodash.defaults": { "version": "4.2.0", + "resolved": false, "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, "lodash.isequal": { - "version": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "version": "4.5.0", + "resolved": false, "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "lodash.memoize": { "version": "4.1.2", + "resolved": false, "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, "lodash.template": { "version": "4.4.0", + "resolved": false, "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { "lodash._reinterpolate": "~3.0.0", @@ -6342,6 +6769,7 @@ }, "lodash.templatesettings": { "version": "4.1.0", + "resolved": false, "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { "lodash._reinterpolate": "~3.0.0" @@ -6349,18 +6777,22 @@ }, "lodash.throttle": { "version": "4.1.1", + "resolved": false, "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "lodash.uniq": { "version": "4.5.0", + "resolved": false, "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "longest": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "version": "1.3.1", + "resolved": false, "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { "js-tokens": "^3.0.0" @@ -6368,6 +6800,7 @@ }, "loud-rejection": { "version": "1.6.0", + "resolved": false, "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { "currently-unhandled": "^0.4.1", @@ -6376,6 +6809,7 @@ }, "lower-case": { "version": "1.1.4", + "resolved": false, "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lowercase-keys": { @@ -6394,6 +6828,7 @@ }, "macaddress": { "version": "0.2.8", + "resolved": false, "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" }, "make-dir": { @@ -6413,6 +6848,7 @@ }, "makeerror": { "version": "1.0.11", + "resolved": false, "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { "tmpl": "1.0.x" @@ -6425,6 +6861,7 @@ }, "map-obj": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-visit": { @@ -6437,6 +6874,7 @@ }, "math-expression-evaluator": { "version": "1.2.17", + "resolved": false, "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, "md5.js": { @@ -6450,10 +6888,12 @@ }, "media-typer": { "version": "0.3.0", + "resolved": false, "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memory-fs": { "version": "0.4.1", + "resolved": false, "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { "errno": "^0.1.3", @@ -6462,6 +6902,7 @@ }, "meow": { "version": "3.7.0", + "resolved": false, "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { "camelcase-keys": "^2.0.0", @@ -6478,20 +6919,24 @@ "dependencies": { "minimist": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "merge": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" }, "merge-descriptors": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { @@ -6525,6 +6970,7 @@ }, "mime": { "version": "1.3.6", + "resolved": false, "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" }, "mime-db": { @@ -6552,6 +6998,7 @@ }, "minimalistic-crypto-utils": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { @@ -6564,6 +7011,7 @@ }, "minimist": { "version": "0.0.8", + "resolved": false, "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { @@ -6587,6 +7035,7 @@ }, "mkdirp": { "version": "0.5.1", + "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -6594,6 +7043,7 @@ }, "ms": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { @@ -6607,10 +7057,12 @@ }, "multicast-dns-service-types": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { "version": "0.0.5", + "resolved": false, "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" }, "nan": { @@ -6640,10 +7092,12 @@ }, "natural-compare": { "version": "1.4.0", + "resolved": false, "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { "version": "0.6.1", + "resolved": false, "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { @@ -6665,7 +7119,8 @@ } }, "node-fetch": { - "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", + "version": "1.7.1", + "resolved": false, "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", "requires": { "encoding": "^0.1.11", @@ -6686,6 +7141,7 @@ }, "node-int64": { "version": "0.4.0", + "resolved": false, "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { @@ -6742,6 +7198,7 @@ }, "normalize-path": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { "remove-trailing-separator": "^1.0.1" @@ -6749,10 +7206,12 @@ }, "normalize-range": { "version": "0.1.2", + "resolved": false, "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { "version": "1.9.1", + "resolved": false, "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { "object-assign": "^4.0.1", @@ -6771,6 +7230,7 @@ }, "nth-check": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { "boolbase": "~1.0.0" @@ -6778,10 +7238,12 @@ }, "num2fraction": { "version": "1.2.2", + "resolved": false, "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, "number-is-nan": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwmatcher": { @@ -6791,10 +7253,12 @@ }, "oauth-sign": { "version": "0.8.2", + "resolved": false, "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -6832,6 +7296,7 @@ }, "object-keys": { "version": "1.0.11", + "resolved": false, "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, "object-visit": { @@ -6844,6 +7309,7 @@ }, "object.omit": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { "for-own": "^0.1.4", @@ -6865,6 +7331,7 @@ }, "on-finished": { "version": "2.3.0", + "resolved": false, "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" @@ -6872,10 +7339,12 @@ }, "on-headers": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" }, "once": { "version": "1.4.0", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" @@ -6883,6 +7352,7 @@ }, "onetime": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "opn": { @@ -6895,6 +7365,7 @@ }, "optimist": { "version": "0.6.1", + "resolved": false, "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { "minimist": "~0.0.1", @@ -6903,12 +7374,14 @@ "dependencies": { "wordwrap": { "version": "0.0.3", + "resolved": false, "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, "optionator": { "version": "0.8.2", + "resolved": false, "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { "deep-is": "~0.1.3", @@ -6921,6 +7394,7 @@ }, "original": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "requires": { "url-parse": "1.0.x" @@ -6928,6 +7402,7 @@ "dependencies": { "url-parse": { "version": "1.0.5", + "resolved": false, "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "requires": { "querystringify": "0.0.x", @@ -6943,10 +7418,12 @@ }, "os-homedir": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "1.4.0", + "resolved": false, "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { "lcid": "^1.0.0" @@ -6954,6 +7431,7 @@ }, "os-tmpdir": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { @@ -6971,6 +7449,7 @@ }, "p-locate": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { "p-limit": "^1.1.0" @@ -7004,6 +7483,7 @@ }, "param-case": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { "no-case": "^2.2.0" @@ -7023,6 +7503,7 @@ }, "parse-glob": { "version": "3.0.4", + "resolved": false, "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { "glob-base": "^0.3.0", @@ -7033,6 +7514,7 @@ }, "parse-json": { "version": "2.2.0", + "resolved": false, "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { "error-ex": "^1.2.0" @@ -7040,6 +7522,7 @@ }, "parse5": { "version": "1.5.1", + "resolved": false, "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" }, "parseurl": { @@ -7054,6 +7537,7 @@ }, "path-browserify": { "version": "0.0.0", + "resolved": false, "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" }, "path-dirname": { @@ -7063,14 +7547,17 @@ }, "path-exists": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { @@ -7080,10 +7567,12 @@ }, "path-parse": { "version": "1.0.5", + "resolved": false, "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "path-to-regexp": { "version": "1.7.0", + "resolved": false, "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { "isarray": "0.0.1" @@ -7091,12 +7580,14 @@ "dependencies": { "isarray": { "version": "0.0.1", + "resolved": false, "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, "path-type": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { "graceful-fs": "^4.1.2", @@ -7118,18 +7609,22 @@ }, "performance-now": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", + "resolved": false, "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", + "resolved": false, "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { "pinkie": "^2.0.0" @@ -7137,6 +7632,7 @@ }, "pkg-dir": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { "find-up": "^1.0.0" @@ -7144,6 +7640,7 @@ "dependencies": { "find-up": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "^2.0.0", @@ -7152,6 +7649,7 @@ }, "path-exists": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { "pinkie-promise": "^2.0.0" @@ -7161,6 +7659,7 @@ }, "pkg-up": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", "requires": { "find-up": "^1.0.0" @@ -7168,6 +7667,7 @@ "dependencies": { "find-up": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "^2.0.0", @@ -7176,6 +7676,7 @@ }, "path-exists": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { "pinkie-promise": "^2.0.0" @@ -7185,10 +7686,12 @@ }, "pluralize": { "version": "1.2.1", + "resolved": false, "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" }, "portfinder": { "version": "1.0.13", + "resolved": false, "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { "async": "^1.5.2", @@ -7198,6 +7701,7 @@ "dependencies": { "async": { "version": "1.5.2", + "resolved": false, "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } @@ -7231,6 +7735,7 @@ }, "postcss-calc": { "version": "5.3.1", + "resolved": false, "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { "postcss": "^5.0.2", @@ -7240,6 +7745,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7260,6 +7766,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7269,6 +7776,7 @@ }, "postcss-colormin": { "version": "2.2.2", + "resolved": false, "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { "colormin": "^1.0.5", @@ -7278,6 +7786,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7298,6 +7807,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7307,6 +7817,7 @@ }, "postcss-convert-values": { "version": "2.6.1", + "resolved": false, "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { "postcss": "^5.0.11", @@ -7315,6 +7826,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7335,6 +7847,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7344,6 +7857,7 @@ }, "postcss-discard-comments": { "version": "2.0.4", + "resolved": false, "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { "postcss": "^5.0.14" @@ -7351,6 +7865,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7371,6 +7886,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7380,6 +7896,7 @@ }, "postcss-discard-duplicates": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { "postcss": "^5.0.4" @@ -7387,6 +7904,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7407,6 +7925,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7416,6 +7935,7 @@ }, "postcss-discard-empty": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { "postcss": "^5.0.14" @@ -7423,6 +7943,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7443,6 +7964,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7452,6 +7974,7 @@ }, "postcss-discard-overridden": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { "postcss": "^5.0.16" @@ -7459,6 +7982,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7479,6 +8003,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7488,6 +8013,7 @@ }, "postcss-discard-unused": { "version": "2.2.3", + "resolved": false, "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { "postcss": "^5.0.14", @@ -7496,6 +8022,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7516,6 +8043,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7525,6 +8053,7 @@ }, "postcss-filter-plugins": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "requires": { "postcss": "^5.0.4", @@ -7533,6 +8062,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7553,6 +8083,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7561,7 +8092,8 @@ } }, "postcss-flexbugs-fixes": { - "version": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", "integrity": "sha512-xWTSRqI3GzrEtboXfqDNyQwyj+P2dRG9EtCMJwqPkhwN4YCp/5J3S6rraQT0S8PrWBmKRT3cpkYAzfVmaZNBkw==", "requires": { "postcss": "^6.0.1" @@ -7569,6 +8101,7 @@ }, "postcss-load-config": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { "cosmiconfig": "^2.1.0", @@ -7579,6 +8112,7 @@ }, "postcss-load-options": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { "cosmiconfig": "^2.1.0", @@ -7587,6 +8121,7 @@ }, "postcss-load-plugins": { "version": "2.3.0", + "resolved": false, "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { "cosmiconfig": "^2.1.1", @@ -7594,7 +8129,8 @@ } }, "postcss-loader": { - "version": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", "integrity": "sha512-HIq7yy1hh9KI472Y38iSRV4WupZUNy6zObkxQM/ZuInoaE2+PyX4NcO6jjP5HG5mXL7j5kcNEl0fAG4Kva7O9w==", "requires": { "loader-utils": "^1.1.0", @@ -7605,6 +8141,7 @@ }, "postcss-merge-idents": { "version": "2.1.7", + "resolved": false, "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { "has": "^1.0.1", @@ -7614,6 +8151,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7634,6 +8172,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7643,6 +8182,7 @@ }, "postcss-merge-longhand": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { "postcss": "^5.0.4" @@ -7650,6 +8190,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7670,6 +8211,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7679,6 +8221,7 @@ }, "postcss-merge-rules": { "version": "2.1.2", + "resolved": false, "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { "browserslist": "^1.5.2", @@ -7690,6 +8233,7 @@ "dependencies": { "browserslist": { "version": "1.7.7", + "resolved": false, "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { "caniuse-db": "^1.0.30000639", @@ -7698,6 +8242,7 @@ }, "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7718,6 +8263,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7727,10 +8273,12 @@ }, "postcss-message-helpers": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" }, "postcss-minify-font-values": { "version": "1.0.5", + "resolved": false, "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { "object-assign": "^4.0.1", @@ -7740,6 +8288,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7760,6 +8309,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7769,6 +8319,7 @@ }, "postcss-minify-gradients": { "version": "1.0.5", + "resolved": false, "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { "postcss": "^5.0.12", @@ -7777,6 +8328,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7797,6 +8349,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7806,6 +8359,7 @@ }, "postcss-minify-params": { "version": "1.2.2", + "resolved": false, "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { "alphanum-sort": "^1.0.1", @@ -7816,6 +8370,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7836,6 +8391,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7845,6 +8401,7 @@ }, "postcss-minify-selectors": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { "alphanum-sort": "^1.0.2", @@ -7855,6 +8412,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7875,6 +8433,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7884,6 +8443,7 @@ }, "postcss-modules-extract-imports": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { "postcss": "^6.0.1" @@ -7891,6 +8451,7 @@ }, "postcss-modules-local-by-default": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { "css-selector-tokenizer": "^0.7.0", @@ -7899,6 +8460,7 @@ }, "postcss-modules-scope": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { "css-selector-tokenizer": "^0.7.0", @@ -7907,6 +8469,7 @@ }, "postcss-modules-values": { "version": "1.3.0", + "resolved": false, "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { "icss-replace-symbols": "^1.1.0", @@ -7915,6 +8478,7 @@ }, "postcss-normalize-charset": { "version": "1.1.1", + "resolved": false, "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { "postcss": "^5.0.5" @@ -7922,6 +8486,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7942,6 +8507,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7951,6 +8517,7 @@ }, "postcss-normalize-url": { "version": "3.0.8", + "resolved": false, "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { "is-absolute-url": "^2.0.0", @@ -7961,6 +8528,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7981,6 +8549,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7990,6 +8559,7 @@ }, "postcss-ordered-values": { "version": "2.2.3", + "resolved": false, "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { "postcss": "^5.0.4", @@ -7998,6 +8568,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8018,6 +8589,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8027,6 +8599,7 @@ }, "postcss-reduce-idents": { "version": "2.4.0", + "resolved": false, "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { "postcss": "^5.0.4", @@ -8035,6 +8608,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8055,6 +8629,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8064,6 +8639,7 @@ }, "postcss-reduce-initial": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { "postcss": "^5.0.4" @@ -8071,6 +8647,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8091,6 +8668,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8100,6 +8678,7 @@ }, "postcss-reduce-transforms": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { "has": "^1.0.1", @@ -8109,6 +8688,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8129,6 +8709,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8138,6 +8719,7 @@ }, "postcss-selector-parser": { "version": "2.2.3", + "resolved": false, "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { "flatten": "^1.0.2", @@ -8147,6 +8729,7 @@ }, "postcss-svgo": { "version": "2.1.6", + "resolved": false, "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { "is-svg": "^2.0.0", @@ -8157,6 +8740,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8177,6 +8761,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8186,6 +8771,7 @@ }, "postcss-unique-selectors": { "version": "2.0.2", + "resolved": false, "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { "alphanum-sort": "^1.0.1", @@ -8195,6 +8781,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8215,6 +8802,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8224,10 +8812,12 @@ }, "postcss-value-parser": { "version": "3.3.0", + "resolved": false, "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" }, "postcss-zindex": { "version": "2.2.0", + "resolved": false, "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { "has": "^1.0.1", @@ -8237,6 +8827,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8257,6 +8848,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8266,22 +8858,27 @@ }, "prelude-ls": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", + "resolved": false, "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "pretty-bytes": { "version": "4.0.2", + "resolved": false, "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" }, "pretty-error": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { "renderkid": "^2.0.1", @@ -8290,6 +8887,7 @@ }, "pretty-format": { "version": "20.0.3", + "resolved": false, "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { "ansi-regex": "^2.1.1", @@ -8303,6 +8901,7 @@ }, "process": { "version": "0.11.10", + "resolved": false, "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { @@ -8312,10 +8911,12 @@ }, "progress": { "version": "1.1.8", + "resolved": false, "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" }, "promise": { - "version": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "version": "7.3.1", + "resolved": false, "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" @@ -8363,6 +8964,7 @@ }, "pseudomap": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { @@ -8379,8 +8981,14 @@ }, "punycode": { "version": "1.4.1", + "resolved": false, "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -8393,6 +9001,7 @@ }, "query-string": { "version": "4.3.4", + "resolved": false, "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { "object-assign": "^4.1.0", @@ -8401,14 +9010,17 @@ }, "querystring": { "version": "0.2.0", + "resolved": false, "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { "version": "0.2.1", + "resolved": false, "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { "version": "0.0.4", + "resolved": false, "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" }, "raf": { @@ -8430,6 +9042,7 @@ "dependencies": { "kind-of": { "version": "4.0.0", + "resolved": false, "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { "is-buffer": "^1.1.5" @@ -8456,6 +9069,7 @@ }, "range-parser": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { @@ -8505,6 +9119,7 @@ "dependencies": { "minimist": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -8658,7 +9273,8 @@ }, "dependencies": { "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "version": "4.1.1", + "resolved": false, "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" } } @@ -8816,6 +9432,17 @@ } } }, + "react-base16-styling": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz", + "integrity": "sha1-OFjyTpxN2MvT9wLz901YHKKRcmk=", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, "react-bootstrap": { "version": "0.31.5", "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.5.tgz", @@ -8992,7 +9619,8 @@ } }, "react-d3": { - "version": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", "integrity": "sha1-3s7c7ZZ/SM2JzNeftAjUfw8qy+I=", "requires": { "d3": "^3.5.0", @@ -9000,7 +9628,8 @@ } }, "react-dev-utils": { - "version": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", "integrity": "sha512-GaAHmCBwvIT1pVUvILK+CSLrYhZeWLsHCrIi/k1dT2JIywkcjRSHw1E9dhsMvzpHf/KTw6ROuTtBt8bK21i6Xw==", "requires": { "address": "1.0.2", @@ -9025,10 +9654,12 @@ "dependencies": { "ansi-escapes": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" }, "ansi-regex": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "babel-code-frame": { @@ -9043,6 +9674,7 @@ }, "cli-cursor": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { "restore-cursor": "^2.0.0" @@ -9050,6 +9682,7 @@ }, "figures": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { "escape-string-regexp": "^1.0.5" @@ -9078,14 +9711,17 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "mute-stream": { "version": "0.0.7", + "resolved": false, "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "onetime": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { "mimic-fn": "^1.0.0" @@ -9093,6 +9729,7 @@ }, "restore-cursor": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { "onetime": "^2.0.0", @@ -9101,6 +9738,7 @@ }, "run-async": { "version": "2.3.0", + "resolved": false, "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { "is-promise": "^2.1.0" @@ -9108,6 +9746,7 @@ }, "rx-lite": { "version": "4.0.8", + "resolved": false, "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "string-width": { @@ -9121,6 +9760,7 @@ "dependencies": { "strip-ansi": { "version": "4.0.0", + "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" @@ -9250,7 +9890,8 @@ } }, "react-dnd-scrollzone": { - "version": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", + "version": "4.0.0", + "resolved": false, "integrity": "sha512-yu9Z/K/7Fy4MtlGYp5eoaZY+Zz+wOccWdC98IeiMvkgoEP+YsC6UCjjMoZMJdeqpi8f1j3agPb4D5uB1OCwuKg==", "requires": { "hoist-non-react-statics": "^1.2.0", @@ -9397,7 +10038,8 @@ } }, "react-error-overlay": { - "version": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", "integrity": "sha512-rxzECPwBQ5VeyGcXtasKtXKBWbWdAVAiQCSmWUTgBYeVu9/L7aWeWG3CFFijvNVRTuUjj/FEJ19Y20BMOP+3Ag==", "requires": { "anser": "1.2.5", @@ -9410,6 +10052,7 @@ "dependencies": { "anser": { "version": "1.2.5", + "resolved": false, "integrity": "sha1-Xc/JVuqjc7nCMBDdINq+ws4ZR1s=" }, "babel-code-frame": { @@ -9422,6 +10065,25 @@ "js-tokens": "^3.0.0" } }, + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "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==" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, "source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", @@ -9446,6 +10108,16 @@ } } }, + "react-json-view": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.17.0.tgz", + "integrity": "sha512-GbbsY/kDe0RyPCj4MVPs7Ds+hSwB8yC7iR4yP0IgrNZBFBaH8N9kvjZErn/vXFzBIvsvoRFbsf8GcnkXTCXcGA==", + "requires": { + "flux": "^3.1.3", + "react-base16-styling": "^0.5.3", + "react-textarea-autosize": "^5.1.0" + } + }, "react-notification-system": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.16.tgz", @@ -9690,7 +10362,8 @@ } }, "react-scripts": { - "version": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.0.10.tgz", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.0.10.tgz", "integrity": "sha1-h2A1WUdCIg9A/7hlpMfo3A+nriM=", "requires": { "autoprefixer": "7.1.1", @@ -9732,6 +10405,20 @@ "whatwg-fetch": "2.0.3" }, "dependencies": { + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "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==" + }, "fsevents": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", @@ -9758,7 +10445,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.1.1", @@ -9801,7 +10489,8 @@ }, "balanced-match": { "version": "0.4.2", - "bundled": true + "bundled": true, + "optional": true }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -9814,6 +10503,7 @@ "block-stream": { "version": "0.0.9", "bundled": true, + "optional": true, "requires": { "inherits": "~2.0.0" } @@ -9821,6 +10511,7 @@ "boom": { "version": "2.10.1", "bundled": true, + "optional": true, "requires": { "hoek": "2.x.x" } @@ -9828,6 +10519,7 @@ "brace-expansion": { "version": "1.1.7", "bundled": true, + "optional": true, "requires": { "balanced-match": "^0.4.1", "concat-map": "0.0.1" @@ -9835,7 +10527,8 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "caseless": { "version": "0.12.0", @@ -9849,26 +10542,31 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "combined-stream": { "version": "1.0.5", "bundled": true, + "optional": true, "requires": { "delayed-stream": "~1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "cryptiles": { "version": "2.0.5", @@ -9908,7 +10606,8 @@ }, "delayed-stream": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "delegates": { "version": "1.0.0", @@ -9930,7 +10629,8 @@ }, "extsprintf": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "forever-agent": { "version": "0.6.1", @@ -9949,11 +10649,13 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "fstream": { "version": "1.0.11", "bundled": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -10004,6 +10706,7 @@ "glob": { "version": "7.1.2", "bundled": true, + "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10015,7 +10718,8 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "bundled": true, + "optional": true }, "har-schema": { "version": "1.0.5", @@ -10049,7 +10753,8 @@ }, "hoek": { "version": "2.16.3", - "bundled": true + "bundled": true, + "optional": true }, "http-signature": { "version": "1.1.1", @@ -10064,6 +10769,7 @@ "inflight": { "version": "1.0.6", "bundled": true, + "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -10081,6 +10787,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -10092,7 +10799,8 @@ }, "isarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "isstream": { "version": "0.1.2", @@ -10155,11 +10863,13 @@ }, "mime-db": { "version": "1.27.0", - "bundled": true + "bundled": true, + "optional": true }, "mime-types": { "version": "2.1.15", "bundled": true, + "optional": true, "requires": { "mime-db": "~1.27.0" } @@ -10167,17 +10877,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -10225,7 +10938,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "oauth-sign": { "version": "0.8.2", @@ -10265,7 +10979,8 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "performance-now": { "version": "0.2.0", @@ -10274,7 +10989,8 @@ }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "bundled": true, + "optional": true }, "punycode": { "version": "1.4.1", @@ -10307,6 +11023,7 @@ "readable-stream": { "version": "2.2.9", "bundled": true, + "optional": true, "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -10349,13 +11066,15 @@ "rimraf": { "version": "2.6.1", "bundled": true, + "optional": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "bundled": true, + "optional": true }, "semver": { "version": "5.3.0", @@ -10406,6 +11125,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -10415,6 +11135,7 @@ "string_decoder": { "version": "1.0.1", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -10427,6 +11148,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -10439,6 +11161,7 @@ "tar": { "version": "2.2.1", "bundled": true, + "optional": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -10488,7 +11211,8 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "uuid": { "version": "3.0.1", @@ -10518,16 +11242,23 @@ } }, "promise": { - "version": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=", "requires": { "asap": "~2.0.3" } + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" } } }, "react-sortable-tree": { - "version": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", "integrity": "sha512-+yRojiLuh/jHI3qLV9sGYRIYuF7dPm0r2HyCvlnVBV6sYHKslNvNg3dyWa+owqhOfHiIlTArqP1AK9ELFzlZLg==", "requires": { "lodash.isequal": "^4.4.0", @@ -10578,8 +11309,17 @@ } } }, + "react-textarea-autosize": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz", + "integrity": "sha512-bx6z2I35aapr71ggw2yZIA4qhmqeTa4ZVsSaTeFvtf9kfcZppDBh2PbMt8lvbdmzEk7qbSFhAxR9vxEVm6oiMg==", + "requires": { + "prop-types": "^15.6.0" + } + }, "react-virtualized": { - "version": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", + "version": "9.9.0", + "resolved": false, "integrity": "sha512-TDe2haZiFr5apN3myuumGyeJ7iqHcGcQ648tfNf9x+R6tkE1+o8yAmeh4nKC4ldcs9My1dOHN3x/lmEX9LyOLA==", "requires": { "babel-runtime": "^6.11.6", @@ -10591,6 +11331,7 @@ }, "read-pkg": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { "load-json-file": "^1.0.0", @@ -10600,6 +11341,7 @@ }, "read-pkg-up": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { "find-up": "^1.0.0", @@ -10608,6 +11350,7 @@ "dependencies": { "find-up": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "^2.0.0", @@ -10616,6 +11359,7 @@ }, "path-exists": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { "pinkie-promise": "^2.0.0" @@ -10639,6 +11383,7 @@ }, "readdirp": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { "graceful-fs": "^4.1.2", @@ -10649,6 +11394,7 @@ }, "readline2": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "requires": { "code-point-at": "^1.0.0", @@ -10658,6 +11404,7 @@ }, "rechoir": { "version": "0.6.2", + "resolved": false, "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { "resolve": "^1.1.6" @@ -10665,6 +11412,7 @@ }, "recursive-readdir": { "version": "2.2.1", + "resolved": false, "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", "requires": { "minimatch": "3.0.3" @@ -10672,6 +11420,7 @@ "dependencies": { "minimatch": { "version": "3.0.3", + "resolved": false, "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" @@ -10681,6 +11430,7 @@ }, "redent": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { "indent-string": "^2.1.0", @@ -10689,6 +11439,7 @@ }, "reduce-css-calc": { "version": "1.3.0", + "resolved": false, "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { "balanced-match": "^0.4.2", @@ -10698,12 +11449,14 @@ "dependencies": { "balanced-match": { "version": "0.4.2", + "resolved": false, "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } }, "reduce-function-call": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { "balanced-match": "^0.4.2" @@ -10711,6 +11464,7 @@ "dependencies": { "balanced-match": { "version": "0.4.2", + "resolved": false, "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } @@ -10721,11 +11475,13 @@ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" }, "regenerator-runtime": { - "version": "0.10.5", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { "version": "0.9.11", + "resolved": false, "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", "requires": { "babel-runtime": "^6.18.0", @@ -10752,6 +11508,7 @@ }, "regexpu-core": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { "regenerate": "^1.2.1", @@ -10770,6 +11527,7 @@ }, "registry-url": { "version": "3.1.0", + "resolved": false, "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" @@ -10777,10 +11535,12 @@ }, "regjsgen": { "version": "0.2.0", + "resolved": false, "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" }, "regjsparser": { "version": "0.1.5", + "resolved": false, "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { "jsesc": "~0.5.0" @@ -10788,12 +11548,14 @@ "dependencies": { "jsesc": { "version": "0.5.0", + "resolved": false, "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, "relateurl": { "version": "0.2.7", + "resolved": false, "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, "remove-trailing-separator": { @@ -10803,6 +11565,7 @@ }, "renderkid": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { "css-select": "^1.1.0", @@ -10814,20 +11577,24 @@ "dependencies": { "utila": { "version": "0.3.3", + "resolved": false, "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } }, "repeat-element": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", + "resolved": false, "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { "is-finite": "^1.0.0" @@ -10871,18 +11638,22 @@ }, "require-directory": { "version": "2.1.1", + "resolved": false, "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "1.2.1", + "resolved": false, "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" }, "require-main-filename": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "require-uncached": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { "caller-path": "^0.1.0", @@ -10891,6 +11662,7 @@ }, "requires-port": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { @@ -10903,6 +11675,7 @@ }, "resolve-from": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, "resolve-url": { @@ -10912,6 +11685,7 @@ }, "restore-cursor": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "requires": { "exit-hook": "^1.0.0", @@ -10925,6 +11699,7 @@ }, "right-align": { "version": "0.1.3", + "resolved": false, "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { "align-text": "^0.1.1" @@ -10940,6 +11715,7 @@ }, "ripemd160": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "requires": { "hash-base": "^2.0.0", @@ -10958,6 +11734,7 @@ }, "run-async": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "requires": { "once": "^1.3.0" @@ -10965,10 +11742,12 @@ }, "rx-lite": { "version": "3.1.2", + "resolved": false, "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" }, "rx-lite-aggregates": { "version": "4.0.8", + "resolved": false, "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { "rx-lite": "*" @@ -10994,6 +11773,7 @@ }, "sane": { "version": "1.6.0", + "resolved": false, "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { "anymatch": "^1.3.0", @@ -11007,6 +11787,7 @@ "dependencies": { "bser": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { "node-int64": "^0.4.0" @@ -11014,6 +11795,7 @@ }, "fb-watchman": { "version": "1.9.2", + "resolved": false, "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", "requires": { "bser": "1.0.2" @@ -11021,6 +11803,7 @@ }, "minimist": { "version": "1.2.0", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -11032,6 +11815,7 @@ }, "schema-utils": { "version": "0.3.0", + "resolved": false, "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { "ajv": "^5.0.0" @@ -11052,6 +11836,7 @@ }, "select-hose": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { @@ -11069,6 +11854,7 @@ }, "semver-diff": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" @@ -11128,14 +11914,17 @@ }, "serviceworker-cache-polyfill": { "version": "4.0.0", + "resolved": false, "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" }, "set-blocking": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "set-value": { @@ -11160,7 +11949,8 @@ } }, "setimmediate": { - "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "version": "1.0.5", + "resolved": false, "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { @@ -11170,6 +11960,7 @@ }, "settle-promise": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-aXrbWLgh84fOJ1fAbvyd5fDuM9g=" }, "sha.js": { @@ -11196,6 +11987,7 @@ }, "shell-quote": { "version": "1.6.1", + "resolved": false, "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "requires": { "array-filter": "~0.0.0", @@ -11206,6 +11998,7 @@ }, "shelljs": { "version": "0.7.8", + "resolved": false, "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "requires": { "glob": "^7.0.0", @@ -11220,14 +12013,17 @@ }, "signal-exit": { "version": "3.0.2", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { "version": "0.0.4", + "resolved": false, "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" }, "snapdragon": { @@ -11342,6 +12138,7 @@ }, "sockjs": { "version": "0.3.18", + "resolved": false, "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { "faye-websocket": "^0.10.0", @@ -11350,6 +12147,7 @@ "dependencies": { "faye-websocket": { "version": "0.10.0", + "resolved": false, "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { "websocket-driver": ">=0.5.1" @@ -11357,12 +12155,14 @@ }, "uuid": { "version": "2.0.3", + "resolved": false, "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } }, "sockjs-client": { "version": "1.1.4", + "resolved": false, "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { "debug": "^2.6.6", @@ -11375,6 +12175,7 @@ }, "sort-keys": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { "is-plain-obj": "^1.0.0" @@ -11382,6 +12183,7 @@ }, "source-list-map": { "version": "0.1.8", + "resolved": false, "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" }, "source-map": { @@ -11451,6 +12253,7 @@ }, "spdy": { "version": "3.4.7", + "resolved": false, "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { "debug": "^2.6.8", @@ -11485,6 +12288,7 @@ }, "sprintf-js": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { @@ -11528,6 +12332,7 @@ }, "stream-browserify": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { "inherits": "~2.0.1", @@ -11548,10 +12353,12 @@ }, "strict-uri-encode": { "version": "1.1.0", + "resolved": false, "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { "strip-ansi": "^3.0.0" @@ -11559,6 +12366,7 @@ }, "string-width": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -11576,10 +12384,12 @@ }, "stringstream": { "version": "0.0.5", + "resolved": false, "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "3.0.1", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -11587,6 +12397,7 @@ }, "strip-bom": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { "is-utf8": "^0.2.0" @@ -11599,6 +12410,7 @@ }, "strip-indent": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { "get-stdin": "^4.0.1" @@ -11606,10 +12418,12 @@ }, "strip-json-comments": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { - "version": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", "requires": { "loader-utils": "^1.0.2", @@ -11786,6 +12600,7 @@ }, "svgo": { "version": "0.7.2", + "resolved": false, "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { "coa": "~1.0.1", @@ -11815,7 +12630,8 @@ } }, "sw-precache-webpack-plugin": { - "version": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", "integrity": "sha512-VThRmVU97VXrxsnqAjd67GIwmxe5Z2R3lWsJjhq88TjN9Ck2iMAOiZIiWqlfnSxp517VgoG7gomg1Vu4v2wPag==", "requires": { "del": "^2.2.2", @@ -11825,6 +12641,7 @@ }, "sw-toolbox": { "version": "3.6.0", + "resolved": false, "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { "path-to-regexp": "^1.0.1", @@ -11833,10 +12650,12 @@ }, "symbol-tree": { "version": "3.2.2", + "resolved": false, "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { "version": "3.8.3", + "resolved": false, "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "requires": { "ajv": "^4.7.0", @@ -11849,10 +12668,12 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { @@ -11866,6 +12687,7 @@ }, "strip-ansi": { "version": "4.0.0", + "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" @@ -11900,6 +12722,7 @@ }, "text-table": { "version": "0.2.0", + "resolved": false, "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { @@ -11909,6 +12732,7 @@ }, "through": { "version": "2.3.8", + "resolved": false, "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "thunky": { @@ -11918,6 +12742,7 @@ }, "time-stamp": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" }, "timed-out": { @@ -11943,14 +12768,17 @@ }, "tmpl": { "version": "1.0.4", + "resolved": false, "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-arraybuffer": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "to-object-path": { @@ -12006,6 +12834,7 @@ }, "tr46": { "version": "0.0.3", + "resolved": false, "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "transformation-matrix": { @@ -12015,18 +12844,22 @@ }, "trim-newlines": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "tty-browserify": { "version": "0.0.0", + "resolved": false, "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { "version": "0.6.0", + "resolved": false, "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -12034,11 +12867,13 @@ }, "tweetnacl": { "version": "0.14.5", + "resolved": false, "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "type-check": { "version": "0.3.2", + "resolved": false, "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { "prelude-ls": "~1.1.2" @@ -12055,6 +12890,7 @@ }, "typedarray": { "version": "0.0.6", + "resolved": false, "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "ua-parser-js": { @@ -12073,6 +12909,7 @@ }, "uglify-to-browserify": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, @@ -12110,10 +12947,12 @@ }, "uniq": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "uniqid": { "version": "4.1.1", + "resolved": false, "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "requires": { "macaddress": "^0.2.8" @@ -12121,6 +12960,7 @@ }, "uniqs": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, "unique-string": { @@ -12133,10 +12973,12 @@ }, "universalify": { "version": "0.1.1", + "resolved": false, "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, "unpipe": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { @@ -12216,6 +13058,7 @@ }, "upper-case": { "version": "1.1.3", + "resolved": false, "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, "urijs": { @@ -12230,6 +13073,7 @@ }, "url": { "version": "0.11.0", + "resolved": false, "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", @@ -12238,12 +13082,14 @@ "dependencies": { "punycode": { "version": "1.3.2", + "resolved": false, "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, "url-loader": { - "version": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", "requires": { "loader-utils": "^1.0.2", @@ -12261,12 +13107,14 @@ "dependencies": { "querystringify": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" } } }, "url-parse-lax": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" @@ -12282,6 +13130,7 @@ }, "user-home": { "version": "2.0.0", + "resolved": false, "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "requires": { "os-homedir": "^1.0.0" @@ -12289,6 +13138,7 @@ }, "util": { "version": "0.10.3", + "resolved": false, "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { "inherits": "2.0.1" @@ -12296,16 +13146,19 @@ "dependencies": { "inherits": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" } } }, "util-deprecate": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utila": { "version": "0.4.0", + "resolved": false, "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" }, "utils-merge": { @@ -12339,6 +13192,7 @@ }, "vendors": { "version": "1.0.1", + "resolved": false, "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" }, "verror": { @@ -12353,6 +13207,7 @@ }, "vm-browserify": { "version": "0.0.4", + "resolved": false, "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "requires": { "indexof": "0.0.1" @@ -12360,6 +13215,7 @@ }, "walker": { "version": "1.0.7", + "resolved": false, "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { "makeerror": "1.0.x" @@ -12367,6 +13223,7 @@ }, "watch": { "version": "0.10.0", + "resolved": false, "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" }, "watchpack": { @@ -12393,7 +13250,8 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", "integrity": "sha512-WkoF1vBKbYYFW4oRNeofwidp14CrzIme8OzDfUK6CEHjCj4zzACAdsTTm23MUd4Ui5bn6OO/GPpc1xBlcKOkRQ==", "requires": { "acorn": "^5.0.0", @@ -12421,10 +13279,12 @@ "dependencies": { "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "loader-utils": { "version": "0.2.17", + "resolved": false, "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { "big.js": "^3.1.3", @@ -12435,6 +13295,7 @@ }, "source-list-map": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" }, "source-map": { @@ -12444,6 +13305,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -12451,6 +13313,7 @@ }, "uglify-js": { "version": "2.8.29", + "resolved": false, "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { "source-map": "~0.5.1", @@ -12460,6 +13323,7 @@ "dependencies": { "yargs": { "version": "3.10.0", + "resolved": false, "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { "camelcase": "^1.0.2", @@ -12472,6 +13336,7 @@ }, "webpack-sources": { "version": "0.2.3", + "resolved": false, "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", "requires": { "source-list-map": "^1.1.1", @@ -12480,6 +13345,7 @@ }, "yargs": { "version": "6.6.0", + "resolved": false, "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { "camelcase": "^3.0.0", @@ -12499,10 +13365,12 @@ "dependencies": { "camelcase": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "cliui": { "version": "3.2.0", + "resolved": false, "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { "string-width": "^1.0.1", @@ -12514,6 +13382,7 @@ }, "yargs-parser": { "version": "4.2.1", + "resolved": false, "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { "camelcase": "^3.0.0" @@ -12521,6 +13390,7 @@ "dependencies": { "camelcase": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } @@ -12547,7 +13417,8 @@ } }, "webpack-dev-server": { - "version": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", "integrity": "sha512-m5vhFvG1vKl0dY3cxgN3FiR6bTsYfjga5w6UkQQu/rQh4aFbMFnXHpfR9kJnduYu5envPsRv+lSZ/fFifbGN9w==", "requires": { "ansi-html": "0.0.7", @@ -12575,6 +13446,7 @@ "dependencies": { "camelcase": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "chokidar": { @@ -12595,6 +13467,7 @@ }, "cliui": { "version": "3.2.0", + "resolved": false, "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { "string-width": "^1.0.1", @@ -12604,6 +13477,7 @@ }, "del": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { "globby": "^6.1.0", @@ -12649,7 +13523,8 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", @@ -12670,7 +13545,8 @@ }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -13078,6 +13954,7 @@ }, "globby": { "version": "6.1.0", + "resolved": false, "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { "array-union": "^1.0.1", @@ -13089,16 +13966,19 @@ "dependencies": { "pify": { "version": "2.3.0", + "resolved": false, "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "has-flag": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "opn": { "version": "4.0.2", + "resolved": false, "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", "requires": { "object-assign": "^4.0.1", @@ -13107,10 +13987,12 @@ }, "pify": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "sockjs-client": { "version": "1.1.2", + "resolved": false, "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", "requires": { "debug": "^2.2.0", @@ -13123,6 +14005,7 @@ }, "supports-color": { "version": "3.2.3", + "resolved": false, "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -13130,6 +14013,7 @@ }, "yargs": { "version": "6.6.0", + "resolved": false, "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { "camelcase": "^3.0.0", @@ -13149,6 +14033,7 @@ }, "yargs-parser": { "version": "4.2.1", + "resolved": false, "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { "camelcase": "^3.0.0" @@ -13157,7 +14042,8 @@ } }, "webpack-manifest-plugin": { - "version": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", "integrity": "sha512-54uDakY6RD97sL3jPhWuBw8VrSujVmvcIcnlY/0EfhRUTWTSH4XCbjMbDvDjKfvvicawtuVunbqZp/ogCvEf9A==", "requires": { "fs-extra": "^0.30.0", @@ -13166,6 +14052,7 @@ "dependencies": { "fs-extra": { "version": "0.30.0", + "resolved": false, "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { "graceful-fs": "^4.1.2", @@ -13177,6 +14064,7 @@ }, "jsonfile": { "version": "2.4.0", + "resolved": false, "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { "graceful-fs": "^4.1.6" @@ -13223,11 +14111,13 @@ } }, "whatwg-fetch": { - "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "version": "2.0.3", + "resolved": false, "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" }, "whatwg-url": { "version": "4.8.0", + "resolved": false, "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { "tr46": "~0.0.3", @@ -13236,12 +14126,14 @@ "dependencies": { "webidl-conversions": { "version": "3.0.1", + "resolved": false, "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" } } }, "whet.extend": { "version": "0.9.9", + "resolved": false, "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" }, "which": { @@ -13254,6 +14146,7 @@ }, "which-module": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "widest-line": { @@ -13295,10 +14188,12 @@ }, "window-size": { "version": "0.1.0", + "resolved": false, "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "wordwrap": { "version": "1.0.0", + "resolved": false, "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { @@ -13311,6 +14206,7 @@ }, "wrap-ansi": { "version": "2.1.0", + "resolved": false, "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -13319,10 +14215,12 @@ }, "wrappy": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", + "resolved": false, "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { "mkdirp": "^0.5.1" @@ -13345,22 +14243,27 @@ }, "xml-name-validator": { "version": "2.0.1", + "resolved": false, "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" }, "xtend": { "version": "4.0.1", + "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", + "resolved": false, "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", + "resolved": false, "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "7.1.0", + "resolved": false, "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { "camelcase": "^3.0.0", @@ -13380,10 +14283,12 @@ "dependencies": { "camelcase": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "cliui": { "version": "3.2.0", + "resolved": false, "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { "string-width": "^1.0.1", @@ -13395,6 +14300,7 @@ }, "yargs-parser": { "version": "5.0.0", + "resolved": false, "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { "camelcase": "^3.0.0" @@ -13402,6 +14308,7 @@ "dependencies": { "camelcase": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } diff --git a/package.json b/package.json index f54e1a9..231fe04 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "react-dnd-html5-backend": "^2.2.4", "react-dom": "^15.4.2", "react-fullscreenable": "^2.4.3", + "react-json-view": "^1.17.0", "react-notification-system": "^0.2.13", "react-rnd": "^7.4.0", "react-router": "^4.1.2", diff --git a/src/components/parameters-editor.js b/src/components/parameters-editor.js new file mode 100644 index 0000000..4f6aa11 --- /dev/null +++ b/src/components/parameters-editor.js @@ -0,0 +1,86 @@ +/** + * 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 + * 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 { ControlLabel, Col } from 'react-bootstrap'; +import JsonView from 'react-json-view'; + +class ParametersEditor extends React.Component { + onAdd = event => { + if (this.props.onChange != null) { + this.props.onChange(event.updated_src); + } + } + + onEdit = event => { + if (this.props.onChange != null) { + this.props.onChange(event.updated_src); + } + } + + onDelete = event => { + if (this.props.onChange != null) { + this.props.onChange(event.updated_src); + } + } + + render() { + const containerStyle = { + minHeight: '100px', + + paddingTop: '5px', + paddingBottom: '5px', + + border: '1px solid lightgray' + }; + + return
    + + {this.props.name} + + + + + +
    ; + } +} + +ParametersEditor.PropTypes = { + name: PropTypes.string, + content: PropTypes.object, + onChange: PropTypes.func +}; + +ParametersEditor.defaultProps = { + name: "Parameters", + content: {} +}; + +export default ParametersEditor; diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 172ef72..14963c2 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -31,6 +31,7 @@ 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'; class SimulationModel extends React.Component { static getStores() { @@ -114,6 +115,14 @@ class SimulationModel extends React.Component { this.setState({ simulationModel }); } + handleStartParametersChange = startParameters => { + const simulationModel = this.state.simulationModel; + + simulationModel.startParameters = startParameters; + + this.setState({ simulationModel }); + } + render() { const buttonStyle = { marginRight: '10px' @@ -129,6 +138,8 @@ class SimulationModel extends React.Component { + + From a124a8d91e782d6253a6b7f333c5b23b3ed72f59 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 6 Jun 2018 13:20:45 +0200 Subject: [PATCH 471/556] Make parameters editor abstract from simulation model --- src/components/parameters-editor.js | 10 +--------- src/containers/simulation-model.js | 13 +++++++++++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/components/parameters-editor.js b/src/components/parameters-editor.js index 4f6aa11..1ce9dea 100644 --- a/src/components/parameters-editor.js +++ b/src/components/parameters-editor.js @@ -53,12 +53,7 @@ class ParametersEditor extends React.Component { border: '1px solid lightgray' }; - return
    - - {this.props.name} - - - + return
    -
    ; } } ParametersEditor.PropTypes = { - name: PropTypes.string, content: PropTypes.object, onChange: PropTypes.func }; ParametersEditor.defaultProps = { - name: "Parameters", content: {} }; diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 14963c2..975b9e6 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 } from 'react-bootstrap'; +import { Button, Col, Form, ControlLabel } from 'react-bootstrap'; import SimulationModelStore from '../stores/simulation-model-store'; import UserStore from '../stores/user-store'; @@ -139,7 +139,16 @@ class SimulationModel extends React.Component { - +
    + + Start Parameters + + + + + +
    + From 6b52c18844ac14b30e2eb51038e198ea58200c59 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Wed, 6 Jun 2018 13:33:48 +0200 Subject: [PATCH 472/556] Add start action parameters on simulation models --- src/components/parameters-editor.js | 1 - src/containers/simulation.js | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/parameters-editor.js b/src/components/parameters-editor.js index 1ce9dea..f11b327 100644 --- a/src/components/parameters-editor.js +++ b/src/components/parameters-editor.js @@ -21,7 +21,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { ControlLabel, Col } from 'react-bootstrap'; import JsonView from 'react-json-view'; class ParametersEditor extends React.Component { diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 77d6d1d..4124572 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -221,6 +221,10 @@ class Simulation extends React.Component { continue; } + if (action.data.action === 'start') { + action.data.parameters = this.state.simulationModels[index].startParameters; + } + AppDispatcher.dispatch({ type: 'simulators/start-action', simulator, From 1f4166a605da90c52f9128435c59dd5adc400cee Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 12:43:41 +0200 Subject: [PATCH 473/556] Add start parameters to simulation --- src/components/dialog/edit-simulation.js | 120 +++++----- src/components/dialog/import-simulation.js | 211 ++++++++++-------- src/components/dialog/new-simulation.js | 112 ++++++---- src/components/parameters-editor.js | 29 +-- src/containers/simulations.js | 2 +- src/data-managers/simulations-data-manager.js | 2 +- 6 files changed, 260 insertions(+), 216 deletions(-) diff --git a/src/components/dialog/edit-simulation.js b/src/components/dialog/edit-simulation.js index fba0d19..0b1c87e 100644 --- a/src/components/dialog/edit-simulation.js +++ b/src/components/dialog/edit-simulation.js @@ -23,69 +23,81 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; class EditSimulationDialog extends React.Component { - valid: false; + valid = true; - constructor(props) { - super(props); + constructor(props) { + super(props); - this.state = { - name: '', - _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.simulation.name, - _id: this.props.simulation._id - }); - } - - validateForm(target) { - // check all controls - var name = true; - - if (this.state.name === '') { - name = false; + this.state = { + name: '', + _id: '', + startParameters: {} + }; } - this.valid = name; + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } - // return state to control - if (target === 'name') return name ? "success" : "error"; + return; + } - return "success"; - } + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + } - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - -
    -
    - ); - } + 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/components/dialog/import-simulation.js b/src/components/dialog/import-simulation.js index 624b11e..e14eada 100644 --- a/src/components/dialog/import-simulation.js +++ b/src/components/dialog/import-simulation.js @@ -23,118 +23,133 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; class ImportSimulationDialog extends React.Component { - valid = false; - imported = false; + valid = false; + imported = false; - constructor(props) { - super(props); + constructor(props) { + super(props); - this.state = { - name: '', - models: [], - }; - } - - onClose(canceled) { - if (canceled === false) { - this.props.onClose(this.state); - } else { - this.props.onClose(); - } - } - - handleChange(e, index) { - if (e.target.id === 'simulator') { - const models = this.state.models; - models[index].simulator = JSON.parse(e.target.value); - - this.setState({ models }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } - } - - resetState() { - this.setState({ name: '', models: [] }); - - this.imported = false; - } - - loadFile(fileList) { - // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { - return; + this.state = { + name: '', + models: [], + startParameters: {} + }; } - // create file reader - var reader = new FileReader(); - var self = this; + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } - reader.onload = function(event) { - // read simulator - const simulation = JSON.parse(event.target.result); - simulation.models.forEach(model => { - model.simulator = { - node: self.props.nodes[0]._id, - simulator: 0 + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); } - }); - - self.imported = true; - self.setState({ name: simulation.name, models: simulation.models }); - }; - - reader.readAsText(file); - } - - validateForm(target) { - // check all controls - let name = true; - - if (this.state.name === '') { - name = false; } - this.valid = name; + handleChange(e, index) { + if (e.target.id === 'simulator') { + const models = this.state.models; + models[index].simulator = JSON.parse(e.target.value); - // return state to control - if (target === 'name') return name ? "success" : "error"; - } + this.setState({ models }); - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Simulation File - this.loadFile(e.target.files)} /> - + return; + } + + this.setState({ [e.target.id]: e.target.value }); + } - - Name - this.handleChange(e)} /> - - + resetState = () => { + this.setState({ name: '', models: [], startParameters: {} }); - {this.state.models.map((model, index) => ( - - {model.name} - Simulator - this.handleChange(e, index)}> - {this.props.nodes.map(node => ( - node.simulators.map((simulator, index) => ( - - )) - ))} - - - ))} -
    -
    - ); - } + 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/components/dialog/new-simulation.js b/src/components/dialog/new-simulation.js index 2d09c0d..b09559c 100644 --- a/src/components/dialog/new-simulation.js +++ b/src/components/dialog/new-simulation.js @@ -23,63 +23,77 @@ import React from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; class NewSimulationDialog extends React.Component { - valid: false; + valid = false; - constructor(props) { - super(props); + constructor(props) { + super(props); - this.state = { - name: '' - }; - } - - 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: '' }); - } - - validateForm(target) { - // check all controls - var name = true; - - if (this.state.name === '') { - name = false; + this.state = { + name: '', + startParameters: {} + }; } - this.valid = name; + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } - // return state to control - if (target === 'name') return name ? "success" : "error"; - } + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + } - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - -
    -
    - ); - } + 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/components/parameters-editor.js b/src/components/parameters-editor.js index f11b327..38f81df 100644 --- a/src/components/parameters-editor.js +++ b/src/components/parameters-editor.js @@ -26,19 +26,19 @@ import JsonView from 'react-json-view'; class ParametersEditor extends React.Component { onAdd = event => { if (this.props.onChange != null) { - this.props.onChange(event.updated_src); + this.props.onChange(JSON.parse(JSON.stringify(event.updated_src))); } } onEdit = event => { if (this.props.onChange != null) { - this.props.onChange(event.updated_src); + this.props.onChange(JSON.parse(JSON.stringify(event.updated_src))); } } onDelete = event => { if (this.props.onChange != null) { - this.props.onChange(event.updated_src); + this.props.onChange(JSON.parse(JSON.stringify(event.updated_src))); } } @@ -48,30 +48,33 @@ class ParametersEditor extends React.Component { paddingTop: '5px', paddingBottom: '5px', + paddingLeft: '8px', border: '1px solid lightgray' }; return
    - +
    ; } } ParametersEditor.PropTypes = { content: PropTypes.object, - onChange: PropTypes.func + onChange: PropTypes.func, + disabled: PropTypes.bool }; ParametersEditor.defaultProps = { - content: {} + content: {}, + disabled: false }; export default ParametersEditor; diff --git a/src/containers/simulations.js b/src/containers/simulations.js index c2c7e11..db04249 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -121,7 +121,7 @@ class Simulations extends Component { closeEditModal(data) { this.setState({ editModal : false }); - if (data) { + if (data != null) { AppDispatcher.dispatch({ type: 'simulations/start-edit', data, diff --git a/src/data-managers/simulations-data-manager.js b/src/data-managers/simulations-data-manager.js index d5fdfde..30885aa 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/data-managers/simulations-data-manager.js @@ -21,4 +21,4 @@ import RestDataManager from './rest-data-manager'; -export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models' ]); +export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models', 'startParameters' ]); From 0cb17cf73266c81374bd02ec79281252a0989927 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 15:06:37 +0200 Subject: [PATCH 474/556] Send simulator action with start parameters --- src/containers/simulation.js | 2 +- src/containers/simulations.js | 71 ++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 4124572..19c1a06 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -61,7 +61,7 @@ class Simulation extends React.Component { // load models let simulationModels = []; if (simulation.models != null) { - simulationModels = SimulationModelStore.getState().filter(m => simulation.models.includes(m._id)); + simulationModels = SimulationModelStore.getState().filter(m => m != null && simulation.models.includes(m._id)); } return { diff --git a/src/containers/simulations.js b/src/containers/simulations.js index db04249..87870c1 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -28,6 +28,7 @@ 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 Table from '../components/table'; import TableColumn from '../components/table-column'; @@ -40,14 +41,21 @@ import DeleteDialog from '../components/dialog/delete-dialog'; class Simulations extends Component { static getStores() { - return [ SimulationStore, UserStore, SimulatorStore ]; + return [ SimulationStore, UserStore, SimulatorStore, SimulationModelStore ]; } static calculateState() { + const simulations = SimulationStore.getState(); + const simulationModels = SimulationModelStore.getState(); + const simulators = SimulatorStore.getState(); + + const sessionToken = UserStore.getState().token; + return { - simulations: SimulationStore.getState(), - simulators: SimulatorStore.getState(), - sessionToken: UserStore.getState().token, + simulations, + simulationModels, + simulators, + sessionToken, newModal: false, deleteModal: false, @@ -59,13 +67,52 @@ class Simulations extends Component { }; } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'simulations/start-load', token: this.state.sessionToken }); } + componentDidUpdate() { + console.log('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 }); @@ -195,10 +242,16 @@ class Simulations extends Component { 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 === model.simulator) { + if (sim._id === simulationModel.simulator) { simulator = sim; } } @@ -206,6 +259,10 @@ class Simulations extends Component { if (simulator == null) { continue; } + + if (action.data.action === 'start') { + action.data.parameters = this.state.simulationModels[index].startParameters; + } AppDispatcher.dispatch({ type: 'simulators/start-action', @@ -222,6 +279,8 @@ class Simulations extends Component { marginLeft: '10px' }; + console.log(this.state.simulationModels.length); + return (

    Simulations

    From a0f260ffe68b3bb0043df5f6db83ebc538450e2f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 15:14:15 +0200 Subject: [PATCH 475/556] Remove log messages --- src/containers/simulations.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 87870c1..ec080b5 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -75,8 +75,6 @@ class Simulations extends Component { } componentDidUpdate() { - console.log('componentDidUpdate'); - const simulationModelIds = []; const simulatorIds = []; @@ -86,7 +84,7 @@ class Simulations extends Component { if (model == null) { simulationModelIds.push(modelId); - + continue; } @@ -279,8 +277,6 @@ class Simulations extends Component { marginLeft: '10px' }; - console.log(this.state.simulationModels.length); - return (

    Simulations

    From 46135f92c07401ee51e8ff3bfd46a5add540f93b Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 15:25:02 +0200 Subject: [PATCH 476/556] Add start parameters merging --- src/containers/simulations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/containers/simulations.js b/src/containers/simulations.js index ec080b5..1367d8a 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -84,7 +84,7 @@ class Simulations extends Component { if (model == null) { simulationModelIds.push(modelId); - + continue; } @@ -259,7 +259,7 @@ class Simulations extends Component { } if (action.data.action === 'start') { - action.data.parameters = this.state.simulationModels[index].startParameters; + action.data.parameters = Object.assign({}, this.state.simulations[index].startParameters, simulationModel.startParameters); } AppDispatcher.dispatch({ From 1cf45a2cae9c1855e9f205b5f48c29d9090178c8 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 19:52:51 +0200 Subject: [PATCH 477/556] Sort simulators by last state update --- src/containers/simulators.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 4c92992..3105755 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -44,10 +44,13 @@ class Simulators extends Component { } static calculateState() { + const simulators = SimulatorStore.getState().sort((a, b) => { + return a.stateUpdatedAt < b.stateUpdatedAt; + }); + return { sessionToken: UserStore.getState().token, - simulators: SimulatorStore.getState(), - + simulators, modalSimulator: {}, deleteModal: false, From 609fd6249e5446585cc8eeb369faf18effa6522f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 20:33:58 +0200 Subject: [PATCH 478/556] Add simulator state label --- src/containers/simulators.js | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 3105755..48c9b2b 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -165,6 +165,42 @@ class Simulators extends Component { } } + labelSimulatorState = state => { + if (state === 'unknown' || state === 'shutdown') { + return + + + {state} + ; + } + + return + + + {state} + ; + } + + isSimulatorOnline(state) { + return state !== 'shutdown' && state !== 'unknown'; + } + + stateLabelStyle = state => { + if (this.isSimulatorOnline(state)) { + return 'success'; + } + + return 'danger'; + } + + stateLabelModifier = state => { + if (this.isSimulatorOnline(state)) { + return 'online'; + } + + return 'offline'; + } + render() { const buttonStyle = { marginLeft: '10px' @@ -177,7 +213,7 @@ class Simulators extends Component { this.onSimulatorChecked(index, event)} width='30' /> - + From d3364ed010544928b553b253b0a9b70f8eb4c667 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 21:10:30 +0200 Subject: [PATCH 479/556] Add labels to simulator state --- src/components/table.js | 4 ++-- src/containers/simulators.js | 28 +++++++++++++--------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/components/table.js b/src/components/table.js index 9d593fe..1c1910d 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -85,10 +85,10 @@ class CustomTable extends Component { var labelContent = data[labelKey]; if (child.props.labelModifier) { - labelContent = child.props.labelModifier(labelContent); + labelContent = child.props.labelModifier(labelContent, data); } - cell.push( ); + cell.push( ); } if (child.props.dataIndex) { diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 48c9b2b..c8e5140 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -165,27 +165,21 @@ class Simulators extends Component { } } - labelSimulatorState = state => { - if (state === 'unknown' || state === 'shutdown') { - return - + isSimulatorOutdated(simulator) { + const fiveMinutes = 5 * 60 * 1000; - {state} - ; - } - - return - - - {state} - ; + return Date.now() - new Date(simulator.stateUpdatedAt) > fiveMinutes; } isSimulatorOnline(state) { return state !== 'shutdown' && state !== 'unknown'; } - stateLabelStyle = state => { + stateLabelStyle = (state, simulator) => { + if (this.isSimulatorOutdated(simulator)) { + return 'default'; + } + if (this.isSimulatorOnline(state)) { return 'success'; } @@ -193,7 +187,11 @@ class Simulators extends Component { return 'danger'; } - stateLabelModifier = state => { + stateLabelModifier = (state, simulator) => { + if (this.isSimulatorOutdated(simulator)) { + return 'unknown'; + } + if (this.isSimulatorOnline(state)) { return 'online'; } From 3e1edcd2a35d96b76e58038c57c55a591d98fa52 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 21:17:13 +0200 Subject: [PATCH 480/556] Add state updated column to simulator table --- src/containers/simulators.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index c8e5140..76cc3e4 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -199,6 +199,12 @@ class Simulators extends Component { return 'offline'; } + stateUpdateModifier = updatedAt => { + const date = new Date(updatedAt); + + return date.toLocaleString('de-DE'); + } + render() { const buttonStyle = { marginLeft: '10px' @@ -212,7 +218,7 @@ class Simulators extends Component { this.onSimulatorChecked(index, event)} width='30' /> - + From 7dd9c0d4314f675a860cd5069a6f721c61b88e5f Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 7 Jun 2018 21:25:56 +0200 Subject: [PATCH 481/556] Fix slider edit dialog tests --- src/__tests__/components/dialog/edit-widget-control-creator.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index d9915bb..1f4815c 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -16,6 +16,7 @@ import EditWidgetCheckboxControl from '../../../components/dialog/edit-widget-ch import EditWidgetMinMaxControl from '../../../components/dialog/edit-widget-min-max-control'; import EditWidgetColorZonesControl from '../../../components/dialog/edit-widget-color-zones-control'; import EditWidgetHTMLContent from '../../../components/dialog/edit-widget-html-content'; +import EditWidgetNumberControl from '../../../components/dialog/edit-widget-number-control'; describe('edit widget control creator', () => { it('should not return null', () => { @@ -31,7 +32,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Slider' }, result: { controlNumber: 4, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, From a4f7be81f43808b279b3e4ccc91dfc6233fa30b5 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 8 Jun 2018 11:34:00 +0200 Subject: [PATCH 482/556] show simluator properties in edit dialog --- src/components/dialog/edit-simulator.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialog/edit-simulator.js index 6002226..346fb2a 100644 --- a/src/components/dialog/edit-simulator.js +++ b/src/components/dialog/edit-simulator.js @@ -24,6 +24,7 @@ import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; class EditSimulatorDialog extends React.Component { valid = true; @@ -82,6 +83,10 @@ class EditSimulatorDialog extends React.Component { this.handleChange(e)} /> + + Properties + + ); From 4265f5946016fa299d6afeef67b322cf3c2d2b93 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 8 Jun 2018 11:34:17 +0200 Subject: [PATCH 483/556] change columns in simulator list --- src/containers/simulators.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 76cc3e4..5c425c5 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -166,13 +166,16 @@ class Simulators extends Component { } isSimulatorOutdated(simulator) { + if (!simulator.stateUpdatedAt) + return true; + const fiveMinutes = 5 * 60 * 1000; return Date.now() - new Date(simulator.stateUpdatedAt) > fiveMinutes; } isSimulatorOnline(state) { - return state !== 'shutdown' && state !== 'unknown'; + return state != '' && state !== 'shutdown' && state !== 'unknown'; } stateLabelStyle = (state, simulator) => { @@ -218,10 +221,11 @@ class Simulators extends Component { this.onSimulatorChecked(index, event)} width='30' /> - - + + + - + Date: Fri, 8 Jun 2018 15:13:00 +0200 Subject: [PATCH 484/556] minor styling improvments of parameters-editor --- src/components/parameters-editor.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/parameters-editor.js b/src/components/parameters-editor.js index 38f81df..09beb96 100644 --- a/src/components/parameters-editor.js +++ b/src/components/parameters-editor.js @@ -58,6 +58,8 @@ class ParametersEditor extends React.Component { src={this.props.content} name={false} displayDataTypes={false} + displayObjectSize={false} + enableClipboard={false} onAdd={this.props.disabled ? undefined : this.onAdd} onEdit={this.props.disabled ? undefined : this.onEdit} onDelete={this.props.disabled ? undefined : this.onDelete} From 74a3cf4d4b578486657a79ab9f018d8bd4140b04 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:48:23 +0200 Subject: [PATCH 485/556] remove obsolete NodeTree component --- src/components/node-tree.js | 126 ------------------------------------ 1 file changed, 126 deletions(-) delete mode 100644 src/components/node-tree.js diff --git a/src/components/node-tree.js b/src/components/node-tree.js deleted file mode 100644 index 7513710..0000000 --- a/src/components/node-tree.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * File: node-tree.js - * Author: Markus Grigull - * Date: 26.06.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 SortableTree from 'react-sortable-tree'; -import { Button, Glyphicon } from 'react-bootstrap'; - -class NodeTree extends React.Component { - constructor(props) { - super(props); - - this.state = { - treeData: [] - }; - } - - canNodeDrag(node, path) { - return (node.parentNode != null); - } - - canNodeDrop(node, prevPath) { - return (node.nextParent != null); - } - - generateNodeProps(rowInfo) { - var buttons = []; - - if (rowInfo.parentNode == null) { - buttons.push(); - buttons.push(); - buttons.push(); - buttons.push(); - } else { - // get child index - var index = rowInfo.path[1] - rowInfo.path[0] - 1; - - buttons.push(); - buttons.push(); - } - - return { - buttons: buttons - }; - } - - nodesToTreeData(nodes) { - var treeData = []; - - nodes.forEach((node) => { - var parent = { title: node.name, subtitle: node.endpoint, id: node._id, config: node.config, children: [], expanded: true }; - - node.simulators.forEach((simulator) => { - parent.children.push({ title: simulator.name, subtitle: simulator.id != null ? 'Online' : 'Offline' }); - }); - - treeData.push(parent); - }); - - return treeData; - } - - treeDataToNodes(treeData) { - var nodes = []; - - treeData.forEach((data) => { - var node = { name: data.title, endpoint: data.subtitle, _id: data.id, config: data.config, simulators: [] }; - - data.children.forEach((child) => { - node.simulators.push({ name: child.title }); - }); - - nodes.push(node); - }); - - return nodes; - } - - componentWillReceiveProps(nextProps) { - // compare if data changed - if (this.props.data == null || this.props.data !== nextProps.data) { - // generate new state - var treeData = this.nodesToTreeData(nextProps.data); - this.setState({ treeData }); - } - } - - onDataChange(treeData) { - this.setState({ treeData }); - - this.props.onDataChange(this.treeDataToNodes(treeData)) - } - - render() { - return ( - this.onDataChange(treeData)} - style={{ height: 400 }} - maxDepth={ 2 } - canDrag={(node, path) => this.canNodeDrag(node, path)} - canDrop={(node, prevPath) => this.canNodeDrop(node, prevPath)} - generateNodeProps={(rowInfo) => this.generateNodeProps(rowInfo)} - /> - ); - } -} - -export default NodeTree; From d4f02c29613c72c3e077c0e0d51ec47c20023e77 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:52:12 +0200 Subject: [PATCH 486/556] replace GlyphIcons by FontAwesome icons --- package-lock.json | 30 +++++++++++++ package.json | 3 ++ .../dialog/edit-widget-color-zones-control.js | 12 +++--- src/components/editable-header.js | 11 ++--- src/components/header.js | 5 ++- src/components/icon.js | 35 +++++++++++++++ src/components/table.js | 9 ++-- src/containers/project.js | 23 +++++----- src/containers/projects.js | 9 ++-- src/containers/simulation.js | 35 +++++++-------- src/containers/simulations.js | 43 ++++++++++--------- src/containers/simulators.js | 9 ++-- src/containers/users.js | 9 ++-- src/styles/app.css | 4 -- 14 files changed, 156 insertions(+), 81 deletions(-) create mode 100644 src/components/icon.js diff --git a/package-lock.json b/package-lock.json index 15360b3..d8848e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,36 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@fortawesome/fontawesome": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome/-/fontawesome-1.1.8.tgz", + "integrity": "sha512-c0/MtkPVT0fmiFcCyYoPjkG9PkMOvfrZw2+0BaJ+Rh6UEcK1AR/LaRgrHHjUkbAbs9LXxQJhFS8CJ4uSnK2+JA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.1.7" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.1.7.tgz", + "integrity": "sha512-ego8jRVSHfq/iq4KRZJKQeUAdi3ZjGNrqw4oPN3fNdvTBnLCSntwVCnc37bsAJP9UB8MhrTfPnZYxkv2vpS4pg==" + }, + "@fortawesome/fontawesome-free-solid": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.13.tgz", + "integrity": "sha512-b+krVnqkdDt52Yfev0x0ZZgtxBQsLw00Zfa3uaVWIDzpNZVtrEXuxldUSUaN/ihgGhSNi8VpvDAdNPVgCKOSxw==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.1.7" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.0.20.tgz", + "integrity": "sha512-0a1VYxlCU1oQZzxXK2KIlVArQJSGG3BgBwelLNbR5f2CD6+zQhXXMC9Vm8V4VLO1ZWDeGdjAJZmf7VL/zuuBGQ==", + "requires": { + "humps": "^2.0.1", + "prop-types": "^15.5.7" + } + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", diff --git a/package.json b/package.json index 231fe04..daa6829 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/fontawesome": "^1.1.8", + "@fortawesome/fontawesome-free-solid": "^5.0.13", + "@fortawesome/react-fontawesome": "0.0.20", "babel-runtime": "^6.26.0", "bootstrap": "^3.3.7", "classnames": "^2.2.5", diff --git a/src/components/dialog/edit-widget-color-zones-control.js b/src/components/dialog/edit-widget-color-zones-control.js index 458a4ce..3367218 100644 --- a/src/components/dialog/edit-widget-color-zones-control.js +++ b/src/components/dialog/edit-widget-color-zones-control.js @@ -20,8 +20,10 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, ControlLabel, Button, Glyphicon } from 'react-bootstrap'; +import { FormGroup, ControlLabel, Button } from 'react-bootstrap'; + +import Icon from '../icon'; import Table from '../table'; import TableColumn from '../table-column'; @@ -67,7 +69,7 @@ class EditWidgetColorZonesControl extends React.Component { changeCell = (event, row, column) => { // change row const widget = this.state.widget; - + if (column === 1) { widget.zones[row].strokeStyle = event.target.value; } else if (column === 2) { @@ -96,7 +98,7 @@ class EditWidgetColorZonesControl extends React.Component { checkedCell = (row, event) => { // update selected rows const selectedZones = this.state.selectedZones; - + if (event.target.checked) { if (selectedZones.indexOf(row) === -1) { selectedZones.push(row); @@ -122,8 +124,8 @@ class EditWidgetColorZonesControl extends React.Component {
    - - + + ; } } diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 77a4293..0b114bc 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -21,7 +21,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Glyphicon, FormControl } from 'react-bootstrap'; +import { FormControl } from 'react-bootstrap'; +import Icon from './icon'; class EditableHeader extends React.Component { titleInput = null; @@ -64,7 +65,7 @@ class EditableHeader extends React.Component { float: 'left' }; - const glyphStyle = { + const iconStyle = { float: 'left', marginLeft: '10px', @@ -84,8 +85,8 @@ class EditableHeader extends React.Component { - - + +
    ; } @@ -94,7 +95,7 @@ class EditableHeader extends React.Component { {this.state.title} - +
    ; } } diff --git a/src/components/header.js b/src/components/header.js index d0d0a87..710ea9b 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -20,7 +20,8 @@ ******************************************************************************/ import React from 'react'; -import { Col, Button, Glyphicon } from 'react-bootstrap'; +import { Col, Button } from 'react-bootstrap'; +import Icon from './icon'; class Header extends React.Component { render() { @@ -31,7 +32,7 @@ class Header extends React.Component { {this.props.showMenuButton && - + }
    diff --git a/src/components/icon.js b/src/components/icon.js new file mode 100644 index 0000000..b2fca6e --- /dev/null +++ b/src/components/icon.js @@ -0,0 +1,35 @@ +/** + * 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 + * 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 FontAwesomeIcon from '@fortawesome/react-fontawesome' + +import '@fortawesome/fontawesome-free-solid'; + +class Icon extends React.Component { + + render() { + return + } +} + +export default Icon; diff --git a/src/components/table.js b/src/components/table.js index 1c1910d..b155826 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -21,8 +21,9 @@ import React, { Component } from 'react'; import _ from 'lodash'; -import { Table, Button, Glyphicon, FormControl, Label, Checkbox } from 'react-bootstrap'; +import { Table, Button, FormControl, Label, Checkbox } from 'react-bootstrap'; import { Link } from 'react-router-dom'; +import Icon from './icon'; class CustomTable extends Component { constructor(props) { @@ -97,11 +98,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) { @@ -111,7 +112,7 @@ class CustomTable extends Component { } if (child.props.exportButton) { - cell.push(); + cell.push(); } return cell; diff --git a/src/containers/project.js b/src/containers/project.js index f649303..985dfbc 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; @@ -30,6 +30,7 @@ import UserStore from '../stores/user-store'; import VisualizationStore from '../stores/visualization-store'; import SimulationStore from '../stores/simulation-store'; +import Icon from '../components/icon'; import CustomTable from '../components/table'; import TableColumn from '../components/table-column'; import NewVisualzationDialog from '../components/dialog/new-visualization'; @@ -128,7 +129,7 @@ class Visualizations extends Component { if (confirmDelete === false) { return; - } + } AppDispatcher.dispatch({ type: 'visualizations/start-remove', @@ -190,7 +191,7 @@ class Visualizations extends Component { onModalKeyPress = (event) => { if (event.key === 'Enter') { event.preventDefault(); - + this.confirmDeleteModal(); } } @@ -206,19 +207,19 @@ class Visualizations extends Component { - this.setState({ editModal: true, modalData: this.state.visualizations[index] })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.visualizations[index] })} + onEdit={(index) => 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)} /> - - + + this.closeNewModal(data)} /> this.closeEditModal(data)} visualization={this.state.modalData} /> diff --git a/src/containers/projects.js b/src/containers/projects.js index 37cb384..8173006 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -21,13 +21,14 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +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 Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewProjectDialog from '../components/dialog/new-project'; @@ -117,14 +118,14 @@ class Projects extends React.Component { 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(); } } @@ -140,7 +141,7 @@ class Projects extends React.Component { 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! diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 19c1a06..6fb8c0b 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; @@ -31,6 +31,7 @@ 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/dialog/import-simulation-model'; @@ -146,7 +147,7 @@ class Simulation extends React.Component { simulationModel.simulation = this.state.simulation._id; console.log(simulationModel); - + AppDispatcher.dispatch({ type: 'simulationModels/start-add', data: simulationModel, @@ -173,7 +174,7 @@ class Simulation extends React.Component { exportModel(index) { // filter properties const model = Object.assign({}, this.state.simulationModels[index]); - + delete model.simulator; delete model.simulation; @@ -222,7 +223,7 @@ class Simulation extends React.Component { } if (action.data.action === 'start') { - action.data.parameters = this.state.simulationModels[index].startParameters; + action.data.parameters = this.state.simulationModels[index].startParameters; } AppDispatcher.dispatch({ @@ -248,31 +249,31 @@ class Simulation extends React.Component { this.getSimulatorName(simulator)} /> - this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} onExport={index => this.exportModel(index)} />
    -
    - - + +
    diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 1367d8a..25ee82a 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import AppDispatcher from '../app-dispatcher'; @@ -30,6 +30,7 @@ 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 NewSimulationDialog from '../components/dialog/new-simulation'; @@ -101,7 +102,7 @@ class Simulations extends Component { token: this.state.sessionToken }); } - + if (simulatorIds.length > 0) { AppDispatcher.dispatch({ type: 'simulators/start-load', @@ -190,7 +191,7 @@ class Simulations extends Component { onModalKeyPress = (event) => { if (event.key === 'Enter') { event.preventDefault(); - + this.confirmDeleteModal(); } } @@ -259,9 +260,9 @@ class Simulations extends Component { } if (action.data.action === 'start') { - action.data.parameters = Object.assign({}, this.state.simulations[index].startParameters, simulationModel.startParameters); + action.data.parameters = Object.assign({}, this.state.simulations[index].startParameters, simulationModel.startParameters); } - + AppDispatcher.dispatch({ type: 'simulators/start-action', simulator, @@ -284,32 +285,32 @@ class Simulations extends Component { 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] })} + 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)} />
    -
    - - + +
    diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 5c425c5..4bd7ff6 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; @@ -29,6 +29,7 @@ import AppDispatcher from '../app-dispatcher'; import SimulatorStore from '../stores/simulator-store'; import UserStore from '../stores/user-store'; +import Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewSimulatorDialog from '../components/dialog/new-simulator'; @@ -175,7 +176,7 @@ class Simulators extends Component { } isSimulatorOnline(state) { - return state != '' && state !== 'shutdown' && state !== 'unknown'; + return state !== '' && state !== 'shutdown' && state !== 'unknown'; } stateLabelStyle = (state, simulator) => { @@ -245,8 +246,8 @@ class Simulators extends Component {
    - - + +
    diff --git a/src/containers/users.js b/src/containers/users.js index edf4162..9d34c3b 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -21,12 +21,13 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; import UserStore from '../stores/user-store'; import UsersStore from '../stores/users-store'; +import Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; import NewUserDialog from '../components/dialog/new-user'; @@ -102,14 +103,14 @@ class Users extends Component { 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(); } } @@ -127,7 +128,7 @@ class Users extends Component { this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> - + this.closeNewModal(data)} /> this.closeEditModal(data)} user={this.state.modalData} /> diff --git a/src/styles/app.css b/src/styles/app.css index 52cb3bd..5017aea 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -373,10 +373,6 @@ body { text-decoration: none; } -.section-header .glyphicon { - font-size: 0.8em; -} - .section-buttons-group-right { height: auto !important; From 7aacc61e3dbb575d9279f099d31a385ef3fd5df9 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:53:34 +0200 Subject: [PATCH 487/556] refactor NumberInputWidget to InputWidget --- .../dialog/edit-widget-control-creator.js | 2 +- .../dialog/edit-widget-control-creator.js | 2 +- src/components/widget-factory.js | 2 +- .../{widget-number-input.js => widget-input.js} | 14 +++++++------- src/containers/widget.js | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) rename src/components/{widget-number-input.js => widget-input.js} (82%) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 1f4815c..4298ef1 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -37,7 +37,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, { args: { widgetType: 'HTML' }, result: { controlNumber: 1, controlTypes: [EditWidgetHTMLContent] } }, - { args: { widgetType: 'NumberInput'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } } + { args: { widgetType: 'Input'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } } ]; runs.forEach( (run) => { diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 9f593ec..f73c86c 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -162,7 +162,7 @@ export default function createControls(widgetType = null, widget = null, session ); break; - case 'NumberInput': + case 'Input': dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index b59c6fa..496a3be 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -108,7 +108,7 @@ class WidgetFactory { widget.simulationModel = defaultSimulationModel; widget.signal = 0; break; - case 'NumberInput': + case 'Input': widget.minWidth = 200; widget.minHeight = 50; widget.width = 200; diff --git a/src/components/widget-number-input.js b/src/components/widget-input.js similarity index 82% rename from src/components/widget-number-input.js rename to src/components/widget-input.js index 13061bb..47c21d0 100644 --- a/src/components/widget-number-input.js +++ b/src/components/widget-input.js @@ -10,8 +10,8 @@ import React, { Component } from 'react'; import { Form, FormGroup, Col, ControlLabel, FormControl } from 'react-bootstrap'; -class WidgetNumberInput extends Component { - +class WidgetInput extends Component { + static whichValidationStateIs( condition ) { switch(condition) { case 'ok': return null; @@ -25,23 +25,23 @@ class WidgetNumberInput extends Component { this.state = { value: '', - validationState: WidgetNumberInput.whichValidationStateIs('ok') + validationState: WidgetInput.whichValidationStateIs('ok') }; } validateInput(e) { if (e.target.value === '' || e.target.value.endsWith('.')) { this.setState({ - validationState: WidgetNumberInput.whichValidationStateIs('ok'), + validationState: WidgetInput.whichValidationStateIs('ok'), value: e.target.value }); } else { var num = Number(e.target.value); if (Number.isNaN(num)) { - this.setState({ validationState: WidgetNumberInput.whichValidationStateIs('error'), + this.setState({ validationState: WidgetInput.whichValidationStateIs('error'), value: e.target.value }); } else { this.setState({ - validationState: WidgetNumberInput.whichValidationStateIs('ok'), + validationState: WidgetInput.whichValidationStateIs('ok'), value: num }); } } @@ -66,4 +66,4 @@ class WidgetNumberInput extends Component { } } -export default WidgetNumberInput; \ No newline at end of file +export default WidgetInput; diff --git a/src/containers/widget.js b/src/containers/widget.js index 2879498..37c7b8e 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -39,7 +39,7 @@ import WidgetLabel from '../components/widget-label'; import WidgetPlotTable from '../components/widget-plot-table'; import WidgetImage from '../components/widget-image'; import WidgetButton from '../components/widget-button'; -import WidgetNumberInput from '../components/widget-number-input'; +import WidgetInput from '../components/widget-input'; import WidgetSlider from '../components/widget-slider'; import WidgetGauge from '../components/widget-gauge'; import WidgetBox from '../components/widget-box'; @@ -218,8 +218,8 @@ class Widget extends React.Component { element = } else if (widget.type === 'Button') { element = - } else if (widget.type === 'NumberInput') { - element = + } else if (widget.type === 'Input') { + element = } else if (widget.type === 'Slider') { element = this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={(value) => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { From 95ff0dc14d24c2358b5884fdeef0cbd336d39aca Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:56:25 +0200 Subject: [PATCH 488/556] update licence and copyright notices in headers --- .../dialog/edit-widget-color-control.js | 25 ++++++++++++----- src/components/widget-box.js | 27 ++++++++++++++----- src/components/widget-button.js | 25 ++++++++++++----- src/components/widget-factory.js | 22 +++++++++++---- src/components/widget-gauge.js | 21 ++++++++++++--- src/components/widget-input.js | 21 ++++++++++++--- src/components/widget-slider.js | 21 ++++++++++++--- src/data-managers/notifications-factory.js | 25 ++++++++++++----- 8 files changed, 146 insertions(+), 41 deletions(-) diff --git a/src/components/dialog/edit-widget-color-control.js b/src/components/dialog/edit-widget-color-control.js index 1b50f44..6a44e3d 100644 --- a/src/components/dialog/edit-widget-color-control.js +++ b/src/components/dialog/edit-widget-color-control.js @@ -2,10 +2,23 @@ * File: edit-widget-color-control.js * Author: Ricardo Hernandez-Montoya * Date: 24.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; @@ -56,7 +69,7 @@ class EditWidgetColorControl extends Component { let checkedClass = classNames({ 'checked': idx === this.state.widget[this.props.controlId] }); - + return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) } ) @@ -67,4 +80,4 @@ class EditWidgetColorControl extends Component { } } -export default EditWidgetColorControl; \ No newline at end of file +export default EditWidgetColorControl; diff --git a/src/components/widget-box.js b/src/components/widget-box.js index b917b65..db4621d 100644 --- a/src/components/widget-box.js +++ b/src/components/widget-box.js @@ -2,10 +2,23 @@ * File: widget-box.js * Author: Ricardo Hernandez-Montoya * Date: 25.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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'; @@ -13,11 +26,13 @@ import EditWidgetColorControl from './dialog/edit-widget-color-control'; class WidgetBox extends Component { render() { - + let colors = EditWidgetColorControl.ColorPalette; let colorStyle = { - borderColor: colors[this.props.widget.border_color] + borderColor: colors[this.props.widget.border_color], + backgroundColor: colors[this.props.widget.background_color], + opacity: this.props.widget.background_color_opacity } return ( diff --git a/src/components/widget-button.js b/src/components/widget-button.js index 98ced0d..9a6c33b 100644 --- a/src/components/widget-button.js +++ b/src/components/widget-button.js @@ -2,10 +2,23 @@ * File: widget-button.js * Author: Ricardo Hernandez-Montoya * Date: 29.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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'; @@ -27,7 +40,7 @@ class WidgetButton extends Component { color: colors[this.props.widget.font_color], borderColor: colors[this.props.widget.font_color] } - + return (
    { this.props.editing ? ( @@ -41,4 +54,4 @@ class WidgetButton extends Component { } } -export default WidgetButton; \ No newline at end of file +export default WidgetButton; diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 496a3be..f644423 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -3,11 +3,23 @@ * Description: A factory to create and pre-configure widgets * Author: Ricardo Hernandez-Montoya * Date: 02.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ - + * 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 + * 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 WidgetSlider from './widget-slider'; class WidgetFactory { diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index 344fbbf..dcd250d 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -2,10 +2,23 @@ * File: widget-gauge.js * Author: Ricardo Hernandez-Montoya * Date: 31.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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 { Gauge } from 'gaugeJS'; diff --git a/src/components/widget-input.js b/src/components/widget-input.js index 47c21d0..d5ad7b6 100644 --- a/src/components/widget-input.js +++ b/src/components/widget-input.js @@ -2,10 +2,23 @@ * File: widget-number-input.js * Author: Ricardo Hernandez-Montoya * Date: 29.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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 { Form, FormGroup, Col, ControlLabel, FormControl } from 'react-bootstrap'; diff --git a/src/components/widget-slider.js b/src/components/widget-slider.js index b6b8647..8599b8c 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -2,10 +2,23 @@ * File: widget-slider.js * Author: Ricardo Hernandez-Montoya * Date: 30.03.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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 classNames from 'classnames'; diff --git a/src/data-managers/notifications-factory.js b/src/data-managers/notifications-factory.js index 56c095c..4f2a079 100644 --- a/src/data-managers/notifications-factory.js +++ b/src/data-managers/notifications-factory.js @@ -1,13 +1,26 @@ /** * File: notifications-factory.js - * Description: An unique source of pre-defined notifications that are displayed + * Description: An unique source of pre-defined notifications that are displayed * throughout the application. * Author: Ricardo Hernandez-Montoya * Date: 13.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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 . + ******************************************************************************/ class NotificationsFactory { @@ -21,4 +34,4 @@ class NotificationsFactory { } -export default NotificationsFactory; \ No newline at end of file +export default NotificationsFactory; From cdba275eeecb934209cc34e37e7537133ff71c6c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:57:02 +0200 Subject: [PATCH 489/556] intialize maximum of EditWidgetMinMaxControl to 100 --- src/components/dialog/edit-widget-min-max-control.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dialog/edit-widget-min-max-control.js b/src/components/dialog/edit-widget-min-max-control.js index 13d178a..7d867a0 100644 --- a/src/components/dialog/edit-widget-min-max-control.js +++ b/src/components/dialog/edit-widget-min-max-control.js @@ -29,7 +29,7 @@ class EditWidgetMinMaxControl extends React.Component { const widget = {}; widget[props.controlID + "UseMinMax"] = false; widget[props.controlId + "Min"] = 0; - widget[props.controlId + "Max"] = 1; + widget[props.controlId + "Max"] = 100; this.state = { widget From e4470a8432566cfb931d99d9b6f4595a38d4a0c6 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:58:07 +0200 Subject: [PATCH 490/556] add new control in order to change background color of boxes --- src/components/dialog/edit-widget-control-creator.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index f73c86c..0ac9502 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -139,7 +139,8 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Box': dialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Label': From aaeaef84a894efe6af81f55fc7e2d6b43e0925da Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:58:41 +0200 Subject: [PATCH 491/556] show plot legends under chart --- src/components/widget-plot-table.js | 7 +++---- src/components/widget-plot.js | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/widget-plot-table.js b/src/components/widget-plot-table.js index 9e9f353..08a400e 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widget-plot-table.js @@ -137,8 +137,6 @@ class WidgetPlotTable extends Component { return (
    - -
    { checkBoxes.length > 0 ? ( @@ -150,9 +148,9 @@ class WidgetPlotTable extends Component {
    -
    +
    ); diff --git a/src/components/widget-plot.js b/src/components/widget-plot.js index cb8271c..5dd00b6 100644 --- a/src/components/widget-plot.js +++ b/src/components/widget-plot.js @@ -55,7 +55,7 @@ class WidgetPlot extends React.Component { if (chosenSignals.includes(signal_index)) { accum.push({ index: signal_index, name: model_signal.name, type: model_signal.type }); } - + return accum; }, []); @@ -67,8 +67,6 @@ class WidgetPlot extends React.Component { render() { return
    - -
    +
    ; } } From c3469f50c509c9e454d4d1876578cf6b9bbaa495 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 14:59:37 +0200 Subject: [PATCH 492/556] whitespace cleanups --- src/components/home.js | 2 +- src/components/widget-gauge.js | 6 +++--- src/containers/visualization.js | 2 +- src/styles/app.css | 16 ++++++++-------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/home.js b/src/components/home.js index 95b20b3..42faa6f 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -56,7 +56,7 @@ 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('nodes')} nodes, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulators')} simulations. + 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

    diff --git a/src/components/widget-gauge.js b/src/components/widget-gauge.js index dcd250d..9f86902 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widget-gauge.js @@ -54,12 +54,12 @@ class WidgetGauge extends Component { } const simulator = nextProps.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.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { this.setState({ value: 0 }); return; @@ -163,7 +163,7 @@ class WidgetGauge extends Component { }); } - this.gauge.setOptions({ + this.gauge.setOptions({ staticLabels: { font: '10px "Helvetica Neue"', labels, diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 2bf0f4b..3ac008f 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -464,7 +464,7 @@ class Visualization extends React.Component { // 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 (
    diff --git a/src/styles/app.css b/src/styles/app.css index 5017aea..6e6daac 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -152,14 +152,14 @@ body { .menu-sidebar a::after { /* Trick to make menu items to be as wide as in bold */ - display:block; - content:attr(title); - font-weight:bold; - height:1px; - color:transparent; - overflow:hidden; - visibility:hidden; - margin-bottom:-1px; + display: block; + content: attr(title); + font-weight: bold; + height: 1px; + color: transparent; + overflow: hidden; + visibility: hidden; + margin-bottom: -1px; } .sidenav { From cd37fbc9aaa4f44c205af05e264950a5f2dc16a2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 15:00:02 +0200 Subject: [PATCH 493/556] remove obsolete event handler --- src/stores/simulator-data-store.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/stores/simulator-data-store.js b/src/stores/simulator-data-store.js index 1486558..1c4c8bf 100644 --- a/src/stores/simulator-data-store.js +++ b/src/stores/simulator-data-store.js @@ -106,7 +106,6 @@ class SimulationDataStore extends ReduceStore { return state; case 'simulatorData/inputChanged': - // find simulator in node array if (state[action.simulator] == null || state[action.simulator].input == null) { return state; } @@ -120,18 +119,6 @@ class SimulationDataStore extends ReduceStore { return state; - case 'simulatorData/closed': - // close and delete socket - if (state[action.node] != null) { - // delete data - //delete state[action.identifier]; - //state[action.identifier] = null; - - //this.__emitChange(); - } - - return state; - default: return state; } From 2e849c6cf6950aed03420fee37f85987523eb38d Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 15:00:35 +0200 Subject: [PATCH 494/556] improve styling of toolbox --- src/components/toolbox-item.js | 23 ++++++--- src/containers/visualization.js | 85 +++++++++++++++++---------------- 2 files changed, 61 insertions(+), 47 deletions(-) diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js index ff2a7cb..b4283c9 100644 --- a/src/components/toolbox-item.js +++ b/src/components/toolbox-item.js @@ -20,8 +20,10 @@ ******************************************************************************/ import React from 'react'; +import { Button } from 'react-bootstrap'; import { DragSource } from 'react-dnd'; import classNames from 'classnames'; +import Icon from './icon'; const toolboxItemSource = { beginDrag(props) { @@ -53,15 +55,22 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource( - - {this.props.name} - +
    + +
    , {dropEffect}); - } else { + } + else { return ( - - {this.props.name} - +
    + +
    ); } } diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 3ac008f..e08f8e1 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -21,12 +21,13 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Glyphicon } from 'react-bootstrap'; +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 Icon from '../components/icon'; import WidgetFactory from '../components/widget-factory'; import ToolboxItem from '../components/toolbox-item'; import Dropzone from '../components/dropzone'; @@ -434,30 +435,29 @@ class Visualization extends React.Component { let buttons = [] let editingControls = []; + let gridControl = {}; if (this.state.editing) { - editingControls.push( -
    - Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} - this.setGrid(value)} /> -
    - ) + buttons.push({ click: () => this.stopEditing(), icon: 'save', text: 'Save' }); + buttons.push({ click: () => this.discardChanges(), icon: 'ban', text: 'Cancel' }); - buttons.push({ click: () => this.stopEditing(), glyph: 'floppy-disk', text: 'Save' }); - buttons.push({ click: () => this.discardChanges(), glyph: 'remove', text: 'Cancel' }); + gridControl =
    + Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} + this.setGrid(value)} /> +
    } if (!this.props.isFullscreen) { - buttons.push({ click: this.props.toggleFullscreen, glyph: 'resize-full', text: 'Fullscreen' }); - buttons.push({ click: this.state.paused ? this.unpauseData : this.pauseData, glyph: this.state.paused ? 'play' : 'pause', text: this.state.paused ? 'Live' : 'Pause' }); + 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 }), glyph: 'pencil', text: 'Edit' }); + buttons.push({ click: () => this.setState({ editing: true }), icon: 'edit', text: 'Edit' }); } const buttonList = buttons.map((btn, idx) => ); @@ -473,31 +473,33 @@ class Visualization extends React.Component {
    + { this.state.editing && gridControl } { buttonList }
    e.preventDefault() }> {this.state.editing && -
    - - - - - - - - - - - - - - - -
    +
    + { editingControls } -
    + + + + + + + + + + + + + + + + +
    } @@ -524,17 +526,20 @@ class Visualization extends React.Component { Object.keys(current_widgets).map(widget_key => { const data = { key: widget_key }; - return - this.editWidget(e, data)}>Edit - this.deleteWidget(e, data)}>Delete + const locked = this.state.visualization.widgets[widget_key].locked; + const disabledMove = locked || this.state.visualization.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.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.lockWidget(data)}>Lock + this.unlockWidget(data)}>Unlock })} From 223ee785eb35d793c976c7b6d43b1b63c05a4b90 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 15:01:26 +0200 Subject: [PATCH 495/556] some bug fixes for z ordering and widget dimensions in editing mode --- src/containers/widget.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 37c7b8e..bdb7761 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -190,6 +190,7 @@ class Widget extends React.Component { const widget = this.props.data; let borderedWidget = false; let element = null; + let zIndex = Number(widget.z); let simulationModel = null; @@ -232,6 +233,9 @@ class Widget extends React.Component { element = } + if (widget.type === 'Box') + zIndex = 0; + const widgetClasses = classNames({ 'widget': !this.props.editing, 'editing-widget': this.props.editing, @@ -258,18 +262,25 @@ class Widget extends React.Component { onDragStop={(event, data) => this.dragStop(event, data)} dragGrid={grid} resizeGrid={grid} - zIndex={widget.z} + z={zIndex} enableResizing={resizing} disableDragging={widget.locked} > - + {element} ); } else { return ( -
    +
    {element}
    ); From ee83dbdbceb59f291d59a3d4126114834c8d77bc Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 15:01:53 +0200 Subject: [PATCH 496/556] some tweaks to the slider widget --- .../dialog/edit-widget-control-creator.js | 4 ++-- .../dialog/edit-widget-number-control.js | 2 +- src/components/widget-slider.js | 20 +++++++++---------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialog/edit-widget-control-creator.js index 0ac9502..5a4f716 100644 --- a/src/components/dialog/edit-widget-control-creator.js +++ b/src/components/dialog/edit-widget-control-creator.js @@ -125,8 +125,8 @@ export default function createControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Button': diff --git a/src/components/dialog/edit-widget-number-control.js b/src/components/dialog/edit-widget-number-control.js index 0977756..15b4c67 100644 --- a/src/components/dialog/edit-widget-number-control.js +++ b/src/components/dialog/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/components/widget-slider.js b/src/components/widget-slider.js index 8599b8c..2f37fd9 100644 --- a/src/components/widget-slider.js +++ b/src/components/widget-slider.js @@ -38,7 +38,6 @@ class WidgetSlider extends Component { super(props); this.state = { - value: Number.parseFloat(this.props.widget.default_value), unit: '' }; } @@ -49,14 +48,14 @@ class WidgetSlider extends Component { } // Update value - if (nextProps.widget.value && this.state.value !== nextProps.widget.value) { + if (nextProps.widget.default_value && this.state.value === undefined) { this.setState({ - value: nextProps.widget.value, + value: nextProps.widget.default_value, }); } // Update unit - if (nextProps.widget.simulationModel && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.signal].type) { + if (nextProps.widget.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.signal].type) { this.setState({ unit: nextProps.simulationModel.inputMapping[nextProps.widget.signal].type }); @@ -95,14 +94,12 @@ class WidgetSlider extends Component { let isVertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; let fields = { - 'name': this.props.widget.name, - 'control': this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, - 'value': Number.parseFloat(this.state.value).toPrecision(3) + name: this.props.widget.name, + control: this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, + value: { Number.parseFloat(this.state.value).toPrecision(3) }, + unit: { this.state.unit } } - if (this.props.widget.showUnit) - fields.value += ' [' + this.state.unit + ']'; - var widgetClasses = classNames({ 'slider-widget': true, 'full': true, @@ -121,7 +118,8 @@ class WidgetSlider extends Component {
    { fields.control } - { fields.value } + { fields.value } + { this.props.widget.showUnit && fields.unit }
    ) ); From fa93abedaa40ab858fa68a41509465e689a94fcb Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 15:02:11 +0200 Subject: [PATCH 497/556] tweaks to the plot widget --- src/components/widget-plot/plot-legend.js | 34 +++++++--- src/components/widget-plot/plot.js | 75 ++++++++++++++--------- 2 files changed, 70 insertions(+), 39 deletions(-) diff --git a/src/components/widget-plot/plot-legend.js b/src/components/widget-plot/plot-legend.js index 9c8ad71..4bde597 100644 --- a/src/components/widget-plot/plot-legend.js +++ b/src/components/widget-plot/plot-legend.js @@ -2,10 +2,23 @@ * File: plot-legend.js * Author: Ricardo Hernandez-Montoya * Date: 10.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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 { scaleOrdinal, schemeCategory10 } from 'd3-scale'; @@ -15,11 +28,14 @@ class PlotLegend extends React.Component { const colorScale = scaleOrdinal(schemeCategory10); return
    - {this.props.signals.map(signal => -
    -   {signal.name} [{signal.type}] -
    - )} +
      + {this.props.signals.map(signal => +
    • + {signal.name} + {signal.type} +
    • + )} +
    ; } } diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 719f35a..986db6f 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -2,10 +2,23 @@ * File: plot.js * Author: Ricardo Hernandez-Montoya * Date: 10.04.2017 - * Copyright: 2017, Institute for Automation of Complex Power Systems, EONERC - * This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential. - * Unauthorized copying of this file, via any medium is strictly prohibited. - **********************************************************************************/ + * 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 + * 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 { scaleLinear, scaleTime, scaleOrdinal, schemeCategory10 } from 'd3-scale'; @@ -14,9 +27,11 @@ import { line } from 'd3-shape'; import { axisBottom, axisLeft } from 'd3-axis'; import { select } from 'd3-selection'; import { timeFormat } from 'd3-time-format'; +import { format } from 'd3'; -const leftMargin = 30; -const bottomMargin = 20; +const topMargin = 10; +const bottomMargin = 25; +const leftMargin = 40; const rightMargin = 10; let uniqueIdentifier = 0; @@ -28,20 +43,20 @@ class Plot extends React.Component { // create dummy axes let labelMargin = 0; if (props.yLabel !== '') { - labelMargin = 20; + labelMargin = 30; } const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([0, props.width - leftMargin - labelMargin - rightMargin]); let yScale; if (props.yUseMinMax) { - yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height - bottomMargin, 0]); + yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height + topMargin - bottomMargin, topMargin]); } else { - yScale = scaleLinear().domain([0, 10]).range([props.height - bottomMargin, 0]); + yScale = scaleLinear().domain([0, 10]).range([props.height + topMargin - bottomMargin, topMargin]); } - const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); - const yAxis = axisLeft().scale(yScale).ticks(5); + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); + const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".1g")); this.state = { data: null, @@ -68,7 +83,7 @@ class Plot extends React.Component { let labelMargin = 0; if (nextProps.yLabel !== '') { - labelMargin = 20; + labelMargin = 30; } // check if data is invalid @@ -76,15 +91,15 @@ class Plot extends React.Component { // create empty plot axes const xScale = scaleTime().domain([Date.now() - nextProps.time * 1000, Date.now()]).range([0, nextProps.width - leftMargin - labelMargin - rightMargin]); let yScale; - + if (nextProps.yUseMinMax) { - yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height - bottomMargin, 0]); + yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height + topMargin - bottomMargin, topMargin]); } else { - yScale = scaleLinear().domain([0, 10]).range([nextProps.height - bottomMargin, 0]); + yScale = scaleLinear().domain([0, 10]).range([nextProps.height + topMargin - bottomMargin, topMargin]); } - - const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); - const yAxis = axisLeft().scale(yScale).ticks(5); + + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); + const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".1g")); this.setState({ data: null, xAxis, yAxis, labelMargin }); return; @@ -92,7 +107,7 @@ class Plot extends React.Component { // only show data in requested time let data = nextProps.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) @@ -137,7 +152,7 @@ class Plot extends React.Component { // calculate yRange let yRange = [0, 0]; - + if (this.props.yUseMinMax) { yRange = [this.props.yMin, this.props.yMax]; } else if (this.props.data.length > 0) { @@ -153,10 +168,10 @@ class Plot extends React.Component { // create scale functions for both axes const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([0, this.props.width - leftMargin - this.state.labelMargin - rightMargin]); - const yScale = scaleLinear().domain(yRange).range([this.props.height - bottomMargin, 5]); + const yScale = scaleLinear().domain(yRange).range([this.props.height + topMargin - bottomMargin, topMargin]); - const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(date => timeFormat("%M:%S")(date)); - const yAxis = axisLeft().scale(yScale).ticks(5); + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); + const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".1g")); // generate paths from data const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); @@ -173,16 +188,16 @@ class Plot extends React.Component { y: this.props.height / 2 } - return - select(node).call(this.state.xAxis)} style={{ transform: `translateX(${leftMargin + this.state.labelMargin}px) translateY(${this.props.height - bottomMargin}px)` }} /> - select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin + this.state.labelMargin}px)`}} /> - - {this.props.yLabel} - Time [s] + return + select(node).call(this.state.xAxis)} style={{ transform: `translateX(${leftMargin + this.state.labelMargin}px) translateY(${this.props.height + topMargin - bottomMargin}px)` }} /> + select(node).call(this.state.yAxis)} style={{ transform: `translateX(${leftMargin + this.state.labelMargin}px)` }} /> + + {this.props.yLabel} + Time [s] - + From 8d87a6a828cc687de409a6b2422fe670bdc0721c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 9 Jun 2018 15:02:34 +0200 Subject: [PATCH 498/556] miscelaneous styling improvments --- src/styles/app.css | 8 +------ src/styles/widgets.css | 50 +++++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/styles/app.css b/src/styles/app.css index 6e6daac..d6128af 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -61,7 +61,6 @@ body { } .app-header .menu-icon { - font-size: 28px; color: #818181; right: 5px; @@ -303,12 +302,7 @@ body { .toolbox-item { display: inline-block; - padding: 5px 10px; - - margin-right: 10px; - - border: 1px solid gray; - + margin-right: 5px; cursor: move; } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index e364a81..be7dec0 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -192,11 +192,7 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input display: flex; -webkit-flex: 1 1 auto; flex: 1 1 auto; -} - -.chart-wrapper { - width: 100%; - padding-left: 10px; + margin-bottom: 5px; } .plot-legend { @@ -207,22 +203,46 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input flex-shrink: 0; flex-wrap: wrap; justify-content: space-around; - margin-bottom: 5px; } .signal-legend { - font-size: 0.8em; - font-weight: 700; - padding-left: 5px; + float: left; + list-style-type: none; + font-size: 1.2em; + padding-left: 10px; padding-right: 5px; - overflow: hidden; + vertical-align: middle; } -.legend-color { - height: 50%; - display: inline-block; - margin-right: 5px; -} +li.signal-legend::before { + content: '■'; +} + +.signal-legend span { + font-size: 0.8em; +} + +.signal-legend-name { + margin-left: 5px; + font-weight: 700; + color: black; +} + +span.signal-unit { + color: grey; + font-style: italic; + font-weight: 50%; +} + +span.signal-unit::before { + content: '['; + font-style: normal; +} + +span.signal-unit::after { + content: ']'; + font-style: normal; +} /* End Plots */ From 24195d383771f526cf17a4fe81a378d745dc1eff Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 14 Jun 2018 15:25:23 +0200 Subject: [PATCH 499/556] Fix box widget tests --- src/__tests__/components/dialog/edit-widget-control-creator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 4298ef1..be81bc8 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -34,7 +34,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, - { args: { widgetType: 'Box' }, result: { controlNumber: 1, controlTypes: [EditWidgetColorControl] } }, + { 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, EditWidgetSimulatorControl, EditWidgetSignalControl] } } From 7781fb70df74455d3cb0c769b049132fcc2263cd Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Thu, 14 Jun 2018 15:33:46 +0200 Subject: [PATCH 500/556] Update react-scripts to newest version --- package-lock.json | 6293 +++++++++++++++++---------------------------- package.json | 2 +- 2 files changed, 2398 insertions(+), 3897 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8848e3..c30375d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,13 +49,13 @@ } }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==" }, "acorn-dynamic-import": { "version": "2.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { "acorn": "^4.0.3" @@ -63,14 +63,14 @@ "dependencies": { "acorn": { "version": "4.0.13", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-globals": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { "acorn": "^4.0.4" @@ -78,14 +78,14 @@ "dependencies": { "acorn": { "version": "4.0.13", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "acorn-jsx": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { "acorn": "^3.0.4" @@ -93,7 +93,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" } } @@ -104,27 +104,29 @@ "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" }, "address": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-SACB6CtYe6MZRZ/vUS9Rb+A9WK8=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", + "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, "ajv": { - "version": "4.11.8", - "resolved": false, - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": false, - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" }, "align-text": { "version": "0.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { "kind-of": "^3.0.2", @@ -144,69 +146,35 @@ }, "alphanum-sort": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "amdefine": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, - "anser": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha1-w2QYY6lizr75Qeoshwbyy08HFr0=" - }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { "string-width": "^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=" - }, - "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" - } - } } }, "ansi-escapes": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-html": { "version": "0.0.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { @@ -296,11 +264,11 @@ } }, "append-transform": { - "version": "0.4.0", - "resolved": false, - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "^2.0.0" } }, "argparse": { @@ -312,11 +280,12 @@ } }, "aria-query": { - "version": "0.5.0", - "resolved": false, - "integrity": "sha1-heMVLNjMW6sY2+1hzZxPzlT6ecM=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", + "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", "requires": { - "ast-types-flow": "0.0.7" + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" } }, "arr-diff": { @@ -336,27 +305,27 @@ }, "array-equal": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, "array-filter": { "version": "0.0.1", - "resolved": false, + "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": false, + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" }, "array-includes": { "version": "3.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { "define-properties": "^1.1.2", @@ -365,17 +334,17 @@ }, "array-map": { "version": "0.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" }, "array-reduce": { "version": "0.0.0", - "resolved": false, + "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": false, + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { "array-uniq": "^1.0.1" @@ -383,7 +352,7 @@ }, "array-uniq": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { @@ -393,17 +362,17 @@ }, "arrify": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { "version": "2.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1": { "version": "0.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "asn1.js": { @@ -418,10 +387,25 @@ }, "assert": { "version": "1.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { "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": { @@ -436,42 +420,49 @@ }, "ast-types-flow": { "version": "0.0.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "^4.14.0" + "lodash": "^4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } } }, "async-each": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "asynckit": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", - "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" }, "autoprefixer": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", - "integrity": "sha512-y3U+M3XLC3oKKkShZXcsjdCY6bTWmqOboqx1iDeaMumpqumPbEDUqb9586imSWcy8nboBTjqRu8bNe4KcoYOXA==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", + "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", "requires": { - "browserslist": "^2.1.3", - "caniuse-lite": "^1.0.30000670", + "browserslist": "^2.5.1", + "caniuse-lite": "^1.0.30000748", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^6.0.1", + "postcss": "^6.0.13", "postcss-value-parser": "^3.2.3" } }, @@ -487,7 +478,7 @@ }, "axobject-query": { "version": "0.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", "requires": { "ast-types-flow": "0.0.7" @@ -504,29 +495,29 @@ } }, "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha512-wne6XXFyKIfZSLLXN17Zun5aw8x2WZY5ork2NSa5t0UWGxK2EHsJlPd8W1rQQDgpG0tsvEHNdaqmvygEI7Qmmw==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "^6.22.0", - "babel-generator": "^6.25.0", + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", "babel-helpers": "^6.24.1", "babel-messages": "^6.23.0", - "babel-register": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.25.0", - "babel-traverse": "^6.25.0", - "babel-types": "^6.25.0", - "babylon": "^6.17.2", - "convert-source-map": "^1.1.0", - "debug": "^2.1.1", - "json5": "^0.5.0", - "lodash": "^4.2.0", - "minimatch": "^3.0.2", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", "slash": "^1.0.0", - "source-map": "^0.5.0" + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -562,25 +553,6 @@ "trim-right": "^1.0.1" }, "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -590,7 +562,7 @@ }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { "babel-helper-explode-assignable-expression": "^6.24.1", @@ -606,32 +578,11 @@ "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "esutils": "^2.0.2" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-helper-call-delegate": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { "babel-helper-hoist-variables": "^6.24.1", @@ -649,32 +600,11 @@ "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { "babel-runtime": "^6.22.0", @@ -684,7 +614,7 @@ }, "babel-helper-function-name": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { "babel-helper-get-function-arity": "^6.24.1", @@ -696,7 +626,7 @@ }, "babel-helper-get-function-arity": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { "babel-runtime": "^6.22.0", @@ -705,7 +635,7 @@ }, "babel-helper-hoist-variables": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { "babel-runtime": "^6.22.0", @@ -714,7 +644,7 @@ }, "babel-helper-optimise-call-expression": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { "babel-runtime": "^6.22.0", @@ -729,32 +659,11 @@ "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { "babel-helper-function-name": "^6.24.1", @@ -766,7 +675,7 @@ }, "babel-helper-replace-supers": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { "babel-helper-optimise-call-expression": "^6.24.1", @@ -779,7 +688,7 @@ }, "babel-helpers": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { "babel-runtime": "^6.22.0", @@ -797,18 +706,18 @@ } }, "babel-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", - "integrity": "sha512-Kt7ND6R8tB0E372MdnZM9H7ImYYF9VevfVHjAa7Q1JKt4tpwihupfFwFc5BiLDWIsehNY+VQ4zyl2E22y86pbA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "requires": { - "find-cache-dir": "^0.1.1", + "find-cache-dir": "^1.0.0", "loader-utils": "^1.0.2", "mkdirp": "^0.5.1" } }, "babel-messages": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { "babel-runtime": "^6.22.0" @@ -816,20 +725,20 @@ }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-rbW8j0iokxFUA5WunwzD7UsQuy4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", + "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", "requires": { "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-istanbul": { @@ -845,52 +754,52 @@ }, "babel-plugin-jest-hoist": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-dynamic-import": { "version": "6.18.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { "babel-helper-remap-async-to-generator": "^6.24.1", @@ -900,7 +809,7 @@ }, "babel-plugin-transform-class-properties": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { "babel-helper-function-name": "^6.24.1", @@ -911,7 +820,7 @@ }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { "babel-runtime": "^6.22.0" @@ -919,7 +828,7 @@ }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { "babel-runtime": "^6.22.0" @@ -935,32 +844,11 @@ "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { "babel-helper-define-map": "^6.24.1", @@ -976,7 +864,7 @@ }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { "babel-runtime": "^6.22.0", @@ -985,7 +873,7 @@ }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { "babel-runtime": "^6.22.0" @@ -993,7 +881,7 @@ }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { "babel-runtime": "^6.22.0", @@ -1002,7 +890,7 @@ }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { "babel-runtime": "^6.22.0" @@ -1010,7 +898,7 @@ }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { "babel-helper-function-name": "^6.24.1", @@ -1020,7 +908,7 @@ }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { "babel-runtime": "^6.22.0" @@ -1028,7 +916,7 @@ }, "babel-plugin-transform-es2015-modules-amd": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", @@ -1037,40 +925,19 @@ } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "requires": { "babel-plugin-transform-strict-mode": "^6.24.1", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-types": "^6.26.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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-plugin-transform-es2015-modules-systemjs": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { "babel-helper-hoist-variables": "^6.24.1", @@ -1080,7 +947,7 @@ }, "babel-plugin-transform-es2015-modules-umd": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { "babel-plugin-transform-es2015-modules-amd": "^6.24.1", @@ -1090,7 +957,7 @@ }, "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { "babel-helper-replace-supers": "^6.24.1", @@ -1099,7 +966,7 @@ }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { "babel-helper-call-delegate": "^6.24.1", @@ -1112,7 +979,7 @@ }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { "babel-runtime": "^6.22.0", @@ -1121,7 +988,7 @@ }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { "babel-runtime": "^6.22.0" @@ -1129,7 +996,7 @@ }, "babel-plugin-transform-es2015-sticky-regex": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { "babel-helper-regex": "^6.24.1", @@ -1139,7 +1006,7 @@ }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { "babel-runtime": "^6.22.0" @@ -1147,7 +1014,7 @@ }, "babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { "babel-runtime": "^6.22.0" @@ -1155,7 +1022,7 @@ }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { "babel-helper-regex": "^6.24.1", @@ -1165,7 +1032,7 @@ }, "babel-plugin-transform-exponentiation-operator": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", @@ -1175,7 +1042,7 @@ }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { "babel-plugin-syntax-flow": "^6.18.0", @@ -1183,17 +1050,17 @@ } }, "babel-plugin-transform-object-rest-spread": { - "version": "6.23.0", - "resolved": false, - "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "requires": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-constant-elements": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { "babel-runtime": "^6.22.0" @@ -1201,7 +1068,7 @@ }, "babel-plugin-transform-react-display-name": { "version": "6.25.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { "babel-runtime": "^6.22.0" @@ -1209,7 +1076,7 @@ }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { "babel-helper-builder-react-jsx": "^6.24.1", @@ -1219,7 +1086,7 @@ }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { "babel-plugin-syntax-jsx": "^6.8.0", @@ -1228,7 +1095,7 @@ }, "babel-plugin-transform-react-jsx-source": { "version": "6.22.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { "babel-plugin-syntax-jsx": "^6.8.0", @@ -1236,16 +1103,16 @@ } }, "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": false, - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "requires": { - "regenerator-transform": "0.9.11" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-runtime": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { "babel-runtime": "^6.22.0" @@ -1253,7 +1120,7 @@ }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { "babel-runtime": "^6.22.0", @@ -1261,9 +1128,9 @@ } }, "babel-preset-env": { - "version": "1.5.2", - "resolved": false, - "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "requires": { "babel-plugin-check-es2015-constants": "^6.22.0", "babel-plugin-syntax-trailing-function-commas": "^6.22.0", @@ -1299,7 +1166,7 @@ }, "babel-preset-flow": { "version": "6.23.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { "babel-plugin-transform-flow-strip-types": "^6.22.0" @@ -1307,7 +1174,7 @@ }, "babel-preset-jest": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { "babel-plugin-jest-hoist": "^20.0.3" @@ -1315,7 +1182,7 @@ }, "babel-preset-react": { "version": "6.24.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { "babel-plugin-syntax-jsx": "^6.3.13", @@ -1327,21 +1194,22 @@ } }, "babel-preset-react-app": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.0.1.tgz", - "integrity": "sha512-YjvnkyvQ0lbqzDd+iG2638Eloy8FtPkkhG6Brv3x8UBHFCC1V25KuUrJqAlKMrANIqyccjrKS9YyanjSJ7EySg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.1.1.tgz", + "integrity": "sha512-9fRHopNaGL5ScRZdPSoyxRaABKmkS2fx0HUJ5Yphan5G8QDFD7lETsPyY7El6b7YPT3sNrw9gfrWzl4/LsJcfA==", "requires": { - "babel-plugin-dynamic-import-node": "1.0.2", + "babel-plugin-dynamic-import-node": "1.1.0", "babel-plugin-syntax-dynamic-import": "6.18.0", "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.23.0", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-object-rest-spread": "6.26.0", "babel-plugin-transform-react-constant-elements": "6.23.0", "babel-plugin-transform-react-jsx": "6.24.1", "babel-plugin-transform-react-jsx-self": "6.22.0", "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-plugin-transform-regenerator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.5.2", + "babel-preset-env": "1.6.1", "babel-preset-react": "6.24.1" } }, @@ -1359,55 +1227,10 @@ "source-map-support": "^0.4.15" }, "dependencies": { - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" - } - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" } } }, @@ -1437,27 +1260,6 @@ "babel-types": "^6.26.0", "babylon": "^6.18.0", "lodash": "^4.17.4" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-traverse": { @@ -1474,27 +1276,6 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babel-types": { @@ -1506,27 +1287,6 @@ "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } } }, "babylon": { @@ -1536,7 +1296,7 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { @@ -1595,18 +1355,18 @@ "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" }, "base64-js": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", - "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "batch": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { @@ -1648,11 +1408,23 @@ "qs": "6.5.1", "raw-body": "2.3.2", "type-is": "~1.6.15" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + } } }, "bonjour": { "version": "3.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { "array-flatten": "^2.1.0", @@ -1665,17 +1437,9 @@ }, "boolbase": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.x.x" - } - }, "bootstrap": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", @@ -1695,47 +1459,20 @@ "widest-line": "^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=" - }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.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=" - }, - "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" - } } } }, @@ -1777,12 +1514,12 @@ }, "brorand": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-resolve": { "version": "1.11.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", "requires": { "resolve": "1.1.7" @@ -1790,7 +1527,7 @@ "dependencies": { "resolve": { "version": "1.1.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } @@ -1830,7 +1567,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { "bn.js": "^4.1.0", @@ -1839,7 +1576,7 @@ }, "browserify-sign": { "version": "4.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { "bn.js": "^4.1.1", @@ -1870,7 +1607,7 @@ }, "bser": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { "node-int64": "^0.4.0" @@ -1878,7 +1615,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -1887,9 +1624,9 @@ } }, "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -1898,17 +1635,17 @@ }, "buffer-xor": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { @@ -1934,7 +1671,7 @@ }, "caller-path": { "version": "0.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { "callsites": "^0.2.0" @@ -1942,12 +1679,12 @@ }, "callsites": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" }, "camel-case": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { "no-case": "^2.2.0", @@ -1956,12 +1693,12 @@ }, "camelcase": { "version": "1.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "camelcase-keys": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { "camelcase": "^2.0.0", @@ -1970,14 +1707,14 @@ "dependencies": { "camelcase": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" } } }, "caniuse-api": { "version": "1.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { "browserslist": "^1.3.6", @@ -1988,7 +1725,7 @@ "dependencies": { "browserslist": { "version": "1.7.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { "caniuse-db": "^1.0.30000639", @@ -1998,18 +1735,18 @@ } }, "caniuse-db": { - "version": "1.0.30000827", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000827.tgz", - "integrity": "sha1-vSg53Rlgk7RMKMF/k1ExQMnZJYg=" + "version": "1.0.30000855", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000855.tgz", + "integrity": "sha1-NPiL8Vd6pQU5XkjkEtwh991B7zs=" }, "caniuse-lite": { - "version": "1.0.30000827", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000827.tgz", - "integrity": "sha512-j9Q9hP5AhqOARNP6fLdctr3XrGhF921sBSycudf4E+8RCWpFT3rJdTfp/5o8LDp6p0NJTpYWEpBFiM+QEDzA6g==" + "version": "1.0.30000855", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000855.tgz", + "integrity": "sha512-ajORrkXa5UYk62P5PK6ZmBraYOAOr9HWy+XxLwjDg8Ys/5KiSyarg8tIA32ZVqbFhtz67wyySXnU9imkh2ZT2w==" }, "capture-stack-trace": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "case-sensitive-paths-webpack-plugin": { @@ -2019,12 +1756,12 @@ }, "caseless": { "version": "0.12.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { "align-text": "^0.1.3", @@ -2105,7 +1842,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } @@ -2143,468 +1880,6 @@ "normalize-path": "^2.1.1" } }, - "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.9.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "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.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "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.2", - "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.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "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.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.9.1", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.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 - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": 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.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.6", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.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.6.2", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "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, - "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, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -2709,15 +1984,15 @@ }, "cli-boxes": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "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": "^1.0.1" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -2727,7 +2002,7 @@ }, "cliui": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { "center-align": "^0.1.1", @@ -2737,7 +2012,7 @@ "dependencies": { "wordwrap": { "version": "0.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } @@ -2749,12 +2024,12 @@ }, "co": { "version": "4.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { "q": "^1.1.2" @@ -2762,7 +2037,7 @@ }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { @@ -2776,7 +2051,7 @@ }, "color": { "version": "0.11.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { "clone": "^1.0.2", @@ -2785,21 +2060,21 @@ } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.1" } }, "color-name": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" }, "color-string": { "version": "0.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { "color-name": "^1.0.0" @@ -2807,7 +2082,7 @@ }, "colormin": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { "color": "^0.11.0", @@ -2817,7 +2092,7 @@ }, "colors": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { @@ -2835,13 +2110,13 @@ }, "commondir": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "compare-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", - "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", + "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==" }, "component-emitter": { "version": "1.2.1", @@ -2849,11 +2124,18 @@ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "compressible": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", - "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", + "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", "requires": { - "mime-db": ">= 1.33.0 < 2" + "mime-db": ">= 1.34.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", + "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=" + } } }, "compression": { @@ -2868,11 +2150,18 @@ "on-headers": "~1.0.1", "safe-buffer": "5.1.1", "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } } }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -2906,7 +2195,7 @@ }, "console-browserify": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { "date-now": "^0.1.4" @@ -2914,17 +2203,17 @@ }, "constants-browserify": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { "version": "0.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, "content-disposition": { "version": "0.5.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { @@ -2944,12 +2233,12 @@ }, "cookie": { "version": "0.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-descriptor": { @@ -2959,12 +2248,12 @@ }, "core-js": { "version": "1.2.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, "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": { @@ -2983,15 +2272,15 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" @@ -2999,7 +2288,7 @@ }, "create-error-class": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" @@ -3031,32 +2320,15 @@ } }, "cross-spawn": { - "version": "4.0.2", - "resolved": false, - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", "which": "^1.2.9" } }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.x.x" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.x.x" - } - } - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3082,13 +2354,13 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, "css-loader": { - "version": "0.28.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", - "integrity": "sha512-umVjsx1rY6Nozzi01Ni32aicDaZ6fBgMC8X3Xk1hqFgYpS5k3YT30K8cqMVVX8YKpkjMCDDdsQ07uLZCShSAmQ==", + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", + "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "requires": { "babel-code-frame": "^6.11.0", "css-selector-tokenizer": "^0.7.0", @@ -3103,12 +2375,12 @@ "postcss-modules-scope": "^1.0.0", "postcss-modules-values": "^1.1.0", "postcss-value-parser": "^3.3.0", - "source-list-map": "^0.1.7" + "source-list-map": "^2.0.0" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -3129,7 +2401,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -3139,7 +2411,7 @@ }, "css-select": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { "boolbase": "~1.0.0", @@ -3150,7 +2422,7 @@ }, "css-selector-tokenizer": { "version": "0.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { "cssesc": "^0.1.0", @@ -3160,7 +2432,7 @@ "dependencies": { "regexpu-core": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { "regenerate": "^1.2.1", @@ -3172,17 +2444,17 @@ }, "css-what": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "cssesc": { "version": "0.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" }, "cssnano": { "version": "3.10.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { "autoprefixer": "^6.3.1", @@ -3221,7 +2493,7 @@ "dependencies": { "autoprefixer": { "version": "6.7.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { "browserslist": "^1.7.6", @@ -3234,7 +2506,7 @@ }, "browserslist": { "version": "1.7.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { "caniuse-db": "^1.0.30000639", @@ -3243,7 +2515,7 @@ }, "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -3264,7 +2536,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -3274,7 +2546,7 @@ }, "csso": { "version": "2.3.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { "clap": "^1.0.9", @@ -3290,12 +2562,12 @@ }, "cssom": { "version": "0.3.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" }, "cssstyle": { "version": "0.2.37", - "resolved": false, + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { "cssom": "0.3.x" @@ -3303,7 +2575,7 @@ }, "currently-unhandled": { "version": "0.4.1", - "resolved": false, + "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" @@ -3311,7 +2583,7 @@ }, "d": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { "es5-ext": "^0.10.9" @@ -3319,7 +2591,7 @@ }, "d3": { "version": "3.5.17", - "resolved": false, + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", "integrity": "sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==" }, "d3-array": { @@ -3334,7 +2606,7 @@ }, "d3-path": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" }, "d3-scale": { @@ -3411,12 +2683,12 @@ }, "damerau-levenshtein": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" }, "dashdash": { "version": "1.14.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" @@ -3424,7 +2696,7 @@ }, "date-now": { "version": "0.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, "debug": { @@ -3437,7 +2709,7 @@ }, "decamelize": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { @@ -3447,30 +2719,37 @@ }, "deep-equal": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deep-extend": { - "version": "0.4.2", - "resolved": false, - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + "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": false, + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-require-extensions": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } } }, "define-properties": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { "foreach": "^2.0.5", @@ -3516,12 +2795,12 @@ }, "defined": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { "version": "2.2.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { "globby": "^5.0.0", @@ -3535,7 +2814,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": { @@ -3545,7 +2824,7 @@ }, "des.js": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { "inherits": "^2.0.1", @@ -3554,12 +2833,12 @@ }, "destroy": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { "repeating": "^2.0.0" @@ -3567,13 +2846,13 @@ }, "detect-node": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" }, "detect-port-alt": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "requires": { "address": "^1.0.1", "debug": "^2.6.0" @@ -3596,7 +2875,7 @@ }, "dns-equal": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { @@ -3610,7 +2889,7 @@ }, "dns-txt": { "version": "2.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { "buffer-indexof": "^1.0.0" @@ -3626,7 +2905,7 @@ }, "dom-converter": { "version": "0.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { "utila": "~0.3" @@ -3634,7 +2913,7 @@ "dependencies": { "utila": { "version": "0.3.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } @@ -3646,7 +2925,7 @@ }, "dom-serializer": { "version": "0.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { "domelementtype": "~1.1.1", @@ -3655,14 +2934,14 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, "dom-urls": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { "urijs": "^1.16.1" @@ -3675,12 +2954,12 @@ }, "domelementtype": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domhandler": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { "domelementtype": "1" @@ -3688,7 +2967,7 @@ }, "domutils": { "version": "1.5.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { "dom-serializer": "0", @@ -3708,9 +2987,14 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" }, + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" + }, "duplexer": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, "duplexer3": { @@ -3720,7 +3004,7 @@ }, "ecc-jsbn": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { @@ -3729,17 +3013,17 @@ }, "ee-first": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.42", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz", - "integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=" + "version": "1.3.48", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", + "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" }, "elliptic": { "version": "6.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { "bn.js": "^4.4.0", @@ -3758,7 +3042,7 @@ }, "emojis-list": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { @@ -3768,7 +3052,6 @@ }, "encoding": { "version": "0.1.12", - "resolved": false, "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" @@ -3786,7 +3069,7 @@ }, "enhanced-resolve": { "version": "3.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { "graceful-fs": "^4.1.2", @@ -3797,7 +3080,7 @@ }, "entities": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "errno": { @@ -3810,16 +3093,16 @@ }, "error-ex": { "version": "1.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "requires": { "es-to-primitive": "^1.1.1", "function-bind": "^1.1.1", @@ -3830,7 +3113,7 @@ }, "es-to-primitive": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { "is-callable": "^1.1.1", @@ -3839,9 +3122,9 @@ } }, "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.1", @@ -3860,7 +3143,7 @@ }, "es6-map": { "version": "0.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { "d": "1", @@ -3878,7 +3161,7 @@ }, "es6-set": { "version": "0.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { "d": "1", @@ -3890,7 +3173,7 @@ }, "es6-symbol": { "version": "3.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { "d": "1", @@ -3899,7 +3182,7 @@ }, "es6-weak-map": { "version": "2.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { "d": "1", @@ -3910,18 +3193,18 @@ }, "escape-html": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz", + "integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==", "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -3939,7 +3222,7 @@ }, "escope": { "version": "3.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { "es6-map": "^0.1.3", @@ -3949,75 +3232,115 @@ } }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha512-x6LJGXWCGB/4YOBhL48yeppZTo+YQUNC37N5qqCpC1b1kkNzydlQHQAtPuUSFoZSxgIadrysQoW2Hq602P+uEA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", + "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", + "ajv": "^5.2.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.0.1", "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", + "eslint-scope": "^3.7.1", + "espree": "^3.5.1", "esquery": "^1.0.0", "estraverse": "^4.2.0", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^9.17.0", + "ignore": "^3.3.3", "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", + "inquirer": "^3.0.6", "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "table": "^4.0.1", + "text-table": "~0.2.0" }, "dependencies": { - "strip-bom": { + "ansi-regex": { "version": "3.0.0", - "resolved": false, - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^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" + } } } }, "eslint-config-react-app": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-1.0.5.tgz", - "integrity": "sha512-nA3AYTMUGKVYH1goOp72fFdj33mxC1rElATOLDrCMbbhmtVz4K61NxKBc6vj9OwjugROioF2LYXZMZIFAfFozA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz", + "integrity": "sha512-8QZrKWuHVC57Fmu+SsKAVxnI9LycZl7NFQ4H9L+oeISuCXhYdXqsOOIVSjQFW6JF5MXZLFE+21Syhd7mF1IRZQ==" }, "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": false, - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "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==", "requires": { - "debug": "^2.2.0", - "object-assign": "^4.0.1", - "resolve": "^1.1.6" + "debug": "^2.6.9", + "resolve": "^1.5.0" } }, "eslint-loader": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", - "integrity": "sha512-4xbtW4Zo5Xpg8fBcx0z4VvWVhdrJJazcNa8yTGrXc4tuppNJEFn5qI/crMORetebvuqkM1W6UhZVKwLklxoSdA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", "requires": { - "find-cache-dir": "^0.1.1", "loader-fs-cache": "^1.0.0", "loader-utils": "^1.0.2", "object-assign": "^4.0.1", @@ -4032,50 +3355,120 @@ "requires": { "debug": "^2.6.8", "pkg-dir": "^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" + } + }, + "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" + } + } } }, "eslint-plugin-flowtype": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.0.tgz", - "integrity": "sha512-a8EGMRsWMqQe7hScFqrg7GytNazT8LaT8dUWRwxeLkFwE1XuSeNxzGeQn86lX9V756HpDvACLk+SdRz3u9ALmA==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", + "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", "requires": { "lodash": "^4.15.0" } }, "eslint-plugin-import": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha512-8HLeIYzOH4eltevxf+iC9Dtz/91yaeOqtlba5srcpQWLrv57F5NNG1RNLqAbpWJWDD4BxKuKjUveJY9W6Tbswg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", "requires": { "builtin-modules": "^1.1.1", "contains-path": "^0.1.0", - "debug": "^2.2.0", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.2.0", - "eslint-module-utils": "^2.0.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.1.1", "has": "^1.0.1", "lodash.cond": "^4.3.0", "minimatch": "^3.0.3", - "pkg-up": "^1.0.0" + "read-pkg-up": "^2.0.0" }, "dependencies": { "doctrine": { "version": "1.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { "esutils": "^2.0.2", "isarray": "^1.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" + } + }, + "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" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "eslint-plugin-jsx-a11y": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz", - "integrity": "sha512-YNIrEw8cepPQlHcPUKLbJF9R4O4duG7ZGZuT0L+jYVdsRmBb6klnpYI0XnuEK3qMirTuuovb4Lg6+Scy4BCwaA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", + "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", "requires": { - "aria-query": "^0.5.0", + "aria-query": "^0.7.0", "array-includes": "^3.0.3", "ast-types-flow": "0.0.7", "axobject-query": "^0.1.0", @@ -4085,13 +3478,33 @@ } }, "eslint-plugin-react": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", - "integrity": "sha512-lErfLh7LnbGOnLku3CS6Deep3PJwg8+mwK40PRYQ6ACvZuAGUAt7mI76dCJKDJbfvmctg6dOq41baMVY+xWFEg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", + "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", "requires": { "doctrine": "^2.0.0", "has": "^1.0.1", - "jsx-ast-utils": "^1.4.1" + "jsx-ast-utils": "^2.0.0", + "prop-types": "^15.5.10" + }, + "dependencies": { + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "requires": { + "array-includes": "^3.0.3" + } + } + } + }, + "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" } }, "espree": { @@ -4105,7 +3518,7 @@ }, "esprima": { "version": "2.7.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" }, "esquery": { @@ -4126,12 +3539,12 @@ }, "estraverse": { "version": "4.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { @@ -4141,7 +3554,7 @@ }, "event-emitter": { "version": "0.3.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { "d": "1", @@ -4149,18 +3562,18 @@ } }, "eventemitter3": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" }, "events": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { "version": "0.1.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { "original": ">=0.0.5" @@ -4195,25 +3608,8 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } } }, - "exit-hook": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -4248,20 +3644,20 @@ }, "expand-range": { "version": "1.8.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", - "randomatic": "^1.1.3", + "randomatic": "^3.0.0", "repeat-element": "^1.1.2", "repeat-string": "^1.5.2" } @@ -4292,6 +3688,14 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", @@ -4331,19 +3735,29 @@ "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "path-to-regexp": { "version": "0.1.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" } } }, "extend": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "extend-shallow": { @@ -4435,12 +3849,12 @@ } }, "extract-text-webpack-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", - "integrity": "sha512-Dv5Y7okQmgFQiKJUuitKYnmnMOT3Sfg47k/AakBA5a4Wl8QBGZy+Yep0IZxUu5OwktdpaY49mvvoudaKbzbzlA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { - "async": "^2.1.2", - "loader-utils": "^1.0.2", + "async": "^2.4.1", + "loader-utils": "^1.1.0", "schema-utils": "^0.3.0", "webpack-sources": "^1.0.1" } @@ -4462,17 +3876,17 @@ }, "fast-levenshtein": { "version": "2.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastparse": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" }, "faye-websocket": { "version": "0.11.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { "websocket-driver": ">=0.5.1" @@ -4480,7 +3894,7 @@ }, "fb-watchman": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "requires": { "bser": "^2.0.0" @@ -4488,7 +3902,7 @@ }, "fbemitter": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", "integrity": "sha512-hd8PgD+Q6RQtlcGrkM9oY3MFIjq6CA6wurCK1TKn2eaA76Ww4VAOihmq98NyjRhjJi/axgznZnh9lF8+TcTsNQ==", "requires": { "fbjs": "^0.8.4" @@ -4496,7 +3910,7 @@ }, "fbjs": { "version": "0.8.12", - "resolved": false, + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", "integrity": "sha512-SBiP6XPiWIlX1tE5mvU/UeUFoqzJgbf+ezkl0M8D2xk4urDb+2uyjjGB10HAPluLboUqqVHtgUwwyuWakUfMgQ==", "requires": { "core-js": "^1.0.0", @@ -4516,17 +3930,16 @@ } }, "figures": { - "version": "1.7.0", - "resolved": false, - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "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", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { "flat-cache": "^1.2.1", @@ -4534,11 +3947,12 @@ } }, "file-loader": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", - "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", + "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "requires": { - "loader-utils": "^1.0.2" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, "file-saver": { @@ -4548,12 +3962,12 @@ }, "filename-regex": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fileset": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { "glob": "^7.0.3", @@ -4561,9 +3975,9 @@ } }, "filesize": { - "version": "3.3.0", - "resolved": false, - "integrity": "sha1-UxSeo0YOOy4CSWKlFkiqVyz5gSI=" + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", + "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" }, "fill-range": { "version": "4.0.0", @@ -4601,18 +4015,18 @@ } }, "find-cache-dir": { - "version": "0.1.1", - "resolved": false, - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "requires": { "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "find-up": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { "locate-path": "^2.0.0" @@ -4631,7 +4045,7 @@ }, "flatten": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, "flux": { @@ -4643,14 +4057,32 @@ "fbjs": "^0.8.0" } }, + "follow-redirects": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", + "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", + "requires": { + "debug": "^3.1.0" + }, + "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" + } + } + } + }, "for-in": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { "for-in": "^1.0.1" @@ -4658,12 +4090,12 @@ }, "foreach": { "version": "2.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { @@ -4706,9 +4138,471 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "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.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.2", + "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.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "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.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.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 + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": 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.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "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.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "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, + "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, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, "fullscreen": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fullscreen/-/fullscreen-1.1.1.tgz", @@ -4722,32 +4616,24 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, "gaugeJS": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.6.tgz", "integrity": "sha1-ZZEzRNsl/sdeS6kxTHxzlwtRR68=" }, - "generate-function": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "requires": { - "is-property": "^1.0.0" - } - }, "get-caller-file": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-stdin": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { @@ -4762,7 +4648,7 @@ }, "getpass": { "version": "0.1.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "^1.0.0" @@ -4783,7 +4669,7 @@ }, "glob-base": { "version": "0.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { "glob-parent": "^2.0.0", @@ -4792,7 +4678,7 @@ }, "glob-parent": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { "is-glob": "^2.0.0" @@ -4806,6 +4692,28 @@ "ini": "^1.3.4" } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -4813,7 +4721,7 @@ }, "globby": { "version": "5.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { "array-union": "^1.0.1", @@ -4844,17 +4752,17 @@ }, "graceful-fs": { "version": "4.1.11", - "resolved": false, + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growly": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gzip-size": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { "duplexer": "^0.1.1" @@ -4862,7 +4770,7 @@ }, "handle-thing": { "version": "1.2.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" }, "handlebars": { @@ -4878,12 +4786,12 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "source-map": { "version": "0.4.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { "amdefine": ">=0.0.4" @@ -4891,7 +4799,7 @@ }, "uglify-js": { "version": "2.8.29", - "resolved": false, + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { @@ -4910,7 +4818,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { @@ -4934,32 +4842,19 @@ "requires": { "ajv": "^5.1.0", "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - } } }, "has": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -5009,33 +4904,22 @@ } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", + "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" } }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" - } - }, "he": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", @@ -5043,25 +4927,28 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" - }, "hoist-non-react-statics": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, "home-or-tmp": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", @@ -5069,7 +4956,7 @@ }, "hpack.js": { "version": "2.1.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { "inherits": "^2.0.1", @@ -5080,7 +4967,7 @@ }, "html-comment-regex": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" }, "html-encoding-sniffer": { @@ -5093,13 +4980,13 @@ }, "html-entities": { "version": "1.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { - "version": "3.5.14", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.14.tgz", - "integrity": "sha512-sZjw6zhQgyUnIlIPU+W80XpRjWjdxHtNcxjfyOskOsCTDKytcfLY04wsQY/83Yqb4ndoiD2FtauiL7Yg6uUQFQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.16.tgz", + "integrity": "sha512-zP5EfLSpiLRp0aAgud4CQXPQZm9kXwWjR/cF0PfdOj+jjWnOaCgeZcll4kYXSvIBPeUMmyaSc7mM4IDtA+kboA==", "requires": { "camel-case": "3.0.x", "clean-css": "4.1.x", @@ -5125,7 +5012,7 @@ "dependencies": { "loader-utils": { "version": "0.2.17", - "resolved": false, + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { "big.js": "^3.1.3", @@ -5138,7 +5025,7 @@ }, "htmlparser2": { "version": "3.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { "domelementtype": "1", @@ -5149,7 +5036,7 @@ "dependencies": { "domutils": { "version": "1.1.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { "domelementtype": "1" @@ -5157,12 +5044,12 @@ }, "isarray": { "version": "0.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.0.34", - "resolved": false, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { "core-util-is": "~1.0.0", @@ -5173,14 +5060,14 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": false, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, "http-deceiver": { "version": "1.2.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { @@ -5195,22 +5082,23 @@ } }, "http-parser-js": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz", - "integrity": "sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA==" + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" }, "http-proxy": { - "version": "1.16.2", - "resolved": false, - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "requires": { - "eventemitter3": "1.x.x", - "requires-port": "1.x.x" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-middleware": { "version": "0.17.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { "http-proxy": "^1.16.2", @@ -5267,12 +5155,12 @@ }, "is-extglob": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { "is-extglob": "^2.1.0" @@ -5338,33 +5226,41 @@ "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.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "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" + } }, "icss-replace-symbols": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" }, "icss-utils": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { "postcss": "^6.0.1" } }, "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==" + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" }, "immutable": { "version": "3.8.2", @@ -5376,14 +5272,23 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, + "import-local": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", + "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, "imurmurhash": { "version": "0.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { "repeating": "^2.0.0" @@ -5391,17 +5296,17 @@ }, "indexes-of": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, "indexof": { "version": "0.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", @@ -5410,7 +5315,7 @@ }, "inherits": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { @@ -5419,28 +5324,54 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "figures": "^1.3.5", + "external-editor": "^2.0.4", + "figures": "^2.0.0", "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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" + } + } } }, "internal-ip": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { "meow": "^3.3.0" @@ -5461,12 +5392,12 @@ }, "invert-kv": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { @@ -5476,7 +5407,7 @@ }, "is-absolute-url": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, "is-accessor-descriptor": { @@ -5499,12 +5430,12 @@ }, "is-arrayish": { "version": "0.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { "version": "1.0.1", - "resolved": false, + "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" @@ -5517,7 +5448,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -5525,7 +5456,7 @@ }, "is-callable": { "version": "1.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" }, "is-ci": { @@ -5556,7 +5487,7 @@ }, "is-date-object": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-descriptor": { @@ -5578,17 +5509,17 @@ }, "is-directory": { "version": "0.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-dotfile": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { "is-primitive": "^2.0.0" @@ -5596,33 +5527,30 @@ }, "is-extendable": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-finite": { "version": "1.0.2", - "resolved": false, + "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": "1.0.0", - "resolved": false, - "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=" }, "is-glob": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { "is-extglob": "^1.0.0" @@ -5637,26 +5565,9 @@ "is-path-inside": "^1.0.0" } }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, "is-npm": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-number": { @@ -5679,7 +5590,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-odd": { @@ -5699,7 +5610,7 @@ }, "is-path-cwd": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" }, "is-path-in-cwd": { @@ -5720,7 +5631,7 @@ }, "is-plain-obj": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { @@ -5733,32 +5644,27 @@ }, "is-posix-bracket": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, - "is-property": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, "is-redirect": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { "has": "^1.0.1" @@ -5771,22 +5677,21 @@ }, "is-retry-allowed": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-root": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" }, "is-stream": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { "html-comment-regex": "^1.1.0" @@ -5794,17 +5699,17 @@ }, "is-symbol": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" }, "is-typedarray": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-windows": { @@ -5814,17 +5719,17 @@ }, "is-wsl": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { @@ -5834,7 +5739,7 @@ }, "isomorphic-fetch": { "version": "2.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { "node-fetch": "^1.0.1", @@ -5843,7 +5748,7 @@ }, "isstream": { "version": "0.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-api": { @@ -5874,9 +5779,9 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", - "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "requires": { "debug": "^3.1.0", "istanbul-lib-coverage": "^1.2.0", @@ -5898,11 +5803,11 @@ "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==" }, "istanbul-lib-hook": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", - "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", + "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", "requires": { - "append-transform": "^0.4.0" + "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { @@ -5932,12 +5837,12 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -5988,6 +5893,11 @@ "jest-cli": "^20.0.4" }, "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -6013,7 +5923,7 @@ }, "callsites": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "expand-brackets": { @@ -6034,7 +5944,7 @@ }, "jest-cli": { "version": "20.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { "ansi-escapes": "^1.4.0", @@ -6101,12 +6011,12 @@ }, "jest-changed-files": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" }, "jest-config": { "version": "20.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { "chalk": "^1.1.3", @@ -6123,7 +6033,7 @@ }, "jest-diff": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { "chalk": "^1.1.3", @@ -6134,12 +6044,12 @@ }, "jest-docblock": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" }, "jest-environment-jsdom": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { "jest-mock": "^20.0.3", @@ -6149,7 +6059,7 @@ }, "jest-environment-node": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { "jest-mock": "^20.0.3", @@ -6240,7 +6150,7 @@ }, "jest-jasmine2": { "version": "20.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { "chalk": "^1.1.3", @@ -6256,7 +6166,7 @@ }, "jest-matcher-utils": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { "chalk": "^1.1.3", @@ -6265,7 +6175,7 @@ }, "jest-matchers": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { "jest-diff": "^20.0.3", @@ -6276,7 +6186,7 @@ }, "jest-message-util": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { "chalk": "^1.1.3", @@ -6355,17 +6265,17 @@ }, "jest-mock": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" }, "jest-regex-util": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" }, "jest-resolve": { "version": "20.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { "browser-resolve": "^1.11.2", @@ -6375,7 +6285,7 @@ }, "jest-resolve-dependencies": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { "jest-regex-util": "^20.0.3" @@ -6383,7 +6293,7 @@ }, "jest-runtime": { "version": "20.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { "babel-core": "^6.0.0", @@ -6472,14 +6382,14 @@ }, "strip-bom": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "jest-snapshot": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { "chalk": "^1.1.3", @@ -6492,7 +6402,7 @@ }, "jest-util": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { "chalk": "^1.1.3", @@ -6506,7 +6416,7 @@ }, "jest-validate": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { "chalk": "^1.1.3", @@ -6516,18 +6426,18 @@ } }, "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", + "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==" }, "js-tokens": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" }, "js-yaml": { "version": "3.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { "argparse": "^1.0.7", @@ -6536,13 +6446,13 @@ }, "jsbn": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "jsdom": { "version": "9.12.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { "abab": "^1.0.3", @@ -6568,14 +6478,14 @@ "dependencies": { "acorn": { "version": "4.0.13", - "resolved": false, + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" } } }, "jsesc": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" }, "json-loader": { @@ -6585,17 +6495,17 @@ }, "json-schema": { "version": "0.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { "version": "1.0.1", - "resolved": false, + "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" @@ -6603,22 +6513,22 @@ }, "json-stringify-safe": { "version": "5.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { "version": "0.5.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { "graceful-fs": "^4.1.6" @@ -6626,14 +6536,9 @@ }, "jsonify": { "version": "0.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, - "jsonpointer": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -6647,9 +6552,14 @@ }, "jsx-ast-utils": { "version": "1.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=" + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -6657,7 +6567,7 @@ }, "klaw": { "version": "1.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { "graceful-fs": "^4.1.9" @@ -6673,12 +6583,12 @@ }, "lazy-cache": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { "invert-kv": "^1.0.0" @@ -6686,12 +6596,12 @@ }, "leven": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { "version": "0.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { "prelude-ls": "~1.1.2", @@ -6700,7 +6610,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { "graceful-fs": "^4.1.2", @@ -6712,21 +6622,58 @@ }, "loader-fs-cache": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "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=", + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.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" + } + }, + "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" + } + } } }, "loader-runner": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" }, "loader-utils": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { "big.js": "^3.1.3", @@ -6736,7 +6683,7 @@ }, "locate-path": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { "p-locate": "^2.0.0", @@ -6750,17 +6697,17 @@ }, "lodash._reinterpolate": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, "lodash.camelcase": { "version": "4.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, "lodash.cond": { "version": "4.5.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" }, "lodash.curry": { @@ -6770,7 +6717,7 @@ }, "lodash.defaults": { "version": "4.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, "lodash.flow": { @@ -6780,17 +6727,17 @@ }, "lodash.isequal": { "version": "4.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "lodash.memoize": { "version": "4.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, "lodash.template": { "version": "4.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { "lodash._reinterpolate": "~3.0.0", @@ -6799,7 +6746,7 @@ }, "lodash.templatesettings": { "version": "4.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { "lodash._reinterpolate": "~3.0.0" @@ -6807,22 +6754,27 @@ }, "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.uniq": { "version": "4.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" + }, "longest": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { "version": "1.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { "js-tokens": "^3.0.0" @@ -6830,7 +6782,7 @@ }, "loud-rejection": { "version": "1.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { "currently-unhandled": "^0.4.1", @@ -6839,7 +6791,7 @@ }, "lower-case": { "version": "1.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lowercase-keys": { @@ -6848,23 +6800,18 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "macaddress": { - "version": "0.2.8", - "resolved": false, - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" - }, "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { "pify": "^3.0.0" }, @@ -6878,7 +6825,7 @@ }, "makeerror": { "version": "1.0.11", - "resolved": false, + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { "tmpl": "1.0.x" @@ -6891,7 +6838,7 @@ }, "map-obj": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-visit": { @@ -6904,9 +6851,14 @@ }, "math-expression-evaluator": { "version": "1.2.17", - "resolved": false, + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -6918,12 +6870,20 @@ }, "media-typer": { "version": "0.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, "memory-fs": { "version": "0.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { "errno": "^0.1.3", @@ -6932,7 +6892,7 @@ }, "meow": { "version": "3.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { "camelcase-keys": "^2.0.0", @@ -6949,24 +6909,24 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "merge": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" }, "merge-descriptors": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { @@ -6999,9 +6959,9 @@ } }, "mime": { - "version": "1.3.6", - "resolved": false, - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.33.0", @@ -7028,7 +6988,7 @@ }, "minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { @@ -7041,7 +7001,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { @@ -7065,7 +7025,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -7073,7 +7033,7 @@ }, "ms": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { @@ -7087,13 +7047,13 @@ }, "multicast-dns-service-types": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { - "version": "0.0.5", - "resolved": false, - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { "version": "2.10.0", @@ -7122,12 +7082,12 @@ }, "natural-compare": { "version": "1.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { @@ -7150,7 +7110,7 @@ }, "node-fetch": { "version": "1.7.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", "requires": { "encoding": "^0.1.11", @@ -7165,13 +7125,13 @@ } }, "node-forge": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" }, "node-int64": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { @@ -7202,6 +7162,13 @@ "url": "^0.11.0", "util": "^0.10.3", "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } } }, "node-notifier": { @@ -7228,7 +7195,7 @@ }, "normalize-path": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { "remove-trailing-separator": "^1.0.1" @@ -7236,12 +7203,12 @@ }, "normalize-range": { "version": "0.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { "version": "1.9.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { "object-assign": "^4.0.1", @@ -7260,7 +7227,7 @@ }, "nth-check": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { "boolbase": "~1.0.0" @@ -7268,12 +7235,12 @@ }, "num2fraction": { "version": "1.2.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwmatcher": { @@ -7283,12 +7250,11 @@ }, "oauth-sign": { "version": "0.8.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", - "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -7326,7 +7292,7 @@ }, "object-keys": { "version": "1.0.11", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, "object-visit": { @@ -7339,7 +7305,7 @@ }, "object.omit": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { "for-own": "^0.1.4", @@ -7361,7 +7327,7 @@ }, "on-finished": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" @@ -7369,33 +7335,36 @@ }, "on-headers": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "onetime": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } }, "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", + "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", "requires": { "is-wsl": "^1.1.0" } }, "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", @@ -7404,14 +7373,14 @@ "dependencies": { "wordwrap": { "version": "0.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, "optionator": { "version": "0.8.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { "deep-is": "~0.1.3", @@ -7423,22 +7392,11 @@ } }, "original": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", + "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", "requires": { - "url-parse": "1.0.x" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": false, - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "requires": { - "querystringify": "0.0.x", - "requires-port": "1.0.x" - } - } + "url-parse": "~1.4.0" } }, "os-browserify": { @@ -7448,12 +7406,12 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "1.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { "lcid": "^1.0.0" @@ -7461,7 +7419,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { @@ -7470,16 +7428,16 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "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": false, + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { "p-limit": "^1.1.0" @@ -7513,7 +7471,7 @@ }, "param-case": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { "no-case": "^2.2.0" @@ -7533,7 +7491,7 @@ }, "parse-glob": { "version": "3.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { "glob-base": "^0.3.0", @@ -7544,15 +7502,20 @@ }, "parse-json": { "version": "2.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { "error-ex": "^1.2.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, "parse5": { "version": "1.5.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" }, "parseurl": { @@ -7567,7 +7530,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" }, "path-dirname": { @@ -7577,17 +7540,17 @@ }, "path-exists": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { @@ -7597,12 +7560,12 @@ }, "path-parse": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "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" @@ -7610,14 +7573,14 @@ "dependencies": { "isarray": { "version": "0.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, "path-type": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { "graceful-fs": "^4.1.2", @@ -7626,9 +7589,9 @@ } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -7639,89 +7602,43 @@ }, "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": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { "pinkie": "^2.0.0" } }, "pkg-dir": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": false, - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": false, - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": false, - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": false, - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - } + "find-up": "^2.1.0" } }, "pluralize": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, "portfinder": { "version": "1.0.13", - "resolved": false, + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { "async": "^1.5.2", @@ -7731,7 +7648,7 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } @@ -7742,19 +7659,19 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "6.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", - "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "requires": { - "chalk": "^2.3.2", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^5.3.0" + "supports-color": "^5.4.0" }, "dependencies": { "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -7765,7 +7682,7 @@ }, "postcss-calc": { "version": "5.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { "postcss": "^5.0.2", @@ -7775,7 +7692,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7796,7 +7713,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7806,7 +7723,7 @@ }, "postcss-colormin": { "version": "2.2.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { "colormin": "^1.0.5", @@ -7816,7 +7733,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7837,7 +7754,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7847,7 +7764,7 @@ }, "postcss-convert-values": { "version": "2.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { "postcss": "^5.0.11", @@ -7856,7 +7773,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7877,7 +7794,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7887,7 +7804,7 @@ }, "postcss-discard-comments": { "version": "2.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { "postcss": "^5.0.14" @@ -7895,7 +7812,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7916,7 +7833,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7926,7 +7843,7 @@ }, "postcss-discard-duplicates": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { "postcss": "^5.0.4" @@ -7934,7 +7851,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7955,7 +7872,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -7965,7 +7882,7 @@ }, "postcss-discard-empty": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { "postcss": "^5.0.14" @@ -7973,7 +7890,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -7994,7 +7911,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8004,7 +7921,7 @@ }, "postcss-discard-overridden": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { "postcss": "^5.0.16" @@ -8012,7 +7929,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8033,7 +7950,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8043,7 +7960,7 @@ }, "postcss-discard-unused": { "version": "2.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { "postcss": "^5.0.14", @@ -8052,7 +7969,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8073,7 +7990,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8082,17 +7999,16 @@ } }, "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": false, - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "requires": { - "postcss": "^5.0.4", - "uniqid": "^4.0.0" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8113,7 +8029,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8122,16 +8038,16 @@ } }, "postcss-flexbugs-fixes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.0.0.tgz", - "integrity": "sha512-xWTSRqI3GzrEtboXfqDNyQwyj+P2dRG9EtCMJwqPkhwN4YCp/5J3S6rraQT0S8PrWBmKRT3cpkYAzfVmaZNBkw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", + "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", "requires": { "postcss": "^6.0.1" } }, "postcss-load-config": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { "cosmiconfig": "^2.1.0", @@ -8142,7 +8058,7 @@ }, "postcss-load-options": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { "cosmiconfig": "^2.1.0", @@ -8151,7 +8067,7 @@ }, "postcss-load-plugins": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { "cosmiconfig": "^2.1.1", @@ -8159,19 +8075,19 @@ } }, "postcss-loader": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", - "integrity": "sha512-HIq7yy1hh9KI472Y38iSRV4WupZUNy6zObkxQM/ZuInoaE2+PyX4NcO6jjP5HG5mXL7j5kcNEl0fAG4Kva7O9w==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", + "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", "requires": { "loader-utils": "^1.1.0", - "postcss": "^6.0.2", + "postcss": "^6.0.0", "postcss-load-config": "^1.2.0", "schema-utils": "^0.3.0" } }, "postcss-merge-idents": { "version": "2.1.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { "has": "^1.0.1", @@ -8181,7 +8097,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8202,7 +8118,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8212,7 +8128,7 @@ }, "postcss-merge-longhand": { "version": "2.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { "postcss": "^5.0.4" @@ -8220,7 +8136,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8241,7 +8157,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8251,7 +8167,7 @@ }, "postcss-merge-rules": { "version": "2.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { "browserslist": "^1.5.2", @@ -8263,7 +8179,7 @@ "dependencies": { "browserslist": { "version": "1.7.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { "caniuse-db": "^1.0.30000639", @@ -8272,7 +8188,7 @@ }, "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8293,7 +8209,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8303,12 +8219,12 @@ }, "postcss-message-helpers": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" }, "postcss-minify-font-values": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { "object-assign": "^4.0.1", @@ -8318,7 +8234,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8339,7 +8255,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8349,7 +8265,7 @@ }, "postcss-minify-gradients": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { "postcss": "^5.0.12", @@ -8358,7 +8274,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8379,7 +8295,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8389,7 +8305,7 @@ }, "postcss-minify-params": { "version": "1.2.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { "alphanum-sort": "^1.0.1", @@ -8400,7 +8316,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8421,7 +8337,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8431,7 +8347,7 @@ }, "postcss-minify-selectors": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { "alphanum-sort": "^1.0.2", @@ -8442,7 +8358,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8463,7 +8379,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8473,7 +8389,7 @@ }, "postcss-modules-extract-imports": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { "postcss": "^6.0.1" @@ -8481,7 +8397,7 @@ }, "postcss-modules-local-by-default": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { "css-selector-tokenizer": "^0.7.0", @@ -8490,7 +8406,7 @@ }, "postcss-modules-scope": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { "css-selector-tokenizer": "^0.7.0", @@ -8499,7 +8415,7 @@ }, "postcss-modules-values": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { "icss-replace-symbols": "^1.1.0", @@ -8508,7 +8424,7 @@ }, "postcss-normalize-charset": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { "postcss": "^5.0.5" @@ -8516,7 +8432,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8537,7 +8453,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8547,7 +8463,7 @@ }, "postcss-normalize-url": { "version": "3.0.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { "is-absolute-url": "^2.0.0", @@ -8558,7 +8474,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8579,7 +8495,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8589,7 +8505,7 @@ }, "postcss-ordered-values": { "version": "2.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { "postcss": "^5.0.4", @@ -8598,7 +8514,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8619,7 +8535,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8629,7 +8545,7 @@ }, "postcss-reduce-idents": { "version": "2.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { "postcss": "^5.0.4", @@ -8638,7 +8554,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8659,7 +8575,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8669,7 +8585,7 @@ }, "postcss-reduce-initial": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { "postcss": "^5.0.4" @@ -8677,7 +8593,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8698,7 +8614,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8708,7 +8624,7 @@ }, "postcss-reduce-transforms": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { "has": "^1.0.1", @@ -8718,7 +8634,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8739,7 +8655,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8749,7 +8665,7 @@ }, "postcss-selector-parser": { "version": "2.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { "flatten": "^1.0.2", @@ -8759,7 +8675,7 @@ }, "postcss-svgo": { "version": "2.1.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { "is-svg": "^2.0.0", @@ -8770,7 +8686,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8791,7 +8707,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8801,7 +8717,7 @@ }, "postcss-unique-selectors": { "version": "2.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { "alphanum-sort": "^1.0.1", @@ -8811,7 +8727,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8832,7 +8748,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8842,12 +8758,12 @@ }, "postcss-value-parser": { "version": "3.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" }, "postcss-zindex": { "version": "2.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { "has": "^1.0.1", @@ -8857,7 +8773,7 @@ "dependencies": { "has-flag": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { @@ -8878,7 +8794,7 @@ }, "supports-color": { "version": "3.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { "has-flag": "^1.0.0" @@ -8888,27 +8804,27 @@ }, "prelude-ls": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "pretty-bytes": { "version": "4.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" }, "pretty-error": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { "renderkid": "^2.0.1", @@ -8917,7 +8833,7 @@ }, "pretty-format": { "version": "20.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { "ansi-regex": "^2.1.1", @@ -8931,7 +8847,7 @@ }, "process": { "version": "0.11.10", - "resolved": false, + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { @@ -8940,13 +8856,13 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "1.1.8", - "resolved": false, - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" }, "promise": { "version": "7.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" @@ -8994,9 +8910,14 @@ }, "pseudomap": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "psl": { + "version": "1.1.28", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz", + "integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw==" + }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", @@ -9010,9 +8931,9 @@ } }, "punycode": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pure-color": { "version": "1.3.0", @@ -9025,13 +8946,13 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "version": "6.5.2", + "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": false, + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { "object-assign": "^4.1.0", @@ -9040,18 +8961,18 @@ }, "querystring": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { "version": "0.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "0.0.4", - "resolved": false, - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" }, "raf": { "version": "3.4.0", @@ -9062,21 +8983,19 @@ } }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { - "kind-of": { + "is-number": { "version": "4.0.0", - "resolved": false, - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" } } }, @@ -9099,7 +9018,7 @@ }, "range-parser": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { @@ -9129,6 +9048,11 @@ "statuses": ">= 1.3.1 < 2" } }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, "setprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", @@ -9137,11 +9061,11 @@ } }, "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -9149,7 +9073,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -9304,7 +9228,7 @@ "dependencies": { "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" } } @@ -9658,146 +9582,28 @@ } }, "react-dev-utils": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-3.0.2.tgz", - "integrity": "sha512-GaAHmCBwvIT1pVUvILK+CSLrYhZeWLsHCrIi/k1dT2JIywkcjRSHw1E9dhsMvzpHf/KTw6ROuTtBt8bK21i6Xw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.1.tgz", + "integrity": "sha512-+y92rG6pmXt3cpcg/NGmG4w/W309tWNSmyyPL8hCMxuCSg2UP/hUg3npACj2UZc8UKVSXexyLrCnxowizGoAsw==", "requires": { - "address": "1.0.2", - "anser": "1.4.1", - "babel-code-frame": "6.22.0", + "address": "1.0.3", + "babel-code-frame": "6.26.0", "chalk": "1.1.3", - "cross-spawn": "4.0.2", - "detect-port-alt": "1.1.3", + "cross-spawn": "5.1.0", + "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", - "filesize": "3.3.0", + "filesize": "3.5.11", + "global-modules": "1.0.0", "gzip-size": "3.0.0", - "html-entities": "1.2.1", - "inquirer": "3.1.1", + "inquirer": "3.3.0", "is-root": "1.0.0", - "opn": "5.1.0", + "opn": "5.2.0", + "react-error-overlay": "^4.0.0", "recursive-readdir": "2.2.1", "shell-quote": "1.6.1", "sockjs-client": "1.1.4", "strip-ansi": "3.0.1", "text-table": "0.2.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": false, - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", - "integrity": "sha512-H50sHQwgvvaTBd3HpKMVtL/u6LoHDvYym51gd7bGQe/+9HkCE+J0/3N5FJLfd6O6oz44hHewC2Pc2LodzWVafQ==", - "requires": { - "ansi-escapes": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.0.0", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": false, - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "onetime": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": false, - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "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": false, - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } } }, "react-display-name": { @@ -9921,7 +9727,7 @@ }, "react-dnd-scrollzone": { "version": "4.0.0", - "resolved": false, + "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", @@ -10068,58 +9874,9 @@ } }, "react-error-overlay": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-1.0.9.tgz", - "integrity": "sha512-rxzECPwBQ5VeyGcXtasKtXKBWbWdAVAiQCSmWUTgBYeVu9/L7aWeWG3CFFijvNVRTuUjj/FEJ19Y20BMOP+3Ag==", - "requires": { - "anser": "1.2.5", - "babel-code-frame": "6.22.0", - "babel-runtime": "6.23.0", - "react-dev-utils": "^3.0.2", - "settle-promise": "1.0.0", - "source-map": "0.5.6" - }, - "dependencies": { - "anser": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha1-Xc/JVuqjc7nCMBDdINq+ws4ZR1s=" - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - } - }, - "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==" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.0.tgz", + "integrity": "sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw==" }, "react-fullscreenable": { "version": "2.4.3", @@ -10392,897 +10149,58 @@ } }, "react-scripts": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.0.10.tgz", - "integrity": "sha1-h2A1WUdCIg9A/7hlpMfo3A+nriM=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.1.4.tgz", + "integrity": "sha512-UVZIujEIT9BGbx+NGvyfS92eOrNIIpqqFi1FP7a0O9l94A/XV7bhPk70SfDKaXZouCX81tFdXo0948DjhCEgGw==", "requires": { - "autoprefixer": "7.1.1", - "babel-core": "6.25.0", + "autoprefixer": "7.1.6", + "babel-core": "6.26.0", "babel-eslint": "7.2.3", "babel-jest": "20.0.3", - "babel-loader": "7.0.0", - "babel-preset-react-app": "^3.0.1", - "babel-runtime": "6.23.0", + "babel-loader": "7.1.2", + "babel-preset-react-app": "^3.1.1", + "babel-runtime": "6.26.0", "case-sensitive-paths-webpack-plugin": "2.1.1", "chalk": "1.1.3", - "css-loader": "0.28.4", + "css-loader": "0.28.7", "dotenv": "4.0.0", - "eslint": "3.19.0", - "eslint-config-react-app": "^1.0.5", - "eslint-loader": "1.7.1", - "eslint-plugin-flowtype": "2.34.0", - "eslint-plugin-import": "2.2.0", - "eslint-plugin-jsx-a11y": "5.0.3", - "eslint-plugin-react": "7.1.0", - "extract-text-webpack-plugin": "2.1.2", - "file-loader": "0.11.2", + "dotenv-expand": "4.2.0", + "eslint": "4.10.0", + "eslint-config-react-app": "^2.1.0", + "eslint-loader": "1.9.0", + "eslint-plugin-flowtype": "2.39.1", + "eslint-plugin-import": "2.8.0", + "eslint-plugin-jsx-a11y": "5.1.1", + "eslint-plugin-react": "7.4.0", + "extract-text-webpack-plugin": "3.0.2", + "file-loader": "1.1.5", "fs-extra": "3.0.1", - "fsevents": "1.1.2", + "fsevents": "^1.1.3", "html-webpack-plugin": "2.29.0", "jest": "20.0.4", "object-assign": "4.1.1", - "postcss-flexbugs-fixes": "3.0.0", - "postcss-loader": "2.0.6", - "promise": "7.1.1", - "react-dev-utils": "^3.0.2", - "react-error-overlay": "^1.0.9", - "style-loader": "0.18.2", - "sw-precache-webpack-plugin": "0.11.3", - "url-loader": "0.5.9", - "webpack": "2.6.1", - "webpack-dev-server": "2.5.0", - "webpack-manifest-plugin": "1.1.0", + "postcss-flexbugs-fixes": "3.2.0", + "postcss-loader": "2.0.8", + "promise": "8.0.1", + "raf": "3.4.0", + "react-dev-utils": "^5.0.1", + "resolve": "1.6.0", + "style-loader": "0.19.0", + "sw-precache-webpack-plugin": "0.11.4", + "url-loader": "0.6.2", + "webpack": "3.8.1", + "webpack-dev-server": "2.9.4", + "webpack-manifest-plugin": "1.3.2", "whatwg-fetch": "2.0.3" }, "dependencies": { - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - } - }, - "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==" - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "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 - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "optional": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "optional": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "optional": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "optional": true, - "requires": { - "mime-db": "~1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "request": "^2.81.0", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "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 - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": 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.4", - "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 - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "optional": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.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.2.9", - "bundled": true, - "optional": true, - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "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.0.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "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": "2.2.1", - "bundled": true, - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, "promise": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", - "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", + "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", "requires": { "asap": "~2.0.3" } - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" } } }, @@ -11349,7 +10267,7 @@ }, "react-virtualized": { "version": "9.9.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", "integrity": "sha512-TDe2haZiFr5apN3myuumGyeJ7iqHcGcQ648tfNf9x+R6tkE1+o8yAmeh4nKC4ldcs9My1dOHN3x/lmEX9LyOLA==", "requires": { "babel-runtime": "^6.11.6", @@ -11361,7 +10279,7 @@ }, "read-pkg": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { "load-json-file": "^1.0.0", @@ -11371,7 +10289,7 @@ }, "read-pkg-up": { "version": "1.0.1", - "resolved": false, + "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", @@ -11380,7 +10298,7 @@ "dependencies": { "find-up": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "^2.0.0", @@ -11389,7 +10307,7 @@ }, "path-exists": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { "pinkie-promise": "^2.0.0" @@ -11413,7 +10331,7 @@ }, "readdirp": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { "graceful-fs": "^4.1.2", @@ -11422,27 +10340,9 @@ "set-immediate-shim": "^1.0.1" } }, - "readline2": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": false, - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, "recursive-readdir": { "version": "2.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", "requires": { "minimatch": "3.0.3" @@ -11450,7 +10350,7 @@ "dependencies": { "minimatch": { "version": "3.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" @@ -11460,7 +10360,7 @@ }, "redent": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { "indent-string": "^2.1.0", @@ -11469,7 +10369,7 @@ }, "reduce-css-calc": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { "balanced-match": "^0.4.2", @@ -11479,14 +10379,14 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } }, "reduce-function-call": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { "balanced-match": "^0.4.2" @@ -11494,15 +10394,15 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" } } }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerator-runtime": { "version": "0.11.1", @@ -11510,9 +10410,9 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { - "version": "0.9.11", - "resolved": false, - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { "babel-runtime": "^6.18.0", "babel-types": "^6.19.0", @@ -11538,7 +10438,7 @@ }, "regexpu-core": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { "regenerate": "^1.2.1", @@ -11557,7 +10457,7 @@ }, "registry-url": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" @@ -11565,12 +10465,12 @@ }, "regjsgen": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" }, "regjsparser": { "version": "0.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { "jsesc": "~0.5.0" @@ -11578,14 +10478,14 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, "relateurl": { "version": "0.2.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, "remove-trailing-separator": { @@ -11595,7 +10495,7 @@ }, "renderkid": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { "css-select": "^1.1.0", @@ -11607,33 +10507,33 @@ "dependencies": { "utila": { "version": "0.3.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" } } }, "repeat-element": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { "is-finite": "^1.0.0" } }, "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.6.0", @@ -11643,7 +10543,6 @@ "forever-agent": "~0.6.1", "form-data": "~2.3.1", "har-validator": "~5.0.3", - "hawk": "~6.0.2", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -11653,37 +10552,44 @@ "performance-now": "^2.1.0", "qs": "~6.5.1", "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", "tough-cookie": "~2.3.3", "tunnel-agent": "^0.6.0", "uuid": "^3.1.0" }, "dependencies": { - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" + } } } }, "require-directory": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "1.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" }, "require-main-filename": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "require-uncached": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { "caller-path": "^0.1.0", @@ -11692,20 +10598,44 @@ }, "requires-port": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz", - "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", + "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", "requires": { "path-parse": "^1.0.5" } }, + "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" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, "resolve-url": { @@ -11714,12 +10644,12 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "restore-cursor": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -11729,7 +10659,7 @@ }, "right-align": { "version": "0.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { "align-text": "^0.1.1" @@ -11744,49 +10674,39 @@ } }, "ripemd160": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "^2.0.0", + "hash-base": "^3.0.0", "inherits": "^2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "^2.0.1" - } - } } }, "run-async": { - "version": "0.1.0", - "resolved": false, - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "once": "^1.3.0" + "is-promise": "^2.1.0" } }, "rx-lite": { - "version": "3.1.2", - "resolved": false, - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { "rx-lite": "*" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -11803,7 +10723,7 @@ }, "sane": { "version": "1.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { "anymatch": "^1.3.0", @@ -11817,7 +10737,7 @@ "dependencies": { "bser": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { "node-int64": "^0.4.0" @@ -11825,7 +10745,7 @@ }, "fb-watchman": { "version": "1.9.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", "requires": { "bser": "1.0.2" @@ -11833,7 +10753,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -11845,36 +10765,23 @@ }, "schema-utils": { "version": "0.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { "ajv": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - } } }, "select-hose": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", - "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", "requires": { - "node-forge": "0.7.1" + "node-forge": "0.7.5" } }, "semver": { @@ -11884,7 +10791,7 @@ }, "semver-diff": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" @@ -11944,17 +10851,17 @@ }, "serviceworker-cache-polyfill": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "set-value": { @@ -11980,7 +10887,7 @@ }, "setimmediate": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { @@ -11988,11 +10895,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, - "settle-promise": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-aXrbWLgh84fOJ1fAbvyd5fDuM9g=" - }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -12017,7 +10919,7 @@ }, "shell-quote": { "version": "1.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "requires": { "array-filter": "~0.0.0", @@ -12026,16 +10928,6 @@ "jsonify": "~0.0.0" } }, - "shelljs": { - "version": "0.7.8", - "resolved": false, - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -12043,18 +10935,21 @@ }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { - "version": "0.0.4", - "resolved": false, - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } }, "snapdragon": { "version": "0.8.2", @@ -12158,17 +11053,9 @@ } } }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.x.x" - } - }, "sockjs": { "version": "0.3.18", - "resolved": false, + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { "faye-websocket": "^0.10.0", @@ -12177,7 +11064,7 @@ "dependencies": { "faye-websocket": { "version": "0.10.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { "websocket-driver": ">=0.5.1" @@ -12185,14 +11072,14 @@ }, "uuid": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } }, "sockjs-client": { "version": "1.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { "debug": "^2.6.6", @@ -12205,16 +11092,16 @@ }, "sort-keys": { "version": "1.1.2", - "resolved": false, + "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": "0.1.8", - "resolved": false, - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" }, "source-map": { "version": "0.6.1", @@ -12222,11 +11109,11 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "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==", "requires": { - "atob": "^2.0.0", + "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -12283,7 +11170,7 @@ }, "spdy": { "version": "3.4.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { "debug": "^2.6.8", @@ -12318,13 +11205,13 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -12333,6 +11220,7 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, @@ -12362,7 +11250,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { "inherits": "~2.0.1", @@ -12370,38 +11258,52 @@ } }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", - "readable-stream": "^2.3.3", + "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" } }, "strict-uri-encode": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { "strip-ansi": "^3.0.0" } }, "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "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" + } + } } }, "string_decoder": { @@ -12412,14 +11314,9 @@ "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "resolved": false, - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -12427,7 +11324,7 @@ }, "strip-bom": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { "is-utf8": "^0.2.0" @@ -12440,7 +11337,7 @@ }, "strip-indent": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { "get-stdin": "^4.0.1" @@ -12448,13 +11345,13 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", + "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", "requires": { "loader-utils": "^1.0.2", "schema-utils": "^0.3.0" @@ -12621,16 +11518,16 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { "has-flag": "^3.0.0" } }, "svgo": { "version": "0.7.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { "coa": "~1.0.1", @@ -12660,9 +11557,9 @@ } }, "sw-precache-webpack-plugin": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.3.tgz", - "integrity": "sha512-VThRmVU97VXrxsnqAjd67GIwmxe5Z2R3lWsJjhq88TjN9Ck2iMAOiZIiWqlfnSxp517VgoG7gomg1Vu4v2wPag==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", + "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", "requires": { "del": "^2.2.2", "sw-precache": "^5.1.1", @@ -12671,7 +11568,7 @@ }, "sw-toolbox": { "version": "3.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { "path-to-regexp": "^1.0.1", @@ -12680,48 +11577,52 @@ }, "symbol-tree": { "version": "3.2.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { - "version": "3.8.3", - "resolved": false, - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": false, - "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==", + "ajv": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": false, - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" } } }, @@ -12752,7 +11653,7 @@ }, "text-table": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { @@ -12762,7 +11663,7 @@ }, "through": { "version": "2.3.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "thunky": { @@ -12772,7 +11673,7 @@ }, "time-stamp": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" }, "timed-out": { @@ -12781,9 +11682,9 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "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==", "requires": { "setimmediate": "^1.0.4" } @@ -12798,17 +11699,17 @@ }, "tmpl": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-arraybuffer": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "to-object-path": { @@ -12850,21 +11751,29 @@ } }, "toposort": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", - "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.2.tgz", + "integrity": "sha512-vahm+X8lSV/KjXziec8x5Vp0OTC9mq8EVCOApIsRAooeuMPSO8aT7PFACYkaL0yZ/3hVqw+8DzhCJwl8H2Ad6w==", "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } } }, "tr46": { "version": "0.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "transformation-matrix": { @@ -12874,22 +11783,22 @@ }, "trim-newlines": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "tty-browserify": { "version": "0.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { "version": "0.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -12897,13 +11806,13 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "type-check": { "version": "0.3.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { "prelude-ls": "~1.1.2" @@ -12920,7 +11829,7 @@ }, "typedarray": { "version": "0.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "ua-parser-js": { @@ -12929,9 +11838,9 @@ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, "uglify-js": { - "version": "3.3.20", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.20.tgz", - "integrity": "sha512-WpLkWCf9sGvGZnIvBV0PNID9BATQNT/IXKAmqegfKzIPcTmTV3FP8NQpoogQkt/Y402x2sOFdaHUmqFY9IZp+g==", + "version": "3.3.28", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.28.tgz", + "integrity": "sha512-68Rc/aA6cswiaQ5SrE979UJcXX+ADA1z33/ZsPd+fbAiVdjZ16OXdbtGO+rJUUBgK6qdf3SOPhQf3K/ybF5Miw==", "requires": { "commander": "~2.15.0", "source-map": "~0.6.1" @@ -12939,10 +11848,48 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -12977,20 +11924,12 @@ }, "uniq": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, - "uniqid": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "requires": { - "macaddress": "^0.2.8" - } - }, "uniqs": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, "unique-string": { @@ -13003,12 +11942,12 @@ }, "universalify": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, "unpipe": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { @@ -13053,14 +11992,14 @@ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "upath": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", - "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" }, "update-notifier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.4.0.tgz", - "integrity": "sha1-+bTHAPv9TsEsgRWHJYd31WPYyGY=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -13075,9 +12014,9 @@ }, "dependencies": { "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -13088,9 +12027,17 @@ }, "upper-case": { "version": "1.1.3", - "resolved": false, + "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", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, "urijs": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", @@ -13103,7 +12050,7 @@ }, "url": { "version": "0.11.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", @@ -13112,39 +12059,33 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, "url-loader": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "requires": { "loader-utils": "^1.0.2", - "mime": "1.3.x" + "mime": "^1.4.1", + "schema-utils": "^0.3.0" } }, "url-parse": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.3.0.tgz", - "integrity": "sha512-zPvPA3T7P6M+0iNsgX+iAcAz4GshKrowtQBHHc/28tVsBc8jK7VRCNX+2GEcoE6zDB6XqXhcyiUWPVZY6C70Cg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", + "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", "requires": { - "querystringify": "~1.0.0", - "requires-port": "~1.0.0" - }, - "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" - } + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" } }, "url-parse-lax": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" @@ -13158,37 +12099,22 @@ "kind-of": "^6.0.2" } }, - "user-home": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "requires": { - "os-homedir": "^1.0.0" - } - }, "util": { - "version": "0.10.3", - "resolved": false, - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } + "inherits": "2.0.3" } }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utila": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" }, "utils-merge": { @@ -13221,9 +12147,9 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==" }, "verror": { "version": "1.10.0", @@ -13237,7 +12163,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "requires": { "indexof": "0.0.1" @@ -13245,7 +12171,7 @@ }, "walker": { "version": "1.0.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { "makeerror": "1.0.x" @@ -13253,13 +12179,13 @@ }, "watch": { "version": "0.10.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" }, "watchpack": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", - "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "requires": { "chokidar": "^2.0.2", "graceful-fs": "^4.1.2", @@ -13280,149 +12206,176 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.6.1.tgz", - "integrity": "sha512-WkoF1vBKbYYFW4oRNeofwidp14CrzIme8OzDfUK6CEHjCj4zzACAdsTTm23MUd4Ui5bn6OO/GPpc1xBlcKOkRQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", + "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "requires": { "acorn": "^5.0.0", "acorn-dynamic-import": "^2.0.0", - "ajv": "^4.7.0", - "ajv-keywords": "^1.1.1", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", "async": "^2.1.2", - "enhanced-resolve": "^3.0.0", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", "interpret": "^1.0.0", "json-loader": "^0.5.4", "json5": "^0.5.1", "loader-runner": "^2.3.0", - "loader-utils": "^0.2.16", + "loader-utils": "^1.1.0", "memory-fs": "~0.4.1", "mkdirp": "~0.5.0", "node-libs-browser": "^2.0.0", "source-map": "^0.5.3", - "supports-color": "^3.1.0", - "tapable": "~0.2.5", - "uglify-js": "^2.8.27", - "watchpack": "^1.3.1", - "webpack-sources": "^0.2.3", - "yargs": "^6.0.0" + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" }, - "loader-utils": { - "version": "0.2.17", - "resolved": false, - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "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" + } + } } }, - "source-list-map": { - "version": "1.1.2", - "resolved": false, - "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "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" + } + }, + "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" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.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" + } + }, + "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" + } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, "supports-color": { - "version": "3.2.3", - "resolved": false, - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "^2.0.0" } }, - "uglify-js": { - "version": "2.8.29", - "resolved": false, - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": false, - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "0.2.3", - "resolved": false, - "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", - "requires": { - "source-list-map": "^1.1.1", - "source-map": "~0.5.3" - } + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "yargs": { - "version": "6.6.0", - "resolved": false, - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "^3.0.0", + "camelcase": "^4.1.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", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", "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", + "string-width": "^2.0.0", + "which-module": "^2.0.0", "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "cliui": { - "version": "3.2.0", - "resolved": false, - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - } + "yargs-parser": "^7.0.0" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": false, - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": false, - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } + "camelcase": "^4.1.0" } } } @@ -13437,46 +12390,45 @@ "path-is-absolute": "^1.0.0", "range-parser": "^1.0.3", "time-stamp": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } } }, "webpack-dev-server": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", - "integrity": "sha512-m5vhFvG1vKl0dY3cxgN3FiR6bTsYfjga5w6UkQQu/rQh4aFbMFnXHpfR9kJnduYu5envPsRv+lSZ/fFifbGN9w==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.4.tgz", + "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", "requires": { "ansi-html": "0.0.7", + "array-includes": "^3.0.3", "bonjour": "^3.5.0", "chokidar": "^1.6.0", "compression": "^1.5.2", "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", "del": "^3.0.0", "express": "^4.13.3", "html-entities": "^1.2.0", "http-proxy-middleware": "~0.17.4", - "internal-ip": "^1.2.0", - "opn": "4.0.2", + "import-local": "^0.1.1", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", "portfinder": "^1.0.9", "selfsigned": "^1.9.1", "serve-index": "^1.7.2", "sockjs": "0.3.18", - "sockjs-client": "1.1.2", + "sockjs-client": "1.1.4", "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^3.1.1", - "webpack-dev-middleware": "^1.10.2", - "yargs": "^6.0.0" + "strip-ansi": "^3.0.1", + "supports-color": "^4.2.1", + "webpack-dev-middleware": "^1.11.0", + "yargs": "^6.6.0" }, "dependencies": { "camelcase": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "chokidar": { @@ -13497,7 +12449,7 @@ }, "cliui": { "version": "3.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { "string-width": "^1.0.1", @@ -13505,9 +12457,17 @@ "wrap-ansi": "^2.0.0" } }, + "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" + } + }, "del": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { "globby": "^6.1.0", @@ -13518,473 +12478,9 @@ "rimraf": "^2.2.8" } }, - "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.9.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "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.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "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.2", - "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.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "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.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.9.1", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.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 - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": 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.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.6", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.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.6.2", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "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, - "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, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, "globby": { "version": "6.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { "array-union": "^1.0.1", @@ -13996,54 +12492,50 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "has-flag": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, - "opn": { - "version": "4.0.2", - "resolved": false, - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "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": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "number-is-nan": "^1.0.0" } }, "pify": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, - "sockjs-client": { - "version": "1.1.2", - "resolved": false, - "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "debug": "^2.2.0", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "supports-color": { - "version": "3.2.3", - "resolved": false, - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "^2.0.0" } }, "yargs": { "version": "6.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { "camelcase": "^3.0.0", @@ -14063,7 +12555,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { "camelcase": "^3.0.0" @@ -14072,9 +12564,9 @@ } }, "webpack-manifest-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz", - "integrity": "sha512-54uDakY6RD97sL3jPhWuBw8VrSujVmvcIcnlY/0EfhRUTWTSH4XCbjMbDvDjKfvvicawtuVunbqZp/ogCvEf9A==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", + "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", "requires": { "fs-extra": "^0.30.0", "lodash": ">=3.5 <5" @@ -14082,7 +12574,7 @@ "dependencies": { "fs-extra": { "version": "0.30.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { "graceful-fs": "^4.1.2", @@ -14094,7 +12586,7 @@ }, "jsonfile": { "version": "2.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { "graceful-fs": "^4.1.6" @@ -14109,13 +12601,6 @@ "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" - }, - "dependencies": { - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" - } } }, "websocket-driver": { @@ -14138,16 +12623,23 @@ "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", "requires": { "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + } } }, "whatwg-fetch": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" }, "whatwg-url": { "version": "4.8.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { "tr46": "~0.0.3", @@ -14156,27 +12648,27 @@ "dependencies": { "webidl-conversions": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" } } }, "whet.extend": { "version": "0.9.9", - "resolved": false, + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "widest-line": { @@ -14185,45 +12677,16 @@ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { "string-width": "^2.1.1" - }, - "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" - } - } } }, "window-size": { "version": "0.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "wordwrap": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { @@ -14236,21 +12699,41 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": false, + "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" + } + } } }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { "mkdirp": "^0.5.1" @@ -14273,27 +12756,27 @@ }, "xml-name-validator": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" }, "xtend": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "7.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { "camelcase": "^3.0.0", @@ -14313,24 +12796,42 @@ "dependencies": { "camelcase": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "cliui": { "version": "3.2.0", - "resolved": false, + "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" } + }, + "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" + } } } }, "yargs-parser": { "version": "5.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { "camelcase": "^3.0.0" @@ -14338,7 +12839,7 @@ "dependencies": { "camelcase": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } diff --git a/package.json b/package.json index daa6829..dcbf542 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "react-rnd": "^7.4.0", "react-router": "^4.1.2", "react-router-dom": "^4.1.2", - "react-scripts": "1.0.10", + "react-scripts": "^1.1.4", "react-sortable-tree": "^0.1.19", "react-svg-pan-zoom": "^2.14.1", "superagent": "^3.5.0", From 25ce9c08263ced02ccd5992b8a1923dd3dceec2c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 14 Jun 2018 19:48:46 +0200 Subject: [PATCH 501/556] topology: improve settings of SVGPanZoom --- src/components/widget-topology.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index bab361b..82e855e 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -156,8 +156,12 @@ class WidgetTopology extends React.Component { markup = (
    this.Viewer = Viewer} - style={{outline: "1px solid black"}} + style={{outline: "1px solid grey"}} detectAutoPan={false} + miniaturePosition="none" + toolbarPosition="none" + background="white" + tool="pan" width={this.props.widget.width-2} height={this.props.widget.height-2} > this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> From 40b6ac9e441f005359c7730f2286591bfa4bb30c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 14 Jun 2018 19:49:51 +0200 Subject: [PATCH 502/556] topology: automatically fit into dimensions of widget --- public/Pintura/js/cimview.js | 12 +++++++++++- src/components/widget-topology.js | 15 ++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/public/Pintura/js/cimview.js b/public/Pintura/js/cimview.js index 3c96201..cf10318 100644 --- a/public/Pintura/js/cimview.js +++ b/public/Pintura/js/cimview.js @@ -149,6 +149,10 @@ var cimview = cimview || (function() { } }; + var fit = function() { + setViewBox(svgNode.getElementById('diagrams').getBBox()); + }; + var getViewBox = function() { let rect = {}; viewBoxString = svgNode.getAttribute("viewBox"); @@ -184,19 +188,25 @@ var cimview = cimview || (function() { }; var init = function(svg) { - svgNode = svg; + svgNode = svg; let rect = { x: "-100", y: "-100", width: "1024", height: "768" }; setViewBox(rect); }; + var setSVG = function(svg) { + svgNode = svg; + } + /* * Specify the functions that this module exports */ return { init, pan, + fit, zoomIn, zoomOut, + setSVG }; }()); diff --git a/src/components/widget-topology.js b/src/components/widget-topology.js index 82e855e..c31bf97 100644 --- a/src/components/widget-topology.js +++ b/src/components/widget-topology.js @@ -84,17 +84,21 @@ class WidgetTopology extends React.Component { super(props); this.svgElem = null; this.Viewer = null; - + this.state = { visualizationState: 'initial' }; } + setSVG(svg) { + this.svgElem = svg; + window.cimsvg.setSVG(svg); // function not available in upstream source + window.cimview.setSVG(svg); // function not available in upstream source + } + componentDidMount() { if (this.svgElem) { window.cimjson.setImagePathBase(process.env.PUBLIC_URL + '/Pintura/'); - window.cimsvg.setSVG(this.svgElem); // function not available in upstream source - window.cimview.init(this.svgElem); window.onMouseLeave = function() {}; window.onMouseOver = function() {}; window.onMouseLeave = function() {}; @@ -120,8 +124,9 @@ class WidgetTopology extends React.Component { this.setState({'visualizationState': 'ready' }); window.cimxml.clearXmlData() window.cimsvg.setFileCount(1); - return response.text().then( contents => { + return response.text().then( contents => { window.cimsvg.loadFile(contents); + window.cimview.fit(); attachComponentEvents(); }); } else { @@ -164,7 +169,7 @@ class WidgetTopology extends React.Component { tool="pan" width={this.props.widget.width-2} height={this.props.widget.height-2} > - this.svgElem = c }width={this.props.widget.width} height={this.props.widget.height}> + this.setSVG(c) } width={this.props.widget.width} height={this.props.widget.height}> From 109b939373cebfd2437632e01f4b1dcbd8726545 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 14 Jun 2018 19:52:42 +0200 Subject: [PATCH 503/556] do not show errors of broken websocket connections (are already shown by api/websocket.js) --- src/data-managers/simulator-data-data-manager.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 518d69b..3154115 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -35,7 +35,7 @@ class SimulatorDataDataManager { 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), onError: (error) => this.onError(error, identifier) }); + 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) }); } update(endpoint, identifier) { @@ -88,10 +88,6 @@ class SimulatorDataDataManager { delete this._sockets[identifier]; } - onError(error, identifier) { - console.error('Error on ' + identifier + ':' + error); - } - onMessage(event, identifier) { var msgs = this.bufferToMessageArray(event.data); From 42c814b237033a7df32767772b57a7f60ba5d92e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 14 Jun 2018 19:53:26 +0200 Subject: [PATCH 504/556] websocket-api: only reconnect if we had a least one successful connection (closes #179) --- src/api/websocket-api.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index ee952dd..94fc953 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -24,6 +24,7 @@ class WebsocketAPI { this.endpoint = endpoint; this.callbacks = callbacks; + this.wasConnected = false; this.isClosing = false; this.connect(endpoint, callbacks); @@ -34,14 +35,12 @@ class WebsocketAPI { this.socket = new WebSocket(WebsocketAPI.getURL(endpoint), 'live'); this.socket.binaryType = 'arraybuffer'; this.socket.onclose = this.onClose; + this.socket.onopen = this.onOpen; + this.socket.onerror = this.onError; // register callbacks - if (callbacks.onOpen) - this.socket.onopen = callbacks.onOpen; if (callbacks.onMessage) this.socket.onmessage = callbacks.onMessage; - if (callbacks.onError) - this.socket.onerror = callbacks.onError; } reconnect() { @@ -62,14 +61,30 @@ class WebsocketAPI { this.socket.close(code, reason); } + onError = e => { + console.error('Error on WebSocket connection to: ' + this.endpoint + ':', e); + + if ('onError' in this.callbacks) + this.callbacks.onError(e); + } + + onOpen = e => { + this.wasConnected = true; + + if ('onOpen' in this.callbacks) + this.callbacks.onOpen(e); + } + onClose = e => { if (this.isClosing) { - if (this.callbacks.onClose) + if ('onClose' in this.callbacks) this.callbacks.onClose(e); } else { - //console.log("Connection to " + this.endpoint + " dropped. Attempt reconnect in 1 sec"); - window.setTimeout(() => { this.reconnect(); }, 500); + if (this.wasConnected) { + console.log("Connection to " + this.endpoint + " dropped. Attempt reconnect in 1 sec"); + window.setTimeout(() => { this.reconnect(); }, 1000); + } } } From de20bb5b5d376eb1f017aaed538e6b33beb9ba72 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 14 Jun 2018 20:37:08 +0200 Subject: [PATCH 505/556] added RESERVE logo --- src/components/home.js | 7 ++-- src/img/reserve.svg | 81 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/img/reserve.svg diff --git a/src/components/home.js b/src/components/home.js index 42faa6f..86ea56b 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -78,9 +78,12 @@ 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 ACS - Logo JARA Logo EU + Logo EU + Logo ACS + { + //Logo JARA + }
    ); } diff --git a/src/img/reserve.svg b/src/img/reserve.svg new file mode 100644 index 0000000..23f3092 --- /dev/null +++ b/src/img/reserve.svg @@ -0,0 +1,81 @@ + + + +image/svg+xml \ No newline at end of file From 2fa45059f022a0c0561f3bbf3e7fbbb80f6d9716 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 15 Jun 2018 09:56:45 +0200 Subject: [PATCH 506/556] moved widgets into their own subdir --- .../dialog/edit-widget-control-creator.js | 32 +++++++++---------- .../{dialog => dialogs}/delete-dialog.js | 0 src/components/{dialog => dialogs}/dialog.js | 0 .../{dialog => dialogs}/edit-node.js | 0 .../{dialog => dialogs}/edit-project.js | 0 .../{dialog => dialogs}/edit-simulation.js | 0 .../{dialog => dialogs}/edit-simulator.js | 0 .../{dialog => dialogs}/edit-user.js | 0 .../{dialog => dialogs}/edit-visualization.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 | 0 .../edit-widget-control-creator.js | 0 .../edit-widget-html-content.js | 0 .../edit-widget-image-control.js | 0 .../edit-widget-min-max-control.js | 0 .../edit-widget-number-control.js | 0 .../edit-widget-orientation.js | 8 ++--- .../edit-widget-signal-control.js | 0 .../edit-widget-signals-control.js | 0 .../edit-widget-simulator-control.js | 0 .../edit-widget-text-control.js | 0 .../edit-widget-text-size-control.js | 0 .../edit-widget-time-control.js | 0 .../{dialog => dialogs}/edit-widget.js | 0 .../{dialog => dialogs}/import-node.js | 0 .../import-simulation-model.js | 0 .../{dialog => dialogs}/import-simulation.js | 0 .../{dialog => dialogs}/import-simulator.js | 0 .../import-visualization.js | 0 .../{dialog => dialogs}/new-node.js | 0 .../{dialog => dialogs}/new-project.js | 0 .../{dialog => dialogs}/new-simulation.js | 0 .../{dialog => dialogs}/new-simulator.js | 0 .../{dialog => dialogs}/new-user.js | 0 .../{dialog => dialogs}/new-visualization.js | 0 src/components/widget-factory.js | 2 +- .../{widget-box.js => widgets/box.js} | 4 +-- .../{widget-button.js => widgets/button.js} | 4 +-- .../{widget-gauge.js => widgets/gauge.js} | 2 +- .../{widget-html.js => widgets/html.js} | 2 +- .../{widget-image.js => widgets/image.js} | 6 ++-- .../{widget-input.js => widgets/input.js} | 2 +- .../{widget-label.js => widgets/label.js} | 4 +-- .../{widget-lamp.js => widgets/lamp.js} | 4 +-- .../plot-table.js} | 6 ++-- .../{widget-plot.js => widgets/plot.js} | 6 ++-- .../{widget-slider.js => widgets/slider.js} | 2 +- .../{widget-table.js => widgets/table.js} | 8 ++--- .../topology.js} | 6 ++-- .../{widget-value.js => widgets/value.js} | 4 +-- src/containers/project.js | 8 ++--- src/containers/projects.js | 6 ++-- src/containers/simulation.js | 4 +-- src/containers/simulations.js | 8 ++--- src/containers/simulators.js | 8 ++--- src/containers/users.js | 6 ++-- src/containers/visualization.js | 2 +- src/containers/widget.js | 28 ++++++++-------- 60 files changed, 86 insertions(+), 86 deletions(-) rename src/components/{dialog => dialogs}/delete-dialog.js (100%) rename src/components/{dialog => dialogs}/dialog.js (100%) rename src/components/{dialog => dialogs}/edit-node.js (100%) rename src/components/{dialog => dialogs}/edit-project.js (100%) rename src/components/{dialog => dialogs}/edit-simulation.js (100%) rename src/components/{dialog => dialogs}/edit-simulator.js (100%) rename src/components/{dialog => dialogs}/edit-user.js (100%) rename src/components/{dialog => dialogs}/edit-visualization.js (100%) rename src/components/{dialog => dialogs}/edit-widget-aspect-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-checkbox-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-color-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-color-zones-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-control-creator.js (100%) rename src/components/{dialog => dialogs}/edit-widget-html-content.js (100%) rename src/components/{dialog => dialogs}/edit-widget-image-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-min-max-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-number-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-orientation.js (95%) rename src/components/{dialog => dialogs}/edit-widget-signal-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-signals-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-simulator-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-text-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-text-size-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget-time-control.js (100%) rename src/components/{dialog => dialogs}/edit-widget.js (100%) rename src/components/{dialog => dialogs}/import-node.js (100%) rename src/components/{dialog => dialogs}/import-simulation-model.js (100%) rename src/components/{dialog => dialogs}/import-simulation.js (100%) rename src/components/{dialog => dialogs}/import-simulator.js (100%) rename src/components/{dialog => dialogs}/import-visualization.js (100%) rename src/components/{dialog => dialogs}/new-node.js (100%) rename src/components/{dialog => dialogs}/new-project.js (100%) rename src/components/{dialog => dialogs}/new-simulation.js (100%) rename src/components/{dialog => dialogs}/new-simulator.js (100%) rename src/components/{dialog => dialogs}/new-user.js (100%) rename src/components/{dialog => dialogs}/new-visualization.js (100%) rename src/components/{widget-box.js => widgets/box.js} (93%) rename src/components/{widget-button.js => widgets/button.js} (94%) rename src/components/{widget-gauge.js => widgets/gauge.js} (99%) rename src/components/{widget-html.js => widgets/html.js} (97%) rename src/components/{widget-image.js => widgets/image.js} (94%) rename src/components/{widget-input.js => widgets/input.js} (98%) rename src/components/{widget-label.js => widgets/label.js} (92%) rename src/components/{widget-lamp.js => widgets/lamp.js} (95%) rename src/components/{widget-plot-table.js => widgets/plot-table.js} (98%) rename src/components/{widget-plot.js => widgets/plot.js} (96%) rename src/components/{widget-slider.js => widgets/slider.js} (99%) rename src/components/{widget-table.js => widgets/table.js} (93%) rename src/components/{widget-topology.js => widgets/topology.js} (98%) rename src/components/{widget-value.js => widgets/value.js} (98%) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index be81bc8..5141075 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -1,22 +1,22 @@ import { expect } from 'chai'; -import createControls from '../../../components/dialog/edit-widget-control-creator'; -import EditWidgetTextControl from '../../../components/dialog/edit-widget-text-control'; -import EditWidgetColorControl from '../../../components/dialog/edit-widget-color-control'; -import EditWidgetTimeControl from '../../../components/dialog/edit-widget-time-control'; -import EditImageWidgetControl from '../../../components/dialog/edit-widget-image-control'; -import EditWidgetSimulatorControl from '../../../components/dialog/edit-widget-simulator-control'; -import EditWidgetSignalControl from '../../../components/dialog/edit-widget-signal-control'; -import EditWidgetSignalsControl from '../../../components/dialog/edit-widget-signals-control'; -import EditWidgetOrientation from '../../../components/dialog/edit-widget-orientation'; -import EditWidgetTextSizeControl from '../../../components/dialog/edit-widget-text-size-control'; -import EditWidgetAspectControl from '../../../components/dialog/edit-widget-aspect-control'; -import EditWidgetCheckboxControl from '../../../components/dialog/edit-widget-checkbox-control'; -import EditWidgetMinMaxControl from '../../../components/dialog/edit-widget-min-max-control'; -import EditWidgetColorZonesControl from '../../../components/dialog/edit-widget-color-zones-control'; -import EditWidgetHTMLContent from '../../../components/dialog/edit-widget-html-content'; -import EditWidgetNumberControl from '../../../components/dialog/edit-widget-number-control'; +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 EditWidgetSimulatorControl from '../../../components/dialogs/edit-widget-simulator-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'; describe('edit widget control creator', () => { it('should not return null', () => { diff --git a/src/components/dialog/delete-dialog.js b/src/components/dialogs/delete-dialog.js similarity index 100% rename from src/components/dialog/delete-dialog.js rename to src/components/dialogs/delete-dialog.js diff --git a/src/components/dialog/dialog.js b/src/components/dialogs/dialog.js similarity index 100% rename from src/components/dialog/dialog.js rename to src/components/dialogs/dialog.js diff --git a/src/components/dialog/edit-node.js b/src/components/dialogs/edit-node.js similarity index 100% rename from src/components/dialog/edit-node.js rename to src/components/dialogs/edit-node.js diff --git a/src/components/dialog/edit-project.js b/src/components/dialogs/edit-project.js similarity index 100% rename from src/components/dialog/edit-project.js rename to src/components/dialogs/edit-project.js diff --git a/src/components/dialog/edit-simulation.js b/src/components/dialogs/edit-simulation.js similarity index 100% rename from src/components/dialog/edit-simulation.js rename to src/components/dialogs/edit-simulation.js diff --git a/src/components/dialog/edit-simulator.js b/src/components/dialogs/edit-simulator.js similarity index 100% rename from src/components/dialog/edit-simulator.js rename to src/components/dialogs/edit-simulator.js diff --git a/src/components/dialog/edit-user.js b/src/components/dialogs/edit-user.js similarity index 100% rename from src/components/dialog/edit-user.js rename to src/components/dialogs/edit-user.js diff --git a/src/components/dialog/edit-visualization.js b/src/components/dialogs/edit-visualization.js similarity index 100% rename from src/components/dialog/edit-visualization.js rename to src/components/dialogs/edit-visualization.js diff --git a/src/components/dialog/edit-widget-aspect-control.js b/src/components/dialogs/edit-widget-aspect-control.js similarity index 100% rename from src/components/dialog/edit-widget-aspect-control.js rename to src/components/dialogs/edit-widget-aspect-control.js diff --git a/src/components/dialog/edit-widget-checkbox-control.js b/src/components/dialogs/edit-widget-checkbox-control.js similarity index 100% rename from src/components/dialog/edit-widget-checkbox-control.js rename to src/components/dialogs/edit-widget-checkbox-control.js diff --git a/src/components/dialog/edit-widget-color-control.js b/src/components/dialogs/edit-widget-color-control.js similarity index 100% rename from src/components/dialog/edit-widget-color-control.js rename to src/components/dialogs/edit-widget-color-control.js diff --git a/src/components/dialog/edit-widget-color-zones-control.js b/src/components/dialogs/edit-widget-color-zones-control.js similarity index 100% rename from src/components/dialog/edit-widget-color-zones-control.js rename to src/components/dialogs/edit-widget-color-zones-control.js diff --git a/src/components/dialog/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js similarity index 100% rename from src/components/dialog/edit-widget-control-creator.js rename to src/components/dialogs/edit-widget-control-creator.js diff --git a/src/components/dialog/edit-widget-html-content.js b/src/components/dialogs/edit-widget-html-content.js similarity index 100% rename from src/components/dialog/edit-widget-html-content.js rename to src/components/dialogs/edit-widget-html-content.js diff --git a/src/components/dialog/edit-widget-image-control.js b/src/components/dialogs/edit-widget-image-control.js similarity index 100% rename from src/components/dialog/edit-widget-image-control.js rename to src/components/dialogs/edit-widget-image-control.js diff --git a/src/components/dialog/edit-widget-min-max-control.js b/src/components/dialogs/edit-widget-min-max-control.js similarity index 100% rename from src/components/dialog/edit-widget-min-max-control.js rename to src/components/dialogs/edit-widget-min-max-control.js diff --git a/src/components/dialog/edit-widget-number-control.js b/src/components/dialogs/edit-widget-number-control.js similarity index 100% rename from src/components/dialog/edit-widget-number-control.js rename to src/components/dialogs/edit-widget-number-control.js diff --git a/src/components/dialog/edit-widget-orientation.js b/src/components/dialogs/edit-widget-orientation.js similarity index 95% rename from src/components/dialog/edit-widget-orientation.js rename to src/components/dialogs/edit-widget-orientation.js index 9f3e67f..737aaef 100644 --- a/src/components/dialog/edit-widget-orientation.js +++ b/src/components/dialogs/edit-widget-orientation.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; -import WidgetSlider from '../widget-slider'; +import WidgetSlider from '../widgets/slider'; class EditWidgetOrientation extends Component { constructor(props) { @@ -52,11 +52,11 @@ class EditWidgetOrientation extends Component { Orientation - { + { Object.keys(WidgetSlider.OrientationTypes).map( (type) => { let value = WidgetSlider.OrientationTypes[type].value; let name = WidgetSlider.OrientationTypes[type].name; - + return ( this.handleOrientationChange(value)}> { name } @@ -70,4 +70,4 @@ class EditWidgetOrientation extends Component { } } -export default EditWidgetOrientation; \ No newline at end of file +export default EditWidgetOrientation; diff --git a/src/components/dialog/edit-widget-signal-control.js b/src/components/dialogs/edit-widget-signal-control.js similarity index 100% rename from src/components/dialog/edit-widget-signal-control.js rename to src/components/dialogs/edit-widget-signal-control.js diff --git a/src/components/dialog/edit-widget-signals-control.js b/src/components/dialogs/edit-widget-signals-control.js similarity index 100% rename from src/components/dialog/edit-widget-signals-control.js rename to src/components/dialogs/edit-widget-signals-control.js diff --git a/src/components/dialog/edit-widget-simulator-control.js b/src/components/dialogs/edit-widget-simulator-control.js similarity index 100% rename from src/components/dialog/edit-widget-simulator-control.js rename to src/components/dialogs/edit-widget-simulator-control.js diff --git a/src/components/dialog/edit-widget-text-control.js b/src/components/dialogs/edit-widget-text-control.js similarity index 100% rename from src/components/dialog/edit-widget-text-control.js rename to src/components/dialogs/edit-widget-text-control.js diff --git a/src/components/dialog/edit-widget-text-size-control.js b/src/components/dialogs/edit-widget-text-size-control.js similarity index 100% rename from src/components/dialog/edit-widget-text-size-control.js rename to src/components/dialogs/edit-widget-text-size-control.js diff --git a/src/components/dialog/edit-widget-time-control.js b/src/components/dialogs/edit-widget-time-control.js similarity index 100% rename from src/components/dialog/edit-widget-time-control.js rename to src/components/dialogs/edit-widget-time-control.js diff --git a/src/components/dialog/edit-widget.js b/src/components/dialogs/edit-widget.js similarity index 100% rename from src/components/dialog/edit-widget.js rename to src/components/dialogs/edit-widget.js diff --git a/src/components/dialog/import-node.js b/src/components/dialogs/import-node.js similarity index 100% rename from src/components/dialog/import-node.js rename to src/components/dialogs/import-node.js diff --git a/src/components/dialog/import-simulation-model.js b/src/components/dialogs/import-simulation-model.js similarity index 100% rename from src/components/dialog/import-simulation-model.js rename to src/components/dialogs/import-simulation-model.js diff --git a/src/components/dialog/import-simulation.js b/src/components/dialogs/import-simulation.js similarity index 100% rename from src/components/dialog/import-simulation.js rename to src/components/dialogs/import-simulation.js diff --git a/src/components/dialog/import-simulator.js b/src/components/dialogs/import-simulator.js similarity index 100% rename from src/components/dialog/import-simulator.js rename to src/components/dialogs/import-simulator.js diff --git a/src/components/dialog/import-visualization.js b/src/components/dialogs/import-visualization.js similarity index 100% rename from src/components/dialog/import-visualization.js rename to src/components/dialogs/import-visualization.js diff --git a/src/components/dialog/new-node.js b/src/components/dialogs/new-node.js similarity index 100% rename from src/components/dialog/new-node.js rename to src/components/dialogs/new-node.js diff --git a/src/components/dialog/new-project.js b/src/components/dialogs/new-project.js similarity index 100% rename from src/components/dialog/new-project.js rename to src/components/dialogs/new-project.js diff --git a/src/components/dialog/new-simulation.js b/src/components/dialogs/new-simulation.js similarity index 100% rename from src/components/dialog/new-simulation.js rename to src/components/dialogs/new-simulation.js diff --git a/src/components/dialog/new-simulator.js b/src/components/dialogs/new-simulator.js similarity index 100% rename from src/components/dialog/new-simulator.js rename to src/components/dialogs/new-simulator.js diff --git a/src/components/dialog/new-user.js b/src/components/dialogs/new-user.js similarity index 100% rename from src/components/dialog/new-user.js rename to src/components/dialogs/new-user.js diff --git a/src/components/dialog/new-visualization.js b/src/components/dialogs/new-visualization.js similarity index 100% rename from src/components/dialog/new-visualization.js rename to src/components/dialogs/new-visualization.js diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index f644423..434d3aa 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -20,7 +20,7 @@ * You should have received a copy of the GNU General Public License * along with VILLASweb. If not, see . ******************************************************************************/ -import WidgetSlider from './widget-slider'; +import WidgetSlider from './widgets/slider'; class WidgetFactory { diff --git a/src/components/widget-box.js b/src/components/widgets/box.js similarity index 93% rename from src/components/widget-box.js rename to src/components/widgets/box.js index db4621d..c32517f 100644 --- a/src/components/widget-box.js +++ b/src/components/widgets/box.js @@ -1,5 +1,5 @@ /** - * File: widget-box.js + * File: box.js * Author: Ricardo Hernandez-Montoya * Date: 25.04.2017 * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC @@ -22,7 +22,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from './dialog/edit-widget-color-control'; +import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; class WidgetBox extends Component { render() { diff --git a/src/components/widget-button.js b/src/components/widgets/button.js similarity index 94% rename from src/components/widget-button.js rename to src/components/widgets/button.js index 9a6c33b..11eef51 100644 --- a/src/components/widget-button.js +++ b/src/components/widgets/button.js @@ -1,5 +1,5 @@ /** - * File: widget-button.js + * File: button.js * Author: Ricardo Hernandez-Montoya * Date: 29.03.2017 * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC @@ -22,7 +22,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from './dialog/edit-widget-color-control'; +import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; class WidgetButton extends Component { diff --git a/src/components/widget-gauge.js b/src/components/widgets/gauge.js similarity index 99% rename from src/components/widget-gauge.js rename to src/components/widgets/gauge.js index 9f86902..d1baa50 100644 --- a/src/components/widget-gauge.js +++ b/src/components/widgets/gauge.js @@ -1,5 +1,5 @@ /** - * File: widget-gauge.js + * File: gauge.js * Author: Ricardo Hernandez-Montoya * Date: 31.03.2017 * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC diff --git a/src/components/widget-html.js b/src/components/widgets/html.js similarity index 97% rename from src/components/widget-html.js rename to src/components/widgets/html.js index b358fea..78dd3c6 100644 --- a/src/components/widget-html.js +++ b/src/components/widgets/html.js @@ -1,5 +1,5 @@ /** - * File: widget-html.js + * File: html.js * Author: Markus Grigull * Date: 29.08.2017 * diff --git a/src/components/widget-image.js b/src/components/widgets/image.js similarity index 94% rename from src/components/widget-image.js rename to src/components/widgets/image.js index cde16e0..3438a51 100644 --- a/src/components/widget-image.js +++ b/src/components/widgets/image.js @@ -1,5 +1,5 @@ /** - * File: widget-image.js + * File: image.js * Author: Markus Grigull * Date: 14.03.2017 * @@ -21,8 +21,8 @@ import React from 'react'; -import AppDispatcher from '../app-dispatcher'; -import config from '../config'; +import AppDispatcher from '../../app-dispatcher'; +import config from '../../config'; class WidgetImage extends React.Component { componentWillReceiveProps(nextProps) { diff --git a/src/components/widget-input.js b/src/components/widgets/input.js similarity index 98% rename from src/components/widget-input.js rename to src/components/widgets/input.js index d5ad7b6..eaa2b0b 100644 --- a/src/components/widget-input.js +++ b/src/components/widgets/input.js @@ -1,5 +1,5 @@ /** - * File: widget-number-input.js + * File: input.js * Author: Ricardo Hernandez-Montoya * Date: 29.03.2017 * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC diff --git a/src/components/widget-label.js b/src/components/widgets/label.js similarity index 92% rename from src/components/widget-label.js rename to src/components/widgets/label.js index 58d2233..4ce680e 100644 --- a/src/components/widget-label.js +++ b/src/components/widgets/label.js @@ -1,5 +1,5 @@ /** - * File: widget-label.js + * File: label.js * Author: Markus Grigull * Date: 14.03.2017 * @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from './dialog/edit-widget-color-control'; +import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; class WidgetLabel extends Component { render() { diff --git a/src/components/widget-lamp.js b/src/components/widgets/lamp.js similarity index 95% rename from src/components/widget-lamp.js rename to src/components/widgets/lamp.js index 2ed2f0e..5b90f56 100644 --- a/src/components/widget-lamp.js +++ b/src/components/widgets/lamp.js @@ -1,5 +1,5 @@ /** - * File: widget-lamp.js + * File: lamp.js * Author: Steffen Vogel * Date: 20.09.2017 * @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from './dialog/edit-widget-color-control'; +import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; class WidgetLamp extends Component { constructor(props) { diff --git a/src/components/widget-plot-table.js b/src/components/widgets/plot-table.js similarity index 98% rename from src/components/widget-plot-table.js rename to src/components/widgets/plot-table.js index 08a400e..368f7c5 100644 --- a/src/components/widget-plot-table.js +++ b/src/components/widgets/plot-table.js @@ -1,5 +1,5 @@ /** - * File: widget-plot-table.js + * File: plot-table.js * Author: Markus Grigull * Date: 15.03.2017 * @@ -23,8 +23,8 @@ import React, { Component } from 'react'; import classNames from 'classnames'; import { FormGroup, Checkbox } from 'react-bootstrap'; -import Plot from './widget-plot/plot'; -import PlotLegend from './widget-plot/plot-legend'; +import Plot from '../widget-plot/plot'; +import PlotLegend from '../widget-plot/plot-legend'; class WidgetPlotTable extends Component { constructor(props) { diff --git a/src/components/widget-plot.js b/src/components/widgets/plot.js similarity index 96% rename from src/components/widget-plot.js rename to src/components/widgets/plot.js index 5dd00b6..e61ca10 100644 --- a/src/components/widget-plot.js +++ b/src/components/widgets/plot.js @@ -1,5 +1,5 @@ /** - * File: widget-plot.js + * File: plot.js * Author: Markus Grigull * Date: 08.03.2017 * @@ -21,8 +21,8 @@ import React from 'react'; -import Plot from './widget-plot/plot'; -import PlotLegend from './widget-plot/plot-legend'; +import Plot from '../widget-plot/plot'; +import PlotLegend from '../widget-plot/plot-legend'; class WidgetPlot extends React.Component { constructor(props) { diff --git a/src/components/widget-slider.js b/src/components/widgets/slider.js similarity index 99% rename from src/components/widget-slider.js rename to src/components/widgets/slider.js index 2f37fd9..49f1994 100644 --- a/src/components/widget-slider.js +++ b/src/components/widgets/slider.js @@ -1,5 +1,5 @@ /** - * File: widget-slider.js + * File: slider.js * Author: Ricardo Hernandez-Montoya * Date: 30.03.2017 * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC diff --git a/src/components/widget-table.js b/src/components/widgets/table.js similarity index 93% rename from src/components/widget-table.js rename to src/components/widgets/table.js index b266a23..0be4178 100644 --- a/src/components/widget-table.js +++ b/src/components/widgets/table.js @@ -1,5 +1,5 @@ /** - * File: widget-table.js + * File: table.js * Author: Markus Grigull * Date: 14.03.2017 * @@ -21,8 +21,8 @@ import React, { Component } from 'react'; -import Table from './table'; -import TableColumn from './table-column'; +import Table from '../table'; +import TableColumn from '../table-column'; class WidgetTable extends Component { constructor(props) { @@ -46,7 +46,7 @@ class WidgetTable extends Component { 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.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { // clear values this.setState({ rows: [], sequence: null }); diff --git a/src/components/widget-topology.js b/src/components/widgets/topology.js similarity index 98% rename from src/components/widget-topology.js rename to src/components/widgets/topology.js index c31bf97..a11940a 100644 --- a/src/components/widget-topology.js +++ b/src/components/widgets/topology.js @@ -1,5 +1,5 @@ /** - * File: widget-topology.js + * File: topology.js * Author: Ricardo Hernandez-Montoya * Date: 08.01.2018 * @@ -21,8 +21,8 @@ import React from 'react'; import {ReactSVGPanZoom} from 'react-svg-pan-zoom'; -import config from '../config'; -import '../styles/simple-spinner.css'; +import config from '../../config'; +import '../../styles/simple-spinner.css'; // Do not show Pintura's grid diff --git a/src/components/widget-value.js b/src/components/widgets/value.js similarity index 98% rename from src/components/widget-value.js rename to src/components/widgets/value.js index aa056da..556db40 100644 --- a/src/components/widget-value.js +++ b/src/components/widgets/value.js @@ -1,5 +1,5 @@ /** - * File: widget-value.js + * File: value.js * Author: Markus Grigull * Date: 04.03.2017 * @@ -46,7 +46,7 @@ class WidgetValue extends Component { } const unit = nextProps.simulationModel.outputMapping[nextProps.widget.signal].type; - + // check if value has changed const signal = nextProps.data[simulator].output.values[nextProps.widget.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { diff --git a/src/containers/project.js b/src/containers/project.js index 985dfbc..ce5e3b4 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -33,11 +33,11 @@ import SimulationStore from '../stores/simulation-store'; import Icon from '../components/icon'; import CustomTable from '../components/table'; import TableColumn from '../components/table-column'; -import NewVisualzationDialog from '../components/dialog/new-visualization'; -import EditVisualizationDialog from '../components/dialog/edit-visualization'; -import ImportVisualizationDialog from '../components/dialog/import-visualization'; +import NewVisualzationDialog from '../components/dialogs/new-visualization'; +import EditVisualizationDialog from '../components/dialogs/edit-visualization'; +import ImportVisualizationDialog from '../components/dialogs/import-visualization'; -import DeleteDialog from '../components/dialog/delete-dialog'; +import DeleteDialog from '../components/dialogs/delete-dialog'; class Visualizations extends Component { static getStores() { diff --git a/src/containers/projects.js b/src/containers/projects.js index 8173006..b94c846 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -31,10 +31,10 @@ import SimulationStore from '../stores/simulation-store'; import Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -import NewProjectDialog from '../components/dialog/new-project'; -import EditProjectDialog from '../components/dialog/edit-project'; +import NewProjectDialog from '../components/dialogs/new-project'; +import EditProjectDialog from '../components/dialogs/edit-project'; -import DeleteDialog from '../components/dialog/delete-dialog'; +import DeleteDialog from '../components/dialogs/delete-dialog'; class Projects extends React.Component { static getStores() { diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 6fb8c0b..090a8de 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -34,10 +34,10 @@ 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/dialog/import-simulation-model'; +import ImportSimulationModelDialog from '../components/dialogs/import-simulation-model'; import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialog/delete-dialog'; +import DeleteDialog from '../components/dialogs/delete-dialog'; class Simulation extends React.Component { static getStores() { diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 25ee82a..2bd8a1d 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -33,12 +33,12 @@ import SimulationModelStore from '../stores/simulation-model-store'; import Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -import NewSimulationDialog from '../components/dialog/new-simulation'; -import EditSimulationDialog from '../components/dialog/edit-simulation'; -import ImportSimulationDialog from '../components/dialog/import-simulation'; +import NewSimulationDialog from '../components/dialogs/new-simulation'; +import EditSimulationDialog from '../components/dialogs/edit-simulation'; +import ImportSimulationDialog from '../components/dialogs/import-simulation'; import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialog/delete-dialog'; +import DeleteDialog from '../components/dialogs/delete-dialog'; class Simulations extends Component { static getStores() { diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 4bd7ff6..8868c15 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -32,12 +32,12 @@ import UserStore from '../stores/user-store'; import Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -import NewSimulatorDialog from '../components/dialog/new-simulator'; -import EditSimulatorDialog from '../components/dialog/edit-simulator'; -import ImportSimulatorDialog from '../components/dialog/import-simulator'; +import NewSimulatorDialog from '../components/dialogs/new-simulator'; +import EditSimulatorDialog from '../components/dialogs/edit-simulator'; +import ImportSimulatorDialog from '../components/dialogs/import-simulator'; import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialog/delete-dialog'; +import DeleteDialog from '../components/dialogs/delete-dialog'; class Simulators extends Component { static getStores() { diff --git a/src/containers/users.js b/src/containers/users.js index 9d34c3b..1e1779e 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -30,10 +30,10 @@ import UsersStore from '../stores/users-store'; import Icon from '../components/icon'; import Table from '../components/table'; import TableColumn from '../components/table-column'; -import NewUserDialog from '../components/dialog/new-user'; -import EditUserDialog from '../components/dialog/edit-user'; +import NewUserDialog from '../components/dialogs/new-user'; +import EditUserDialog from '../components/dialogs/edit-user'; -import DeleteDialog from '../components/dialog/delete-dialog'; +import DeleteDialog from '../components/dialogs/delete-dialog'; class Users extends Component { static getStores() { diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e08f8e1..34040e2 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -32,7 +32,7 @@ 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/dialog/edit-widget'; +import EditWidget from '../components/dialogs/edit-widget'; import Grid from '../components/grid'; import UserStore from '../stores/user-store'; diff --git a/src/containers/widget.js b/src/containers/widget.js index bdb7761..beec69c 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -31,20 +31,20 @@ import SimulatorDataStore from '../stores/simulator-data-store'; import SimulationModelStore from '../stores/simulation-model-store'; import FileStore from '../stores/file-store'; -import WidgetLamp from '../components/widget-lamp'; -import WidgetValue from '../components/widget-value'; -import WidgetPlot from '../components/widget-plot'; -import WidgetTable from '../components/widget-table'; -import WidgetLabel from '../components/widget-label'; -import WidgetPlotTable from '../components/widget-plot-table'; -import WidgetImage from '../components/widget-image'; -import WidgetButton from '../components/widget-button'; -import WidgetInput from '../components/widget-input'; -import WidgetSlider from '../components/widget-slider'; -import WidgetGauge from '../components/widget-gauge'; -import WidgetBox from '../components/widget-box'; -import WidgetHTML from '../components/widget-html'; -import WidgetTopology from '../components/widget-topology'; +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 '../styles/widgets.css'; From a8d4d23c9704658139b3401a8e3562ba11c5c82e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 13:49:04 +0200 Subject: [PATCH 507/556] explicity set background color of visualization container as the property of the parent container gets lost as soon as we enter fullscreen mode --- src/containers/visualization.js | 2 +- src/styles/app.css | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 34040e2..8b0641c 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -431,7 +431,7 @@ class Visualization extends React.Component { render() { const current_widgets = this.state.visualization.widgets; - let boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); + let boxClasses = classNames('section', 'box', { 'fullscreen-container': this.props.isFullscreen }); let buttons = [] let editingControls = []; diff --git a/src/styles/app.css b/src/styles/app.css index d6128af..da43dc5 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -218,8 +218,9 @@ body { /** * Visualizations */ -.fullscreen-padding { +.fullscreen-container { padding: 10px; + background-color: white; } From 6ce61f4726c632a893a5cc3eb92c5ec266644927 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 21:13:14 +0200 Subject: [PATCH 508/556] use SI prefixes and add unit column to table --- src/components/widget-plot/plot.js | 6 +++--- src/components/widgets/slider.js | 5 ++++- src/components/widgets/table.js | 23 +++++++++++++++++------ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index 986db6f..a3f6d37 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -56,7 +56,7 @@ class Plot extends React.Component { } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); - const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".1g")); + const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".3s")); this.state = { data: null, @@ -99,7 +99,7 @@ class Plot extends React.Component { } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); - const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".1g")); + const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".3s")); this.setState({ data: null, xAxis, yAxis, labelMargin }); return; @@ -171,7 +171,7 @@ class Plot extends React.Component { const yScale = scaleLinear().domain(yRange).range([this.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(".1g")); + const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".3s")); // generate paths from data const sparkLine = line().x(p => xScale(p.x)).y(p => yScale(p.y)); diff --git a/src/components/widgets/slider.js b/src/components/widgets/slider.js index 49f1994..4212eef 100644 --- a/src/components/widgets/slider.js +++ b/src/components/widgets/slider.js @@ -21,6 +21,7 @@ ******************************************************************************/ import React, { Component } from 'react'; +import { format } from 'd3'; import classNames from 'classnames'; import Slider from 'rc-slider'; import 'rc-slider/assets/index.css'; @@ -64,6 +65,7 @@ class WidgetSlider extends Component { // Check if the orientation changed, update the size if it did if (this.props.widget.orientation !== nextProps.widget.orientation) { let baseWidget = nextProps.widget; + // Exchange dimensions and constraints let newWidget = Object.assign({}, baseWidget, { width: baseWidget.height, @@ -73,6 +75,7 @@ class WidgetSlider extends Component { maxWidth: baseWidget.maxHeight, maxHeight: baseWidget.maxWidth }); + nextProps.onWidgetChange(newWidget); } } @@ -96,7 +99,7 @@ class WidgetSlider extends Component { let fields = { name: this.props.widget.name, control: this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, - value: { Number.parseFloat(this.state.value).toPrecision(3) }, + value: { format('.3s')(Number.parseFloat(this.state.value)) }, unit: { this.state.unit } } diff --git a/src/components/widgets/table.js b/src/components/widgets/table.js index 0be4178..c2025f6 100644 --- a/src/components/widgets/table.js +++ b/src/components/widgets/table.js @@ -20,6 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; +import { format } from 'd3'; import Table from '../table'; import TableColumn from '../table-column'; @@ -30,7 +31,8 @@ class WidgetTable extends Component { this.state = { rows: [], - sequence: null + sequence: null, + showUnit: false }; } @@ -48,8 +50,9 @@ class WidgetTable extends Component { || nextProps.data[simulator].output == null || nextProps.data[simulator].output.values.length === 0 || nextProps.data[simulator].output.values[0].length === 0) { + // clear values - this.setState({ rows: [], sequence: null }); + this.setState({ rows: [], sequence: null, showUnit: false }); return; } @@ -65,20 +68,28 @@ class WidgetTable extends Component { if (index < nextProps.simulationModel.outputMapping.length) { rows.push({ name: nextProps.simulationModel.outputMapping[index].name, - value: signal[signal.length - 1].y.toFixed(3) + unit: nextProps.simulationModel.outputMapping[index].type, + value: signal[signal.length - 1].y }); } }); - this.setState({ rows: rows, sequence: nextProps.data[simulator].output.sequence }); + this.setState({ showUnit: nextProps.showUnit, rows: rows, sequence: nextProps.data[simulator].output.sequence }); } render() { + var columns = [ + , + + ]; + + if (this.props.widget.showUnit) + columns.push() + return (
    - - + { columns }
    ); From 530921cfb61ea6c6db2df3ad8a4810d53b4b42d4 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 21:13:30 +0200 Subject: [PATCH 509/556] make layout of table widget more compact --- src/styles/widgets.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index be7dec0..2e4d416 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -421,8 +421,13 @@ div[class*="-widget"] label { } .table-widget td, .table-widget th { - text-align: center; + text-align: left; } + +.table-widget td { + padding: 2px 8px !important; +} + /* End table widget*/ /* Begin box widget */ From d3b1af177e6b9965fe6aeb898316392cf2e04172 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 22:58:16 +0200 Subject: [PATCH 510/556] rework input widget --- src/components/widgets/input.js | 70 +++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/components/widgets/input.js b/src/components/widgets/input.js index eaa2b0b..63bc655 100644 --- a/src/components/widgets/input.js +++ b/src/components/widgets/input.js @@ -21,56 +21,68 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Form, FormGroup, Col, ControlLabel, FormControl } from 'react-bootstrap'; +import { Form, FormGroup, Col, ControlLabel, FormControl, InputGroup } from 'react-bootstrap'; class WidgetInput extends Component { - static whichValidationStateIs( condition ) { - switch(condition) { - case 'ok': return null; - case 'error': return 'error'; - default: return 'error'; - } - } - constructor(props) { super(props); this.state = { value: '', - validationState: WidgetInput.whichValidationStateIs('ok') + unit: '' }; } - validateInput(e) { - if (e.target.value === '' || e.target.value.endsWith('.')) { - this.setState({ - validationState: WidgetInput.whichValidationStateIs('ok'), - value: e.target.value }); - } else { - var num = Number(e.target.value); - if (Number.isNaN(num)) { - this.setState({ validationState: WidgetInput.whichValidationStateIs('error'), - value: e.target.value }); - } else { - this.setState({ - validationState: WidgetInput.whichValidationStateIs('ok'), - value: num }); - } - } + componentWillReceiveProps(nextProps) { + if (nextProps.simulationModel == null) { + return; + } + + // Update value + if (nextProps.widget.default_value && this.state.value === undefined) { + this.setState({ + value: nextProps.widget.default_value + }); + } + + // Update unit + if (nextProps.widget.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.signal].type) { + this.setState({ + unit: nextProps.simulationModel.inputMapping[nextProps.widget.signal].type + }); + } + } + + valueIsChanging(newValue) { + this.setState({ value: newValue }); + } + + valueChanged(newValue) { + if (this.props.onInputChanged) { + this.props.onInputChanged(newValue); + } + } + + handleKeyPress(e) { + if(e.charCode === 13) { + this.valueChanged(this.state.value) + } } render() { return (
    - + {this.props.widget.name} - this.validateInput(e) } 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.state.unit} + From e7b5aa6c0de957bf71880bb5f78acd5af39c0b7c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 22:58:33 +0200 Subject: [PATCH 511/556] use SI prefixes in value widget --- src/components/widgets/value.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/widgets/value.js b/src/components/widgets/value.js index 556db40..c58f57d 100644 --- a/src/components/widgets/value.js +++ b/src/components/widgets/value.js @@ -20,6 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; +import { format } from 'd3'; class WidgetValue extends Component { constructor(props) { @@ -59,7 +60,7 @@ class WidgetValue extends Component { return (
    {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : value_to_render.toFixed(3)} + {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} {this.props.widget.showUnit && [{this.state.unit}] } From e8177400f7f40c1781311fb35610b459e8353d32 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 23:37:21 +0200 Subject: [PATCH 512/556] reworked button widget --- src/components/widgets/button.js | 50 +++++++++++++++++++------------- src/styles/widgets.css | 11 ------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/components/widgets/button.js b/src/components/widgets/button.js index 11eef51..d2293b8 100644 --- a/src/components/widgets/button.js +++ b/src/components/widgets/button.js @@ -21,34 +21,44 @@ ******************************************************************************/ import React, { Component } from 'react'; - -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import { Button } from 'react-bootstrap'; class WidgetButton extends Component { - action(e) { - e.target.blur(); // Remove focus - console.log('Button widget action'); + constructor(props) { + super(props); + + this.state = { + pressed: false + } + } + + onPress(e) { + if (!this.props.widget.toggle) { + this.setState({ pressed: true }); + this.valueChanged(this.props.widget.on_value); + } + } + + onRelease(e) { + let nextState = false; + if (this.props.widget.toggle) { + nextState = !this.state.pressed; + } + + this.setState({ pressed: nextState }); + this.valueChanged(nextState ? this.props.widget.on_value : this.props.widget.off_value); + } + + valueChanged(newValue) { + if (this.props.onInputChanged) + this.props.onInputChanged(newValue); } render() { - - let colors = EditWidgetColorControl.ColorPalette; - - let colorStyle = { - background: colors[this.props.widget.background_color], - color: colors[this.props.widget.font_color], - borderColor: colors[this.props.widget.font_color] - } - return (
    - { this.props.editing ? ( - - ) : ( - - ) - } +
    ); } diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 2e4d416..2e79f89 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -265,18 +265,7 @@ span.signal-unit::after { } /* Button widget styling */ -.button-widget button { - border-radius: 25px; - border-style: double; - border-width: 4px; - overflow-x: hidden; - font-weight: 500; - font-size: 1.2em; -} -.button-widget button:hover { - border-style: double; -} /* End button widget styling */ .full { From 0cfd3a9ef8e742b94fb8c49a12d437c983ebc8a2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 23:37:34 +0200 Subject: [PATCH 513/556] add key properties --- src/components/widgets/table.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/widgets/table.js b/src/components/widgets/table.js index c2025f6..53af120 100644 --- a/src/components/widgets/table.js +++ b/src/components/widgets/table.js @@ -79,12 +79,12 @@ class WidgetTable extends Component { render() { var columns = [ - , - + , + ]; if (this.props.widget.showUnit) - columns.push() + columns.push() return (
    From 6b83a4e97856fdb6b988579bef839f4c50802a89 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 23:38:20 +0200 Subject: [PATCH 514/556] add missing callback to input widgets --- src/containers/widget.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index beec69c..f0018ca 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -218,11 +218,11 @@ class Widget extends React.Component { } else if (widget.type === 'Image') { element = } else if (widget.type === 'Button') { - element = + element = this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Input') { - element = + element = this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Slider') { - element = this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={(value) => this.inputDataChanged(widget, value)} /> + element = this.inputDataChanged(widget, value)} onWidgetChange={(w) => this.props.onWidgetStatusChange(w, this.props.index) } /> } else if (widget.type === 'Gauge') { element = } else if (widget.type === 'Box') { From 343723cc677febb2c2dc232dc24124dcb0e5d2a3 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 23:39:15 +0200 Subject: [PATCH 515/556] missing changed in edit-widget-control-creator --- .../dialogs/edit-widget-control-creator.js | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js index 5a4f716..ebcfcf1 100644 --- a/src/components/dialogs/edit-widget-control-creator.js +++ b/src/components/dialogs/edit-widget-control-creator.js @@ -80,7 +80,8 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Table': dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Image': @@ -130,11 +131,15 @@ export default function createControls(widgetType = null, widget = null, session ); break; case 'Button': + let buttonBoundOnChange = (e) => { + handleChange([e, {target: {id: 'signal', value: 0}}]); + } dialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => buttonBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Box': @@ -164,10 +169,13 @@ 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)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => inputBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; From c6d5ed51c9fa27d5f134d8147f814ee153239105 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 17 Jun 2018 23:39:52 +0200 Subject: [PATCH 516/556] set property step of number inputs to any for allowing non-integer inputs --- src/components/dialogs/edit-widget-min-max-control.js | 4 ++-- src/components/dialogs/edit-widget-number-control.js | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/dialogs/edit-widget-min-max-control.js b/src/components/dialogs/edit-widget-min-max-control.js index 7d867a0..39218bf 100644 --- a/src/components/dialogs/edit-widget-min-max-control.js +++ b/src/components/dialogs/edit-widget-min-max-control.js @@ -49,10 +49,10 @@ class EditWidgetMinMaxControl 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/components/dialogs/edit-widget-number-control.js b/src/components/dialogs/edit-widget-number-control.js index 15b4c67..07de491 100644 --- a/src/components/dialogs/edit-widget-number-control.js +++ b/src/components/dialogs/edit-widget-number-control.js @@ -38,10 +38,9 @@ class EditWidgetNumberControl extends Component { render() { return ( - + {this.props.label} - this.props.handleChange(e)} /> - + this.props.handleChange(e)} /> ); } From 728466d0d2f5df9b706f076d8ca97270b489d8ae Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 18 Jun 2018 14:53:00 +0200 Subject: [PATCH 517/556] prepared an "action" widget which can be used to control a simulation from within a visualization --- .../dialogs/edit-widget-control-creator.js | 5 ++ src/components/widget-factory.js | 3 ++ src/components/widgets/action.js | 48 +++++++++++++++++++ src/containers/visualization.js | 1 + src/containers/widget.js | 5 +- 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/components/widgets/action.js diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js index ebcfcf1..927e967 100644 --- a/src/components/dialogs/edit-widget-control-creator.js +++ b/src/components/dialogs/edit-widget-control-creator.js @@ -42,6 +42,11 @@ export default function createControls(widgetType = null, widget = null, session var dialogControls = []; switch(widgetType) { + case 'Action': + dialogControls.push( + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + ) + break; case 'Value': let valueBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 434d3aa..b190f81 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -39,6 +39,9 @@ class WidgetFactory { // set type specific properties switch(type) { + case 'Action': + widget.simulationModel = defaultSimulationModel; + break; case 'Lamp': widget.simulationModel = defaultSimulationModel; widget.signal = 0; diff --git a/src/components/widgets/action.js b/src/components/widgets/action.js new file mode 100644 index 0000000..24e105c --- /dev/null +++ b/src/components/widgets/action.js @@ -0,0 +1,48 @@ +/** + * 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 + * 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 { Button, ButtonGroup } from 'react-bootstrap'; +import Icon from '../icon'; + +class WidgetAction extends Component { + constructor(props) { + super(props); + + this.state = { + }; + } + + onClick(e) { + + } + + render() { + return + + + + ; + } +} + +export default WidgetAction; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 8b0641c..3ae300b 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -485,6 +485,7 @@ class Visualization extends React.Component { { editingControls } + diff --git a/src/containers/widget.js b/src/containers/widget.js index f0018ca..ebcf7d1 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -31,6 +31,7 @@ import SimulatorDataStore from '../stores/simulator-data-store'; import SimulationModelStore from '../stores/simulation-model-store'; import FileStore from '../stores/file-store'; +import WidgetAction from '../components/widgets/action'; import WidgetLamp from '../components/widgets/lamp'; import WidgetValue from '../components/widgets/value'; import WidgetPlot from '../components/widgets/plot'; @@ -203,7 +204,9 @@ class Widget extends React.Component { } // dummy is passed to widgets to keep updating them while in edit mode - if (widget.type === 'Lamp') { + if (widget.type === 'Action') { + element = + } else if (widget.type === 'Lamp') { element = } else if (widget.type === 'Value') { element = From 04d5ab54d68acb41bc55a40d8f1a7d533318c0aa Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 18 Jun 2018 14:53:23 +0200 Subject: [PATCH 518/556] add input field for changing button name --- src/components/dialogs/edit-widget-control-creator.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js index 927e967..5e1f9db 100644 --- a/src/components/dialogs/edit-widget-control-creator.js +++ b/src/components/dialogs/edit-widget-control-creator.js @@ -140,11 +140,12 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: 0}}]); } dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => buttonBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + 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)} /> ); break; case 'Box': From 3f1913dd4934eae3682607e67f63405d70c51ad2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 29 Aug 2018 19:34:46 +0200 Subject: [PATCH 519/556] fix undraggable toolbox items in Firefox --- src/components/toolbox-item.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/toolbox-item.js b/src/components/toolbox-item.js index b4283c9..a4f5b14 100644 --- a/src/components/toolbox-item.js +++ b/src/components/toolbox-item.js @@ -20,7 +20,6 @@ ******************************************************************************/ import React from 'react'; -import { Button } from 'react-bootstrap'; import { DragSource } from 'react-dnd'; import classNames from 'classnames'; import Icon from './icon'; @@ -56,20 +55,20 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource(
    - +
    , {dropEffect}); } else { return (
    - +
    ); } From 56da37801401b7dfba93ac8d1bc3946d5442f551 Mon Sep 17 00:00:00 2001 From: Manuel Pitz Date: Thu, 30 Aug 2018 22:23:04 +0200 Subject: [PATCH 520/556] Add simulator dialog field check fixed --- src/components/dialogs/new-simulator.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dialogs/new-simulator.js b/src/components/dialogs/new-simulator.js index 3ddd80d..1eb5b34 100644 --- a/src/components/dialogs/new-simulator.js +++ b/src/components/dialogs/new-simulator.js @@ -63,7 +63,7 @@ class NewSimulatorDialog extends React.Component { } resetState() { - this.setState({ name: '', endpoint: 'http://', uuid: '' }); + this.setState({ name: '', endpoint: 'http://', uuid: this.uuidv4()}); } validateForm(target) { @@ -79,7 +79,7 @@ class NewSimulatorDialog extends React.Component { uuid = false; } - this.valid = name || uuid; + this.valid = name && uuid; // return state to control if (target === 'name') return name ? "success" : "error"; @@ -110,7 +110,7 @@ class NewSimulatorDialog extends React.Component {
    UUID - this.handleChange(e)} /> + this.handleChange(e)} /> From d9deff7b7eda6ffda84d8a419adfdf5b7526ef42 Mon Sep 17 00:00:00 2001 From: Manuel Pitz Date: Fri, 31 Aug 2018 00:28:38 +0200 Subject: [PATCH 521/556] activate enter handling and add function to prevent key handling when needed --- src/components/dialogs/dialog.js | 14 +++++++++++--- src/components/dialogs/edit-widget-html-content.js | 9 +++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/components/dialogs/dialog.js b/src/components/dialogs/dialog.js index d3bb657..db4c6a4 100644 --- a/src/components/dialogs/dialog.js +++ b/src/components/dialogs/dialog.js @@ -31,13 +31,21 @@ class Dialog extends React.Component { this.props.onClose(true); } + /** + * To prevent Enter hanlding user onKeyPress={this.handleKeyIgnore} in that form element + * and the following handler in the corresponding file: + * + * //this function prevents a keystroke from beeing handled by dialog.js + * handleKeyIgnore(event){ + * event.stopPropagation(); + * } + */ onKeyPress = (event) => { - /*if (event.key === 'Enter') { + if (event.key === 'Enter') { // prevent input from submitting event.preventDefault(); - this.closeModal(false); - }*/ + } } render() { diff --git a/src/components/dialogs/edit-widget-html-content.js b/src/components/dialogs/edit-widget-html-content.js index 22cc10b..3b02bc3 100644 --- a/src/components/dialogs/edit-widget-html-content.js +++ b/src/components/dialogs/edit-widget-html-content.js @@ -31,15 +31,20 @@ class EditWidgetHTMLContent extends React.Component { }; } + handleKeyIgnore(event){ + // This function prevents a keystroke from beeing handled by dialog.js + event.stopPropagation(); + } + componentWillReceiveProps(nextProps) { - // Update state's widget with props + // Update state's widget with props this.setState({ widget: nextProps.widget }); } render() { return HTML Content - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ; } } From c392f67649400999661d6d655121b7a6beb21d4e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 10 Sep 2018 13:47:53 +0200 Subject: [PATCH 522/556] fix link in footer --- src/components/footer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/footer.js b/src/components/footer.js index 2ebd1c9..e036516 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -25,7 +25,7 @@ class Footer extends Component { render() { return ( ); } From 272c6fc4c8aec5f052248a6fbe4ffc07bcbb5b8c Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 20 Sep 2018 11:21:11 +0200 Subject: [PATCH 523/556] add a note to cite our paper --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index c933425..18e1c06 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,11 @@ The default user and password are configured in the `config.js` file of the _bac This project is released under the terms of the [GPL version 3](COPYING.md). +We kindly ask all academic publications employing components of VILLASframework to cite one of the following papers: + +- A. Monti et al., "[A Global Real-Time Superlab: Enabling High Penetration of Power Electronics in the Electric Grid](https://ieeexplore.ieee.org/document/8458285/)," in IEEE Power Electronics Magazine, vol. 5, no. 3, pp. 35-44, Sept. 2018. +- S. Vogel, M. Mirz, L. Razik and A. Monti, "[An open solution for next-generation real-time power system simulation](http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8245739&isnumber=8244404)," 2017 IEEE Conference on Energy Internet and Energy System Integration (EI2), Beijing, 2017, pp. 1-6. + ``` This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From b8e19704c0be327073eb848d9996ed3036bf8e24 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 10:05:59 +0200 Subject: [PATCH 524/556] remove obsolete node related classes --- src/components/dialogs/edit-node.js | 104 --------------------- src/components/dialogs/import-node.js | 129 -------------------------- src/components/dialogs/new-node.js | 103 -------------------- 3 files changed, 336 deletions(-) delete mode 100644 src/components/dialogs/edit-node.js delete mode 100644 src/components/dialogs/import-node.js delete mode 100644 src/components/dialogs/new-node.js diff --git a/src/components/dialogs/edit-node.js b/src/components/dialogs/edit-node.js deleted file mode 100644 index beba460..0000000 --- a/src/components/dialogs/edit-node.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * File: edit-node.js - * Author: Markus Grigull - * Date: 06.07.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, ControlLabel } from 'react-bootstrap'; - -import Dialog from './dialog'; - -class NewNodeDialog extends React.Component { - valid: false; - - constructor(props) { - super(props); - - this.state = { - name: '', - endpoint: '', - config: {}, - simulators: [], - _id: '' - }; - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - handleChange(e) { - if (e.target.type === 'checkbox') { - this.setState({ [e.target.id]: e.target.checked }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } - } - - resetState() { - this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id }); - } - - validateForm(target) { - // check all controls - var endpoint = true; - var name = true; - - if (this.state.name === '' || this.props.nodes.find(node => node._id !== this.state._id && node.name === this.state.name) !== undefined) { - name = false; - } - - if (this.state.endpoint === '' || this.props.nodes.find(node => node._id !== this.state._id && node.endpoint === this.state.endpoint) !== undefined) { - endpoint = false; - } - - this.valid = endpoint && name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Endpoint - this.handleChange(e)} /> - - -
    -
    - ); - } -} - -export default NewNodeDialog; diff --git a/src/components/dialogs/import-node.js b/src/components/dialogs/import-node.js deleted file mode 100644 index c91f772..0000000 --- a/src/components/dialogs/import-node.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * File: import-node.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, ControlLabel } from 'react-bootstrap'; - -import Dialog from './dialog'; - -class ImportNodeDialog extends React.Component { - valid = false; - imported = false; - - constructor(props) { - super(props); - - this.state = { - name: '', - endpoint: '', - simulators: [] - }; - } - - onClose(canceled) { - if (canceled === false) { - this.props.onClose(this.state); - } else { - this.props.onClose(); - } - } - - handleChange(e) { - if (e.target.type === 'checkbox') { - this.setState({ [e.target.id]: e.target.checked }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } - } - - resetState() { - this.setState({ name: '', endpoint: '' }); - - this.imported = false; - } - - loadFile(fileList) { - // get file - const file = fileList[0]; - if (!file.type.match('application/json')) { - return; - } - - // create file reader - const reader = new FileReader(); - const self = this; - - reader.onload = function(event) { - // read simulator - const node = JSON.parse(event.target.result); - self.imported = true; - self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators }); - }; - - reader.readAsText(file); - } - - validateForm(target) { - // check all controls - let endpoint = true; - let name = true; - - if (this.state.name === '' || this.props.nodes.find(node => node.name === this.state.name) !== undefined) { - name = false; - } - - if (this.state.endpoint === '' || this.props.nodes.find(node => node.endpoint === this.state.endpoint) !== undefined) { - endpoint = false; - } - - this.valid = endpoint && name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Simulator File - this.loadFile(e.target.files)} /> - - - - Name - this.handleChange(e)} /> - - - - Endpoint - this.handleChange(e)} /> - - -
    -
    - ); - } -} - -export default ImportNodeDialog; diff --git a/src/components/dialogs/new-node.js b/src/components/dialogs/new-node.js deleted file mode 100644 index aedd1ee..0000000 --- a/src/components/dialogs/new-node.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * File: new-node.js - * Author: Markus Grigull - * Date: 06.07.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, ControlLabel } from 'react-bootstrap'; - -import Dialog from './dialog'; - -class NewNodeDialog extends React.Component { - valid = false; - - constructor(props) { - super(props); - - this.state = { - name: '', - endpoint: '', - config: {}, - simulators: [] - }; - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - handleChange(e) { - if (e.target.type === 'checkbox') { - this.setState({ [e.target.id]: e.target.checked }); - } else { - this.setState({ [e.target.id]: e.target.value }); - } - } - - resetState() { - this.setState({ name: '', endpoint: '', config: {}, simulators: [] }); - } - - validateForm(target) { - // check all controls - var endpoint = true; - var name = true; - - if (this.state.name === '' || this.props.nodes.find(node => node.name === this.state.name) !== undefined) { - name = false; - } - - if (this.state.endpoint === '' || this.props.nodes.find(node => node.endpoint === this.state.endpoint) !== undefined) { - endpoint = false; - } - - this.valid = endpoint && name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else return endpoint ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Endpoint - this.handleChange(e)} /> - - -
    -
    - ); - } -} - -export default NewNodeDialog; From a609d540728e564fbf18be28e22bc28abccc2877 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 10:06:40 +0200 Subject: [PATCH 525/556] visualization: do not directly modify state --- src/containers/visualization.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 3ae300b..4820e96 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -150,15 +150,11 @@ class Visualization extends React.Component { } }*/ - getNewWidgetKey() { - // Increase the counter and update the state - return this.state.last_widget_key++; - } - transformToWidgetsDict(widgets) { var widgetsDict = {}; // Create a new key and make a copy of the widget object - widgets.forEach( (widget) => widgetsDict[this.getNewWidgetKey()] = Object.assign({}, widget) ); + var key = 0; + widgets.forEach( (widget) => widgetsDict[key++] = Object.assign({}, widget) ); return widgetsDict; } @@ -216,9 +212,9 @@ class Visualization extends React.Component { widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulationModel); var new_widgets = this.state.visualization.widgets; + var new_key = Object.keys(new_widgets).length; - var widget_key = this.getNewWidgetKey(); - new_widgets[widget_key] = widget; + new_widgets[new_key] = widget; var visualization = Object.assign({}, this.state.visualization, { widgets: new_widgets From aa781711fb3d5bad3b2134ac9ce0bde9e4de196a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 10:09:07 +0200 Subject: [PATCH 526/556] whitespace cleanups --- src/containers/visualization.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 4820e96..e522d16 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -81,8 +81,7 @@ class Visualization extends React.Component { modalIndex: prevState.modalIndex || null, maxWidgetHeight: prevState.maxWidgetHeight || 0, - dropZoneHeight: prevState.dropZoneHeight || 0, - last_widget_key: prevState.last_widget_key || 0 + dropZoneHeight: prevState.dropZoneHeight || 0 }; } @@ -169,7 +168,7 @@ class Visualization extends React.Component { // convert widgets list to a dictionary var visualization = Object.assign({}, tempVisualization, { - widgets: tempVisualization.widgets? this.transformToWidgetsDict(tempVisualization.widgets) : {} + widgets: tempVisualization.widgets ? this.transformToWidgetsDict(tempVisualization.widgets) : {} }); this.computeHeightWithWidgets(visualization.widgets); From a62a8a56cf017b6bf0e22ecaf6ce63c23302a727 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 11:12:40 +0200 Subject: [PATCH 527/556] refactor: EditWidgetSimulatorControl => EditWidgetSimulationControl --- .../dialog/edit-widget-control-creator.js | 20 ++++++++--------- .../dialogs/edit-widget-control-creator.js | 22 +++++++++---------- ...l.js => edit-widget-simulation-control.js} | 6 ++--- 3 files changed, 24 insertions(+), 24 deletions(-) rename src/components/dialogs/{edit-widget-simulator-control.js => edit-widget-simulation-control.js} (93%) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 5141075..29e8cd0 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -6,7 +6,7 @@ import EditWidgetTextControl from '../../../components/dialogs/edit-widget-text- 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 EditWidgetSimulatorControl from '../../../components/dialogs/edit-widget-simulator-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'; @@ -25,19 +25,19 @@ describe('edit widget control creator', () => { }); var runs = [ - { args: { widgetType: 'Lamp' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextControl, EditWidgetColorControl, EditWidgetColorControl] } }, - { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, - { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulatorControl] } }, + { 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: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, - { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulatorControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulatorControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, - { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulatorControl, EditWidgetSignalControl] } }, + { 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: '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, EditWidgetSimulatorControl, EditWidgetSignalControl] } } + { args: { widgetType: 'Input'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl] } } ]; runs.forEach( (run) => { diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js index 5e1f9db..50e5407 100644 --- a/src/components/dialogs/edit-widget-control-creator.js +++ b/src/components/dialogs/edit-widget-control-creator.js @@ -26,7 +26,7 @@ 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 EditWidgetSimulatorControl from './edit-widget-simulator-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'; @@ -44,7 +44,7 @@ export default function createControls(widgetType = null, widget = null, session switch(widgetType) { case 'Action': dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ) break; case 'Value': @@ -53,7 +53,7 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -64,7 +64,7 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'signal', value: 0}}]); } dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => lampBoundOnChange(e)} />, + 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)} />, @@ -77,7 +77,7 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -85,7 +85,7 @@ export default function createControls(widgetType = null, widget = null, session break; case 'Table': dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; @@ -103,7 +103,7 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => gaugeBoundOnChange(e) } />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => gaugeBoundOnChange(e) } />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -115,7 +115,7 @@ export default function createControls(widgetType = null, widget = null, session handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); } dialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotTableBoundOnChange(e)} />, + 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)} />, @@ -126,7 +126,7 @@ export default function createControls(widgetType = null, widget = null, session 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)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -141,7 +141,7 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => buttonBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => buttonBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -180,7 +180,7 @@ export default function createControls(widgetType = null, widget = null, session } dialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => inputBoundOnChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => inputBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; diff --git a/src/components/dialogs/edit-widget-simulator-control.js b/src/components/dialogs/edit-widget-simulation-control.js similarity index 93% rename from src/components/dialogs/edit-widget-simulator-control.js rename to src/components/dialogs/edit-widget-simulation-control.js index b0a2ea9..3ad0642 100644 --- a/src/components/dialogs/edit-widget-simulator-control.js +++ b/src/components/dialogs/edit-widget-simulation-control.js @@ -1,5 +1,5 @@ /** - * File: edit-widget-simulator-control.js + * File: edit-widget-simulation-control.js * Author: Ricardo Hernandez-Montoya * Date: 03.04.2017 * @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; -class EditWidgetSimulatorControl extends Component { +class EditWidgetSimulationControl extends Component { constructor(props) { super(props); @@ -57,4 +57,4 @@ class EditWidgetSimulatorControl extends Component { } } -export default EditWidgetSimulatorControl; +export default EditWidgetSimulationControl; From 6323d7cb0e5e5cc802c21ba92dbe059114509fb9 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 13:12:25 +0200 Subject: [PATCH 528/556] upgrade to React v16 --- package.json | 60 +++++++++++++++++++++--------------------- src/components/icon.js | 8 ++++-- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index dcbf542..87b2961 100644 --- a/package.json +++ b/package.json @@ -3,47 +3,47 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome": "^1.1.8", - "@fortawesome/fontawesome-free-solid": "^5.0.13", - "@fortawesome/react-fontawesome": "0.0.20", + "@fortawesome/fontawesome-svg-core": "^1.2.8", + "@fortawesome/free-solid-svg-icons": "^5.5.0", + "@fortawesome/react-fontawesome": "^0.1.3", "babel-runtime": "^6.26.0", "bootstrap": "^3.3.7", - "classnames": "^2.2.5", - "d3-array": "^1.2.0", - "d3-axis": "^1.0.8", + "classnames": "^2.2.6", + "d3-array": "^1.2.4", + "d3-axis": "^1.0.12", "d3-scale": "^1.0.6", - "d3-selection": "^1.1.0", - "d3-shape": "^1.2.0", - "d3-time-format": "^2.0.5", - "es6-promise": "^4.0.5", - "file-saver": "^1.3.3", + "d3-selection": "^1.3.2", + "d3-shape": "^1.2.2", + "d3-time-format": "^2.1.3", + "es6-promise": "^4.2.5", + "file-saver": "^1.3.8", "flux": "^3.1.2", "gaugeJS": "^1.3.2", "immutable": "^3.8.1", - "lodash": "^4.17.5", - "prop-types": "^15.6.1", - "rc-slider": "^8.3.0", - "react": "^15.4.2", + "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.0", + "react-contexify": "^3.0.3", "react-d3": "^0.4.0", - "react-dnd": "^2.2.4", - "react-dnd-html5-backend": "^2.2.4", - "react-dom": "^15.4.2", - "react-fullscreenable": "^2.4.3", - "react-json-view": "^1.17.0", - "react-notification-system": "^0.2.13", - "react-rnd": "^7.4.0", - "react-router": "^4.1.2", - "react-router-dom": "^4.1.2", - "react-scripts": "^1.1.4", + "react-dnd": "^2.6.0", + "react-dnd-html5-backend": "^2.6.0", + "react-dom": "^16.6.3", + "react-fullscreenable": "^2.5.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-scripts": "^1.1.5", "react-sortable-tree": "^0.1.19", - "react-svg-pan-zoom": "^2.14.1", - "superagent": "^3.5.0", - "validator": "^10.2.0" + "react-svg-pan-zoom": "^2.18.0", + "superagent": "^3.8.3", + "validator": "^10.9.0" }, "devDependencies": { - "chai": "^4.1.0" + "chai": "^4.2.0" }, "scripts": { "start": "react-scripts start", diff --git a/src/components/icon.js b/src/components/icon.js index b2fca6e..1cff82a 100644 --- a/src/components/icon.js +++ b/src/components/icon.js @@ -21,9 +21,13 @@ import React from 'react'; -import FontAwesomeIcon from '@fortawesome/react-fontawesome' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import '@fortawesome/fontawesome-free-solid'; +import { library } from '@fortawesome/fontawesome-svg-core'; +import { fas } from '@fortawesome/free-solid-svg-icons'; +//import '@fortawesome/free-regular-svg-icons'; + +library.add(fas); class Icon extends React.Component { From 0e5d169fc0b79c810430138f64505c6f2e764374 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 13:14:43 +0200 Subject: [PATCH 529/556] fix invalid property name in parameters-editor --- src/components/parameters-editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/parameters-editor.js b/src/components/parameters-editor.js index 09beb96..9f17e7e 100644 --- a/src/components/parameters-editor.js +++ b/src/components/parameters-editor.js @@ -68,7 +68,7 @@ class ParametersEditor extends React.Component { } } -ParametersEditor.PropTypes = { +ParametersEditor.propTypes = { content: PropTypes.object, onChange: PropTypes.func, disabled: PropTypes.bool From 0226fca3051292beaa21537486b5d5c12f5984d9 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 13:15:33 +0200 Subject: [PATCH 530/556] add new widget control for parameters editor --- .../dialogs/edit-widget-parameters-control.js | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/components/dialogs/edit-widget-parameters-control.js diff --git a/src/components/dialogs/edit-widget-parameters-control.js b/src/components/dialogs/edit-widget-parameters-control.js new file mode 100644 index 0000000..b999a6f --- /dev/null +++ b/src/components/dialogs/edit-widget-parameters-control.js @@ -0,0 +1,50 @@ +/** + * 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 + * 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, ControlLabel } from 'react-bootstrap'; +import ParametersEditor from '../parameters-editor'; + +class EditWidgetParametersControl extends Component { + constructor(props) { + super(props); + + this.state = { + widget: {} + }; + } + + componentWillReceiveProps(nextProps) { + // Update state's widget with props + this.setState({ widget: nextProps.widget }); + } + + render() { + return ( + + {this.props.label} + this.props.handleChange(e)} /> + + ); + } +} + +export default EditWidgetParametersControl; From 8934a8e5a3686e9fe153fce5de3fc14f11a800ad Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 14:47:23 +0200 Subject: [PATCH 531/556] fix onChange callback for widget parameters control --- .../dialogs/edit-widget-parameters-control.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/dialogs/edit-widget-parameters-control.js b/src/components/dialogs/edit-widget-parameters-control.js index b999a6f..8cf454b 100644 --- a/src/components/dialogs/edit-widget-parameters-control.js +++ b/src/components/dialogs/edit-widget-parameters-control.js @@ -37,11 +37,20 @@ class EditWidgetParametersControl extends Component { this.setState({ widget: nextProps.widget }); } + handleChange(value) { + this.props.handleChange({ + target: { + id: this.props.controlId, + value: value + } + }); + } + render() { return ( {this.props.label} - this.props.handleChange(e)} /> + this.handleChange(v)} /> ); } From 6e6c5b89a3fb999b0169785ae1aacf1ede6c0c82 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 21 Nov 2018 14:48:49 +0200 Subject: [PATCH 532/556] added new widget for custom actions --- .../dialogs/edit-widget-control-creator.js | 9 +++ src/components/widget-factory.js | 17 +++++ src/components/widgets/custom-action.js | 69 +++++++++++++++++++ src/containers/visualization.js | 1 + src/containers/widget.js | 5 +- 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/components/widgets/custom-action.js diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js index 50e5407..c686b34 100644 --- a/src/components/dialogs/edit-widget-control-creator.js +++ b/src/components/dialogs/edit-widget-control-creator.js @@ -36,12 +36,21 @@ 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'; 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 = []; switch(widgetType) { + case 'CustomAction': + dialogControls.push( + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> + ) + break; case 'Action': dialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index b190f81..6169867 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -20,6 +20,7 @@ * You should have received a copy of the GNU General Public License * along with VILLASweb. If not, see . ******************************************************************************/ + import WidgetSlider from './widgets/slider'; class WidgetFactory { @@ -39,6 +40,22 @@ class WidgetFactory { // set type specific properties switch(type) { + case 'CustomAction': + widget.action = { + action: 'start', + model: { + url: 'ftp://user:pass@example.com/projectA/model.zip' + }, + parameters: { + timestep: 50e-6 + } + }; + widget.name = 'Action'; + widget.icon = 'star'; + widget.width = 100; + widget.height = 50; + widget.simulationModel = defaultSimulationModel; + break; case 'Action': widget.simulationModel = defaultSimulationModel; break; diff --git a/src/components/widgets/custom-action.js b/src/components/widgets/custom-action.js new file mode 100644 index 0000000..6434694 --- /dev/null +++ b/src/components/widgets/custom-action.js @@ -0,0 +1,69 @@ +/** + * 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 + * 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 { 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'; + +class WidgetCustomAction extends Component { + constructor(props) { + super(props); + + this.state = { + simulator: null + }; + } + + static getStores() { + return [ SimulatorStore ]; + } + + componentWillReceiveProps(props) { + if (props.simulationModel === null) + return; + + this.setState({ + simulator: SimulatorStore.getState().find(s => s._id === props.simulationModel.simulator), + sessionToken: UserStore.getState().token + }); + } + + onClick() { + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator: this.state.simulator, + data: this.props.widget.action, + token: this.state.sessionToken + }); + } + + render() { + const btnStyle = { width: '100%', height: '100%' }; + + return ; + } +} + +export default WidgetCustomAction; diff --git a/src/containers/visualization.js b/src/containers/visualization.js index e522d16..a9e53ff 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -480,6 +480,7 @@ class Visualization extends React.Component { { editingControls } + diff --git a/src/containers/widget.js b/src/containers/widget.js index ebcf7d1..b4df992 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -31,6 +31,7 @@ import SimulatorDataStore from '../stores/simulator-data-store'; import SimulationModelStore from '../stores/simulation-model-store'; import FileStore from '../stores/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'; @@ -204,7 +205,9 @@ class Widget extends React.Component { } // dummy is passed to widgets to keep updating them while in edit mode - if (widget.type === 'Action') { + if (widget.type === 'CustomAction') { + element = + } else if (widget.type === 'Action') { element = } else if (widget.type === 'Lamp') { element = From eb2cc000c090c352b5d660acc92e237e7c500930 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 23 Nov 2018 21:30:54 +0200 Subject: [PATCH 533/556] widgets: make buttons fill the full widget dimensions --- src/components/widgets/button.js | 2 +- src/components/widgets/custom-action.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/widgets/button.js b/src/components/widgets/button.js index d2293b8..e9c32c2 100644 --- a/src/components/widgets/button.js +++ b/src/components/widgets/button.js @@ -58,7 +58,7 @@ class WidgetButton extends Component { render() { return (
    - +
    ); } diff --git a/src/components/widgets/custom-action.js b/src/components/widgets/custom-action.js index 6434694..2e91154 100644 --- a/src/components/widgets/custom-action.js +++ b/src/components/widgets/custom-action.js @@ -60,9 +60,11 @@ class WidgetCustomAction extends Component { } render() { - const btnStyle = { width: '100%', height: '100%' }; - - return ; + return
    + +
    ; } } From c40998cc6121828027154e9d7fd85f2fb3f7fb40 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 23 Nov 2018 22:05:53 +0200 Subject: [PATCH 534/556] send multiple actions in a single request --- .../dialogs/edit-widget-control-creator.js | 2 +- src/components/widget-factory.js | 19 ++++++++++++------- src/components/widgets/custom-action.js | 2 +- src/data-managers/simulators-data-manager.js | 4 ++-- src/stores/simulator-store.js | 5 ++++- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/components/dialogs/edit-widget-control-creator.js index c686b34..fdce7e5 100644 --- a/src/components/dialogs/edit-widget-control-creator.js +++ b/src/components/dialogs/edit-widget-control-creator.js @@ -48,7 +48,7 @@ export default function createControls(widgetType = null, widget = null, session 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': diff --git a/src/components/widget-factory.js b/src/components/widget-factory.js index 6169867..4ab6731 100644 --- a/src/components/widget-factory.js +++ b/src/components/widget-factory.js @@ -41,15 +41,20 @@ class WidgetFactory { // set type specific properties switch(type) { case 'CustomAction': - widget.action = { - action: 'start', - model: { - url: 'ftp://user:pass@example.com/projectA/model.zip' + widget.actions = [ + { + action: 'stop' }, - parameters: { - timestep: 50e-6 + { + action: 'pause', + model: { + url: 'ftp://user:pass@example.com/projectA/model.zip' + }, + parameters: { + timestep: 50e-6 + } } - }; + ]; widget.name = 'Action'; widget.icon = 'star'; widget.width = 100; diff --git a/src/components/widgets/custom-action.js b/src/components/widgets/custom-action.js index 2e91154..4a1a7cb 100644 --- a/src/components/widgets/custom-action.js +++ b/src/components/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.action, + data: this.props.widget.actions, token: this.state.sessionToken }); } diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index dc7c879..df45f34 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -28,7 +28,7 @@ class SimulatorsDataManager extends RestDataManager { super('simulator', '/simulators'); } - doAction(simulator, action, token = null) { + doActions(simulator, action, token = null) { // TODO: Make only simulator id dependent RestAPI.post(this.makeURL(this.url + '/' + simulator._id), action, token).then(response => { AppDispatcher.dispatch({ @@ -39,7 +39,7 @@ class SimulatorsDataManager extends RestDataManager { AppDispatcher.dispatch({ type: 'simulators/action-error', error - }); + }); }); } } diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 2bd4410..00b8635 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -65,7 +65,10 @@ class SimulatorStore extends ArrayStore { return state; case 'simulators/start-action': - SimulatorsDataManager.doAction(action.simulator, action.data, action.token); + if (!Array.isArray(action.data)) + action.data = [ action.data ] + + SimulatorsDataManager.doActions(action.simulator, action.data, action.token); return state; case 'simulators/action-error': From 29ffefaea18f234fe528b0516ea5391a52bbf904 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 27 Nov 2018 19:20:47 +0100 Subject: [PATCH 535/556] improve sort algorithm in simulator view --- src/containers/simulators.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 8868c15..a716b39 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -44,9 +44,34 @@ class Simulators extends Component { return [ UserStore, SimulatorStore ]; } + static statePrio(state) { + switch (state) { + case 'running': + case 'starting': + return 1; + case 'paused': + case 'pausing': + case 'resuming': + return 2; + case 'idle': + return 3; + case 'shutdown': + return 4; + case 'error': + return 10; + default: + return 99; + } + } + static calculateState() { const simulators = SimulatorStore.getState().sort((a, b) => { - return a.stateUpdatedAt < b.stateUpdatedAt; + if (a.state !== b.state) + return this.statePrio(a.state) > this.statePrio(b.state); + else if (a.name !== b.name) + return a.name < b.name; + else + return a.stateUpdatedAt < b.stateUpdatedAt; }); return { From 9efdd2f1116bfdb6c0212d1b03c8ab3d1459dd9b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 27 Nov 2018 19:21:48 +0100 Subject: [PATCH 536/556] improve styling over labels in simulator view --- src/components/table.js | 2 +- src/containers/simulators.js | 55 +++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/components/table.js b/src/components/table.js index b155826..2e28c41 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -89,7 +89,7 @@ class CustomTable extends Component { labelContent = child.props.labelModifier(labelContent, data); } - cell.push( ); + cell.push( ); } if (child.props.dataIndex) { diff --git a/src/containers/simulators.js b/src/containers/simulators.js index a716b39..62f77f0 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -91,6 +91,7 @@ class Simulators extends Component { }); } + closeNewModal(data) { this.setState({ newModal : false }); @@ -200,32 +201,39 @@ class Simulators extends Component { return Date.now() - new Date(simulator.stateUpdatedAt) > fiveMinutes; } - isSimulatorOnline(state) { - return state !== '' && state !== 'shutdown' && state !== 'unknown'; - } - stateLabelStyle = (state, simulator) => { - if (this.isSimulatorOutdated(simulator)) { - return 'default'; + var style = [ 'label' ]; + + if (this.isSimulatorOutdated(simulator) && state !== 'shutdown') { + style.push('label-outdated'); } - if (this.isSimulatorOnline(state)) { - return 'success'; + switch (state) { + case 'running': + style.push('label-success'); + break; + + case 'paused': + style.push('label-info'); + break; + + case 'idle': + style.push('label-primary'); + break; + + case 'error': + style.push('label-danger'); + break; + + case 'shutdown': + style.push('label-warning'); + break; + + default: + style.push('label-default'); } - return 'danger'; - } - - stateLabelModifier = (state, simulator) => { - if (this.isSimulatorOutdated(simulator)) { - return 'unknown'; - } - - if (this.isSimulatorOnline(state)) { - return 'online'; - } - - return 'offline'; + return style.join(' '); } stateUpdateModifier = updatedAt => { @@ -246,10 +254,11 @@ class Simulators extends Component { this.onSimulatorChecked(index, event)} width='30' /> - + + - + {/* */} Date: Tue, 27 Nov 2018 19:22:21 +0100 Subject: [PATCH 537/556] periodically refresh simulator states --- src/containers/simulators.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 62f77f0..9e07bab 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -89,6 +89,20 @@ class Simulators extends Component { type: 'simulators/start-load', token: this.state.sessionToken }); + + // Start timer for periodic refresh + this.timer = window.setInterval(() => this.refresh(), 1000); + } + + componentWillUnmount() { + window.clearInterval(this.timer); + } + + refresh() { + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken + }); } From 9b3a29d4590b05f6b746ca792cf3340b4baf96b4 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 27 Nov 2018 19:22:50 +0100 Subject: [PATCH 538/556] grey out outdated simulators --- src/styles/app.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/styles/app.css b/src/styles/app.css index da43dc5..552f7ed 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -382,3 +382,7 @@ body { margin-left: 0 !important; margin-right: 0 !important; } + +.label-outdated { + opacity: 0.4; +} From 9287ab7e3564b8a588bb833f1a2c28d43e64dc31 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 23 Feb 2019 07:25:20 +0100 Subject: [PATCH 539/556] update README (closes #202) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 18e1c06..e654b3d 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,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) - - Markus Grigull + - Steffen Vogel [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) From 061e782f6b461020d7bfb6406a2760116fd94bfd Mon Sep 17 00:00:00 2001 From: Richard Marston Date: Thu, 14 Mar 2019 15:34:25 +0100 Subject: [PATCH 540/556] Remove old Pintura version --- public/Pintura/css/colours.css | 61 - public/Pintura/css/svg.css | 84 - public/Pintura/images/Pintura_logo.svg | 1225 ----------- public/Pintura/images/brea.svg | 24 - public/Pintura/images/conn.svg | 21 - public/Pintura/images/cons.svg | 22 - public/Pintura/images/net.svg | 27 - public/Pintura/images/sol.svg | 32 - public/Pintura/images/sync.svg | 22 - public/Pintura/images/term.svg | 21 - public/Pintura/images/topo.svg | 22 - public/Pintura/images/trans.svg | 22 - public/Pintura/js/cimjson.js | 201 -- public/Pintura/js/cimsvg.js | 140 -- public/Pintura/js/cimview.js | 218 -- public/Pintura/js/cimxml.js | 253 --- public/Pintura/js/handlebars.runtime.js | 1468 ------------- public/Pintura/templates/template.js | 2521 ----------------------- 18 files changed, 6384 deletions(-) delete mode 100644 public/Pintura/css/colours.css delete mode 100644 public/Pintura/css/svg.css delete mode 100644 public/Pintura/images/Pintura_logo.svg delete mode 100644 public/Pintura/images/brea.svg delete mode 100644 public/Pintura/images/conn.svg delete mode 100644 public/Pintura/images/cons.svg delete mode 100644 public/Pintura/images/net.svg delete mode 100644 public/Pintura/images/sol.svg delete mode 100644 public/Pintura/images/sync.svg delete mode 100644 public/Pintura/images/term.svg delete mode 100644 public/Pintura/images/topo.svg delete mode 100644 public/Pintura/images/trans.svg delete mode 100644 public/Pintura/js/cimjson.js delete mode 100644 public/Pintura/js/cimsvg.js delete mode 100644 public/Pintura/js/cimview.js delete mode 100644 public/Pintura/js/cimxml.js delete mode 100644 public/Pintura/js/handlebars.runtime.js delete mode 100644 public/Pintura/templates/template.js diff --git a/public/Pintura/css/colours.css b/public/Pintura/css/colours.css deleted file mode 100644 index 0911a35..0000000 --- a/public/Pintura/css/colours.css +++ /dev/null @@ -1,61 +0,0 @@ -#menu { - color:#fff!important; - background-color:#000!important -} -.dark-grey-background { - color:black; - background:#aaa; -} -.light-grey-background { - color:black; - background:#ddd; -} -.blue-grey-background { - color:white; - background:#607d8b; -} -.floating-panel-item { - font-size:12px; -} -#floating-panel-list-div { - background:#aaa; -} -.floating-panel-list { - background:grey; - border:none; -} -.w3-ul li { - border-bottom:0px; -} -#sidebar { - background:#607d8b; - border-right:thick solid white; -} -.component-type-name { - color:black; - font-size:12px; -} -.floating-panel-name { - font-size:12px; -} -.dark-font { - color:black; -} -.dropdown-menu { - border:medium solid black; - background:#607d8b; - border:medium solid black; - border-width: 1px 1px 1px 1px; -} -.dropdown-menu h4 { - color:white; -} -.dropdown-menu a { - color: black; - background:#ddd; - font-size:14px; -} -.dropdown-menu a:hover { - background:#bbb; - color: white; -} diff --git a/public/Pintura/css/svg.css b/public/Pintura/css/svg.css deleted file mode 100644 index 2fcb5e9..0000000 --- a/public/Pintura/css/svg.css +++ /dev/null @@ -1,84 +0,0 @@ -.bar { - stroke: #000; - stroke-width: 3px; -} - -.highlighted-node:hover { - stroke: #ff0; -} - -line { - stroke: #000; - stroke-width: 1px; -} - -.line { - stroke: #000; - stroke-width: 2px; -} -.terminal-connnode { - stroke: #000; - stroke-width: 1px; -} -.terminal-toponode { - stroke: #000; - stroke-width: 1px; -} -.conduct { - stroke: #000; - stroke-width: 1px; -} -.unknown { - stroke: #f0f; - stroke-width: 1px; - height: 20px; - width: 20px; -} -.acline { - stroke: #000; - stroke-width: 2px; -} -#backing { - fill: whitesmoke; -} - -/* Below here are SVG elements that we don't want the user to interact with - therefore we disable pointer events */ - -.svglabel { - visibility: hidden; - pointer-events: none; - -webkit-user-select: none; /* Chrome all / Safari all */ - -moz-user-select: none; /* Firefox all */ - -ms-user-select: none; /* IE 10+ */ -} -.svglabel-high { - visibility: visible; - font-size: 12px; - font-family: "sans-serif"; - text-anchor: right; - fill: black; - stroke-width: 1px; - pointer-events: none; - -webkit-user-select: none; /* Chrome all / Safari all */ - -moz-user-select: none; /* Firefox all */ - -ms-user-select: none; /* IE 10+ */ -} -.gridLine { - stroke: #aaa; - stroke-width: 1px; - pointer-events: none; - -webkit-user-select: none; /* Chrome all / Safari all */ - -moz-user-select: none; /* Firefox all */ - -ms-user-select: none; /* IE 10+ */ -} -.gridLabel { - font-size: 8px; - font-family: "sans-serif"; - fill: grey; - stroke-width: 0px; - pointer-events: none; - -webkit-user-select: none; /* Chrome all / Safari all */ - -moz-user-select: none; /* Firefox all */ - -ms-user-select: none; /* IE 10+ */ -} diff --git a/public/Pintura/images/Pintura_logo.svg b/public/Pintura/images/Pintura_logo.svg deleted file mode 100644 index 3230dd5..0000000 --- a/public/Pintura/images/Pintura_logo.svg +++ /dev/null @@ -1,1225 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/Pintura/images/brea.svg b/public/Pintura/images/brea.svg deleted file mode 100644 index 0361327..0000000 --- a/public/Pintura/images/brea.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/public/Pintura/images/conn.svg b/public/Pintura/images/conn.svg deleted file mode 100644 index cce4240..0000000 --- a/public/Pintura/images/conn.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/public/Pintura/images/cons.svg b/public/Pintura/images/cons.svg deleted file mode 100644 index 47b333d..0000000 --- a/public/Pintura/images/cons.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/public/Pintura/images/net.svg b/public/Pintura/images/net.svg deleted file mode 100644 index 494831c..0000000 --- a/public/Pintura/images/net.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - diff --git a/public/Pintura/images/sol.svg b/public/Pintura/images/sol.svg deleted file mode 100644 index f738402..0000000 --- a/public/Pintura/images/sol.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/public/Pintura/images/sync.svg b/public/Pintura/images/sync.svg deleted file mode 100644 index 717aa31..0000000 --- a/public/Pintura/images/sync.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/public/Pintura/images/term.svg b/public/Pintura/images/term.svg deleted file mode 100644 index d67173e..0000000 --- a/public/Pintura/images/term.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/public/Pintura/images/topo.svg b/public/Pintura/images/topo.svg deleted file mode 100644 index 643c352..0000000 --- a/public/Pintura/images/topo.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/public/Pintura/images/trans.svg b/public/Pintura/images/trans.svg deleted file mode 100644 index e9af2ce..0000000 --- a/public/Pintura/images/trans.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/public/Pintura/js/cimjson.js b/public/Pintura/js/cimjson.js deleted file mode 100644 index 957c369..0000000 --- a/public/Pintura/js/cimjson.js +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright © 2016-2017, RWTH Aachen University - * Authors: Richard Marston - * - * This program 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. - * - * This program 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. - * - * A copy of the GNU General Public License is in the LICENSE file - * in the top level directory of this source tree. - */ - -var cimjson = cimjson || (function() { - - var pathBase = ''; - const imageNames = { - "cim:ACLineSegment": "images/term.svg", - "cim:Terminal": "images/term.svg", - "cim:Breaker": "images/brea.svg", - "cim:ConnectivityNode": "images/conn.svg", - "cim:EnergyConsumer": "images/cons.svg", - "cim:EquivalentInjection": "images/cons.svg", - "cim:ExternalNetworkInjection": "images/net.svg", - "cim:PowerTransformer": "images/trans.svg", - "cim:SolarGeneratingUnit": "images/solar.svg", - "cim:SynchronousMachine": "images/sync.svg", - "cim:TopologicalNode": "images/topo.svg", - "cim:TransformerWinding": "images/trans.svg", - }; - - const PinturaDiagramObjectPoints = "Pintura:DiagramObjectPoints"; - - var getImageName = function(type) { - return pathBase + imageNames[type]; - } - - var convertDiagramObjectToTemplateFormat = function(diagramObject, graph, categoryGraphName, diagramList) { - - let originalPoints = diagramObject[PinturaDiagramObjectPoints]; - let preOffsetPoints = []; - let imagePoints = []; - let labelPoint; - let object; - let categoryGraph = graph[categoryGraphName]; - const imageHeight = 12; - const imageWidth = 12; - if (diagramObject["cim:DiagramObject.IdentifiedObject"] != undefined) { - let rdfId = diagramObject["cim:DiagramObject.IdentifiedObject"]["rdf:resource"].substring(1); - for (let index in originalPoints) { - let point = originalPoints[index]; - preOffsetPoints.push( - { - "x": parseInt(point["cim:DiagramObjectPoint.xPosition"]).toString(), - "y": parseInt(point["cim:DiagramObjectPoint.yPosition"]).toString() - }); - imagePoints.push( - { - "imageHeight" : imageHeight.toString(), - "imageWidth" : imageWidth.toString(), - "x" : (parseInt(point["cim:DiagramObjectPoint.xPosition"]) - (imageWidth/2)).toString(), - "y" : (parseInt(point["cim:DiagramObjectPoint.yPosition"]) - (imageHeight/2)).toString() - }); - }; - labelPoint = { - "x": (parseInt(preOffsetPoints[0].x) + (imageWidth/2)).toString(), - "y": (parseInt(preOffsetPoints[0].y) - (imageHeight/2)).toString() - }; - object = - { - "pintura:image" : getImageName(categoryGraphName), - "pintura:rdfId" : rdfId, - "pintura:points" : imagePoints, - "pintura:label" : { - "text": categoryGraph[rdfId]["cim:IdentifiedObject.name"], - "x" : labelPoint.x, - "y" : labelPoint.y - } - } - while (preOffsetPoints.length > 1) { - if (object["pintura:line"] == null) { - object["pintura:line"] = []; - } - let line = { - "x1": preOffsetPoints[0].x, - "y1": preOffsetPoints[0].y, - "x2": preOffsetPoints[1].x, - "y2": preOffsetPoints[1].y - }; - object["pintura:line"].push(line); - preOffsetPoints.shift() - } - } - let diagram = diagramObject["cim:DiagramObject.Diagram"]["rdf:resource"].substring(1); - if (diagramList[diagram] === undefined){ - diagramList[diagram] = { "pintura:name" : graph["cim:Diagram"][diagram]["cim:IdentifiedObject.name"] }; - } - if (diagramObject["cim:DiagramObject.IdentifiedObject"]) { - let identifiedObject = diagramObject["cim:DiagramObject.IdentifiedObject"]["rdf:resource"].substring(1); - if (diagramList[diagram]["components"] === undefined){ - diagramList[diagram]["components"] = {}; - } - if (diagramList[diagram]["components"][categoryGraphName] === undefined){ - diagramList[diagram]["components"][categoryGraphName] = {}; - } - diagramList[diagram]["components"][categoryGraphName][identifiedObject] = object; - } - }; - - var convertToTemplatableFormat = function(diagramObjects, graph) { - - let output = { 'Diagram' : {} }; - let diagramList = output['Diagram']; - - for (categoryGraphName in imageNames) { - - let categoryGraph = graph[categoryGraphName]; - for (let key in categoryGraph) { - let diagramObject = diagramObjects[key]; - if (diagramObject != undefined) { - convertDiagramObjectToTemplateFormat(diagramObject, graph, categoryGraphName, diagramList); - } - } - } - return output; - }; - - var indexDiagramGraphByComponentType = function(input) { - /* - * Index the diagram object graph by the identified object's id so we don't - * have to go hunting for the referenced object inside the diagram objects. - */ - let graph = {}; - for (let key in input) { - let diagramObject = input[key]; - let diagram = diagramObject["cim:DiagramObject.Diagram"]["rdf:resource"].substring(1); - if (diagramObject["cim:DiagramObject.IdentifiedObject"]) { - let identifiedObject = input[key]["cim:DiagramObject.IdentifiedObject"]["rdf:resource"].substring(1); - graph[identifiedObject] = input[key]; - } - } - return graph; - }; - - var addDiagramObjectPointsToDiagramObjects = function(diagramObjectPointGraph, diagramObjectGraph){ - for (let key in diagramObjectPointGraph) { - mergeMatchingDataIntoParentNodeArray(diagramObjectPointGraph[key], "cim:DiagramObjectPoint.DiagramObject", diagramObjectGraph, PinturaDiagramObjectPoints); - } - }; - - /* - * Create link to a member of an array of e.g. points - */ - var mergeMatchingDataIntoParentNodeArray = function(node, matchingElement, destinationGraph, destinationElement) { - if (node[matchingElement]) { - let id = node[matchingElement]["rdf:resource"].substr(1); - if (destinationGraph[id]) { - if (destinationGraph[id][destinationElement] === undefined) { - destinationGraph[id][destinationElement] = []; - } - destinationGraph[id][destinationElement].push(node); - } - else { - console.log("Could not find destination "+matchingElement+" to merge into "+destinationElement+"."); - } - } - else { - console.log("Could not find matching element "+matchingElement+" to merge "+destinationElement+" into ."); - } - }; - - var getTemplateJson = function(graph) { - let updatedDiagramObjects = JSON.parse(JSON.stringify(graph['cim:DiagramObject'])); - let diagramObjectPoints = graph['cim:DiagramObjectPoint']; - addDiagramObjectPointsToDiagramObjects(diagramObjectPoints, updatedDiagramObjects); - - let diagramObjectsByIdentifiedObjects = indexDiagramGraphByComponentType(updatedDiagramObjects); - - templateReadyFormat = convertToTemplatableFormat(diagramObjectsByIdentifiedObjects, graph); - - return templateReadyFormat; - }; - - return { - setImagePathBase : function(path) { - pathBase = path; - }, - getTemplateJson, - }; -}()); - -if (typeof module !== 'undefined' && module.exports) { - module.exports = { - cimjson - }; -} diff --git a/public/Pintura/js/cimsvg.js b/public/Pintura/js/cimsvg.js deleted file mode 100644 index aaf97d0..0000000 --- a/public/Pintura/js/cimsvg.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright © 2016-2017, RWTH Aachen University - * Authors: Richard Marston - * - * This program 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. - * - * This program 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. - * - * A copy of the GNU General Public License is in the LICENSE file - * in the top level directory of this source tree. - */ - -var cimsvg = cimsvg || (function() { - - var svgNode = null; - var xmlNode = null; - var pinturaNode = null; - var sidebarNode = null; - - function handler() { - //console.log(this.getResponseHeader('content-type')); - } - - var includeFile = function(fileName, callback) { - let dom = svgNode.ownerDocument; - let newTag = dom.createElement("script"); - newTag.type = "text/javascript"; - newTag.src=fileName; - if ( callback != undefined ) { - newTag.onload=function() { - callback(); - }; - } - svgNode.parentElement.appendChild(newTag); - }; - - var applyTemplate = function(data) { - var template = Handlebars.templates['cim2svg']; - return template(data); - }; - - var loadFile = function(fileContents) { - if (cimxml.moreXmlData(fileContents)) { - baseJson = cimxml.getBaseJson(); - templateJson = cimjson.getTemplateJson(baseJson); - svgNode.ownerDocument.getElementById('diagrams').innerHTML = applyTemplate(templateJson); - if(sidebarNode != null) { - cimmenu.populateSidebar(sidebarNode, templateJson); - } - } - }; - - var setFileCount = function(count) { - cimxml.setRdfFileCount(count); - }; - - var isNode = false; - if (typeof module !== 'undefined' && module.exports) { - isNode = true; - } - - var updateComponent = function(type, id, attribute, value) { - cimxml.updateComponentInBaseJson(type, id, attribute, value) - baseJson = cimxml.getBaseJson(); - templateJson = cimjson.getTemplateJson(baseJson); - if (attribute === "cim:IdentifiedObject.name") { - buttonId = '#' + id + "-sidebar-button" - button = sidebarNode.querySelector(buttonId) - button.innerHTML = value; - } - }; - - var loadXml = function(fileName, callback) { - // Create a connection to the file. - var Connect = new XMLHttpRequest(); - // Define which file to open and - Connect.open("GET", fileName, true); - Connect.setRequestHeader("Content-Type", "text/xml"); - Connect.onreadystatechange = handler; - Connect.onload = function (e) { - if(Connect.readyState === 4) { - if(Connect.status === 200) { - callback(Connect.responseXML); - } - else { - console.log(Connect.statusText); - } - } - }; - // send the request. - Connect.send(null); - }; - - return { - init : function(svg, sidebar, componentAttributes, componentCreation) { - svgNode = svg; - sidebarNode = sidebar; - includeFile("handlebars.runtime.js", function() { - includeFile("src/cimview.js", function() { - cimview.init(svgNode); - if(sidebarNode != undefined) { - includeFile("src/cimmenu.js", function() { - cimmenu.init(componentAttributes) - }); - } - includeFile("templates/template.js", function(){ - includeFile("src/cimxml.js", function(){ - includeFile("src/cimjson.js", function(){}); - }); - }); - }); - }); - loadXml("templates/generated_add_components/menu.xml", function(xml){ - if(componentCreation != undefined) { - accordion = componentCreation.querySelector('#component-creation-list-div') - accordion.innerHTML = xml.documentElement.innerHTML; - } - }); - }, - setSVG : function(svg) { - svgNode = svg; - }, - loadFile, - setFileCount, - updateComponent, - }; - -}()); - -if (cimsvg.isNode) { - module.exports = { - cimsvg - } -} diff --git a/public/Pintura/js/cimview.js b/public/Pintura/js/cimview.js deleted file mode 100644 index cf10318..0000000 --- a/public/Pintura/js/cimview.js +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright © 2016-2017, RWTH Aachen University - * Authors: Richard Marston - * - * This program 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. - * - * This program 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. - * - * A copy of the GNU General Public License is in the LICENSE file - * in the top level directory of this source tree. - */ - -var cimview = cimview || (function() { - - var svgNode = null; - - var zoomSizes = [ - { width: 1024, height: 768 }, - { width: 920, height: 690 }, - { width: 816, height: 612 }, - { width: 712, height: 532 }, - { width: 608, height: 456 }, - { width: 504, height: 378 }, - { width: 400, height: 300 }, - ]; - - var zoomLevel = 0; - - var zoomToLevel = function(level) { - zoomLevel = level; - let rect = getViewBox(); - centreOfGrid = { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }; - rect.width = zoomSizes[level].width; - rect.height = zoomSizes[level].height; - rect.x = centreOfGrid.x - (rect.width / 2); - rect.y = centreOfGrid.y - (rect.height / 2); - setViewBox(rect); - }; - - var zoomOut = function() { - let level = zoomLevel-1; - if (level < 0) { - level = 0; - } - zoomToLevel(level); - //document.getElementById("zoomer").value=level; - }; - - var zoomIn = function() { - let level = zoomLevel+1; - let lastIndex = zoomSizes.length-1; - if (level > lastIndex) { - level = lastIndex; - } - zoomToLevel(level); - //document.getElementById("zoomer").value=level; - }; - - var pan = function(point) { - let rect = getViewBox(); - rect.x += point.x; - rect.y += point.y; - setViewBox(rect); - }; - - var clearGrid = function() { - let oldLines = Array.from(svgNode.getElementsByClassName("gridLine")); - oldLines.forEach(function(key) { - key.remove(); - }); - let oldLabels = Array.from(svgNode.getElementsByClassName("gridLabel")); - oldLabels.forEach(function(key) { - key.remove(); - }); - }; - - var createLocationMarker = function(id, loc, x, y) { - let grid = svgNode.ownerDocument.getElementById("grid"); - let textAttributes = { - "x": x, - "y": y, - "class": "gridLabel", - "id": id, - }; - let text = createSvgTag("text", textAttributes); - text.innerHTML = loc; - grid.appendChild(text); - }; - - var createGridLine = function(x1, y1, x2, y2) { - let grid = svgNode.ownerDocument.getElementById("grid"); - let lineAttributes = { - "x1": x1, - "x2": x2, - "y1": y1, - "y2": y2, - "class": "gridLine", - }; - let line = createSvgTag("line", lineAttributes); - grid.appendChild(line); - }; - - /* - * Create a tag in the svg namespace - */ - const createSvgTag = function(tagname, attributes) { - let xmlns="http://www.w3.org/2000/svg"; - let newTag = svgNode.ownerDocument.createElementNS(xmlns, tagname); - for (let key in attributes) { - newTag.setAttribute(key, attributes[key]); - } - return newTag; - }; - - var calculateStartOffset = function(distanceFromOrigin, gridSize) { - let offset; - if (distanceFromOrigin < 0) { - offset = distanceFromOrigin - ( distanceFromOrigin % gridSize ); - } - else { - offset = distanceFromOrigin + gridSize - ( distanceFromOrigin % gridSize ); - } - return offset; - }; - - var createGrid = function() { - clearGrid(); - let gridSize = 100; - let viewBoxRect = getViewBox(); - /* horizontal lines */ - let startOffsetY = calculateStartOffset(viewBoxRect.y, gridSize); - let startOffsetX = calculateStartOffset(viewBoxRect.x, gridSize); - for (let i=0; i<(viewBoxRect.height/gridSize); i++) { - let yval = i*gridSize+startOffsetY; - createGridLine(viewBoxRect.x, yval, viewBoxRect.width+viewBoxRect.x, yval); - createLocationMarker(yval+"y", yval.toString(), viewBoxRect.x+10, yval+20); - } - /* vertical lines */ - for (let i=0; i<(viewBoxRect.width/gridSize); i++) { - let xval = i*gridSize+startOffsetX; - createGridLine(xval, viewBoxRect.y, xval, viewBoxRect.height+viewBoxRect.y); - createLocationMarker(xval+"x", xval.toString(), xval+10, viewBoxRect.y+20); - } - }; - - var fit = function() { - setViewBox(svgNode.getElementById('diagrams').getBBox()); - }; - - var getViewBox = function() { - let rect = {}; - viewBoxString = svgNode.getAttribute("viewBox"); - viewBoxElements = viewBoxString.split(" "); - rect.x = parseInt(viewBoxElements[0]); - rect.y = parseInt(viewBoxElements[1]); - rect.width = parseInt(viewBoxElements[2]); - rect.height = parseInt(viewBoxElements[3]); - return rect; - }; - - var setViewBox = function(rect) { - let viewBoxString = rect.x+" "+rect.y+" "+rect.width+" "+rect.height; - svgNode.setAttribute("viewBox", viewBoxString); - let bg = svgNode.ownerDocument.getElementById("backing"); - bg.setAttribute("x", rect.x); - bg.setAttribute("y", rect.y); - bg.setAttribute("width", "100%"); - bg.setAttribute("height", "100%"); - createGrid(); - }; - - var clearDisplay = function() { - while (svgNode.firstChild) { - svgNode.removeChild(svgNode.firstChild); - } - }; - - var hideAllLabels = function() { - Array.from(svgNode.getElementsByClassName("svglabel")).forEach(function (label) { - label.setAttributeNS(null, "visibility", "hidden"); - }); - }; - - var init = function(svg) { - svgNode = svg; - let rect = { x: "-100", y: "-100", width: "1024", height: "768" }; - setViewBox(rect); - }; - - var setSVG = function(svg) { - svgNode = svg; - } - - /* - * Specify the functions that this module exports - */ - return { - init, - pan, - fit, - zoomIn, - zoomOut, - setSVG - }; - -}()); - -if (typeof module !== 'undefined' && module.exports) { - module.exports = { - cimview - } -} diff --git a/public/Pintura/js/cimxml.js b/public/Pintura/js/cimxml.js deleted file mode 100644 index 128deb9..0000000 --- a/public/Pintura/js/cimxml.js +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright © 2016-2017, RWTH Aachen University - * Authors: Richard Marston - * - * This program 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. - * - * This program 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. - * - * A copy of the GNU General Public License is in the LICENSE file - * in the top level directory of this source tree. - */ - -var cimxml = cimxml || (function() { - - var xmlDoc; - var rdfFileCount = 0; - var rdfFileReceived = 0; - var jsonBaseData = null; - const xmlnsString = "xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cim='http://iec.ch/TC57/2012/CIM-schema-cim16#' xmlns:md='http://iec.ch/TC57/61970-552/ModelDescription/1#' xmlns:entsoe='http://entsoe.eu/Secretariat/ProfileExtension/2#'"; - - var getRawXML = function() { - return xmlDoc; - }; - - var getBaseJson = function() { - return jsonBaseData; - }; - - /* - * Convert a small data item into XML and add it to a node - */ - var addChild = function(object, name, doc, owner) { - - let child; - if (typeof object == "object") { - child = doc.createElement(name); - child.setAttribute("rdf:resource", object["rdf:resource"]); - } - else { - child = doc.createElement(name); - child.innerHTML = object; - } - owner.appendChild(child); - }; - - var copyXmlDataIntoObject = function(object, node) { - - let childNodes = node.children; - for (let childIndex = 0; childIndex < childNodes.length; childIndex++) { - let thisChild = childNodes[childIndex]; - if (thisChild.nodeType == Node.ELEMENT_NODE) { - if (thisChild.attributes.length > 0) { - object[thisChild.nodeName] = { "rdf:resource": thisChild.getAttribute("rdf:resource")}; - } - else { - object[thisChild.nodeName] = thisChild.innerHTML; - } - } - } - }; - - var importXmlNodeIntoGraph = function(graph, nodeCategory, node, id) { - - let thisObject = { }; - - thisObject['rdfid'] = id - - copyXmlDataIntoObject(thisObject, node); - - if (!graph[nodeCategory]) { - graph[nodeCategory] = {}; - } - - /* add the new object to the graph */ - let categoryGraph = graph[nodeCategory]; - categoryGraph[id] = thisObject; - }; - - var importAboutDataIntoGraph = function(graph, nodeCategory, thisNode, id) { - - if (graph[nodeCategory] && graph[nodeCategory][id]) { - let thisObject = graph[nodeCategory][id].about = []; - copyXmlDataIntoObject(thisObject, thisNode); - } - }; - - /* - * What is the rdf:ID attribute for this node - */ - var getRdfId = function(node) { - - let rdfId = node.getAttribute("rdf:ID"); - return rdfId; - }; - - /* - * What is the rdf:about attribute for this node - */ - var getRdfAbout = function(node) { - - let rdfAbout = node.getAttribute("rdf:about"); - return rdfAbout; - }; - - /* - * Clear the buffer of XML data that we use to handle multiple file imports - */ - var clearXmlData = function() { - - xmlDoc = null; - }; - - var xmlns = function(){ - - return xmlnsString; - }; - - /* - * Function to create a JSON document from an RDF (XML) DOM. - * RDF is a shallow xml format so we don"t have to dig too - * deep, a node will only ever have children or attributes. - */ - var createObjectGraphFromXml = function( xmlData ) { - - let graph = {}; - let topLevelNodes = xmlData.documentElement.childNodes; - - /* loop through all of the top level nodes */ - for (let topLevelIndex=0; topLevelIndex 0) { - if (rdfFileCount == rdfFileReceived) { - return true; - } - } - }; - - /* - * Here comes some more data - */ - var moreXmlData = function(text, draw=true) { - - if (!xmlDoc) { - xmlDoc = getDOM(""); - } - - let newDoc = getDOM(text); - let nodes = newDoc.documentElement.childNodes; - for (let i = 0; i < nodes.length; i++) { - if (nodes[i].nodeType == Node.ELEMENT_NODE) { - if (nodes[i].nodeName != "md:FullModel") { - xmlDoc.documentElement.appendChild(nodes[i].cloneNode(true)); - } - } - } - - rdfFileReceived++; - if (checkIfParseReady()) { - jsonBaseData = createObjectGraphFromXml(xmlDoc); - rdfFileReceived = 0; - rdfFileCount = 0; - return true; - } - return false; - }; - - /* - * Different method of getting DOM required for some platforms - */ - var getDOM = function(text) { - - let newDoc; - if ( window.DOMParser ) { - newDoc = ( new DOMParser() ).parseFromString( text, "application/xml" ); - } - else if( window.ActiveXObject ) { - let xmlObject = new ActiveXObject( "Microsoft.XMLDOM" ); - xmlObject.async = false; - xmlObject.loadXML( text ); - newDoc = xmlObject; - xmlObject = undefined; - } - else { - throw new Error( "Cannot find an XML parser!" ); - } - return newDoc; - }; - - var updateComponentInBaseJson = function(type, id, attribute, value) { - jsonBaseData[type][id][attribute] = value - }; - - return { - getBaseJson, - setRdfFileCount, - clearXmlData, - moreXmlData, - getRawXML, - updateComponentInBaseJson, - }; -}()); - -if (typeof module !== 'undefined' && module.exports) { - module.exports = { - cimxml - }; -} diff --git a/public/Pintura/js/handlebars.runtime.js b/public/Pintura/js/handlebars.runtime.js deleted file mode 100644 index 86c977a..0000000 --- a/public/Pintura/js/handlebars.runtime.js +++ /dev/null @@ -1,1468 +0,0 @@ -/**! - - @license - handlebars v4.0.10 - -Copyright (C) 2011-2016 by Yehuda Katz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["Handlebars"] = factory(); - else - root["Handlebars"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(1)['default']; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - - var _handlebarsBase = __webpack_require__(3); - - var base = _interopRequireWildcard(_handlebarsBase); - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _handlebarsSafeString = __webpack_require__(20); - - var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); - - var _handlebarsException = __webpack_require__(5); - - var _handlebarsException2 = _interopRequireDefault(_handlebarsException); - - var _handlebarsUtils = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_handlebarsUtils); - - var _handlebarsRuntime = __webpack_require__(21); - - var runtime = _interopRequireWildcard(_handlebarsRuntime); - - var _handlebarsNoConflict = __webpack_require__(33); - - var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _handlebarsSafeString2['default']; - hb.Exception = _handlebarsException2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _handlebarsNoConflict2['default'](inst); - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }), -/* 1 */ -/***/ (function(module, exports) { - - "use strict"; - - exports["default"] = function (obj) { - if (obj && obj.__esModule) { - return obj; - } else { - var newObj = {}; - - if (obj != null) { - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; - } - } - - newObj["default"] = obj; - return newObj; - } - }; - - exports.__esModule = true; - -/***/ }), -/* 2 */ -/***/ (function(module, exports) { - - "use strict"; - - exports["default"] = function (obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; - }; - - exports.__esModule = true; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - - var _utils = __webpack_require__(4); - - var _exception = __webpack_require__(5); - - var _exception2 = _interopRequireDefault(_exception); - - var _helpers = __webpack_require__(9); - - var _decorators = __webpack_require__(17); - - var _logger = __webpack_require__(19); - - var _logger2 = _interopRequireDefault(_logger); - - var VERSION = '4.0.10'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 7; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1', - 7: '>= 4.0.0' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials, decorators) { - this.helpers = helpers || {}; - this.partials = partials || {}; - this.decorators = decorators || {}; - - _helpers.registerDefaultHelpers(this); - _decorators.registerDefaultDecorators(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: _logger2['default'], - log: _logger2['default'].log, - - registerHelper: function registerHelper(name, fn) { - if (_utils.toString.call(name) === objectType) { - if (fn) { - throw new _exception2['default']('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (_utils.toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - }, - - registerDecorator: function registerDecorator(name, fn) { - if (_utils.toString.call(name) === objectType) { - if (fn) { - throw new _exception2['default']('Arg not supported with multiple decorators'); - } - _utils.extend(this.decorators, name); - } else { - this.decorators[name] = fn; - } - }, - unregisterDecorator: function unregisterDecorator(name) { - delete this.decorators[name]; - } - }; - - var log = _logger2['default'].log; - - exports.log = log; - exports.createFrame = _utils.createFrame; - exports.logger = _logger2['default']; - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.createFrame = createFrame; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`', - '=': '=' - }; - - var badChars = /[&<>"'`=]/g, - possible = /[&<>"'`=]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /* eslint-disable func-style */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - exports.isFunction = isFunction; - - /* eslint-enable func-style */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - }; - - exports.isArray = isArray; - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function createFrame(object) { - var frame = extend({}, object); - frame._parent = object; - return frame; - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _Object$defineProperty = __webpack_require__(6)['default']; - - exports.__esModule = true; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - /* istanbul ignore else */ - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - try { - if (loc) { - this.lineNumber = line; - - // Work around issue under safari where we can't directly set the column value - /* istanbul ignore next */ - if (_Object$defineProperty) { - Object.defineProperty(this, 'column', { - value: column, - enumerable: true - }); - } else { - this.column = column; - } - } - } catch (nop) { - /* Ignore if the browser is very particular */ - } - } - - Exception.prototype = new Error(); - - exports['default'] = Exception; - module.exports = exports['default']; - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - - module.exports = { "default": __webpack_require__(7), __esModule: true }; - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - - var $ = __webpack_require__(8); - module.exports = function defineProperty(it, key, desc){ - return $.setDesc(it, key, desc); - }; - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - - var $Object = Object; - module.exports = { - create: $Object.create, - getProto: $Object.getPrototypeOf, - isEnum: {}.propertyIsEnumerable, - getDesc: $Object.getOwnPropertyDescriptor, - setDesc: $Object.defineProperty, - setDescs: $Object.defineProperties, - getKeys: $Object.keys, - getNames: $Object.getOwnPropertyNames, - getSymbols: $Object.getOwnPropertySymbols, - each: [].forEach - }; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - exports.registerDefaultHelpers = registerDefaultHelpers; - - var _helpersBlockHelperMissing = __webpack_require__(10); - - var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); - - var _helpersEach = __webpack_require__(11); - - var _helpersEach2 = _interopRequireDefault(_helpersEach); - - var _helpersHelperMissing = __webpack_require__(12); - - var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); - - var _helpersIf = __webpack_require__(13); - - var _helpersIf2 = _interopRequireDefault(_helpersIf); - - var _helpersLog = __webpack_require__(14); - - var _helpersLog2 = _interopRequireDefault(_helpersLog); - - var _helpersLookup = __webpack_require__(15); - - var _helpersLookup2 = _interopRequireDefault(_helpersLookup); - - var _helpersWith = __webpack_require__(16); - - var _helpersWith2 = _interopRequireDefault(_helpersWith); - - function registerDefaultHelpers(instance) { - _helpersBlockHelperMissing2['default'](instance); - _helpersEach2['default'](instance); - _helpersHelperMissing2['default'](instance); - _helpersIf2['default'](instance); - _helpersLog2['default'](instance); - _helpersLookup2['default'](instance); - _helpersWith2['default'](instance); - } - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _utils = __webpack_require__(4); - - exports['default'] = function (instance) { - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (_utils.isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = _utils.createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - - var _utils = __webpack_require__(4); - - var _exception = __webpack_require__(5); - - var _exception2 = _interopRequireDefault(_exception); - - exports['default'] = function (instance) { - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (_utils.isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = _utils.createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (_utils.isArray(context)) { - for (var j = context.length; i < j; i++) { - if (i in context) { - execIteration(i, i, i === context.length - 1); - } - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey !== undefined) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey !== undefined) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - - var _exception = __webpack_require__(5); - - var _exception2 = _interopRequireDefault(_exception); - - exports['default'] = function (instance) { - instance.registerHelper('helperMissing', function () /* [args, ]options */{ - if (arguments.length === 1) { - // A missing field in a {{foo}} construct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _utils = __webpack_require__(4); - - exports['default'] = function (instance) { - instance.registerHelper('if', function (conditional, options) { - if (_utils.isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - - exports['default'] = function (instance) { - instance.registerHelper('log', function () /* message, options */{ - var args = [undefined], - options = arguments[arguments.length - 1]; - for (var i = 0; i < arguments.length - 1; i++) { - args.push(arguments[i]); - } - - var level = 1; - if (options.hash.level != null) { - level = options.hash.level; - } else if (options.data && options.data.level != null) { - level = options.data.level; - } - args[0] = level; - - instance.log.apply(instance, args); - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - - exports['default'] = function (instance) { - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _utils = __webpack_require__(4); - - exports['default'] = function (instance) { - instance.registerHelper('with', function (context, options) { - if (_utils.isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - var data = options.data; - if (options.data && options.ids) { - data = _utils.createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - } - - return fn(context, { - data: data, - blockParams: _utils.blockParams([context], [data && data.contextPath]) - }); - } else { - return options.inverse(this); - } - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - exports.registerDefaultDecorators = registerDefaultDecorators; - - var _decoratorsInline = __webpack_require__(18); - - var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); - - function registerDefaultDecorators(instance) { - _decoratorsInline2['default'](instance); - } - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _utils = __webpack_require__(4); - - exports['default'] = function (instance) { - instance.registerDecorator('inline', function (fn, props, container, options) { - var ret = fn; - if (!props.partials) { - props.partials = {}; - ret = function (context, options) { - // Create a new partials stack frame prior to exec. - var original = container.partials; - container.partials = _utils.extend({}, original, props.partials); - var ret = fn(context, options); - container.partials = original; - return ret; - }; - } - - props.partials[options.args[0]] = options.fn; - - return ret; - }); - }; - - module.exports = exports['default']; - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _utils = __webpack_require__(4); - - var logger = { - methodMap: ['debug', 'info', 'warn', 'error'], - level: 'info', - - // Maps a given level value to the `methodMap` indexes above. - lookupLevel: function lookupLevel(level) { - if (typeof level === 'string') { - var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); - if (levelMap >= 0) { - level = levelMap; - } else { - level = parseInt(level, 10); - } - } - - return level; - }, - - // Can be overridden in the host environment - log: function log(level) { - level = logger.lookupLevel(level); - - if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { - var method = logger.methodMap[level]; - if (!console[method]) { - // eslint-disable-line no-console - method = 'log'; - } - - for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - message[_key - 1] = arguments[_key]; - } - - console[method].apply(console, message); // eslint-disable-line no-console - } - } - }; - - exports['default'] = logger; - module.exports = exports['default']; - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - - // Build out our basic SafeString type - 'use strict'; - - exports.__esModule = true; - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - exports['default'] = SafeString; - module.exports = exports['default']; - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var _Object$seal = __webpack_require__(22)['default']; - - var _interopRequireWildcard = __webpack_require__(1)['default']; - - var _interopRequireDefault = __webpack_require__(2)['default']; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _utils = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_utils); - - var _exception = __webpack_require__(5); - - var _exception2 = _interopRequireDefault(_exception); - - var _base = __webpack_require__(3); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - templateSpec.main.decorator = templateSpec.main_d; - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - if (options.ids) { - options.ids[0] = true; - } - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - var ret = templateSpec[i]; - ret.decorator = templateSpec[i + '_d']; - return ret; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - // An empty object to use as replacement for null-contexts - nullContext: _Object$seal({}), - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - if (options.depths) { - depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; - } else { - depths = [context]; - } - } - - function main(context /*, options*/) { - return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); - } - main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); - return main(context, options); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - if (templateSpec.usePartial || templateSpec.useDecorators) { - container.decorators = container.merge(options.decorators, env.decorators); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - container.decorators = options.decorators; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var currentDepths = depths; - if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { - currentDepths = [context].concat(depths); - } - - return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); - } - - prog = executeDecorators(fn, prog, container, depths, data, blockParams); - - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - if (options.name === '@partial-block') { - partial = options.data['partial-block']; - } else { - partial = options.partials[options.name]; - } - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - // Use the current closure context to save the partial-block if this partial - var currentPartialBlock = options.data && options.data['partial-block']; - options.partial = true; - if (options.ids) { - options.data.contextPath = options.ids[0] || options.data.contextPath; - } - - var partialBlock = undefined; - if (options.fn && options.fn !== noop) { - (function () { - options.data = _base.createFrame(options.data); - // Wrapper function to get access to currentPartialBlock from the closure - var fn = options.fn; - partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - // Restore the partial-block from the closure for the execution of the block - // i.e. the part inside the block of the partial call. - options.data = _base.createFrame(options.data); - options.data['partial-block'] = currentPartialBlock; - return fn(context, options); - }; - if (fn.partials) { - options.partials = Utils.extend({}, options.partials, fn.partials); - } - })(); - } - - if (partial === undefined && partialBlock) { - partial = partialBlock; - } - - if (partial === undefined) { - throw new _exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } - - function executeDecorators(fn, prog, container, depths, data, blockParams) { - if (fn.decorator) { - var props = {}; - prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); - Utils.extend(prog, props); - } - return prog; - } - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - - module.exports = { "default": __webpack_require__(23), __esModule: true }; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - - __webpack_require__(24); - module.exports = __webpack_require__(29).Object.seal; - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - - // 19.1.2.17 Object.seal(O) - var isObject = __webpack_require__(25); - - __webpack_require__(26)('seal', function($seal){ - return function seal(it){ - return $seal && isObject(it) ? $seal(it) : it; - }; - }); - -/***/ }), -/* 25 */ -/***/ (function(module, exports) { - - module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; - }; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - - // most Object methods by ES6 should accept primitives - var $export = __webpack_require__(27) - , core = __webpack_require__(29) - , fails = __webpack_require__(32); - module.exports = function(KEY, exec){ - var fn = (core.Object || {})[KEY] || Object[KEY] - , exp = {}; - exp[KEY] = exec(fn); - $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); - }; - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - - var global = __webpack_require__(28) - , core = __webpack_require__(29) - , ctx = __webpack_require__(30) - , PROTOTYPE = 'prototype'; - - var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && key in target; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(param){ - return this instanceof C ? new C(param) : C(param); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; - } - }; - // type bitmap - $export.F = 1; // forced - $export.G = 2; // global - $export.S = 4; // static - $export.P = 8; // proto - $export.B = 16; // bind - $export.W = 32; // wrap - module.exports = $export; - -/***/ }), -/* 28 */ -/***/ (function(module, exports) { - - // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 - var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); - if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef - -/***/ }), -/* 29 */ -/***/ (function(module, exports) { - - var core = module.exports = {version: '1.2.6'}; - if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - - // optional / simple context binding - var aFunction = __webpack_require__(31); - module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; - }; - -/***/ }), -/* 31 */ -/***/ (function(module, exports) { - - module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; - }; - -/***/ }), -/* 32 */ -/***/ (function(module, exports) { - - module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } - }; - -/***/ }), -/* 33 */ -/***/ (function(module, exports) { - - /* WEBPACK VAR INJECTION */(function(global) {/* global window */ - 'use strict'; - - exports.__esModule = true; - - exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - return Handlebars; - }; - }; - - module.exports = exports['default']; - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) - -/***/ }) -/******/ ]) -}); -; \ No newline at end of file diff --git a/public/Pintura/templates/template.js b/public/Pintura/templates/template.js deleted file mode 100644 index 14a8178..0000000 --- a/public/Pintura/templates/template.js +++ /dev/null @@ -1,2521 +0,0 @@ -(function() { - var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; -templates['cim2svg'] = template({"1":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return " \n" - + ((stack1 = helpers["with"].call(alias1,(depth0 != null ? depth0.components : depth0),{"name":"with","hash":{},"fn":container.program(2, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1; - - return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 2, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); -},"3":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1; - - return " \n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(4, data, 2, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") - + " \n"; -},"4":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1, helper, options, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda, buffer = - " \n" - + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0["pintura:points"] : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); - stack1 = ((helper = (helper = helpers["pintura:label"] || (depth0 != null ? depth0["pintura:label"] : depth0)) != null ? helper : alias2),(options={"name":"pintura:label","hash":{},"fn":container.program(7, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); - if (!helpers["pintura:label"]) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)} - if (stack1 != null) { buffer += stack1; } - return buffer + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0["pintura:line"] : depth0),{"name":"each","hash":{},"fn":container.program(9, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") - + " \n"; -},"5":function(container,depth0,helpers,partials,data,blockParams,depths) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; - - return " \n"; -},"7":function(container,depth0,helpers,partials,data,blockParams) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; - - return " " - + alias4(((helper = (helper = helpers.text || (depth0 != null ? depth0.text : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"text","hash":{},"data":data,"blockParams":blockParams}) : helper))) - + "\n"; -},"9":function(container,depth0,helpers,partials,data,blockParams) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1; - - return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.Diagram : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0, blockParams, depths),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") - + "\n\n"; -},"useData":true,"useDepths":true,"useBlockParams":true}); -templates['pintura2html'] = template({"1":function(container,depth0,helpers,partials,data,blockParams) { - var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}); - - return "
  • Components in Diagram: " - + container.escapeExpression(((helper = (helper = helpers["pintura:name"] || (depth0 != null ? depth0["pintura:name"] : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"pintura:name","hash":{},"data":data,"blockParams":blockParams}) : helper))) - + "
  • \n" - + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.components : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 2, blockParams),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : ""); -},"2":function(container,depth0,helpers,partials,data,blockParams) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression; - - return " \n
    \n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 2, blockParams),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") - + "
    \n"; -},"3":function(container,depth0,helpers,partials,data,blockParams) { - var stack1, alias1=container.lambda, alias2=container.escapeExpression; - - return " \n"; -},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams) { - var stack1; - - return "
      \n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.Diagram : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0, blockParams),"inverse":container.noop,"data":data,"blockParams":blockParams})) != null ? stack1 : "") - + "
    \n"; -},"useData":true,"useBlockParams":true}); -templates['ACDCTerminal'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "\n
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ACDCTerminal.connected\n \n
    • \n
    • \n cim:ACDCTerminal.sequenceNumber\n \n
    • \n
    \n"; -},"useData":true}); -templates['ACLineSegment'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "\n
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ACLineSegment.b0ch\n \n
    • \n
    • \n cim:ACLineSegment.bch\n \n
    • \n
    • \n cim:ACLineSegment.g0ch\n \n
    • \n
    • \n cim:ACLineSegment.gch\n \n
    • \n
    • \n cim:ACLineSegment.r\n \n
    • \n
    • \n cim:ACLineSegment.r0\n \n
    • \n
    • \n cim:ACLineSegment.shortCircuitEndTemperature\n \n
    • \n
    • \n cim:ACLineSegment.x\n \n
    • \n
    • \n cim:ACLineSegment.x0\n \n
    • \n
    • \n cim:ACLineSegment.Clamp\n \n
    • \n
    \n"; -},"useData":true}); -templates['ACLineSegmentPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ACLineSegmentPhase.phase\n \n
    • \n
    • \n cim:ACLineSegmentPhase.ACLineSegment\n \n
    • \n
    \n"; -},"useData":true}); -templates['AsynchronousMachine'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:AsynchronousMachine.asynchronousMachineType\n \n
    • \n
    • \n cim:AsynchronousMachine.converterFedDrive\n \n
    • \n
    • \n cim:AsynchronousMachine.efficiency\n \n
    • \n
    • \n cim:AsynchronousMachine.iaIrRatio\n \n
    • \n
    • \n cim:AsynchronousMachine.nominalFrequency\n \n
    • \n
    • \n cim:AsynchronousMachine.nominalSpeed\n \n
    • \n
    • \n cim:AsynchronousMachine.polePairNumber\n \n
    • \n
    • \n cim:AsynchronousMachine.ratedMechanicalPower\n \n
    • \n
    • \n cim:AsynchronousMachine.reversible\n \n
    • \n
    • \n cim:AsynchronousMachine.rr1\n \n
    • \n
    • \n cim:AsynchronousMachine.rr2\n \n
    • \n
    • \n cim:AsynchronousMachine.rxLockedRotorRatio\n \n
    • \n
    • \n cim:AsynchronousMachine.tpo\n \n
    • \n
    • \n cim:AsynchronousMachine.tppo\n \n
    • \n
    • \n cim:AsynchronousMachine.xlr1\n \n
    • \n
    • \n cim:AsynchronousMachine.xlr2\n \n
    • \n
    • \n cim:AsynchronousMachine.xm\n \n
    • \n
    • \n cim:AsynchronousMachine.xp\n \n
    • \n
    • \n cim:AsynchronousMachine.xpp\n \n
    • \n
    • \n cim:AsynchronousMachine.xs\n \n
    • \n
    \n"; -},"useData":true}); -templates['BaseFrequency'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BaseFrequency.frequency\n \n
    • \n
    \n"; -},"useData":true}); -templates['BasePower'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BasePower.basePower\n \n
    • \n
    \n"; -},"useData":true}); -templates['BaseVoltage'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BaseVoltage.nominalVoltage\n \n
    • \n
    • \n cim:BaseVoltage.ConductingEquipment\n \n
    • \n
    \n"; -},"useData":true}); -templates['BasicIntervalSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BasicIntervalSchedule.startTime\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value1Multiplier\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value1Unit\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value2Multiplier\n \n
    • \n
    • \n cim:BasicIntervalSchedule.value2Unit\n \n
    • \n
    \n"; -},"useData":true}); -templates['Bay'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Bay.bayEnergyMeasFlag\n \n
    • \n
    • \n cim:Bay.bayPowerMeasFlag\n \n
    • \n
    • \n cim:Bay.breakerConfiguration\n \n
    • \n
    • \n cim:Bay.busBarConfiguration\n \n
    • \n
    \n"; -},"useData":true}); -templates['Breaker'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Breaker.inTransitTime\n \n
    • \n
    \n"; -},"useData":true}); -templates['BusbarSection'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BusbarSection.ipMax\n \n
    • \n
    • \n cim:BusbarSection.VoltageControlZone\n \n
    • \n
    \n"; -},"useData":true}); -templates['BusNameMarker'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "\n
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:BusNameMarker.priority\n \n
    • \n
    • \n cim:BusNameMarker.ReportingGroup\n \n
    • \n
    • \n cim:BusNameMarker.Terminal\n \n
    • \n
    \n"; -},"useData":true}); -templates['Clamp'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Clamp.lengthFromTerminal1\n \n
    • \n
    \n"; -},"useData":true}); -templates['CompositeSwitch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:CompositeSwitch.compositeSwitchType\n \n
    • \n
    • \n cim:CompositeSwitch.Switches\n \n
    • \n
    \n"; -},"useData":true}); -templates['ConductingEquipment'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ConductingEquipment.ProtectiveActionAdjustment\n \n
    • \n
    \n"; -},"useData":true}); -templates['Conductor'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Conductor.length\n \n
    • \n
    \n"; -},"useData":true}); -templates['ConnectivityNodeContainer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; -},"useData":true}); -templates['ConnectivityNode'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:ConnectivityNode.ConnectivityNodeContainer\n \n
    • \n
    \n"; -},"useData":true}); -templates['Connector'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; -},"useData":true}); -templates['Curve'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Curve.curveStyle\n \n
    • \n
    • \n cim:Curve.xMultiplier\n \n
    • \n
    • \n cim:Curve.xUnit\n \n
    • \n
    • \n cim:Curve.y1Multiplier\n \n
    • \n
    • \n cim:Curve.y1Unit\n \n
    • \n
    • \n cim:Curve.y2Multiplier\n \n
    • \n
    • \n cim:Curve.y2Unit\n \n
    • \n
    • \n cim:Curve.y3Multiplier\n \n
    • \n
    • \n cim:Curve.y3Unit\n \n
    • \n
    • \n cim:Curve.CurveDatas\n \n
    • \n
    \n"; -},"useData":true}); -templates['Cut'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:Cut.lengthFromTerminal1\n \n
    • \n
    • \n cim:Cut.ACLineSegment\n \n
    • \n
    \n"; -},"useData":true}); -templates['DCTopologicalNode'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; -},"useData":true}); -templates['Disconnector'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    \n"; -},"useData":true}); -templates['EarthFaultCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EarthFaultCompensator.r\n \n
    • \n
    \n"; -},"useData":true}); -templates['EnergyConsumer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EnergyConsumer.customerCount\n \n
    • \n
    • \n cim:EnergyConsumer.grounded\n \n
    • \n
    • \n cim:EnergyConsumer.p\n \n
    • \n
    • \n cim:EnergyConsumer.pfixed\n \n
    • \n
    • \n cim:EnergyConsumer.pfixedPct\n \n
    • \n
    • \n cim:EnergyConsumer.phaseConnection\n \n
    • \n
    • \n cim:EnergyConsumer.q\n \n
    • \n
    • \n cim:EnergyConsumer.qfixed\n \n
    • \n
    • \n cim:EnergyConsumer.qfixedPct\n \n
    • \n
    • \n cim:EnergyConsumer.LoadResponse\n \n
    • \n
    • \n cim:EnergyConsumer.EnergyConsumerPhase\n \n
    • \n
    \n"; -},"useData":true}); -templates['EnergyConsumerPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EnergyConsumerPhase.pfixed\n \n
    • \n
    • \n cim:EnergyConsumerPhase.pfixedPct\n \n
    • \n
    • \n cim:EnergyConsumerPhase.phase\n \n
    • \n
    • \n cim:EnergyConsumerPhase.qfixed\n \n
    • \n
    • \n cim:EnergyConsumerPhase.qfixedPct\n \n
    • \n
    \n"; -},"useData":true}); -templates['EnergySource'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EnergySource.activePower\n \n
    • \n
    • \n cim:EnergySource.nominalVoltage\n \n
    • \n
    • \n cim:EnergySource.r\n \n
    • \n
    • \n cim:EnergySource.r0\n \n
    • \n
    • \n cim:EnergySource.reactivePower\n \n
    • \n
    • \n cim:EnergySource.rn\n \n
    • \n
    • \n cim:EnergySource.voltageAngle\n \n
    • \n
    • \n cim:EnergySource.voltageMagnitude\n \n
    • \n
    • \n cim:EnergySource.x\n \n
    • \n
    • \n cim:EnergySource.x0\n \n
    • \n
    • \n cim:EnergySource.xn\n \n
    • \n
    • \n cim:EnergySource.EnergySchedulingType\n \n
    • \n
    \n"; -},"useData":true}); -templates['EquipmentContainer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
    • \n cim:IdentifiedObject.name\n \n
    • \n
    • \n cim:EquipmentContainer.Equipments\n \n
    • \n
    \n"; -},"useData":true}); -templates['Equipment'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
      \n
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:Equipment.aggregate\n \n
      • \n
      • \n cim:Equipment.normallyInService\n \n
      • \n
      • \n cim:Equipment.WeatherStation\n \n
      • \n
      \n"; -},"useData":true}); -templates['ExternalNetworkInjection'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:ExternalNetworkInjection.governorSCD\n \n
      • \n
      • \n cim:ExternalNetworkInjection.ikSecond\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxInitialSymShCCurrent\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxP\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxQ\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxR0ToX0Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxR1ToX1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.maxZ0ToZ1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minInitialSymShCCurrent\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minP\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minQ\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minR0ToX0Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minR1ToX1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.minZ0ToZ1Ratio\n \n
      • \n
      • \n cim:ExternalNetworkInjection.p\n \n
      • \n
      • \n cim:ExternalNetworkInjection.q\n \n
      • \n
      • \n cim:ExternalNetworkInjection.referencePriority\n \n
      • \n
      • \n cim:ExternalNetworkInjection.voltageFactor\n \n
      • \n
      \n"; -},"useData":true}); -templates['FrequencyConverter'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:FrequencyConverter.frequency\n \n
      • \n
      • \n cim:FrequencyConverter.maxP\n \n
      • \n
      • \n cim:FrequencyConverter.maxU\n \n
      • \n
      • \n cim:FrequencyConverter.minP\n \n
      • \n
      • \n cim:FrequencyConverter.minU\n \n
      • \n
      \n"; -},"useData":true}); -templates['Fuse'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      \n"; -},"useData":true}); -templates['GeographicalRegion'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:GeographicalRegion.Regions\n \n
      • \n
      \n"; -},"useData":true}); -templates['GroundDisconnector'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      \n"; -},"useData":true}); -templates['Ground'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      \n"; -},"useData":true}); -templates['GroundingImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
      • \n cim:IdentifiedObject.name\n \n
      • \n
      • \n cim:GroundingImpedance.x\n \n
      • \n
      \n"; -},"useData":true}); -templates['IrregularIntervalSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
        \n
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:IrregularIntervalSchedule.TimePoints\n \n
        • \n
        \n"; -},"useData":true}); -templates['Jumper'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; -},"useData":true}); -templates['Junction'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; -},"useData":true}); -templates['LinearShuntCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:LinearShuntCompensator.b0PerSection\n \n
        • \n
        • \n cim:LinearShuntCompensator.bPerSection\n \n
        • \n
        • \n cim:LinearShuntCompensator.g0PerSection\n \n
        • \n
        • \n cim:LinearShuntCompensator.gPerSection\n \n
        • \n
        \n"; -},"useData":true}); -templates['LinearShuntCompensatorPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:LinearShuntCompensatorPhase.bPerSection\n \n
        • \n
        • \n cim:LinearShuntCompensatorPhase.gPerSection\n \n
        • \n
        \n"; -},"useData":true}); -templates['Line'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; -},"useData":true}); -templates['LoadBreakSwitch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        \n"; -},"useData":true}); -templates['MutualCoupling'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:MutualCoupling.b0ch\n \n
        • \n
        • \n cim:MutualCoupling.distance11\n \n
        • \n
        • \n cim:MutualCoupling.distance12\n \n
        • \n
        • \n cim:MutualCoupling.distance21\n \n
        • \n
        • \n cim:MutualCoupling.distance22\n \n
        • \n
        • \n cim:MutualCoupling.g0ch\n \n
        • \n
        • \n cim:MutualCoupling.r0\n \n
        • \n
        • \n cim:MutualCoupling.x0\n \n
        • \n
        • \n cim:MutualCoupling.First_Terminal\n \n
        • \n
        • \n cim:MutualCoupling.Second_Terminal\n \n
        • \n
        \n"; -},"useData":true}); -templates['NonlinearShuntCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:NonlinearShuntCompensator.NonlinearShuntCompensatorPoints\n \n
        • \n
        \n"; -},"useData":true}); -templates['NonlinearShuntCompensatorPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
        • \n cim:IdentifiedObject.name\n \n
        • \n
        • \n cim:NonlinearShuntCompensatorPhase.NonlinearShuntCompensatorPhasePoints\n \n
        • \n
        \n"; -},"useData":true}); -templates['OperatingParticipant'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
          \n
            \n
              \n
                \n
                  \n
                • \n cim:IdentifiedObject.name\n \n
                • \n
                \n"; -},"useData":true}); -templates['PerLengthImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                  \n
                    \n
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PerLengthImpedance.ACLineSegments\n \n
                    • \n
                    \n"; -},"useData":true}); -templates['PerLengthLineParameter'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    \n"; -},"useData":true}); -templates['PerLengthPhaseImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PerLengthPhaseImpedance.conductorCount\n \n
                    • \n
                    • \n cim:PerLengthPhaseImpedance.PhaseImpedanceData\n \n
                    • \n
                    \n"; -},"useData":true}); -templates['PerLengthSequenceImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.b0ch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.bch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.g0ch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.gch\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.r\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.r0\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.x\n \n
                    • \n
                    • \n cim:PerLengthSequenceImpedance.x0\n \n
                    • \n
                    \n"; -},"useData":true}); -templates['PetersenCoil'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PetersenCoil.mode\n \n
                    • \n
                    • \n cim:PetersenCoil.nominalU\n \n
                    • \n
                    • \n cim:PetersenCoil.offsetCurrent\n \n
                    • \n
                    • \n cim:PetersenCoil.positionCurrent\n \n
                    • \n
                    • \n cim:PetersenCoil.xGroundMax\n \n
                    • \n
                    • \n cim:PetersenCoil.xGroundMin\n \n
                    • \n
                    • \n cim:PetersenCoil.xGroundNominal\n \n
                    • \n
                    \n"; -},"useData":true}); -templates['PhaseTapChangerAsymmetrical'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                      \n
                    • \n cim:IdentifiedObject.name\n \n
                    • \n
                    • \n cim:PhaseTapChangerAsymmetrical.windingConnectionAngle\n \n
                    • \n
                    \n"; -},"useData":true}); -templates['PhaseTapChanger'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                      \n
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PhaseTapChangerLinear'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerLinear.stepPhaseShiftIncrement\n \n
                      • \n
                      • \n cim:PhaseTapChangerLinear.xMax\n \n
                      • \n
                      • \n cim:PhaseTapChangerLinear.xMin\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PhaseTapChangerNonLinear'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerNonLinear.voltageStepIncrement\n \n
                      • \n
                      • \n cim:PhaseTapChangerNonLinear.xMax\n \n
                      • \n
                      • \n cim:PhaseTapChangerNonLinear.xMin\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PhaseTapChangerSymmetrical'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PhaseTapChangerTable'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerTable.PhaseTapChangerTabular\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PhaseTapChangerTablePoint'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PhaseTapChangerTablePoint.angle\n \n
                      • \n
                      • \n cim:PhaseTapChangerTablePoint.PhaseTapChangerTable\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PhaseTapChangerTabular'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['Plant'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PowerSystemResource'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PowerSystemResource.Controls\n \n
                      • \n
                      • \n cim:PowerSystemResource.Measurements\n \n
                      • \n
                      • \n cim:PowerSystemResource.PSRType\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PowerTransformerEnd'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.b\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.b0\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.connectionKind\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.g\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.g0\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.phaseAngleClock\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.r\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.r0\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.ratedS\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.ratedU\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.x\n \n
                      • \n
                      • \n cim:PowerTransformerEnd.x0\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PowerTransformer'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:PowerTransformer.beforeShCircuitHighestOperatingCurrent\n \n
                      • \n
                      • \n cim:PowerTransformer.beforeShCircuitHighestOperatingVoltage\n \n
                      • \n
                      • \n cim:PowerTransformer.beforeShortCircuitAnglePf\n \n
                      • \n
                      • \n cim:PowerTransformer.highSideMinOperatingU\n \n
                      • \n
                      • \n cim:PowerTransformer.isPartOfGeneratorUnit\n \n
                      • \n
                      • \n cim:PowerTransformer.operationalValuesConsidered\n \n
                      • \n
                      • \n cim:PowerTransformer.vectorGroup\n \n
                      • \n
                      • \n cim:PowerTransformer.PowerTransformerEnd\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['ProtectedSwitch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                      • \n cim:IdentifiedObject.name\n \n
                      • \n
                      • \n cim:ProtectedSwitch.breakingCapacity\n \n
                      • \n
                      \n"; -},"useData":true}); -templates['PSRType'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                        \n
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RatioTapChanger'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RatioTapChanger.stepVoltageIncrement\n \n
                        • \n
                        • \n cim:RatioTapChanger.tculControlMode\n \n
                        • \n
                        • \n cim:RatioTapChanger.RatioTapChangerTable\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RatioTapChangerTable'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RatioTapChangerTablePoint'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RatioTapChangerTablePoint.RatioTapChangerTable\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['ReactiveCapabilityCurve'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.coolantTemperature\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.hydrogenPressure\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.EquivalentInjection\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.InitiallyUsedBySynchronousMachines\n \n
                        • \n
                        • \n cim:ReactiveCapabilityCurve.SynchronousMachines\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['Recloser'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RegularIntervalSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegularIntervalSchedule.endTime\n \n
                        • \n
                        • \n cim:RegularIntervalSchedule.timeStep\n \n
                        • \n
                        • \n cim:RegularIntervalSchedule.TimePoints\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RegulatingCondEq'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegulatingCondEq.controlEnabled\n \n
                        • \n
                        • \n cim:RegulatingCondEq.RegulatingControl\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RegulatingControl'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegulatingControl.discrete\n \n
                        • \n
                        • \n cim:RegulatingControl.enabled\n \n
                        • \n
                        • \n cim:RegulatingControl.mode\n \n
                        • \n
                        • \n cim:RegulatingControl.monitoredPhase\n \n
                        • \n
                        • \n cim:RegulatingControl.targetDeadband\n \n
                        • \n
                        • \n cim:RegulatingControl.targetValue\n \n
                        • \n
                        • \n cim:RegulatingControl.targetValueUnitMultiplier\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['RegulationSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                        • \n cim:IdentifiedObject.name\n \n
                        • \n
                        • \n cim:RegulationSchedule.RegulatingControl\n \n
                        • \n
                        • \n cim:RegulationSchedule.VoltageControlZones\n \n
                        • \n
                        \n"; -},"useData":true}); -templates['ReportingSuperGroup'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                          \n
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:ReportingSuperGroup.ReportingGroup\n \n
                          • \n
                          • \n cim:ReportingSuperGroup.ReportingGroup\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['RotatingMachine'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:RotatingMachine.p\n \n
                          • \n
                          • \n cim:RotatingMachine.q\n \n
                          • \n
                          • \n cim:RotatingMachine.ratedPowerFactor\n \n
                          • \n
                          • \n cim:RotatingMachine.ratedS\n \n
                          • \n
                          • \n cim:RotatingMachine.ratedU\n \n
                          • \n
                          • \n cim:RotatingMachine.HydroPump\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['Sectionaliser'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['SeriesCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SeriesCompensator.r\n \n
                          • \n
                          • \n cim:SeriesCompensator.r0\n \n
                          • \n
                          • \n cim:SeriesCompensator.varistorPresent\n \n
                          • \n
                          • \n cim:SeriesCompensator.varistorRatedCurrent\n \n
                          • \n
                          • \n cim:SeriesCompensator.varistorVoltageThreshold\n \n
                          • \n
                          • \n cim:SeriesCompensator.x\n \n
                          • \n
                          • \n cim:SeriesCompensator.x0\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['ShuntCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:ShuntCompensator.aVRDelay\n \n
                          • \n
                          • \n cim:ShuntCompensator.grounded\n \n
                          • \n
                          • \n cim:ShuntCompensator.maximumSections\n \n
                          • \n
                          • \n cim:ShuntCompensator.nomU\n \n
                          • \n
                          • \n cim:ShuntCompensator.normalSections\n \n
                          • \n
                          • \n cim:ShuntCompensator.phaseConnection\n \n
                          • \n
                          • \n cim:ShuntCompensator.sections\n \n
                          • \n
                          • \n cim:ShuntCompensator.switchOnCount\n \n
                          • \n
                          • \n cim:ShuntCompensator.switchOnDate\n \n
                          • \n
                          • \n cim:ShuntCompensator.voltageSensitivity\n \n
                          • \n
                          • \n cim:ShuntCompensator.ShuntCompensatorPhase\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['ShuntCompensatorPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:ShuntCompensatorPhase.maximumSections\n \n
                          • \n
                          • \n cim:ShuntCompensatorPhase.normalSections\n \n
                          • \n
                          • \n cim:ShuntCompensatorPhase.phase\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['StaticVarCompensator'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:StaticVarCompensator.capacitiveRating\n \n
                          • \n
                          • \n cim:StaticVarCompensator.inductiveRating\n \n
                          • \n
                          • \n cim:StaticVarCompensator.q\n \n
                          • \n
                          • \n cim:StaticVarCompensator.slope\n \n
                          • \n
                          • \n cim:StaticVarCompensator.sVCControlMode\n \n
                          • \n
                          • \n cim:StaticVarCompensator.voltageSetPoint\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['SubGeographicalRegion'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SubGeographicalRegion.Lines\n \n
                          • \n
                          • \n cim:SubGeographicalRegion.Substations\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['Substation'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:Substation.VoltageLevels\n \n
                          • \n
                          • \n cim:Substation.Bays\n \n
                          • \n
                          • \n cim:Substation.DCConverterUnit\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['Switch'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:Switch.normalOpen\n \n
                          • \n
                          • \n cim:Switch.open\n \n
                          • \n
                          • \n cim:Switch.ratedCurrent\n \n
                          • \n
                          • \n cim:Switch.retained\n \n
                          • \n
                          • \n cim:Switch.switchOnCount\n \n
                          • \n
                          • \n cim:Switch.switchOnDate\n \n
                          • \n
                          • \n cim:Switch.SwitchPhase\n \n
                          • \n
                          • \n cim:Switch.SwitchSchedules\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['SwitchPhase'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SwitchPhase.closed\n \n
                          • \n
                          • \n cim:SwitchPhase.normalOpen\n \n
                          • \n
                          • \n cim:SwitchPhase.phaseSide1\n \n
                          • \n
                          • \n cim:SwitchPhase.phaseSide2\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['SwitchSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['SynchronousMachine'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:SynchronousMachine.aVRToManualLag\n \n
                          • \n
                          • \n cim:SynchronousMachine.aVRToManualLead\n \n
                          • \n
                          • \n cim:SynchronousMachine.baseQ\n \n
                          • \n
                          • \n cim:SynchronousMachine.condenserP\n \n
                          • \n
                          • \n cim:SynchronousMachine.coolantCondition\n \n
                          • \n
                          • \n cim:SynchronousMachine.coolantType\n \n
                          • \n
                          • \n cim:SynchronousMachine.earthing\n \n
                          • \n
                          • \n cim:SynchronousMachine.earthingStarPointR\n \n
                          • \n
                          • \n cim:SynchronousMachine.earthingStarPointX\n \n
                          • \n
                          • \n cim:SynchronousMachine.ikk\n \n
                          • \n
                          • \n cim:SynchronousMachine.manualToAVR\n \n
                          • \n
                          • \n cim:SynchronousMachine.maxQ\n \n
                          • \n
                          • \n cim:SynchronousMachine.maxU\n \n
                          • \n
                          • \n cim:SynchronousMachine.minQ\n \n
                          • \n
                          • \n cim:SynchronousMachine.minU\n \n
                          • \n
                          • \n cim:SynchronousMachine.mu\n \n
                          • \n
                          • \n cim:SynchronousMachine.operatingMode\n \n
                          • \n
                          • \n cim:SynchronousMachine.qPercent\n \n
                          • \n
                          • \n cim:SynchronousMachine.r\n \n
                          • \n
                          • \n cim:SynchronousMachine.r0\n \n
                          • \n
                          • \n cim:SynchronousMachine.r2\n \n
                          • \n
                          • \n cim:SynchronousMachine.referencePriority\n \n
                          • \n
                          • \n cim:SynchronousMachine.satDirectSubtransX\n \n
                          • \n
                          • \n cim:SynchronousMachine.satDirectSyncX\n \n
                          • \n
                          • \n cim:SynchronousMachine.satDirectTransX\n \n
                          • \n
                          • \n cim:SynchronousMachine.shortCircuitRotorType\n \n
                          • \n
                          • \n cim:SynchronousMachine.type\n \n
                          • \n
                          • \n cim:SynchronousMachine.voltageRegulationRange\n \n
                          • \n
                          • \n cim:SynchronousMachine.x0\n \n
                          • \n
                          • \n cim:SynchronousMachine.x2\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['TapChangerControl'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:TapChangerControl.limitVoltage\n \n
                          • \n
                          • \n cim:TapChangerControl.lineDropCompensation\n \n
                          • \n
                          • \n cim:TapChangerControl.lineDropR\n \n
                          • \n
                          • \n cim:TapChangerControl.lineDropX\n \n
                          • \n
                          • \n cim:TapChangerControl.reverseLineDropR\n \n
                          • \n
                          • \n cim:TapChangerControl.reverseLineDropX\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['TapChanger'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                          • \n cim:IdentifiedObject.name\n \n
                          • \n
                          • \n cim:TapChanger.controlEnabled\n \n
                          • \n
                          • \n cim:TapChanger.highStep\n \n
                          • \n
                          • \n cim:TapChanger.initialDelay\n \n
                          • \n
                          • \n cim:TapChanger.lowStep\n \n
                          • \n
                          • \n cim:TapChanger.ltcFlag\n \n
                          • \n
                          • \n cim:TapChanger.neutralStep\n \n
                          • \n
                          • \n cim:TapChanger.neutralU\n \n
                          • \n
                          • \n cim:TapChanger.normalStep\n \n
                          • \n
                          • \n cim:TapChanger.step\n \n
                          • \n
                          • \n cim:TapChanger.subsequentDelay\n \n
                          • \n
                          • \n cim:TapChanger.TapChangerControl\n \n
                          • \n
                          \n"; -},"useData":true}); -templates['TapSchedule'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                            \n
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TapSchedule.TapChanger\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['Terminal'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:Terminal.phases\n \n
                            • \n
                            • \n cim:Terminal.ConnectivityNode\n \n
                            • \n
                            • \n cim:Terminal.ConductingEquipment\n \n
                            • \n
                            • \n cim:Terminal.RegulatingControl\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TopologicalIsland'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TopologicalIsland.TopologicalNodes\n \n
                            • \n
                            • \n cim:TopologicalIsland.AngleRefTopologicalNode\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TopologicalNode'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TopologicalNode.pInjection\n \n
                            • \n
                            • \n cim:TopologicalNode.qInjection\n \n
                            • \n
                            • \n cim:TopologicalNode.ReportingGroup\n \n
                            • \n
                            • \n cim:TopologicalNode.ConnectivityNodeContainer\n \n
                            • \n
                            • \n cim:TopologicalNode.BaseVoltage\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TransformerCoreAdmittance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.b\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.b0\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.g\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.g0\n \n
                            • \n
                            • \n cim:TransformerCoreAdmittance.TransformerEnd\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TransformerEnd'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerEnd.bmagSat\n \n
                            • \n
                            • \n cim:TransformerEnd.endNumber\n \n
                            • \n
                            • \n cim:TransformerEnd.grounded\n \n
                            • \n
                            • \n cim:TransformerEnd.magBaseU\n \n
                            • \n
                            • \n cim:TransformerEnd.magSatFlux\n \n
                            • \n
                            • \n cim:TransformerEnd.rground\n \n
                            • \n
                            • \n cim:TransformerEnd.xground\n \n
                            • \n
                            • \n cim:TransformerEnd.PhaseTapChanger\n \n
                            • \n
                            • \n cim:TransformerEnd.StarImpedance\n \n
                            • \n
                            • \n cim:TransformerEnd.RatioTapChanger\n \n
                            • \n
                            • \n cim:TransformerEnd.BaseVoltage\n \n
                            • \n
                            • \n cim:TransformerEnd.Terminal\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TransformerMeshImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.r\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.r0\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.x\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.x0\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.ToTransformerEnd\n \n
                            • \n
                            • \n cim:TransformerMeshImpedance.FromTransformerEnd\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TransformerStarImpedance'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.r\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.r0\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.x\n \n
                            • \n
                            • \n cim:TransformerStarImpedance.x0\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TransformerTankEnd'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerTankEnd.phases\n \n
                            • \n
                            • \n cim:TransformerTankEnd.TransformerTank\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['TransformerTank'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:TransformerTank.PowerTransformer\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['VoltageControlZone'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            \n"; -},"useData":true}); -templates['VoltageLevel'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { - var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; - - return "
                              \n
                            • \n cim:IdentifiedObject.name\n \n
                            • \n
                            • \n cim:VoltageLevel.highVoltageLimit\n \n
                            • \n
                            • \n cim:VoltageLevel.lowVoltageLimit\n \n
                            • \n
                            • \n cim:VoltageLevel.Bays\n \n
                            • \n
                            • \n cim:VoltageLevel.BaseVoltage\n \n
                            • \n
                            \n"; -},"useData":true}); -})(); From fbbcf5dc6986590737d0cef293f51d26fd2abd83 Mon Sep 17 00:00:00 2001 From: Richard Marston Date: Wed, 20 Mar 2019 11:21:11 +0100 Subject: [PATCH 541/556] Use new libcimsvg interface for diagram rendering --- package.json | 2 ++ public/index.html | 7 ----- src/components/widgets/topology.js | 36 ++++++++++++------------- src/data-managers/files-data-manager.js | 1 - 4 files changed, 20 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 87b2961..63b7c18 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,9 @@ "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", "lodash": "^4.17.11", "prop-types": "^15.6.2", "rc-slider": "^8.6.3", diff --git a/public/index.html b/public/index.html index 7c7f981..2775a2d 100644 --- a/public/index.html +++ b/public/index.html @@ -27,12 +27,5 @@ To begin the development, run `npm start`. To create a production bundle, use `npm run build`. --> - - - - - - - diff --git a/src/components/widgets/topology.js b/src/components/widgets/topology.js index a11940a..c47b155 100644 --- a/src/components/widgets/topology.js +++ b/src/components/widgets/topology.js @@ -23,7 +23,7 @@ import React from 'react'; import {ReactSVGPanZoom} from 'react-svg-pan-zoom'; import config from '../../config'; import '../../styles/simple-spinner.css'; - +import { cimsvg } from 'libcimsvg'; // Do not show Pintura's grid const pinturaGridStyle = { @@ -82,7 +82,7 @@ function detachComponentEvents() { class WidgetTopology extends React.Component { constructor(props) { super(props); - this.svgElem = null; + this.svgElem = React.createRef(); this.Viewer = null; this.state = { @@ -90,15 +90,8 @@ class WidgetTopology extends React.Component { }; } - setSVG(svg) { - this.svgElem = svg; - window.cimsvg.setSVG(svg); // function not available in upstream source - window.cimview.setSVG(svg); // function not available in upstream source - } - componentDidMount() { if (this.svgElem) { - window.cimjson.setImagePathBase(process.env.PUBLIC_URL + '/Pintura/'); window.onMouseLeave = function() {}; window.onMouseOver = function() {}; window.onMouseLeave = function() {}; @@ -122,18 +115,25 @@ class WidgetTopology extends React.Component { .then( response => { if (response.status === 200) { this.setState({'visualizationState': 'ready' }); - window.cimxml.clearXmlData() - window.cimsvg.setFileCount(1); return response.text().then( contents => { - window.cimsvg.loadFile(contents); - window.cimview.fit(); - attachComponentEvents(); + 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({ 'visualizationState': 'show_message', 'message': 'Topology could not be loaded.'}); @@ -169,10 +169,10 @@ class WidgetTopology extends React.Component { tool="pan" width={this.props.widget.width-2} height={this.props.widget.height-2} > - this.setSVG(c) } width={this.props.widget.width} height={this.props.widget.height}> - - - + + + + diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js index 60cbdad..b9fbd91 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/data-managers/files-data-manager.js @@ -30,7 +30,6 @@ class FilesDataManager extends RestDataManager { upload(file, token = null, progressCallback = null, finishedCallback = null) { RestAPI.upload(this.makeURL('/upload'), file, token, progressCallback).then(response => { - console.log(response); AppDispatcher.dispatch({ type: 'files/uploaded', From 174f128c5b728906eee8a1d05e6e426651e47ede Mon Sep 17 00:00:00 2001 From: Richard Marston Date: Tue, 14 May 2019 09:39:48 +0200 Subject: [PATCH 542/556] Add libcimsvg as git dependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 63b7c18..9048147 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "handlebars": "^4.1.1", "immutable": "^3.8.1", "jszip": "^3.2.0", + "libcimsvg": "git+ssh://git@git.rwth-aachen.de:acs/public/villas/pintura-npm-package.git", "lodash": "^4.17.11", "prop-types": "^15.6.2", "rc-slider": "^8.6.3", From 284c277436dfd324ce42f77a2268246ad07d058b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 14 May 2019 11:05:27 +0200 Subject: [PATCH 543/556] use HTTPS and new location of NPM package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9048147..61827cc 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "handlebars": "^4.1.1", "immutable": "^3.8.1", "jszip": "^3.2.0", - "libcimsvg": "git+ssh://git@git.rwth-aachen.de:acs/public/villas/pintura-npm-package.git", + "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", From 790e9a2c4b6b0f1a21993a9d6a186e421ce634b3 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 14 May 2019 11:07:43 +0200 Subject: [PATCH 544/556] install Git for installation of Pintura NPM --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index 9262cc9..073bf3c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,8 @@ FROM node:8.2 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app +RUN apt install -y git + # 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 From 7b11f6d0809cd6851952c21a421e21078126d9b2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 14 May 2019 11:10:08 +0200 Subject: [PATCH 545/556] use our own Dockerimage in CI --- .gitlab-ci.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5c5ca55..048b0a9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,5 @@ variables: GIT_SUBMODULE_STRATEGY: normal - CI: "true" cache: untracked: true @@ -12,8 +11,17 @@ cache: - .yarn stages: + - prepare - build - test + +prepare: + stage: prepare + script: + - docker build -t villas/web-dev . + tags: + - linux + - shell build_job: stage: build @@ -22,7 +30,7 @@ build_job: script: - npm install - npm run build - image: node:7.9.0-slim + image: villas/web-dev artifacts: paths: - build/ @@ -34,7 +42,7 @@ test_job: stage: test script: - npm test - image: node:7.9.0-slim + image: villas/web-dev dependencies: - build_job tags: From ed661f993bd99597fff52e45bf2373c8ddc370cf Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 14 May 2019 11:10:08 +0200 Subject: [PATCH 546/556] use our own Dockerimage in CI --- .gitlab-ci.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5c5ca55..048b0a9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,5 @@ variables: GIT_SUBMODULE_STRATEGY: normal - CI: "true" cache: untracked: true @@ -12,8 +11,17 @@ cache: - .yarn stages: + - prepare - build - test + +prepare: + stage: prepare + script: + - docker build -t villas/web-dev . + tags: + - linux + - shell build_job: stage: build @@ -22,7 +30,7 @@ build_job: script: - npm install - npm run build - image: node:7.9.0-slim + image: villas/web-dev artifacts: paths: - build/ @@ -34,7 +42,7 @@ test_job: stage: test script: - npm test - image: node:7.9.0-slim + image: villas/web-dev dependencies: - build_job tags: From 41660ed51eff25ad23caeaa706938b0a0304273a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 00:54:53 +0200 Subject: [PATCH 547/556] fix typo in static class member declaration --- src/components/editable-header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 0b114bc..b2325c6 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -100,7 +100,7 @@ class EditableHeader extends React.Component { } } -EditableHeader.PropTypes = { +EditableHeader.propTypes = { title: PropTypes.string.isRequired, onChange: PropTypes.func }; From 85f4d5de7870bcb82ab258d6e49c9e3b9b9fc548 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 00:55:18 +0200 Subject: [PATCH 548/556] update react-scripts to 3.1.0 --- package-lock.json | 15785 +++++++++++++++++++++++--------------------- package.json | 16 +- 2 files changed, 8364 insertions(+), 7437 deletions(-) diff --git a/package-lock.json b/package-lock.json index c30375d..d1c1633 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,98 +4,1687 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@fortawesome/fontawesome": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome/-/fontawesome-1.1.8.tgz", - "integrity": "sha512-c0/MtkPVT0fmiFcCyYoPjkG9PkMOvfrZw2+0BaJ+Rh6UEcK1AR/LaRgrHHjUkbAbs9LXxQJhFS8CJ4uSnK2+JA==", + "@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": { - "@fortawesome/fontawesome-common-types": "^0.1.7" + "@babel/highlight": "^7.0.0" } }, - "@fortawesome/fontawesome-common-types": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.1.7.tgz", - "integrity": "sha512-ego8jRVSHfq/iq4KRZJKQeUAdi3ZjGNrqw4oPN3fNdvTBnLCSntwVCnc37bsAJP9UB8MhrTfPnZYxkv2vpS4pg==" - }, - "@fortawesome/fontawesome-free-solid": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.13.tgz", - "integrity": "sha512-b+krVnqkdDt52Yfev0x0ZZgtxBQsLw00Zfa3uaVWIDzpNZVtrEXuxldUSUaN/ihgGhSNi8VpvDAdNPVgCKOSxw==", + "@babel/core": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", + "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.1.7" + "@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", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "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==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@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==", + "requires": { + "@babel/types": "^7.0.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==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.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==", + "requires": { + "@babel/types": "^7.3.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==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@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==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.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-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==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@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==", + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.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==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.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==", + "requires": { + "@babel/types": "^7.0.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==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@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==", + "requires": { + "@babel/types": "^7.0.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==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@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==", + "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/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==", + "requires": { + "@babel/types": "^7.0.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==" + }, + "@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==", + "requires": { + "lodash": "^4.17.11" + } + }, + "@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==", + "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-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==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@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==", + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.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==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@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==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@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==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "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==" + }, + "@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==", + "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/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==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.0", + "@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==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^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", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "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/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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.11" + } + }, + "@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==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.4.4", + "@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-split-export-declaration": "^7.4.4", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.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==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "requires": { + "regexp-tree": "^0.1.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.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==", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.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==", + "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==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@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==", + "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==", + "requires": { + "regenerator-transform": "^0.13.4" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@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==" + } + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.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==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@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==", + "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-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@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-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-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.4.4", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.2.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-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.2.0", + "@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-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.4.4", + "browserslist": "^4.5.2", + "core-js-compat": "^3.0.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "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==" + } + } + }, + "@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==", + "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/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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.3.2" + } + }, + "@babel/runtime": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", + "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", + "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==" + } + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@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", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "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": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "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==" + }, + "@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==", + "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/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==", + "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/react-fontawesome": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.0.20.tgz", - "integrity": "sha512-0a1VYxlCU1oQZzxXK2KIlVArQJSGG3BgBwelLNbR5f2CD6+zQhXXMC9Vm8V4VLO1ZWDeGdjAJZmf7VL/zuuBGQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.4.tgz", + "integrity": "sha512-GwmxQ+TK7PEdfSwvxtGnMCqrfEm0/HbRHArbUudsYiy9KzVCwndxa2KMcfyTQ8El0vROrq8gOOff09RF1oQe8g==", "requires": { "humps": "^2.0.1", - "prop-types": "^15.5.7" + "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==" + }, + "@hapi/hoek": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.1.tgz", + "integrity": "sha512-+ryw4GU9pjr1uT6lBuErHJg3NYqzwJTvZ75nKuJijEzpd00Uqi6oiawTGDDf5Hl0zWmI7qHfOtaqB0kpQZJQzA==" + }, + "@hapi/joi": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz", + "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/hoek": "6.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@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==", + "requires": { + "@hapi/hoek": "6.x.x" + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "requires": { + "@jest/source-map": "^24.3.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==", + "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", + "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-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", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "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" + } + } + } + }, + "@jest/environment": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", + "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "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": { + "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==", + "requires": { + "@jest/types": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.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==", + "requires": { + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "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.1.1", + "jest-haste-map": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "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==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "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==" + } + } + }, + "@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==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.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==", + "requires": { + "@jest/test-result": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.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==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.8.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", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + } + }, + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, + "@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==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==", + "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-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==", + "requires": { + "@svgr/plugin-jsx": "^4.2.0", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.0" + } + }, + "@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==", + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@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==", + "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" + } + }, + "@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==", + "requires": { + "cosmiconfig": "^5.2.0", + "merge-deep": "^3.0.2", + "svgo": "^1.2.1" + } + }, + "@svgr/webpack": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", + "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", + "requires": { + "@babel/core": "^7.1.6", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.1.6", + "@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" + } + }, + "@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==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@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==", + "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==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@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==" + }, + "@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==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@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==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@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/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@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", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==" + }, + "@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==", + "requires": { + "@typescript-eslint/parser": "1.6.0", + "@typescript-eslint/typescript-estree": "1.6.0", + "requireindex": "^1.2.0", + "tsutils": "^3.7.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==", + "requires": { + "@typescript-eslint/typescript-estree": "1.6.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.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==", + "requires": { + "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==" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@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==" + }, + "@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==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@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==" + }, + "@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==", + "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/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "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==", + "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==" + }, + "@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==", + "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/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "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/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "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/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==", + "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/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==", + "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", + "@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==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", - "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" }, "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" }, "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" } }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "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==" + }, + "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": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } + "object-assign": "4.x" } }, "add-event-listener": { @@ -109,63 +1698,40 @@ "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.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" - } - } - } + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" }, "alphanum-sort": { "version": "1.0.2", "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-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "^2.0.0" - } + "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.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + "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-html": { "version": "0.0.7", @@ -173,9 +1739,9 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", @@ -186,90 +1752,18 @@ } }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "requires": { - "default-require-extensions": "^2.0.0" - } + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "argparse": { "version": "1.0.10", @@ -280,9 +1774,9 @@ } }, "aria-query": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", - "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", "requires": { "ast-types-flow": "0.0.7", "commander": "^2.11.0" @@ -313,15 +1807,10 @@ "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.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { "version": "3.0.3", @@ -368,12 +1857,15 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } }, "asn1.js": { "version": "4.10.1", @@ -386,10 +1878,11 @@ } }, "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": { @@ -413,6 +1906,12 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -423,47 +1922,47 @@ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "requires": { - "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - } - } + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + "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-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "resolved": false, "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", - "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", + "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", "requires": { - "browserslist": "^2.5.1", - "caniuse-lite": "^1.0.30000748", + "browserslist": "^4.5.4", + "caniuse-lite": "^1.0.30000957", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^6.0.13", - "postcss-value-parser": "^3.2.3" + "postcss": "^7.0.14", + "postcss-value-parser": "^3.3.1" } }, "aws-sign2": { @@ -472,14 +1971,14 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "axobject-query": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", "requires": { "ast-types-flow": "0.0.7" } @@ -492,563 +1991,148 @@ "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "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" + } + }, + "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": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "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==", "requires": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "@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": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "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" + } } } }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babylon": "^6.18.0" } }, "babel-jest": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", - "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", + "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-preset-jest": "^20.0.3" + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" } }, "babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "requires": { - "find-cache-dir": "^1.0.0", + "find-cache-dir": "^2.0.0", "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" } }, "babel-plugin-dynamic-import-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", - "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", + "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": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "object.assign": "^4.1.0" } }, "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "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==", "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", - "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "requires": { + "@types/babel__traverse": "^7.0.6" + } }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + "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==", + "requires": { + "@babel/runtime": "^7.4.2", + "cosmiconfig": "^5.2.0", + "resolve": "^1.10.0" + } }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + "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==" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", @@ -1058,179 +2142,149 @@ "babel-runtime": "^6.26.0" } }, - "babel-plugin-transform-react-constant-elements": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^2.1.2", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "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": "20.0.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", - "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", "requires": { - "babel-plugin-jest-hoist": "^20.0.3" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" } }, "babel-preset-react-app": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.1.1.tgz", - "integrity": "sha512-9fRHopNaGL5ScRZdPSoyxRaABKmkS2fx0HUJ5Yphan5G8QDFD7lETsPyY7El6b7YPT3sNrw9gfrWzl4/LsJcfA==", + "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==", "requires": { - "babel-plugin-dynamic-import-node": "1.1.0", - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-object-rest-spread": "6.26.0", - "babel-plugin-transform-react-constant-elements": "6.23.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-plugin-transform-regenerator": "6.26.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.6.1", - "babel-preset-react": "6.24.1" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "@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-plugin-transform-react-remove-prop-types": "0.4.24" }, "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==" + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@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==", + "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-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==", + "requires": { + "@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==", + "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-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", + "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==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "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==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" } } }, @@ -1250,50 +2304,16 @@ } } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, "babylon": { "version": "6.18.0", "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", @@ -1346,6 +2366,11 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -1365,28 +2390,27 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { "tweetnacl": "^0.14.3" } }, "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==" }, "bn.js": { "version": "4.11.8", @@ -1394,31 +2418,42 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" }, "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "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=" } } }, @@ -1445,37 +2480,6 @@ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1517,10 +2521,15 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "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==" + }, "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "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" }, @@ -1556,13 +2565,14 @@ } }, "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -1597,12 +2607,13 @@ } }, "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz", + "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==", "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "caniuse-lite": "^1.0.30000967", + "electron-to-chromium": "^1.3.133", + "node-releases": "^1.1.19" } }, "bser": { @@ -1624,9 +2635,9 @@ } }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", @@ -1638,11 +2649,6 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -1653,6 +2659,27 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "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==", + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "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", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1669,18 +2696,31 @@ "unset-value": "^1.0.0" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "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": "^0.2.0" + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" } }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { "version": "3.0.0", @@ -1692,232 +2732,608 @@ } }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "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=" - } - } + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } } }, - "caniuse-db": { - "version": "1.0.30000855", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000855.tgz", - "integrity": "sha1-NPiL8Vd6pQU5XkjkEtwh991B7zs=" - }, "caniuse-lite": { - "version": "1.0.30000855", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000855.tgz", - "integrity": "sha512-ajORrkXa5UYk62P5PK6ZmBraYOAOr9HWy+XxLwjDg8Ys/5KiSyarg8tIA32ZVqbFhtz67wyySXnU9imkh2ZT2w==" + "version": "1.0.30000967", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", + "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==" }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", - "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=" + "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==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "ccount": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", + "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==" }, "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" - }, - "dependencies": { - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "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 - } + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "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" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" + "readdirp": "^2.2.1", + "upath": "^1.1.1" }, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "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" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "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": { - "is-extglob": "^2.1.0" + "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.1", + "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": "4.1.1", + "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.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.3", + "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.1", + "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.3", + "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.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.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" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "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.0", + "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.6.3", + "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.0", + "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.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "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.0.3", + "bundled": true, + "optional": true } } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" } } }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "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==", + "requires": { + "tslib": "^1.9.0" + } + }, "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { "version": "1.0.4", @@ -1928,19 +3344,6 @@ "safe-buffer": "^5.0.1" } }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "^1.1.3" - } - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1963,30 +3366,18 @@ } }, "classnames": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "requires": { - "source-map": "0.5.x" - }, - "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.0" } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -2001,26 +3392,26 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + } }, "co": { "version": "4.6.0", @@ -2028,10 +3419,12 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", "q": "^1.1.2" } }, @@ -2050,112 +3443,116 @@ } }, "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", + "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "color-name": "1.1.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "requires": { - "color-name": "^1.0.0" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "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.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "compare-versions": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", - "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==" + "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.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "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=" }, "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", "requires": { - "mime-db": ">= 1.34.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=" - } + "mime-db": ">= 1.40.0 < 2" } }, "compression": { - "version": "1.7.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", - "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { - "accepts": "~1.3.4", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.13", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.1", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -2175,23 +3572,15 @@ "typedarray": "^0.0.6" } }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } + "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==" }, "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "console-browserify": { "version": "1.1.0", @@ -2221,15 +3610,13 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" - }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + "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==", + "requires": { + "safe-buffer": "~5.1.1" + } }, "cookie": { "version": "0.3.1", @@ -2241,6 +3628,24 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2251,30 +3656,43 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, + "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==", + "requires": { + "browserslist": "^4.5.4", + "core-js": "3.0.1", + "core-js-pure": "3.0.1", + "semver": "^6.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==" + } + } + }, + "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==" + }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "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.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, "create-ecdh": { @@ -2286,14 +3704,6 @@ "elliptic": "^6.0.0" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2319,14 +3729,33 @@ "sha.js": "^2.4.8" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "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": { - "lru-cache": "^4.0.1", + "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", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "crypto-browserify": { @@ -2347,209 +3776,118 @@ "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-animation": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.5.0.tgz", + "integrity": "sha512-hWYoWiOZ7Vr20etzLh3kpWgtC454tW5vn4I6rLANDgpzNSkO7UfOqyCEeaoBSG9CYWQpRkFWTWbWW8o3uZrNLw==", + "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", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, - "css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "requires": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "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==", + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "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==", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "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==", "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - }, - "dependencies": { - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "^1.0.9", + "mdn-data": "~1.1.0", "source-map": "^0.5.3" }, "dependencies": { @@ -2560,54 +3898,163 @@ } } }, + "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-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", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "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==", + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "requires": { "cssom": "0.3.x" } }, - "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" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "^0.10.9" - } + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" }, "d3": { "version": "3.5.17", "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==" + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", - "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, "d3-axis": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", - "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" }, "d3-path": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", - "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" + "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", @@ -2654,37 +4101,35 @@ } }, "d3-selection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", - "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", + "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==" }, "d3-shape": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", - "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", + "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", "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==" + }, "d3-time-format": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", - "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", "requires": { "d3-time": "1" - }, - "dependencies": { - "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==" - } } }, "damerau-levenshtein": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==" }, "dashdash": { "version": "1.14.1", @@ -2694,17 +4139,39 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "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==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, "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": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -2717,43 +4184,40 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, - "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", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "requires": { - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "object-keys": "^1.0.12" } }, "define-property": { @@ -2790,31 +4254,51 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "globby": "^5.0.0", + "globby": "^6.1.0", "is-path-cwd": "^1.0.0", "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + } } }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": false, "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { @@ -2836,18 +4320,15 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "^2.0.0" - } + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, "detect-port-alt": { "version": "1.1.6", @@ -2856,12 +4337,27 @@ "requires": { "address": "^1.0.1", "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "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==" }, "diffie-hellman": { "version": "5.0.3", @@ -2873,6 +4369,31 @@ "randombytes": "^2.0.0" } }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "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=", + "requires": { + "asap": "^2.0.6", + "invariant": "^2.0.0", + "lodash": "^4.2.0", + "redux": "^3.7.1" + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -2896,26 +4417,24 @@ } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { "esutils": "^2.0.2" } }, + "dom-align": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.8.2.tgz", + "integrity": "sha512-17vInOylbB7H4qua7QRsmQT05FFTZemO8BhnOPgF9BPqjAPDyQr/9V8fmJbn05vQ31m2gu3EJSSYN2u94szUZg==" + }, "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { - "utila": "~0.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" - } + "utila": "~0.4" } }, "dom-helpers": { @@ -2924,27 +4443,12 @@ "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } - } - }, - "dom-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", - "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", - "requires": { - "urijs": "^1.16.1" + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, "domain-browser": { @@ -2953,22 +4457,30 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "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==", + "requires": { + "webidl-conversions": "^4.0.2" + } }, "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { "domelementtype": "1" } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -2983,9 +4495,9 @@ } }, "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" }, "dotenv-expand": { "version": "4.2.0", @@ -2997,18 +4509,24 @@ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -3017,14 +4535,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.48", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", - "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" + "version": "1.3.134", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.134.tgz", + "integrity": "sha512-C3uK2SrtWg/gSWaluLHWSHjyebVZCe4ZC0NVgTAoTq8tCR9FareRK5T7R7AS/nPZShtlEcjVMX1kQ8wi4nU68w==" }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -3036,9 +4554,9 @@ } }, "emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { "version": "2.1.0", @@ -3052,6 +4570,7 @@ }, "encoding": { "version": "0.1.12", + "resolved": false, "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" @@ -3067,21 +4586,28 @@ } } }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "tapable": "^1.0.0" } }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "errno": { "version": "0.1.7", @@ -3092,104 +4618,40 @@ } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "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==", "requires": { - "is-callable": "^1.1.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "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-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "is-symbol": "^1.0.2" } }, "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" }, "escape-html": { "version": "1.0.3", @@ -3202,9 +4664,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz", - "integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -3220,112 +4682,77 @@ } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "eslint": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", - "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "requires": { - "ajv": "^5.2.0", - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.0.1", - "doctrine": "^2.0.0", - "eslint-scope": "^3.7.1", - "espree": "^3.5.1", - "esquery": "^1.0.0", - "estraverse": "^4.2.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", + "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", - "globals": "^9.17.0", - "ignore": "^3.3.3", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify": "^1.0.1", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", "progress": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" }, "dependencies": { - "ansi-regex": { + "import-fresh": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "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" - } - }, - "esprima": { + "resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^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" - } + "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": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz", - "integrity": "sha512-8QZrKWuHVC57Fmu+SsKAVxnI9LycZl7NFQ4H9L+oeISuCXhYdXqsOOIVSjQFW6JF5MXZLFE+21Syhd7mF1IRZQ==" + "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==", + "requires": { + "confusing-browser-globals": "^1.0.7" + } }, "eslint-import-resolver-node": { "version": "0.3.2", @@ -3334,12 +4761,27 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "eslint-loader": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", + "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", "requires": { "loader-fs-cache": "^1.0.0", "loader-utils": "^1.0.2", @@ -3349,66 +4791,108 @@ } }, "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "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==", "requires": { "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "pkg-dir": "^2.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=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "ms": "2.0.0" } }, - "path-exists": { + "find-up": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "pinkie-promise": "^2.0.0" + "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": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "^1.0.0" + "find-up": "^2.1.0" } } } }, "eslint-plugin-flowtype": { - "version": "2.39.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", - "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", + "version": "2.50.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz", + "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==", "requires": { - "lodash": "^4.15.0" + "lodash": "^4.17.10" } }, "eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "requires": { - "builtin-modules": "^1.1.1", "contains-path": "^0.1.0", - "debug": "^2.6.8", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.1.1", - "has": "^1.0.1", - "lodash.cond": "^4.3.0", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0" + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.3.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "read-pkg-up": "^2.0.0", + "resolve": "^1.9.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -3418,6 +4902,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", @@ -3429,6 +4921,49 @@ "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", + "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", @@ -3437,6 +4972,11 @@ "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", @@ -3455,71 +4995,86 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "eslint-plugin-jsx-a11y": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", - "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", + "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==", "requires": { - "aria-query": "^0.7.0", + "aria-query": "^3.0.0", "array-includes": "^3.0.3", - "ast-types-flow": "0.0.7", - "axobject-query": "^0.1.0", - "damerau-levenshtein": "^1.0.0", - "emoji-regex": "^6.1.0", - "jsx-ast-utils": "^1.4.0" + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1" } }, "eslint-plugin-react": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", - "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", + "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", "requires": { - "doctrine": "^2.0.0", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.0", - "prop-types": "^15.5.10" + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "object.fromentries": "^2.0.0", + "prop-types": "^15.6.2", + "resolve": "^1.9.0" }, "dependencies": { - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "array-includes": "^3.0.3" + "esutils": "^2.0.2" } } } }, + "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==" + }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "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" } }, + "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==" + }, + "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==" + }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.0.1", @@ -3552,31 +5107,22 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "requires": { - "original": ">=0.0.5" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -3589,20 +5135,17 @@ } }, "exec-sh": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", - "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", - "requires": { - "merge": "^1.1.3" - } + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -3610,6 +5153,11 @@ "strip-eof": "^1.0.0" } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3624,6 +5172,14 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3639,71 +5195,35 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "expect": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" + "@jest/types": "^24.8.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" } }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", "content-type": "~1.0.4", "cookie": "0.3.1", @@ -3720,10 +5240,10 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", @@ -3738,27 +5258,30 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "path-to-regexp": { "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.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -3780,12 +5303,12 @@ } }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, @@ -3845,29 +5368,36 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "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==", + "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" + } }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -3879,11 +5409,6 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" - }, "faye-websocket": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", @@ -3903,7 +5428,7 @@ "fbemitter": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", - "integrity": "sha512-hd8PgD+Q6RQtlcGrkM9oY3MFIjq6CA6wurCK1TKn2eaA76Ww4VAOihmq98NyjRhjJi/axgznZnh9lF8+TcTsNQ==", + "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", "requires": { "fbjs": "^0.8.4" } @@ -3929,6 +5454,11 @@ } } }, + "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", @@ -3938,46 +5468,31 @@ } }, "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^2.0.1" } }, "file-loader": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", - "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", "requires": { "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "schema-utils": "^1.0.0" } }, "file-saver": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", - "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } + "version": "1.3.8", + "resolved": "http://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", + "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" }, "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" }, "fill-range": { "version": "4.0.0", @@ -4012,42 +5527,70 @@ "parseurl": "~1.3.2", "statuses": "~1.4.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "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": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" } }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" + }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, "flux": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", @@ -4058,19 +5601,19 @@ } }, "follow-redirects": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", - "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "requires": { - "debug": "^3.1.0" + "debug": "^3.2.6" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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" } } } @@ -4088,26 +5631,48 @@ "for-in": "^1.0.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "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==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -4126,482 +5691,46 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "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": "^3.0.0", + "jsonfile": "^4.0.0", "universalify": "^0.1.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", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "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.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "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.2", - "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.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "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.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.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 - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": 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.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "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.6.2", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "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, - "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, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.6.tgz", + "integrity": "sha512-vfmKZp3XPM36DNF0qhW+Cdxk7xm7gTEHY1clv1Xq1arwRQuKZgAhw+NZNWbJBtuaNxzNXwhfdPYRrvIbjfS33A==", + "optional": true }, "fullscreen": { "version": "1.1.1", @@ -4627,19 +5756,28 @@ "integrity": "sha1-ZZEzRNsl/sdeS6kxTHxzlwtRR68=" }, "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "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==" }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } }, "get-value": { "version": "2.0.6", @@ -4655,9 +5793,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4667,93 +5805,90 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "^2.0.0" + "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" + } + } } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } + "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": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "^3.0.0" } }, "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "requires": { "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "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=" + } } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growly": { "version": "1.3.0", @@ -4761,73 +5896,28 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", "requires": { - "duplexer": "^0.1.1" + "duplexer": "^0.1.1", + "pify": "^3.0.0" } }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "requires": { - "async": "^1.4.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "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" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" } }, "har-schema": { @@ -4836,14 +5926,19 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4858,6 +5953,13 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.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=" + } } }, "has-flag": { @@ -4865,6 +5967,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "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=" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -4884,6 +5991,11 @@ "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", @@ -4904,18 +6016,64 @@ } }, "hash.js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", - "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "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.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "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==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^0.4.0" + } }, "hmac-drbg": { "version": "1.0.1", @@ -4929,30 +6087,13 @@ }, "hoist-non-react-statics": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "resolved": false, "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + "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==" }, "hpack.js": { "version": "2.1.6", @@ -4965,10 +6106,20 @@ "wbuf": "^1.1.0" } }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" }, "html-encoding-sniffer": { "version": "1.0.2", @@ -4984,84 +6135,77 @@ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.16.tgz", - "integrity": "sha512-zP5EfLSpiLRp0aAgud4CQXPQZm9kXwWjR/cF0PfdOj+jjWnOaCgeZcll4kYXSvIBPeUMmyaSc7mM4IDtA+kboA==", + "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==", "requires": { "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.15.x", - "he": "1.1.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.3.x" - } - }, - "html-webpack-plugin": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", - "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", - "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "uglify-js": "3.4.x" }, "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "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": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "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==" + } } } } }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "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==", "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" + "html-minifier": "^3.5.20", + "loader-utils": "^1.1.0", + "lodash": "^4.17.11", + "pretty-error": "^2.1.1", + "tapable": "^1.1.0", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" }, "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "requires": { - "domelementtype": "1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, @@ -5082,9 +6226,9 @@ } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" }, "http-proxy": { "version": "1.17.0", @@ -5097,118 +6241,14 @@ } }, "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "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" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - } + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "http-signature": { @@ -5232,9 +6272,9 @@ "integrity": "sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao=" }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -5245,39 +6285,82 @@ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" }, "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", + "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", "requires": { - "postcss": "^6.0.1" + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "requires": { + "harmony-reflect": "^1.4.6" } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" }, - "import-lazy": { + "import-cwd": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.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" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } }, "import-local": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", - "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", + "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": "^2.0.0", + "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" } }, @@ -5286,14 +6369,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "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" - } - }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -5315,7 +6390,7 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { @@ -5324,64 +6399,49 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.4", + "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.3.0", + "lodash": "^4.17.11", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", + "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "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": "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" } } } }, "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "requires": { - "meow": "^3.3.0" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -5391,19 +6451,24 @@ } }, "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=" + "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", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + "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==" }, "is-absolute-url": { "version": "2.1.0", @@ -5416,16 +6481,6 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "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-arrayish": { @@ -5442,29 +6497,34 @@ } }, "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "^1.0.0" - } + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" }, "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { - "ci-info": "^1.0.0" + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, "is-data-descriptor": { @@ -5473,16 +6533,6 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "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-date-object": { @@ -5512,80 +6562,40 @@ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "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": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "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=" }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, "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-obj": { @@ -5593,21 +6603,6 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -5642,26 +6637,11 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -5670,48 +6650,47 @@ "has": "^1.0.1" } }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", + "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" }, "is-stream": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "requires": { "html-comment-regex": "^1.1.0" } }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", "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", @@ -5751,747 +6730,1172 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", - "requires": { - "async": "^2.1.4", - "compare-versions": "^3.1.0", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-report": "^1.1.4", - "istanbul-lib-source-maps": "^1.2.4", - "istanbul-reports": "^1.3.0", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - }, - "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" - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", - "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==" - }, - "istanbul-lib-hook": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", - "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", - "requires": { - "append-transform": "^1.0.0" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" }, "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "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==", "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" + "@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" } }, "istanbul-lib-report": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "requires": { - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "^1.0.0" + "has-flag": "^3.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "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==", "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" } }, "istanbul-reports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "requires": { - "handlebars": "^4.0.3" + "handlebars": "^4.1.2" } }, "jest": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", + "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", "requires": { - "jest-cli": "^20.0.4" + "import-local": "^2.0.0", + "jest-cli": "^24.7.1" }, "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, "jest-cli": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", - "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", "requires": { - "ansi-escapes": "^1.4.0", - "callsites": "^2.0.0", - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.1", - "istanbul-lib-coverage": "^1.0.1", - "istanbul-lib-instrument": "^1.4.2", - "istanbul-lib-source-maps": "^1.1.0", - "jest-changed-files": "^20.0.3", - "jest-config": "^20.0.4", - "jest-docblock": "^20.0.3", - "jest-environment-jsdom": "^20.0.3", - "jest-haste-map": "^20.0.4", - "jest-jasmine2": "^20.0.4", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve-dependencies": "^20.0.3", - "jest-runtime": "^20.0.4", - "jest-snapshot": "^20.0.3", - "jest-util": "^20.0.3", - "micromatch": "^2.3.11", - "node-notifier": "^5.0.2", - "pify": "^2.3.0", - "slash": "^1.0.0", - "string-length": "^1.0.1", - "throat": "^3.0.0", - "which": "^1.2.12", - "worker-farm": "^1.3.1", - "yargs": "^7.0.2" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.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", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" } } } }, "jest-changed-files": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", - "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" + "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==", + "requires": { + "@jest/types": "^24.8.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } }, "jest-config": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", - "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", "requires": { - "chalk": "^1.1.3", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^20.0.3", - "jest-environment-node": "^20.0.3", - "jest-jasmine2": "^20.0.4", - "jest-matcher-utils": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-validate": "^20.0.3", - "pretty-format": "^20.0.3" + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.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": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "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==", "requires": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" } }, "jest-docblock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", - "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "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==", + "requires": { + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0" + } }, "jest-environment-jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", - "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", + "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==", "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3", - "jsdom": "^9.12.0" + "@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", + "jsdom": "^11.5.1" + } + }, + "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==", + "requires": { + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", + "jsdom": "^14.0.0" + }, + "dependencies": { + "jsdom": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", + "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", + "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" + } + }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "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" + } + } } }, "jest-environment-node": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", - "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", + "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==", "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3" + "@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-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==" + }, "jest-haste-map": { - "version": "20.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", - "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", + "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", "requires": { + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^20.0.3", - "micromatch": "^2.3.11", - "sane": "~1.6.0", - "worker-farm": "^1.3.1" + "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", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" }, "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "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.1", + "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": "4.1.1", + "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.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.3", + "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.1", + "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.3", + "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.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.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" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "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.0", + "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.6.3", + "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.0", + "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.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "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.0.3", + "bundled": true, + "optional": true + } } } } }, "jest-jasmine2": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", - "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-matchers": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-snapshot": "^20.0.3", - "once": "^1.4.0", - "p-map": "^1.1.1" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.8.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", + "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==", + "requires": { + "pretty-format": "^24.8.0" } }, "jest-matcher-utils": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", "requires": { - "chalk": "^1.1.3", - "pretty-format": "^20.0.3" - } - }, - "jest-matchers": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", - "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", - "requires": { - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3" + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" } }, "jest-message-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", "requires": { - "chalk": "^1.1.3", - "micromatch": "^2.3.11", - "slash": "^1.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.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-mock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "requires": { + "@jest/types": "^24.8.0" + } + }, + "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==" }, "jest-regex-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==" }, "jest-resolve": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", - "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", + "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", "requires": { - "browser-resolve": "^1.11.2", - "is-builtin-module": "^1.0.0", - "resolve": "^1.3.2" + "@jest/types": "^24.7.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" } }, "jest-resolve-dependencies": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", - "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "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==", "requires": { - "jest-regex-util": "^20.0.3" + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" } }, - "jest-runtime": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", - "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", + "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==", "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^20.0.3", - "babel-plugin-istanbul": "^4.0.0", - "chalk": "^1.1.3", - "convert-source-map": "^1.4.0", - "graceful-fs": "^4.1.11", - "jest-config": "^20.0.4", - "jest-haste-map": "^20.0.4", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-util": "^20.0.3", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "strip-bom": "3.0.0", - "yargs": "^7.0.2" + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.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-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" }, "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "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": { - "arr-flatten": "^1.0.1" + "@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" } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, - "jest-snapshot": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", - "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", + "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==", "requires": { - "chalk": "^1.1.3", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-util": "^20.0.3", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", + "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-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", + "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" + } + } + } + }, + "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==" + }, + "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==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.8.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", + "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^20.0.3" + "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==" + } } }, "jest-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-message-util": "^20.0.3", - "jest-mock": "^20.0.3", - "jest-validate": "^20.0.3", - "leven": "^2.1.0", - "mkdirp": "^0.5.1" + "@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", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "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==" + } } }, "jest-validate": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", - "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", "requires": { - "chalk": "^1.1.3", - "jest-matcher-utils": "^20.0.3", + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", "leven": "^2.1.0", - "pretty-format": "^20.0.3" + "pretty-format": "^24.8.0" } }, - "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==" + "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==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.4.1", + "jest-watcher": "^24.3.0", + "slash": "^2.0.0", + "string-length": "^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" + } + } + } + }, + "jest-watcher": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "requires": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.8.0", + "string-length": "^2.0.0" + } + }, + "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==", + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "requires": { "argparse": "^1.0.7", - "esprima": "^2.6.0" + "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "requires": { - "abab": "^1.0.3", - "acorn": "^4.0.4", - "acorn-globals": "^3.1.0", + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", "array-equal": "^1.0.0", - "content-type-parser": "^1.0.1", "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "escodegen": "^1.6.1", - "html-encoding-sniffer": "^1.0.1", - "nwmatcher": ">= 1.3.9 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.79.0", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.2", - "webidl-conversions": "^4.0.0", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^4.3.0", - "xml-name-validator": "^2.0.1" + "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", + "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + "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==" } } }, "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { "version": "0.2.3", @@ -6499,9 +7903,9 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "version": "0.4.1", + "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", @@ -6511,6 +7915,11 @@ "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", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -6522,14 +7931,24 @@ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "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=" + } + } }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } @@ -6551,34 +7970,56 @@ } }, "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" - }, - "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", + "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", "requires": { - "graceful-fs": "^4.1.9" + "array-includes": "^3.0.3" } }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "jszip": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", + "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", "requires": { - "package-json": "^4.0.0" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "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" + }, + "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": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "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", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" } }, "lazy-cache": { @@ -6587,13 +8028,18 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, + "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": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -6608,22 +8054,33 @@ "type-check": "~0.3.2" } }, + "libcimsvg": { + "version": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git#7e5c48fff7eced878da471b5c69ab4a8b575a6c9", + "from": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git" + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "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" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "loader-fs-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "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==", "requires": { "find-cache-dir": "^0.1.1", "mkdirp": "0.5.1" @@ -6667,74 +8124,114 @@ } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { - "big.js": "^3.1.3", + "big.js": "^5.2.2", "emojis-list": "^2.0.0", - "json5": "^0.5.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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } } }, "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.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "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==" + }, + "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", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" - }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, "lodash.flow": { "version": "3.5.0", "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": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, + "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", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.sortby": { + "version": "4.7.0", + "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.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -6754,9 +8251,14 @@ }, "lodash.throttle": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "resolved": false, "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", @@ -6767,11 +8269,6 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -6780,46 +8277,37 @@ "js-tokens": "^3.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", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "requires": { - "pify": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "dependencies": { "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==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" } } }, @@ -6831,16 +8319,24 @@ "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-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", "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", @@ -6849,36 +8345,41 @@ "object-visit": "^1.0.0" } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "requires": { - "mimic-fn": "^1.0.0" + "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": { @@ -6890,45 +8391,44 @@ "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=", + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", "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": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" } }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "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" + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" + }, "methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "resolved": false, "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=" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -6947,6 +8447,13 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } } }, "miller-rabin": { @@ -6964,16 +8471,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -6981,6 +8488,16 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, + "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==", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -7000,9 +8517,26 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } }, "mixin-deep": { "version": "1.3.1", @@ -7023,18 +8557,54 @@ } } }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "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=" + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "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==" }, "multicast-dns": { "version": "6.2.3", @@ -7056,28 +8626,34 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "optional": true }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } } }, "natural-compare": { @@ -7086,19 +8662,19 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==" + "version": "2.6.1", + "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", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { "version": "2.3.2", @@ -7135,9 +8711,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "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==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -7146,7 +8722,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -7160,7 +8736,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7171,26 +8747,61 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, "node-notifier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", - "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", "requires": { "growly": "^1.3.0", - "semver": "^5.4.1", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "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==", + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "normalize-path": { @@ -7207,15 +8818,9 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { - "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" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" }, "npm-run-path": { "version": "2.0.2", @@ -7226,9 +8831,9 @@ } }, "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "requires": { "boolbase": "~1.0.0" } @@ -7243,18 +8848,19 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==" }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -7274,26 +8880,18 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "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" - } } } }, "object-hash": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", - "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -7303,13 +8901,35 @@ "isobject": "^3.0.0" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "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==", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.pick": { @@ -7320,6 +8940,17 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -7334,9 +8965,9 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", @@ -7355,27 +8986,29 @@ } }, "opn": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", - "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "requires": { "is-wsl": "^1.1.0" } }, "optimist": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "resolved": false, "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - } + } + }, + "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==", + "requires": { + "cssnano": "^4.1.0", + "last-call-webpack-plugin": "^3.0.0" } }, "optionator": { @@ -7389,14 +9022,21 @@ "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=" + } } }, "original": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", - "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "requires": { - "url-parse": "~1.4.0" + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -7404,17 +9044,14 @@ "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": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "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": { - "lcid": "^1.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "os-tmpdir": { @@ -7422,25 +9059,43 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "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", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "requires": { + "p-reduce": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "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.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "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": { @@ -7448,26 +9103,30 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" }, - "p-try": { + "p-reduce": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.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==" }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "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=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } }, "param-case": { "version": "2.1.1", @@ -7477,51 +9136,52 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "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": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "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.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascalcase": { "version": "0.1.1", @@ -7559,13 +9219,13 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "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", + "resolved": false, "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { "isarray": "0.0.1" @@ -7579,19 +9239,23 @@ } }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "pify": "^3.0.0" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -7602,13 +9266,13 @@ }, "performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "resolved": false, "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pinkie": { "version": "2.0.4", @@ -7623,33 +9287,105 @@ "pinkie": "^2.0.0" } }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "requires": { - "find-up": "^2.1.0" + "node-modules-regexp": "^1.0.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "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=" + } + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==", + "requires": { + "ts-pnp": "^1.0.0" + } }, "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "requires": { "async": "^1.5.2", "debug": "^2.2.0", "mkdirp": "0.5.x" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -7659,1147 +9395,833 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^6.1.0" }, "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "has-flag": "^3.0.0" } } } }, + "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==", + "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-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==", + "requires": { + "postcss": "^7.0.2" + } + }, "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" + "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": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "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==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.0" } }, "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.0" } }, "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.0" } }, "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "requires": { - "postcss": "^5.0.16" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.0" } }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" } }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" } }, "postcss-flexbugs-fixes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", - "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", + "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==", "requires": { - "postcss": "^6.0.1" + "postcss": "^7.0.0" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "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==", + "requires": { + "lodash.template": "^4.2.4", + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" } }, "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "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==", "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" + "cosmiconfig": "^4.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": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", - "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "requires": { "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^1.2.0", - "schema-utils": "^0.3.0" + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" } }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" } }, "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" } }, "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", "vendors": "^1.0.0" }, "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "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=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", "uniqs": "^2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } } }, "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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=", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { - "postcss": "^6.0.1" + "postcss": "^7.0.5" } }, "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "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==", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" } }, "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", "requires": { "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "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==", + "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==", + "requires": { + "@csstools/normalize.css": "^9.0.1", + "browserslist": "^4.1.1", + "postcss": "^7.0.2", + "postcss-browser-comments": "^2.0.0" } }, "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "requires": { - "postcss": "^5.0.5" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "requires": { "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "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==", + "requires": { + "autoprefixer": "^9.4.9", + "browserslist": "^4.4.2", + "caniuse-lite": "^1.0.30000939", + "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", + "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-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-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" } }, "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "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==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" } }, "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "requires": { - "flatten": "^1.0.2", + "cssesc": "^3.0.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } }, "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" } }, "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", "uniqs": "^2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } } }, "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + "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-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "prelude-ls": { @@ -8807,20 +10229,10 @@ "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=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz", + "integrity": "sha512-ujANBhiUsl9AhREUDUEY1GPOharMGm8x8juS7qOHybcLi7XsKfrYQ88hSly1l2i0klXHTDYrlL8ihMCG55Dc3w==" }, "pretty-error": { "version": "2.1.1", @@ -8832,12 +10244,21 @@ } }, "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "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==", "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "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==" + } } }, "private": { @@ -8856,9 +10277,9 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { "version": "7.3.1", @@ -8868,39 +10289,55 @@ "asap": "~2.0.3" } }, - "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", + "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" }, "dependencies": { - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "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": { - "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" + "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==", + "requires": { + "xtend": "^4.0.1" + } + }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "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==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" + "ipaddr.js": "1.9.0" } }, "prr": { @@ -8908,26 +10345,52 @@ "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.1.28", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz", - "integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw==" + "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==" }, "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { @@ -8950,15 +10413,6 @@ "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", @@ -8970,9 +10424,9 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, "raf": { "version": "3.4.0", @@ -8982,27 +10436,10 @@ "performance-now": "^2.1.0" } }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } @@ -9017,71 +10454,59 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" }, "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - } - }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + "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" + } } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "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==", "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", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } + "babel-runtime": "^6.26.0", + "dom-align": "^1.7.0", + "prop-types": "^15.5.8", + "rc-util": "^4.0.4" + } + }, + "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==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "css-animation": "^1.3.2", + "prop-types": "15.x", + "raf": "^3.4.0", + "react-lifecycles-compat": "^3.0.4" } }, "rc-slider": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.0.tgz", - "integrity": "sha512-Ek68lWlMZm2b9N0AevvBvd/1GRG+n/kvf2wpvSz4xkXawc2SXpF64auU2qF6eyvv98qhGFoDeyCELMATYddJkA==", + "version": "8.6.11", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.11.tgz", + "integrity": "sha512-k6dPXA7NkjSp5NCyjAJbRxnttj/U7qEMydT2Y/VY64INyoznMx968xz8s4KX1iTiTA69X7EBMD5TWM3cdsfzRg==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.5", @@ -9089,307 +10514,119 @@ "rc-tooltip": "^3.7.0", "rc-util": "^4.0.4", "shallowequal": "^1.0.1", - "warning": "^3.0.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==", + "requires": { + "babel-runtime": "6.x", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.2" + } + }, + "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==", + "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": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.6.0.tgz", + "integrity": "sha512-rbgrzm1/i8mgfwOI4t1CwWK7wGe+OwX+dNa7PVMgxZYPBADGh86eD4OcJO1UKGeajIMDUUKMluaZxvgraQIOmw==", + "requires": { + "add-dom-event-listener": "^1.1.0", + "babel-runtime": "6.x", + "prop-types": "^15.5.10", + "shallowequal": "^0.2.2" }, "dependencies": { - "add-dom-event-listener": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", - "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", - "requires": { - "object-assign": "4.x" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "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" - } - }, - "component-classes": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", - "requires": { - "component-indexof": "0.0.3" - } - }, - "component-indexof": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, - "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" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "css-animation": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.4.1.tgz", - "integrity": "sha1-W4gTEl3g+7uwu+G0cq6EIhRpt6g=", - "requires": { - "babel-runtime": "6.x", - "component-classes": "^1.2.5" - } - }, - "dom-align": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.6.7.tgz", - "integrity": "sha512-FrHttKVCqdHaDyVjygY+8kRhcNOJEdvAkc2ltppJUz71ekgpzIOuLgsOIKVqzdETI2EocmW2DzF+uP365qcR5Q==" - }, - "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=" - } - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "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.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" - } - }, - "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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - } - } - }, - "rc-align": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.3.5.tgz", - "integrity": "sha512-V1AN/gMNiJ3vOzbY/H3CTxhzYH+Ri2KlsEpo1SN8/SYmI4I/ZfQpScFAgmERuIGcLStA2sOEeBNVpH2FaOd2hA==", - "requires": { - "babel-runtime": "^6.26.0", - "dom-align": "1.x", - "prop-types": "^15.5.8", - "rc-util": "^4.0.4" - } - }, - "rc-animate": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.4.tgz", - "integrity": "sha512-DjJLTUQj7XKKcuS8cczN0uOLfuSmgrVXFGieP1SZc87xUUTFGh8B/KjNmEtlfvxkSrSuVfb2rrEPER4SqKUtEA==", - "requires": { - "babel-runtime": "6.x", - "css-animation": "^1.3.2", - "prop-types": "15.x" - } - }, - "rc-tooltip": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.0.tgz", - "integrity": "sha512-xEoUMatXp8OEL61UFH0+NrC39nkKzpOBhLrJCnnRpDRduU8L3DOhF6CNlIMkvg68hxlGGdquFtFw2t+1xNLX5A==", - "requires": { - "babel-runtime": "6.x", - "prop-types": "^15.5.8", - "rc-trigger": "^2.2.2" - } - }, - "rc-trigger": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.3.3.tgz", - "integrity": "sha512-j8MHq0jES4vXShFbSExyty/WVR238lrZzUfsSaIDeiziBIiUAOP6SR2HBEi2gSGK239Jm3bWIJvwGA85kFMgmQ==", - "requires": { - "babel-runtime": "6.x", - "create-react-class": "15.x", - "prop-types": "15.x", - "rc-align": "2.x", - "rc-animate": "2.x", - "rc-util": "^4.3.0" - } - }, - "rc-util": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.3.1.tgz", - "integrity": "sha512-OVNMKLePnwn0dCX/Gpc+/kGEDpmMo1Rfesg9xFcAckRd+D+YwVqV+dUJMHugP+4nRtbXi55o0HwPlkKIApYfQA==", - "requires": { - "add-dom-event-listener": "1.x", - "babel-runtime": "6.x", - "prop-types": "^15.5.10", - "shallowequal": "^0.2.2" - }, - "dependencies": { - "shallowequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", - "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", - "requires": { - "lodash.keys": "^3.1.2" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "shallowequal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", - "integrity": "sha512-zlVXeVUKvo+HEv1e2KQF/csyeMKx2oHvatQ9l6XjCUj3agvC8XGf6R9HvIPDSmp8FNPvx7b5kaEJTRi7CqxtEw==" - }, - "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==" - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", + "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "requires": { - "loose-envify": "^1.0.0" + "lodash.keys": "^3.1.2" } } } }, "re-resizable": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-4.4.8.tgz", - "integrity": "sha512-5Nm4FL5wz41/5SYz8yJIM1kCcftxNPXxv3Yfa5qhkrGasHPgYzmzbbu1pcYM9vuCHog79EVwKWuz7zxDH52Gfw==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-4.5.1.tgz", + "integrity": "sha512-amjlp4IuTSHs4XG1bP5WbAgBDIZitODKIsqcpZsNhEBYYEidol0dlP4S9zHiN3iu6Tff4WfYuruihLgN7RJeQw==" }, "react": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", + "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", "requires": { - "create-react-class": "^15.6.0", - "fbjs": "^0.8.9", "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" + } + }, + "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==", + "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" }, "dependencies": { - "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==", + "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==" + }, + "promise": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", + "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "asap": "~2.0.6" } }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "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" + "performance-now": "^2.1.0" } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "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==" }, - "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" - } - }, - "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==" + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" } } }, "react-base16-styling": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz", - "integrity": "sha1-OFjyTpxN2MvT9wLz901YHKKRcmk=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", "requires": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -9538,38 +10775,12 @@ } }, "react-contexify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-3.0.0.tgz", - "integrity": "sha512-34C3tDh/zmzt9Tk0VlWodJrLeGtsWvYIFYxi+k/RJgHAidFBdDqqXmxVlz4kfly6x/MqXuu/Dwmioij7IMM1bw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-3.0.3.tgz", + "integrity": "sha512-Bk6r238FXKJptI2+bZff+JoyI1RTVW0ynv5hwlT+hrGFS81U5BGO5akzyWLXljFoJitHR20W/l6pSLasp7FeLQ==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" - }, - "dependencies": { - "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" - } - }, - "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - } } }, "react-d3": { @@ -9582,28 +10793,80 @@ } }, "react-dev-utils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.1.tgz", - "integrity": "sha512-+y92rG6pmXt3cpcg/NGmG4w/W309tWNSmyyPL8hCMxuCSg2UP/hUg3npACj2UZc8UKVSXexyLrCnxowizGoAsw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", + "integrity": "sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ==", "requires": { + "@babel/code-frame": "7.0.0", "address": "1.0.3", - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "cross-spawn": "5.1.0", + "browserslist": "4.5.4", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", - "filesize": "3.5.11", - "global-modules": "1.0.0", - "gzip-size": "3.0.0", - "inquirer": "3.3.0", - "is-root": "1.0.0", - "opn": "5.2.0", - "react-error-overlay": "^4.0.0", - "recursive-readdir": "2.2.1", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.1.1", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.0.0", + "immer": "1.10.0", + "inquirer": "6.2.2", + "is-root": "2.0.0", + "loader-utils": "1.2.3", + "opn": "5.4.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^5.1.6", + "recursive-readdir": "2.2.2", "shell-quote": "1.6.1", - "sockjs-client": "1.1.4", - "strip-ansi": "3.0.1", + "sockjs-client": "1.3.0", + "strip-ansi": "5.2.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.5.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", + "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", + "requires": { + "caniuse-lite": "^1.0.30000955", + "electron-to-chromium": "^1.3.122", + "node-releases": "^1.1.13" + } + }, + "inquirer": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "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.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.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==", + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "react-display-name": { @@ -9612,117 +10875,31 @@ "integrity": "sha1-9QIE1DDJyoGbwLreAwbpF12NGYc=" }, "react-dnd": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.5.4.tgz", - "integrity": "sha512-y9YmnusURc+3KPgvhYKvZ9oCucj51MSZWODyaeV0KFU0cquzA7dCD1g/OIYUKtNoZ+MXtacDngkdud2TklMSjw==", + "version": "2.6.0", + "resolved": "http://registry.npmjs.org/react-dnd/-/react-dnd-2.6.0.tgz", + "integrity": "sha1-f6JWds+CfViokSk+PBq1naACVFo=", "requires": { "disposables": "^1.0.1", - "dnd-core": "^2.5.4", + "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": { - "disposables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.2.tgz", - "integrity": "sha1-NsamdEdfVaLWkTVnpgFETkh7S24=" - }, - "dnd-core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.5.4.tgz", - "integrity": "sha512-BcI782MfTm3wCxeIS5c7tAutyTwEIANtuu3W6/xkoJRwiqhRXKX3BbGlycUxxyzMsKdvvoavxgrC3EMPFNYL9A==", - "requires": { - "asap": "^2.0.6", - "invariant": "^2.0.0", - "lodash": "^4.2.0", - "redux": "^3.7.1" - } - }, - "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" - } - }, "hoist-non-react-statics": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", - "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" - }, - "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" - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" - }, - "lodash-es": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.5.tgz", - "integrity": "sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw==" - }, - "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" - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "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": "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==" } } }, "react-dnd-html5-backend": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.5.4.tgz", - "integrity": "sha512-jDqAkm/hI8Tl4HcsbhkBgB6HgpJR1e+ML1SbfxaegXYiuMxEVQm0FOwEH5WxUoo6fmIG4N+H0rSm59POuZOCaA==", + "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=", "requires": { "lodash": "^4.2.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" - } } }, "react-dnd-scrollzone": { @@ -9738,476 +10915,178 @@ } }, "react-dom": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", + "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", "requires": { - "fbjs": "^0.8.9", "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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==" - } + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" } }, "react-draggable": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", - "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.0.tgz", + "integrity": "sha512-U7/jD0tAW4T0S7DCPK0kkKLyL0z61sC/eqU+NUfDjnq+JtBKaYKDHpsK2wazctiA4alEzCXUnzkREoxppOySVw==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" - }, - "dependencies": { - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "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" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "^3.0.0" - } - }, - "node-fetch": { - "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" - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - } } }, "react-error-overlay": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.0.tgz", - "integrity": "sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw==" + "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==" }, "react-fullscreenable": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.4.3.tgz", - "integrity": "sha512-SJtFN90hkVp18HnfS0CXodHzVByAK66JRSxAhMXNnE95q4Z3prBpZkh0G724uVi4NBRRPI4znHeTNFQStSdtJA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.5.0.tgz", + "integrity": "sha512-z03SBarLfdZjWzK/nARyuylLBJnii1nnkCgU/JA1QOpav7lF7RbX3w+vTQ/9ZutOAo4clPXDtpYeb2xXurY6fA==", "requires": { "classnames": "^2.2.5", "fullscreen": "^1.1.1", "react-display-name": "^0.2.0" - }, - "dependencies": { - "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=" - } } }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, "react-json-view": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.17.0.tgz", - "integrity": "sha512-GbbsY/kDe0RyPCj4MVPs7Ds+hSwB8yC7iR4yP0IgrNZBFBaH8N9kvjZErn/vXFzBIvsvoRFbsf8GcnkXTCXcGA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.19.1.tgz", + "integrity": "sha512-u5e0XDLIs9Rj43vWkKvwL8G3JzvXSl6etuS5G42a8klMohZuYFQzSN6ri+/GiBptDqlrXPTdExJVU7x9rrlXhg==", "requires": { "flux": "^3.1.3", - "react-base16-styling": "^0.5.3", - "react-textarea-autosize": "^5.1.0" + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^6.1.0" } }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "react-notification-system": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.16.tgz", - "integrity": "sha1-m52iCw00eGtgBXxStCUW6hKVN0o=", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.17.tgz", + "integrity": "sha1-pg7du2IiWtj5/F14N1Rr9s2zaBg=", "requires": { "create-react-class": "^15.5.1", "object-assign": "^4.0.1", "prop-types": "^15.5.6" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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==" - } } }, "react-rnd": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-7.4.0.tgz", - "integrity": "sha512-za9maWDiG4dV6GG2nFyMlV4eI2jBvAhcjH6o+dOoiyOclH4IH6OR/rqIopAkTdg/MqiLDMZQsnPNzpgrJZW7jw==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-7.4.3.tgz", + "integrity": "sha512-TLQ35nqXup7rC63qAETebbO6Znilr20CroTTeAdlYu8nvRSwB7BrmPKZhHB2GgeiSucOoeCyAA9pHPhbMpEd/Q==", "requires": { - "re-resizable": "^4.4.5", + "re-resizable": "4.5.1", "react-draggable": "^3.0.5" } }, "react-router": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", - "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", "requires": { "history": "^4.7.2", - "hoist-non-react-statics": "^2.3.0", - "invariant": "^2.2.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", "loose-envify": "^1.3.1", "path-to-regexp": "^1.7.0", - "prop-types": "^15.5.4", - "warning": "^3.0.0" + "prop-types": "^15.6.1", + "warning": "^4.0.1" }, "dependencies": { - "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" - } - }, - "history": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", - "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", - "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", - "value-equal": "^0.4.0", - "warning": "^3.0.0" - } - }, "hoist-non-react-statics": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", - "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" - }, - "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" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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=", - "requires": { - "isarray": "0.0.1" - } - }, - "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" - } - }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, - "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==" - }, - "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==" - }, - "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" - } + "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==" } } }, "react-router-dom": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", - "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", + "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==", "requires": { "history": "^4.7.2", - "invariant": "^2.2.2", + "invariant": "^2.2.4", "loose-envify": "^1.3.1", - "prop-types": "^15.5.4", - "react-router": "^4.2.0", - "warning": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "history": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", - "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", - "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", - "value-equal": "^0.4.0", - "warning": "^3.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, - "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==" - }, - "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==" - }, - "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" - } - } + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" } }, "react-scripts": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.1.4.tgz", - "integrity": "sha512-UVZIujEIT9BGbx+NGvyfS92eOrNIIpqqFi1FP7a0O9l94A/XV7bhPk70SfDKaXZouCX81tFdXo0948DjhCEgGw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.1.tgz", + "integrity": "sha512-LKEjBhVpEB+c312NeJhzF+NATxF7JkHNr5GhtwMeRS1cMeLElMeIu8Ye7WGHtDP7iz7ra4ryy48Zpo6G/cwWUw==", "requires": { - "autoprefixer": "7.1.6", - "babel-core": "6.26.0", - "babel-eslint": "7.2.3", - "babel-jest": "20.0.3", - "babel-loader": "7.1.2", - "babel-preset-react-app": "^3.1.1", - "babel-runtime": "6.26.0", - "case-sensitive-paths-webpack-plugin": "2.1.1", - "chalk": "1.1.3", - "css-loader": "0.28.7", - "dotenv": "4.0.0", + "@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", + "case-sensitive-paths-webpack-plugin": "2.2.0", + "css-loader": "2.1.1", + "dotenv": "6.2.0", "dotenv-expand": "4.2.0", - "eslint": "4.10.0", - "eslint-config-react-app": "^2.1.0", - "eslint-loader": "1.9.0", - "eslint-plugin-flowtype": "2.39.1", - "eslint-plugin-import": "2.8.0", - "eslint-plugin-jsx-a11y": "5.1.1", - "eslint-plugin-react": "7.4.0", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.5", - "fs-extra": "3.0.1", - "fsevents": "^1.1.3", - "html-webpack-plugin": "2.29.0", - "jest": "20.0.4", - "object-assign": "4.1.1", - "postcss-flexbugs-fixes": "3.2.0", - "postcss-loader": "2.0.8", - "promise": "8.0.1", - "raf": "3.4.0", - "react-dev-utils": "^5.0.1", - "resolve": "1.6.0", - "style-loader": "0.19.0", - "sw-precache-webpack-plugin": "0.11.4", - "url-loader": "0.6.2", - "webpack": "3.8.1", - "webpack-dev-server": "2.9.4", - "webpack-manifest-plugin": "1.3.2", - "whatwg-fetch": "2.0.3" - }, - "dependencies": { - "promise": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", - "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", - "requires": { - "asap": "~2.0.3" - } - } + "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", + "html-webpack-plugin": "4.0.0-beta.5", + "identity-obj-proxy": "3.0.0", + "is-wsl": "^1.1.0", + "jest": "24.7.1", + "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", + "postcss-flexbugs-fixes": "4.1.0", + "postcss-loader": "3.0.0", + "postcss-normalize": "7.0.1", + "postcss-preset-env": "6.6.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-sortable-tree": { "version": "0.1.21", "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", - "integrity": "sha512-+yRojiLuh/jHI3qLV9sGYRIYuF7dPm0r2HyCvlnVBV6sYHKslNvNg3dyWa+owqhOfHiIlTArqP1AK9ELFzlZLg==", + "integrity": "sha1-JqBd4gEv+kalpNsrcSdDcSV9rrg=", "requires": { "lodash.isequal": "^4.4.0", "prop-types": "^15.5.8", @@ -10218,49 +11097,18 @@ } }, "react-svg-pan-zoom": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.15.1.tgz", - "integrity": "sha512-A5zlNKO9Q77oP9jnGE+GG423RB3hg28ZyDrULciexu78rU9WaR4IiqR+egzZA+qUKYYyP7oJiedYspzekAqbtg==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.18.0.tgz", + "integrity": "sha1-HwM9nbHIK5u0lOIZYjcnb2lOesk=", "requires": { - "prop-types": "^15.5.10", - "transformation-matrix": "^1.7.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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==" - } + "prop-types": "^15.6.2", + "transformation-matrix": "^1.12.0" } }, "react-textarea-autosize": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz", - "integrity": "sha512-bx6z2I35aapr71ggw2yZIA4qhmqeTa4ZVsSaTeFvtf9kfcZppDBh2PbMt8lvbdmzEk7qbSFhAxR9vxEVm6oiMg==", + "version": "6.1.0", + "resolved": "http://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" } @@ -10278,41 +11126,22 @@ } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "path-type": "^3.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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "requires": { - "find-up": "^1.0.0", - "read-pkg": "^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" - } - }, - "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" - } - } + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" } }, "readable-stream": { @@ -10330,73 +11159,40 @@ } }, "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "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.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "requires": { - "minimatch": "3.0.3" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "requires": { - "brace-expansion": "^1.0.0" - } - } + "minimatch": "3.0.4" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "^0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" } }, "regenerate": { @@ -10404,29 +11200,27 @@ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", "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==", + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", + "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", "private": "^0.1.6" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -10436,42 +11230,38 @@ "safe-regex": "^1.1.0" } }, + "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==" + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "^1.0.1" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" } }, "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==" }, "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", "requires": { "jsesc": "~0.5.0" }, @@ -10483,6 +11273,16 @@ } } }, + "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", @@ -10494,67 +11294,92 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "requires": { "css-select": "^1.1.0", - "dom-converter": "~0.1", - "htmlparser2": "~3.3.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", "strip-ansi": "^3.0.0", - "utila": "~0.3" + "utila": "^0.4.0" }, "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "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" + } } } }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", "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" - } + "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.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" }, "dependencies": { "punycode": { @@ -10563,38 +11388,53 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" } } } }, + "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==", + "requires": { + "lodash": "^4.17.11" + } + }, + "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==", + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + "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": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } + "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", @@ -10602,11 +11442,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", - "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-cwd": { @@ -10615,28 +11455,17 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "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=" - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "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==" }, "resolve-url": { "version": "0.2.1", @@ -10657,20 +11486,22 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -10682,6 +11513,11 @@ "inherits": "^2.0.1" } }, + "rsvp": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -10690,17 +11526,20 @@ "is-promise": "^2.1.0" } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { - "rx-lite": "*" + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "requires": { + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -10722,35 +11561,21 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", - "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "requires": { - "anymatch": "^1.3.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^1.8.0", - "minimatch": "^3.0.2", + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" + "walker": "~1.0.5" }, "dependencies": { - "bser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", - "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "fb-watchman": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", - "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", - "requires": { - "bser": "1.0.2" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -10758,17 +11583,97 @@ } } }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "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" + }, + "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==", + "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": { + "version": "6.0.2", + "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==", + "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==" + } + } + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "saxes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", + "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", "requires": { - "ajv": "^5.0.0" + "xmlchars": "^1.3.1" + } + }, + "scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "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==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, "select-hose": { @@ -10777,25 +11682,17 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", "requires": { "node-forge": "0.7.5" } }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "^5.0.3" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" }, "send": { "version": "0.16.2", @@ -10817,13 +11714,31 @@ "statuses": "~1.4.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, + "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==" + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -10836,6 +11751,21 @@ "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "serve-static": { @@ -10849,11 +11779,6 @@ "send": "0.16.2" } }, - "serviceworker-cache-polyfill": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", - "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10904,6 +11829,42 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "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", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -10938,16 +11899,38 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "slash": { + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sisteransi": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", + "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -10966,6 +11949,14 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -10982,6 +11973,11 @@ "is-extendable": "^0.1.0" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -11032,6 +12028,11 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -11041,25 +12042,15 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { "kind-of": "^3.2.0" - }, - "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" - } - } } }, "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "requires": { "faye-websocket": "^0.10.0", - "uuid": "^2.0.2" + "uuid": "^3.0.1" }, "dependencies": { "faye-websocket": { @@ -11069,39 +12060,36 @@ "requires": { "websocket-driver": ">=0.5.1" } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } }, "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", "json3": "^3.3.2", - "url-parse": "^1.1.8" - } - }, - "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" + "url-parse": "^1.4.3" + }, + "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" + } + } } }, "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "source-map": { "version": "0.6.1", @@ -11121,18 +12109,12 @@ } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "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==", "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { @@ -11140,19 +12122,24 @@ "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.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", @@ -11164,35 +12151,45 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" } }, "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "split-string": { @@ -11209,9 +12206,9 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -11224,6 +12221,24 @@ "tweetnacl": "~0.14.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" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "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==" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -11248,15 +12263,29 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", @@ -11269,17 +12298,18 @@ "xtend": "^4.0.0" } }, - "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=" + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "requires": { - "strip-ansi": "^3.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" } }, "string-width": { @@ -11289,21 +12319,6 @@ "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" - } - } } }, "string_decoder": { @@ -11314,20 +12329,36 @@ "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "requires": { - "ansi-regex": "^2.0.0" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.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" } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", "requires": { - "is-utf8": "^0.2.0" + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" } }, "strip-eof": { @@ -11335,245 +12366,107 @@ "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=" }, "style-loader": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", - "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", + "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.0.2", - "schema-utils": "^0.3.0" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "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=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } } }, "superagent": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", "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.1.1", + "formidable": "^1.2.0", "methods": "^1.1.1", "mime": "^1.4.1", "qs": "^6.5.1", - "readable-stream": "^2.0.5" + "readable-stream": "^2.3.5" }, "dependencies": { - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "~1.30.0" + "ms": "^2.1.1" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } }, "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", + "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", + "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", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" } }, - "sw-precache": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", - "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", - "requires": { - "dom-urls": "^1.1.0", - "es6-promise": "^4.0.5", - "glob": "^7.1.1", - "lodash.defaults": "^4.2.0", - "lodash.template": "^4.4.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "pretty-bytes": "^4.0.2", - "sw-toolbox": "^3.4.0", - "update-notifier": "^2.3.0" - } - }, - "sw-precache-webpack-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", - "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", - "requires": { - "del": "^2.2.2", - "sw-precache": "^5.1.1", - "uglify-js": "^3.0.13" - } - }, - "sw-toolbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", - "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", - "requires": { - "path-to-regexp": "^1.0.1", - "serviceworker-cache-polyfill": "^4.0.0" - } + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { "version": "3.2.2", @@ -11581,74 +12474,80 @@ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", + "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", - "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "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": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "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-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-regex": "^4.1.0" } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" } } }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", "requires": { - "execa": "^0.7.0" + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + } + }, + "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==", + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" } }, "test-exclude": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" } }, "text-table": { @@ -11657,29 +12556,28 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" - }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" }, "timers-browserify": { "version": "2.0.10", @@ -11689,6 +12587,21 @@ "setimmediate": "^1.0.4" } }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "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==" + }, + "tiny-warning": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", + "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -11708,9 +12621,9 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -11718,16 +12631,6 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "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" - } - } } }, "to-regex": { @@ -11750,47 +12653,56 @@ "repeat-string": "^1.6.1" } }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" - }, "tough-cookie": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.2.tgz", - "integrity": "sha512-vahm+X8lSV/KjXziec8x5Vp0OTC9mq8EVCOApIsRAooeuMPSO8aT7PFACYkaL0yZ/3hVqw+8DzhCJwl8H2Ad6w==", + "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.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } }, "transformation-matrix": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.7.0.tgz", - "integrity": "sha512-nBXvxh7J2zqNKgKGyLttne3I2iHmEWyywQ+rOHjSSuSEzVT7I+4Cf0H1fyePggG7Y5VFlWM66fd7xwi7rWhCTQ==" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", + "integrity": "sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==" }, "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==" + }, + "tsutils": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", + "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -11807,8 +12719,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", @@ -11818,13 +12729,19 @@ "prelude-ls": "~1.1.2" } }, + "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 + }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -11838,54 +12755,63 @@ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, "uglify-js": { - "version": "3.3.28", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.28.tgz", - "integrity": "sha512-68Rc/aA6cswiaQ5SrE979UJcXX+ADA1z33/ZsPd+fbAiVdjZ16OXdbtGO+rJUUBgK6qdf3SOPhQf3K/ybF5Miw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", + "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", + "optional": true, "requires": { - "commander": "~2.15.0", + "commander": "~2.20.0", "source-map": "~0.6.1" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true + "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", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "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==" + }, + "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==" + }, + "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": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" } } } @@ -11932,24 +12858,42 @@ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "requires": { - "crypto-random-string": "^1.0.0" + "unique-slug": "^2.0.0" } }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "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.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -11986,44 +12930,10 @@ } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" }, "upper-case": { "version": "1.1.3", @@ -12038,11 +12948,6 @@ "punycode": "^2.1.0" } }, - "urijs": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", - "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -12065,53 +12970,58 @@ } }, "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "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": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "requires": { - "querystringify": "^2.0.0", + "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "requires": { - "kind-of": "^6.0.2" - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "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" } }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": false, "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==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -12123,23 +13033,28 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "validator": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.2.0.tgz", - "integrity": "sha512-gz/uknWtNfZTj1BLUzYHDxOoiQ7A4wZ6xPuuE6RpxswR4cNyT4I5kN9jmU0AQr7IBEap9vfYChI2TpssTN6Itg==" + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "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==" }, "vary": { "version": "1.1.2", @@ -12147,9 +13062,9 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" }, "verror": { "version": "1.10.0", @@ -12161,6 +13076,52 @@ "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", @@ -12169,6 +13130,24 @@ "indexof": "0.0.1" } }, + "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=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "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==", + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -12177,10 +13156,13 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } }, "watchpack": { "version": "1.6.0", @@ -12200,404 +13182,198 @@ "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", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "version": "4.29.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz", + "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==", "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", + "@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", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "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", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.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==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" }, "dependencies": { - "ajv-keywords": { + "mime": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==" + } + } + }, + "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==", + "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", + "debug": "^4.1.1", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.5.1", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "has-flag": { + "decamelize": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "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=", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", "requires": { - "number-is-nan": "^1.0.0" + "xregexp": "4.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=", + "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==" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "ansi-regex": "^2.0.0" } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.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" - } - }, - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": "^2.0.0" + "has-flag": "^3.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", + "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", - "yargs-parser": "^7.0.0" + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "requires": { "camelcase": "^4.1.0" } } } }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.4.tgz", - "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", - "requires": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^1.6.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.13.3", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", - "import-local": "^0.1.1", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.18", - "sockjs-client": "1.1.4", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.1", - "supports-color": "^4.2.1", - "webpack-dev-middleware": "^1.11.0", - "yargs": "^6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "requires": { - "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" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "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" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "^2.0.0" - } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "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": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "requires": { - "camelcase": "^3.0.0" - } - } + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" } }, "webpack-manifest-plugin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", - "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", + "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==", "requires": { - "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - } + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "tapable": "^1.0.0" } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -12618,18 +13394,11 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "whatwg-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", - "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - } + "iconv-lite": "0.4.24" } }, "whatwg-fetch": { @@ -12637,26 +13406,20 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" }, - "whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - } - } + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } }, "which": { "version": "1.3.1", @@ -12667,36 +13430,192 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "widest-line": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "requires": { - "string-width": "^2.1.1" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.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" + }, + "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==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", + "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==", + "requires": { + "@babel/runtime": "^7.0.0", + "json-stable-stringify": "^1.0.1", + "workbox-build": "^4.2.0" + } + }, + "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==", + "requires": { + "workbox-core": "^4.3.1" + } }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "requires": { "errno": "~0.1.7" } }, + "worker-rpc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.0.tgz", + "integrity": "sha1-XxJY3KPWF80YyoZYf4oFrA7r2DQ=", + "requires": { + "microevent.ts": "~0.1.0" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -12706,6 +13625,11 @@ "strip-ansi": "^3.0.1" }, "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", @@ -12723,6 +13647,14 @@ "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" + } } } }, @@ -12732,32 +13664,50 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "requires": { "mkdirp": "^0.5.1" } }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "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==", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "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" + } + }, + "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": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + "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==" + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" }, "xtend": { "version": "4.0.1", @@ -12765,83 +13715,48 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^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": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" }, "dependencies": { - "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" - } - }, - "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" - } + "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=" } } }, "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=", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index 61827cc..e9295e2 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "react-rnd": "^7.4.3", "react-router": "^4.3.1", "react-router-dom": "^4.3.1", - "react-scripts": "^1.1.5", + "react-scripts": "^3.0.1", "react-sortable-tree": "^0.1.19", "react-svg-pan-zoom": "^2.18.0", "superagent": "^3.8.3", @@ -54,5 +54,17 @@ "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" }, - "proxy": "http://localhost:4000" + "proxy": "http://localhost:4000", + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } } From b6732c41d00adaf28ef83eb14de8ec481d5178cc Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 00:56:49 +0200 Subject: [PATCH 549/556] added Dockerfiles --- .gitlab-ci.yml | 10 ++++++---- packaging/docker/Dockerfile | 21 +++++++++++++++++++++ packaging/docker/Dockerfile-dev | 4 ++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 packaging/docker/Dockerfile create mode 100644 packaging/docker/Dockerfile-dev diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 048b0a9..ce3b29c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,11 @@ variables: GIT_SUBMODULE_STRATEGY: normal + DOCKER_TAG: ${CI_COMMIT_REF_NAME} + DOCKER_IMAGE_DEV: villas/web-dev:${DOCKER_TAG} cache: untracked: true - key: "$CI_PROJECT_ID" + key: ${CI_PROJECT_ID} paths: - node_modules/ - _site/vendor/ @@ -18,7 +20,7 @@ stages: prepare: stage: prepare script: - - docker build -t villas/web-dev . + - docker build -t ${DOCKER_IMAGE_DEV} -f packaging/docker/Dockerfile.dev . tags: - linux - shell @@ -30,7 +32,7 @@ build_job: script: - npm install - npm run build - image: villas/web-dev + image: ${DOCKER_IMAGE_DEV} artifacts: paths: - build/ @@ -42,7 +44,7 @@ test_job: stage: test script: - npm test - image: villas/web-dev + image: ${DOCKER_IMAGE_DEV} dependencies: - build_job tags: diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile new file mode 100644 index 0000000..28b1443 --- /dev/null +++ b/packaging/docker/Dockerfile @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..a9d8a4e --- /dev/null +++ b/packaging/docker/Dockerfile-dev @@ -0,0 +1,4 @@ +FROM node:12.2 + +RUN apt-git install -y \ + git From 6331635482d92e79c30d559e61533e99bcd71e68 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 00:57:02 +0200 Subject: [PATCH 550/556] ci: added deploy stage --- .gitlab-ci.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ce3b29c..2203cb0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,6 +16,7 @@ stages: - prepare - build - test + - deploy prepare: stage: prepare @@ -49,3 +50,17 @@ test_job: - build_job 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 From 595149706a803e6c5891f24003bf7cf300803a57 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 01:02:00 +0200 Subject: [PATCH 551/556] fix ci --- .gitlab-ci.yml | 2 +- packaging/docker/{Dockerfile-dev => Dockerfile.dev} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename packaging/docker/{Dockerfile-dev => Dockerfile.dev} (52%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2203cb0..e9305b1 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:${DOCKER_TAG} + DOCKER_IMAGE_DEV: villas/web-dev:${CI_COMMIT_REF_NAME} cache: untracked: true diff --git a/packaging/docker/Dockerfile-dev b/packaging/docker/Dockerfile.dev similarity index 52% rename from packaging/docker/Dockerfile-dev rename to packaging/docker/Dockerfile.dev index a9d8a4e..7e10c33 100644 --- a/packaging/docker/Dockerfile-dev +++ b/packaging/docker/Dockerfile.dev @@ -1,4 +1,4 @@ FROM node:12.2 -RUN apt-git install -y \ +RUN apt-get install -y \ git From 852decd6777876b5631143d90519c4391f2cb4a7 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 01:10:00 +0200 Subject: [PATCH 552/556] fix eslint warnings --- src/components/editable-header.js | 6 +++--- src/components/table.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/editable-header.js b/src/components/editable-header.js index b2325c6..44c0f46 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -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 2e28c41..4fa2fb9 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( child.props.onClick(index)}>{content}); } else { cell.push(content); } From c6d2f0caa663cb7a703c3c88372795488a4e65a5 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 01:10:11 +0200 Subject: [PATCH 553/556] use symlink for Dockerfile --- Dockerfile | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) mode change 100644 => 120000 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 073bf3c..0000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM node:8.2 - -# Create app directory -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -RUN apt install -y git - -# 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 - -# Run the app in a local webserver -RUN npm install -g serve -EXPOSE 5000 - -CMD [ "serve", "-s", "build" ] diff --git a/Dockerfile b/Dockerfile new file mode 120000 index 0000000..30004e8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1 @@ +packaging/docker/Dockerfile \ No newline at end of file From 3a0d98b1a4c92bbed01913f46c1d97f4cbb0a0a9 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 16 May 2019 01:13:10 +0200 Subject: [PATCH 554/556] bug fix --- src/components/table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/table.js b/src/components/table.js index 4fa2fb9..b81b63a 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( child.props.onClick(index)}>{content}); } else { cell.push(content); } From 3fcb30bdacd133fc7c5a11d512a4cbedd43fd933 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 19 Jul 2019 09:35:49 +0200 Subject: [PATCH 555/556] fix invalid href warnings for anchor elements --- src/components/editable-header.js | 8 ++++---- src/components/table.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 44c0f46..ff15d11 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..0eaac85 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 b1638cd1248a02610e1423e88647e686c478be38 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 19 Jul 2019 16:27:56 +0200 Subject: [PATCH 556/556] fixes test stage of CI --- .../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] } },