From 6c296c626aeb8ef50feab011790ac0a7c6869767 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Fri, 26 Apr 2019 18:17:13 -0400 Subject: [PATCH 1/7] feat: reward screen --- app/images/arrow-left.svg | 3 + app/images/arrow-right.svg | 3 + app/images/complete.png | Bin 0 -> 19056 bytes app/images/down-arrow.svg | 3 + app/images/error.png | Bin 0 -> 24518 bytes app/images/info.svg | 5 + app/images/spinner.png | Bin 0 -> 3483 bytes app/images/status-logo.svg | 3 + app/js/components/Allocation.js | 44 +++++ app/js/components/Complete.js | 14 ++ app/js/components/ContributorSelection.js | 70 ++++++++ app/js/components/Error.js | 14 ++ app/js/components/History.js | 9 + app/js/components/Home.js | 188 ++++++++++++-------- app/js/components/Loading.js | 12 ++ app/js/components/Step1.js | 28 +++ app/js/components/allocation.scss | 15 ++ app/js/components/contributor-selector.scss | 31 ++++ app/js/components/home.scss | 8 +- app/js/components/loading.scss | 11 ++ 20 files changed, 381 insertions(+), 80 deletions(-) create mode 100644 app/images/arrow-left.svg create mode 100644 app/images/arrow-right.svg create mode 100644 app/images/complete.png create mode 100644 app/images/down-arrow.svg create mode 100644 app/images/error.png create mode 100644 app/images/info.svg create mode 100644 app/images/spinner.png create mode 100644 app/images/status-logo.svg create mode 100644 app/js/components/Allocation.js create mode 100644 app/js/components/Complete.js create mode 100644 app/js/components/ContributorSelection.js create mode 100644 app/js/components/Error.js create mode 100644 app/js/components/History.js create mode 100644 app/js/components/Loading.js create mode 100644 app/js/components/Step1.js create mode 100644 app/js/components/allocation.scss create mode 100644 app/js/components/contributor-selector.scss create mode 100644 app/js/components/loading.scss diff --git a/app/images/arrow-left.svg b/app/images/arrow-left.svg new file mode 100644 index 0000000..c366567 --- /dev/null +++ b/app/images/arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/arrow-right.svg b/app/images/arrow-right.svg new file mode 100644 index 0000000..a95e58b --- /dev/null +++ b/app/images/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/complete.png b/app/images/complete.png new file mode 100644 index 0000000000000000000000000000000000000000..58641c546c401473629e7d7c64cb6bd6e33b172d GIT binary patch literal 19056 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 literal 0 HcmV?d00001 diff --git a/app/images/down-arrow.svg b/app/images/down-arrow.svg new file mode 100644 index 0000000..3826601 --- /dev/null +++ b/app/images/down-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/error.png b/app/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..b348b7339218bc927a01a3e35007da69fc91e27a GIT binary patch literal 24518 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 F{~sMwXw3is literal 0 HcmV?d00001 diff --git a/app/images/info.svg b/app/images/info.svg new file mode 100644 index 0000000..9d909f0 --- /dev/null +++ b/app/images/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/images/spinner.png b/app/images/spinner.png new file mode 100644 index 0000000000000000000000000000000000000000..435e42030f610167729a86f4b2b3a5f713c9041e GIT binary patch literal 3483 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 + + diff --git a/app/js/components/Allocation.js b/app/js/components/Allocation.js new file mode 100644 index 0000000..0df7b0b --- /dev/null +++ b/app/js/components/Allocation.js @@ -0,0 +1,44 @@ +import React, {Component} from 'react'; +import info from '../../images/info.svg'; +import downArrow from '../../images/down-arrow.svg'; + +import "./allocation.scss"; + +class Allocation extends Component { + state = { + showHelp: false + } + + handleClickHelp = (e) => { + e.preventDefault(); + this.setState(prevState => ({ showHelp: !prevState.showHelp })); + } + + render() { + const {value} = this.props; + const {showHelp} = this.state; + + return ( +
+

Reward Status contributors for all the times they impressed you.

+

+ Learn more +

+ {showHelp && ( +
+ +

+ Status Meritocracy is an SNT Reward System that allows a Contributor in the registry to + award allocated SNT, along with praise, to other Contributors.
+ Register to + receive a budget and participate.

+
+ )} +

{value} SNT

+

Available

+
+ ); + } +} + +export default Allocation; diff --git a/app/js/components/Complete.js b/app/js/components/Complete.js new file mode 100644 index 0000000..38525cb --- /dev/null +++ b/app/js/components/Complete.js @@ -0,0 +1,14 @@ +import React from 'react'; +import CompleteIcon from '../../images/complete.png'; +import {Button} from 'react-bootstrap'; + +const Complete = ({onClick}) => ( +
+ +

Thank you

+

Your SNT has been awarded.

+

+
+) + +export default Complete; diff --git a/app/js/components/ContributorSelection.js b/app/js/components/ContributorSelection.js new file mode 100644 index 0000000..2a0d36f --- /dev/null +++ b/app/js/components/ContributorSelection.js @@ -0,0 +1,70 @@ +import React, {Fragment} from 'react'; +import Select from 'react-select'; +import {Form} from 'react-bootstrap'; +import Allocation from './Allocation'; +import statusLogo from '../../images/status-logo.svg'; + +import "./contributor-selector.scss"; + +const sortByAlpha = (a,b) => { + if (a.label < b.label) return -1; + if (a.label > b.label) return 1; + return 0; +} + +const ContributorSelection = ({allocation, contributorList, selectedContributors, onSelectContributor, onChangeAward, onClickPlus5, award}) => ( + + +
+
+
+ Enter contributors and award SNT +
+
+
+ +5 + +5 +
+
+
+ +
+
+ + +

Your Total Received Kudos: {currentContributor.totalReceived || 0} SNT

+

Your Total Forfeited Kudos: {currentContributor.totalForfeited || 0} SNT

- {selectedContributors.length === 0 && - Please select one or more contributors - } +

Your Kudos History

+

Your Received Kudos: {currentContributor.received} SNT

- +

+ +

-
- - -

Total Awarding: {award * selectedContributors.length} SNT

-

-
+ + + {currentContributor.praises && currentContributor.praises.map((item, i) => { + const name = options.find(x => x.value === item.author); + return {(name && name.label) || item.author} has sent + you {web3.utils.fromWei(item.amount, "ether")} SNT {item.praise && "\"" + item.praise + "\""}; + })} + + - -

Your Total Received Kudos: {currentContributor.totalReceived || 0} SNT

-

Your Total Forfeited Kudos: {currentContributor.totalForfeited || 0} SNT

-

Your Kudos History

-

Your Received Kudos: {currentContributor.received} SNT

-

- -

- - - - {currentContributor.praises && currentContributor.praises.map((item, i) => { - const name = options.find(x => x.value === item.author); - return {(name && name.label) || item.author} has sent - you {web3.utils.fromWei(item.amount, "ether")} SNT {item.praise && "\"" + item.praise + "\""}; - })} - - -
- - ); + + + + ); } } diff --git a/app/js/components/Loading.js b/app/js/components/Loading.js new file mode 100644 index 0000000..fe17843 --- /dev/null +++ b/app/js/components/Loading.js @@ -0,0 +1,12 @@ +import React from 'react'; +import './loading.scss'; +import spinner from '../../images/spinner.png'; + +const Loading = () => ( +
+ +
Waiting for the confirmation from miners
+
+) + +export default Loading; diff --git a/app/js/components/Step1.js b/app/js/components/Step1.js new file mode 100644 index 0000000..70ee3be --- /dev/null +++ b/app/js/components/Step1.js @@ -0,0 +1,28 @@ +import React, {Fragment} from 'react'; +import arrowRight from '../../images/arrow-right.svg'; +import ContributorSelection from './ContributorSelection'; +import {Button, Form} from 'react-bootstrap'; + +const Step1 = ({allocation, onChangeAward, onSelectContributor, onClickPlus5, contributorList, selectedContributors, award, isChecked, onClickCheckbox, onClickNext}) => ( + + + + + + + +
+ +
+
+); + +export default Step1; \ No newline at end of file diff --git a/app/js/components/allocation.scss b/app/js/components/allocation.scss new file mode 100644 index 0000000..3f144a3 --- /dev/null +++ b/app/js/components/allocation.scss @@ -0,0 +1,15 @@ +.learn-more { + display: flex; + + img { + width: 25px; + margin: 0 10px 0 0; + object-fit: contain; + align-self: flex-start; + } + + p { + flex: 1 1 auto; + } + +} diff --git a/app/js/components/contributor-selector.scss b/app/js/components/contributor-selector.scss new file mode 100644 index 0000000..216548f --- /dev/null +++ b/app/js/components/contributor-selector.scss @@ -0,0 +1,31 @@ + +@import "../../css/variable-overrides"; + +.contributorSelector > div:first-child, +.contributorSelector input { + border-color: #EEF2F5 !important; +} + +.contributorSelector > div:nth-child(3){ + background: #FFFFFF !important; + z-index: 99999; +} + +.label { + font-size: 15px; +} + +.plus-5 { + width: 45px; + margin: auto; + position: relative; + cursor: pointer; + span { + position: absolute; + top: -10px; + right: 10px; + font-size: 12px; + color: $dark; + + } +} \ No newline at end of file diff --git a/app/js/components/home.scss b/app/js/components/home.scss index eb30d6a..65f871f 100644 --- a/app/js/components/home.scss +++ b/app/js/components/home.scss @@ -23,11 +23,17 @@ } .reward-panel { + padding-bottom: 70px; + .allocation { font-size: 32px; } - .react-numeric-input { + .TOC { + font-size: 15px; + } + .small-text { + font-size: 13px; } } diff --git a/app/js/components/loading.scss b/app/js/components/loading.scss new file mode 100644 index 0000000..a3b93a6 --- /dev/null +++ b/app/js/components/loading.scss @@ -0,0 +1,11 @@ +.busy { + img { + -webkit-animation:spin 7s linear infinite; + -moz-animation:spin 7s linear infinite; + animation:spin 7s linear infinite; + } + @-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } } + @-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } } + @keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } } +} + From 891d8d7e4000b5249fcd7536c2d20b82f0cbc1a1 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Sat, 27 Apr 2019 09:18:46 -0400 Subject: [PATCH 2/7] added prettier and eslint --- .eslintrc.json | 274 ++++++++ .prettierrc | 8 + package-lock.json | 1614 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 20 +- 4 files changed, 1915 insertions(+), 1 deletion(-) create mode 100644 .eslintrc.json create mode 100644 .prettierrc diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a254c8a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,274 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": [ + "standard", + "eslint:recommended", + "plugin:react/recommended", + "plugin:unicorn/recommended", + "prettier", + "prettier/standard", + "prettier/unicorn" + ], + "parser": "babel-eslint", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2018, + "ecmaFeatures": { + "jsx": true + } + }, + "globals": { + "__": true + }, + "plugins": ["babel", "react", "prettier", "standard", "unicorn"], + "rules": { + "accessor-pairs": "error", + "array-bracket-newline": "error", + "array-bracket-spacing": ["error", "never"], + "array-callback-return": "off", + "array-element-newline": "off", + "arrow-body-style": "off", + "arrow-parens": "off", + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": "off", + "callback-return": "off", + "camelcase": "off", + "capitalized-comments": "off", + "class-methods-use-this": "off", + "comma-dangle": "error", + "comma-spacing": "off", + "comma-style": ["error", "last"], + "complexity": "error", + "computed-property-spacing": ["error", "never"], + "consistent-return": "off", + "consistent-this": "off", + "curly": "off", + "default-case": "error", + "dot-location": ["error", "property"], + "dot-notation": "off", + "eol-last": "error", + "eqeqeq": "error", + "for-direction": "error", + "func-call-spacing": "error", + "func-name-matching": "error", + "func-names": "off", + "func-style": "off", + "function-paren-newline": "off", + "generator-star-spacing": "error", + "getter-return": "error", + "global-require": "off", + "guard-for-in": "off", + "handle-callback-err": "off", + "id-blacklist": "error", + "id-length": "off", + "id-match": "error", + "indent": ["error", 2, {"SwitchCase": 1}], + "indent-legacy": "off", + "init-declarations": "off", + "jsx-quotes": "error", + "key-spacing": "off", + "keyword-spacing": "off", + "line-comment-position": "off", + "linebreak-style": ["error", "unix"], + "lines-around-comment": "error", + "lines-around-directive": "error", + "max-depth": "error", + "max-len": "off", + "max-lines": "off", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "off", + "multiline-ternary": "off", + "new-parens": "off", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "off", + "no-alert": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-bitwise": "error", + "no-buffer-constructor": "error", + "no-caller": "error", + "no-catch-shadow": "error", + "no-confusing-arrow": "error", + "no-console": "off", + "no-continue": "off", + "no-debugger": "warn", + "no-div-regex": "error", + "no-duplicate-imports": "error", + "no-else-return": 2, + "no-empty-function": "off", + "no-eq-null": "error", + "no-eval": "off", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-extra-parens": "off", + "no-floating-decimal": "error", + "no-implicit-coercion": [ + "error", + { + "allow": ["!!"] + } + ], + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "off", + "no-inner-declarations": ["error", "functions"], + "no-invalid-this": "off", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "off", + "no-loop-func": "off", + "no-magic-numbers": "off", + "no-mixed-operators": "error", + "no-mixed-requires": "error", + "no-multi-assign": "error", + "no-multi-spaces": "off", + "no-multi-str": "error", + "no-multiple-empty-lines": "error", + "no-native-reassign": "error", + "no-negated-condition": "off", + "no-negated-in-lhs": "error", + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "off", + "no-path-concat": "error", + "no-plusplus": "off", + "no-process-env": "off", + "no-process-exit": "off", + "no-proto": "error", + "no-prototype-builtins": "off", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-modules": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "error", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "off", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-sync": "off", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-ternary": "off", + "no-throw-literal": "error", + "no-trailing-spaces": "off", + "no-undef-init": "error", + "no-undefined": "off", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "error", + "no-unused-expressions": "error", + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "no-use-before-define": "off", + "no-useless-call": "off", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-escape": "off", + "no-useless-rename": "error", + "no-useless-return": "off", + "no-var": "off", + "no-void": "error", + "no-warning-comments": "off", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": "error", + "object-curly-newline": "off", + "object-curly-spacing": ["off"], + "object-property-newline": "off", + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "off", + "operator-assignment": "off", + "operator-linebreak": "error", + "padded-blocks": "off", + "padding-line-between-statements": "error", + "prefer-arrow-callback": "off", + "prefer-const": "off", + "prefer-destructuring": "off", + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "error", + "prefer-reflect": "off", + "prefer-rest-params": "off", + "prefer-spread": "off", + "prefer-template": "off", + "quote-props": "off", + "quotes": "off", + "radix": "error", + "require-await": "off", + "require-jsdoc": "off", + "rest-spread-spacing": "error", + "semi": ["error", "always"], + "semi-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "semi-style": ["error", "last"], + "sort-imports": "off", + "sort-keys": "off", + "sort-vars": "off", + "space-before-blocks": "off", + "space-before-function-paren": "off", + "space-in-parens": ["error", "never"], + "space-infix-ops": "off", + "space-unary-ops": "error", + "spaced-comment": "off", + "strict": "error", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": ["error", "never"], + "template-tag-spacing": "error", + "unicode-bom": ["error", "never"], + "valid-jsdoc": "error", + "vars-on-top": "off", + "wrap-iife": "error", + "wrap-regex": "error", + "yield-star-spacing": "error", + "yoda": ["error", "never"], + "react/jsx-boolean-value": 0, + "react/jsx-closing-bracket-location": 1, + "react/jsx-curly-spacing": "off", + "react/jsx-indent-props": [1, 2], + "react/jsx-no-undef": 1, + "react/jsx-uses-react": 1, + "react/jsx-uses-vars": 1, + "react/react-in-jsx-scope": 1, + "react/prefer-es6-class": 1, + "react/jsx-no-bind": "off", + "unicorn/filename-case": "off" + } +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d196722 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +trailingComma: "none" +printWidth: 120 +useTabs: false +semi: true +arrowParens: "avoid" +tabWidth: 2 +endOfLine: "lf" +singleQuote: true \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index db71f09..53b1076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,61 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "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": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.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==", + "dev": true, + "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==", + "dev": true, + "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", @@ -12,6 +67,45 @@ "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "dev": true + }, "@babel/runtime": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", @@ -27,6 +121,60 @@ } } }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "dev": true, + "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" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/types": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", @@ -161,6 +309,51 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -169,11 +362,27 @@ "sprintf-js": "~1.0.2" } }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", @@ -182,6 +391,32 @@ "lodash": "^4.17.11" } }, + "babel-eslint": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", + "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, "babel-plugin-emotion": { "version": "9.2.11", "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz", @@ -271,16 +506,78 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "classnames": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -328,11 +625,57 @@ "gud": "^1.0.0" } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "csstype": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.2.tgz", "integrity": "sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow==" }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-helpers": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", @@ -356,6 +699,12 @@ "resolved": "https://registry.npmjs.org/embarkjs-connector-web3/-/embarkjs-connector-web3-4.0.0.tgz", "integrity": "sha512-mqLDRGawEfyqXgoSb2NgTwhlbAHwDrk7eyHrtEvywWgKfEPer+S+5IN+KGXi85d7QxcNKJSZ+BHve8wvWX0FfQ==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "emotion": { "version": "9.2.12", "resolved": "https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz", @@ -381,16 +730,452 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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=", + "dev": true + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "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", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-config-prettier": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.2.0.tgz", + "integrity": "sha512-y0uWc/FRfrHhpPZCYflWC8aE0KRJRY04rdZVfl8cL3sEZmOYyaBdhdlQPjKZBnuRMyLVK+JUZr7HaZFClQiH4w==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "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==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-babel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.0.tgz", + "integrity": "sha512-HPuNzSPE75O+SnxHIafbW5QB45r2w78fxqwK3HmjqIUoPfPzVrq6rD+CINU3yzoDSzEhUkX07VUphbF73Lth/w==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "read-pkg-up": "^2.0.0", + "resolve": "^1.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz", + "integrity": "sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^5.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", + "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", + "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-promise": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", + "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", + "dev": true, + "requires": { + "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": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "dev": true + }, + "eslint-plugin-unicorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-7.1.0.tgz", + "integrity": "sha512-lW/ZwGR638V0XuZgR160qVQvPtw8tw3laKT5LjJPt+W+tN7kVf2S2V7x+ZrEEwSjEb3OiEzb3cppzaKuYtgYeg==", + "dev": true, + "requires": { + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.0.0", + "import-modules": "^1.1.0", + "lodash.camelcase": "^4.1.1", + "lodash.kebabcase": "^4.0.1", + "lodash.snakecase": "^4.0.1", + "lodash.upperfirst": "^4.2.0", + "safe-regex": "^2.0.1" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, "esprima": { "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", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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=", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "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=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fbjs": { "version": "0.8.17", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", @@ -412,16 +1197,78 @@ } } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "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==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "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==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -435,11 +1282,44 @@ "path-is-absolute": "^1.0.0" } }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, "gud": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "history": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz", @@ -461,6 +1341,12 @@ "react-is": "^16.7.0" } }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, "humps": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/humps/-/humps-2.0.1.tgz", @@ -474,6 +1360,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -483,6 +1375,18 @@ "resolve-from": "^3.0.0" } }, + "import-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-1.1.0.tgz", + "integrity": "sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -497,6 +1401,44 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, + "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.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -515,21 +1457,69 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "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=", + "dev": true + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, + "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=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", @@ -553,26 +1543,132 @@ "esprima": "^4.0.0" } }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "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-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==", + "dev": true + }, + "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=", + "dev": true + }, + "jsx-ast-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", + "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, "keycode": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, "lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=" }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", + "dev": true + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -586,6 +1682,12 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==" }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -607,6 +1709,35 @@ "minimist": "0.0.8" } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -624,11 +1755,41 @@ "abbrev": "1" } }, + "normalize-package-data": { + "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==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -637,6 +1798,76 @@ "wrappy": "1" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "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" + } + }, + "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=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -646,11 +1877,29 @@ "json-parse-better-errors": "^1.0.1" } }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "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=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -664,16 +1913,67 @@ "isarray": "0.0.1" } }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, "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=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, "popper.js": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.0.tgz", + "integrity": "sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -710,6 +2010,12 @@ } } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -944,6 +2250,27 @@ "uuid": "^3.1.0" } }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "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=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -957,6 +2284,18 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" }, + "regexp-tree": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.5.tgz", + "integrity": "sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", @@ -975,11 +2314,57 @@ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz", + "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "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": "2.0.2", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.0.2.tgz", + "integrity": "sha512-rRALJT0mh4qVFIJ9HvfjKDN77F9vp7kltOpFFI/8e6oKyHFmmxz4aSkY/YVauRDe7U0RrHdw9Lsxdel3E19s0A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1009,6 +2394,21 @@ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.1.0.tgz", "integrity": "sha512-0SW1nWo1hnabO62SEeHsl8nmTVVEzguVWZCj5gaQrgWAxz/BaCja4OWdJBWLVPDxdtE/WU7c98uUCCXyPHSCvw==" }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, "shelljs": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", @@ -1019,16 +2419,96 @@ "rechoir": "^0.6.2" } }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^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=" }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "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==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "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=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "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=", + "dev": true + }, "stylis": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", @@ -1039,6 +2519,67 @@ "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", + "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "tiny-invariant": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.4.tgz", @@ -1049,6 +2590,15 @@ "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", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1062,6 +2612,27 @@ "nopt": "~1.0.10" } }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "typed-styles": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", @@ -1080,11 +2651,30 @@ "invariant": "^2.2.4" } }, + "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==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "uuid": { "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.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "value-equal": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", @@ -1103,10 +2693,34 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } } } } diff --git a/package.json b/package.json index 1f3f4e5..779a2a8 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,28 @@ "description": "", "main": "Gruntfile.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "prettier": "prettier --write \"app/**/*.js\"", + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "./node_modules/.bin/eslint app" }, "author": "", "license": "ISC", "homepage": "", + "devDependencies": { + "babel-eslint": "^10.0.1", + "eslint": "^5.9.0", + "eslint-config-prettier": "^4.0.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-babel": "^5.3.0", + "eslint-plugin-import": "^2.16.0", + "eslint-plugin-node": "^8.0.1", + "eslint-plugin-prettier": "^3.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-react": "^7.12.4", + "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-unicorn": "^7.1.0", + "prettier": "^1.16.4" + }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.17", "@fortawesome/free-solid-svg-icons": "^5.8.1", @@ -16,6 +33,7 @@ "bootstrap": "^4.3.1", "embark-solc": "^4.0.1", "embarkjs-connector-web3": "^4.0.0", + "moment": "^2.24.0", "react": "^16.8.6", "react-bootstrap": "1.0.0-beta.6", "react-dom": "^16.8.6", From ae884d278c4c9dbfd994b36225eed94ac44cad00 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Sat, 27 Apr 2019 09:19:33 -0400 Subject: [PATCH 3/7] changed forfeit rule --- contracts/Meritocracy.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Meritocracy.sol b/contracts/Meritocracy.sol index ad26d39..03bb87d 100644 --- a/contracts/Meritocracy.sol +++ b/contracts/Meritocracy.sol @@ -255,7 +255,7 @@ contract Meritocracy { // Locals uint256 registryLength = registry.length; // Requirements - require(block.timestamp >= lastForfeit + 1 weeks); // prevents admins accidently calling too quickly. + require(block.timestamp >= lastForfeit + 6 days); // prevents admins accidently calling too quickly. // Body lastForfeit = block.timestamp; for (uint256 i = 0; i < registryLength; i++) { // should never be longer than maxContributors, see addContributor From 64fdef7697d732e95dd30acfd0625a125f874069 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Sat, 27 Apr 2019 18:10:34 -0400 Subject: [PATCH 4/7] feat: withdrawal screens + prettier --- app/images/red-info.svg | 8 + app/js/App.js | 54 +++--- app/js/components/Address.js | 56 ++++++ app/js/components/Admin.js | 185 ++++++++++--------- app/js/components/Allocation.js | 34 ++-- app/js/components/Complete.js | 12 +- app/js/components/ContributorSelection.js | 41 ++--- app/js/components/Error.js | 12 +- app/js/components/Header.js | 32 ++-- app/js/components/History.js | 9 - app/js/components/Home.js | 205 +++++++++++----------- app/js/components/Loading.js | 2 +- app/js/components/Step1.js | 50 ++++-- app/js/components/Step2.js | 31 ++++ app/js/components/Withdrawal.js | 72 ++++++++ app/js/components/allocation.scss | 15 -- app/js/components/home.scss | 23 +++ app/js/components/withdrawal.scss | 4 + app/js/contributors.js | 90 +++++----- app/js/index.js | 23 ++- app/js/services/Meritocracy.js | 64 +++---- app/js/validators.js | 70 ++++++-- 22 files changed, 676 insertions(+), 416 deletions(-) create mode 100644 app/images/red-info.svg create mode 100644 app/js/components/Address.js delete mode 100644 app/js/components/History.js create mode 100644 app/js/components/Step2.js create mode 100644 app/js/components/Withdrawal.js delete mode 100644 app/js/components/allocation.scss create mode 100644 app/js/components/withdrawal.scss diff --git a/app/images/red-info.svg b/app/images/red-info.svg new file mode 100644 index 0000000..d6d2002 --- /dev/null +++ b/app/images/red-info.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/js/App.js b/app/js/App.js index da362dd..57703f8 100644 --- a/app/js/App.js +++ b/app/js/App.js @@ -1,11 +1,11 @@ /*global web3*/ -import React, {Fragment} from 'react'; -import {HashRouter, Route, Redirect, Switch} from "react-router-dom"; +import React from 'react'; +import { HashRouter, Route, Redirect, Switch } from 'react-router-dom'; import ThemeProvider from 'react-bootstrap/ThemeProvider'; import EmbarkJS from 'Embark/EmbarkJS'; -import {isAdmin} from './services/Meritocracy'; +import { isAdmin } from './services/Meritocracy'; import Header from './components/Header'; import Home from './components/Home'; import Admin from './components/Admin'; @@ -14,7 +14,6 @@ const MAINNET = 1; const TESTNET = 3; class App extends React.Component { - state = { error: null, loading: true, @@ -22,52 +21,57 @@ class App extends React.Component { }; componentDidMount() { - EmbarkJS.onReady(async (err) => { + EmbarkJS.onReady(async err => { if (err) { - return this.setState({error: err.message || err}); + return this.setState({ error: err.message || err }); } const netId = await web3.eth.net.getId(); if (EmbarkJS.environment === 'testnet' && netId !== TESTNET) { - return this.setState({error: 'Please connect to Ropsten'}); + return this.setState({ error: 'Please connect to Ropsten' }); } if (EmbarkJS.environment === 'livenet' && netId !== MAINNET) { - return this.setState({error: 'Please connect to Mainnet'}); + return this.setState({ error: 'Please connect to Mainnet' }); } const isUserAdmin = await isAdmin(web3.eth.defaultAccount); - this.setState({loading: false, isUserAdmin}) + this.setState({ loading: false, isUserAdmin }); }); } render() { - const {error, loading, isUserAdmin} = this.state; + const { error, loading, isUserAdmin } = this.state; if (error) { - return (
-
Something went wrong connecting to Ethereum. Please make sure you have a node running or are using Metamask - to connect to the Ethereum network: + return ( +
+
+ Something went wrong connecting to Ethereum. Please make sure you have a node running or are using Metamask + to connect to the Ethereum network: +
+
{error}
-
{error}
-
); + ); } if (loading) { return

Loading, please wait

; } - return ( - -
- - - {isUserAdmin && } + return ( + + +
+ + + {isUserAdmin && } - - - - ); + + + + + ); } } diff --git a/app/js/components/Address.js b/app/js/components/Address.js new file mode 100644 index 0000000..0a427da --- /dev/null +++ b/app/js/components/Address.js @@ -0,0 +1,56 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +function compactAddress(addr) { + return addr.substring(0, 6) + '...' + addr.substring(38); +} + +class Address extends Component { + constructor(props) { + super(props); + this.state = { + addressHovered: false, + fixed: false + }; + } + + mouseOverAddress = () => { + this.setState({ addressHovered: true }); + }; + + mouseOutAddress = () => { + this.setState({ addressHovered: false }); + }; + + handleClick = () => { + this.setState({ fixed: !this.state.fixed }); + }; + + render() { + const address = + this.props.compact || (!this.state.fixed && !this.state.addressHovered) + ? compactAddress(this.props.value) + : this.props.value; + return ( + + {address} + + ); + } +} + +Address.defaultProps = { + compact: false +}; + +Address.propTypes = { + value: PropTypes.string, + compact: PropTypes.bool +}; + +export default Address; diff --git a/app/js/components/Admin.js b/app/js/components/Admin.js index 0bf0c4f..75417d8 100644 --- a/app/js/components/Admin.js +++ b/app/js/components/Admin.js @@ -1,13 +1,12 @@ -/*global web3*/ -import React, {Fragment} from 'react'; -import {Button, Form, Alert, ListGroup, OverlayTrigger, Tooltip, Modal} from 'react-bootstrap'; +import React, { Fragment } from 'react'; +import { Button, Form, Alert, ListGroup, OverlayTrigger, Tooltip, Modal } from 'react-bootstrap'; import ValidatedForm from 'react-validation/build/form'; import Input from 'react-validation/build/input'; -import {required, isAddress} from '../validators'; -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; -import {faTrash} from "@fortawesome/free-solid-svg-icons"; +import { required, isAddress } from '../validators'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faTrash } from '@fortawesome/free-solid-svg-icons'; -import {addContributor, getFormattedContributorList, removeContributor} from '../services/Meritocracy'; +import { addContributor, getFormattedContributorList, removeContributor } from '../services/Meritocracy'; import './admin.scss'; @@ -27,121 +26,139 @@ class Admin extends React.Component { try { const contributorList = await getFormattedContributorList(); - this.setState({busy: false, contributorList}); - } catch (e) { - this.setState({errorMsg: e.message || e}); + this.setState({ busy: false, contributorList }); + } catch (error) { + this.setState({ errorMsg: error.message || error }); } } onChange = (name, e) => { - this.setState({[name]: e.target.value}); + this.setState({ [name]: e.target.value }); }; - addContributor = async (e) => { + addContributor = async e => { e.preventDefault(); - this.setState({busy: true, successMsg: ''}); + this.setState({ busy: true, successMsg: '' }); try { await addContributor(this.state.contributorName, this.state.contributorAddress); const contributorList = this.state.contributorList; - contributorList.push({label: this.state.contributorName, value: this.state.contributorAddress}); + contributorList.push({ label: this.state.contributorName, value: this.state.contributorAddress }); - this.setState({busy: false, successMsg: 'Contributor added!'}); - } catch (e) { - this.setState({error: e.message || e, busy: false}); + this.setState({ busy: false, successMsg: 'Contributor added!' }); + } catch (error) { + this.setState({ error: error.message || error, busy: false }); } }; removeContributor = (e, contributorIndex) => { e.preventDefault(); - this.setState({focusedContributorIndex: contributorIndex, showDeleteModal: true}); + this.setState({ focusedContributorIndex: contributorIndex, showDeleteModal: true }); }; doRemove = async () => { const idx = this.state.focusedContributorIndex; - this.setState({focusedContributorIndex: -1, showDeleteModal: false, busy: true}); + this.setState({ focusedContributorIndex: -1, showDeleteModal: false, busy: true }); try { await removeContributor(this.state.contributorList[idx].value); const contributorList = this.state.contributorList; contributorList.splice(idx, 1); - this.setState({contributorList, busy: false, successMsg: 'Contributor removed!'}); - } catch (e) { - this.setState({error: e.message || e, busy: false}); + this.setState({ contributorList, busy: false, successMsg: 'Contributor removed!' }); + } catch (error) { + this.setState({ error: error.message || error, busy: false }); } }; handleClose = () => { - this.setState({showDeleteModal: false}); + this.setState({ showDeleteModal: false }); }; render() { - const {contributorAddress, contributorName, error, busy, contributorList, successMsg, focusedContributorIndex} = this.state; + const { + contributorAddress, + contributorName, + error, + busy, + contributorList, + successMsg, + focusedContributorIndex + } = this.state; const currentContributor = focusedContributorIndex > -1 ? contributorList[focusedContributorIndex] : {}; - return ( -

Admin Panel

- {error && {error}} - {successMsg && {successMsg}} - {busy && Working...} -

Add a contributor

- this.addContributor(e)}> - - Contributor name - this.onChange('contributorName', e)} - className="form-control" - validations={[required]}/> - + return ( + +

Admin Panel

+ {error && {error}} + {successMsg && {successMsg}} + {busy && Working...} +

Add a contributor

+ this.addContributor(e)}> + + Contributor name + this.onChange('contributorName', e)} + className="form-control" + validations={[required]} + /> + - - Contributor address - this.onChange('contributorAddress', e)} - className="form-control" - validations={[required, isAddress]}/> - - - -

Contributor List

- - {contributorList.map((contributor, idx) => ( - - {contributor.label}: {contributor.value} - -
- - Delete contributor - - }> - this.removeContributor(e, idx)}/> - -
-
- ))} -
- - - - Are you sure you want to remove this contributor? - - -

Name: {currentContributor.label}

-

Address: {currentContributor.value}

-
- - - - -
-
); +
+

Contributor List

+ + {contributorList.map((contributor, idx) => ( + + {contributor.label}: {contributor.value} +
+ Delete contributor}> + this.removeContributor(e, idx)} + /> + +
+
+ ))} +
+ + + + Are you sure you want to remove this contributor? + + +

Name: {currentContributor.label}

+

Address: {currentContributor.value}

+
+ + + + +
+
+ ); } } diff --git a/app/js/components/Allocation.js b/app/js/components/Allocation.js index 0df7b0b..95520b6 100644 --- a/app/js/components/Allocation.js +++ b/app/js/components/Allocation.js @@ -1,40 +1,44 @@ -import React, {Component} from 'react'; +import React, { Component } from 'react'; import info from '../../images/info.svg'; import downArrow from '../../images/down-arrow.svg'; -import "./allocation.scss"; - class Allocation extends Component { state = { showHelp: false - } + }; - handleClickHelp = (e) => { + handleClickHelp = e => { e.preventDefault(); this.setState(prevState => ({ showHelp: !prevState.showHelp })); - } + }; render() { - const {value} = this.props; - const {showHelp} = this.state; - + const { value } = this.props; + const { showHelp } = this.state; + return (

Reward Status contributors for all the times they impressed you.

- Learn more + + Learn more +

{showHelp && (

- Status Meritocracy is an SNT Reward System that allows a Contributor in the registry to - award allocated SNT, along with praise, to other Contributors.
- Register to - receive a budget and participate.

+ Status Meritocracy is an SNT Reward System that allows a Contributor in the registry to award allocated + SNT, along with praise, to other Contributors. +
+ Register to receive a + budget and participate. +

)} -

{value} SNT

+

+ {value} SNT +

Available

); diff --git a/app/js/components/Complete.js b/app/js/components/Complete.js index 38525cb..01cc8c1 100644 --- a/app/js/components/Complete.js +++ b/app/js/components/Complete.js @@ -1,14 +1,18 @@ import React from 'react'; import CompleteIcon from '../../images/complete.png'; -import {Button} from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; -const Complete = ({onClick}) => ( +const Complete = ({ onClick }) => (

Thank you

Your SNT has been awarded.

-

+

+ +

-) +); export default Complete; diff --git a/app/js/components/ContributorSelection.js b/app/js/components/ContributorSelection.js index 2a0d36f..10f23be 100644 --- a/app/js/components/ContributorSelection.js +++ b/app/js/components/ContributorSelection.js @@ -1,25 +1,31 @@ -import React, {Fragment} from 'react'; +import React, { Fragment } from 'react'; import Select from 'react-select'; -import {Form} from 'react-bootstrap'; +import { Form } from 'react-bootstrap'; import Allocation from './Allocation'; import statusLogo from '../../images/status-logo.svg'; -import "./contributor-selector.scss"; +import './contributor-selector.scss'; -const sortByAlpha = (a,b) => { +const sortByAlpha = (a, b) => { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; -} +}; -const ContributorSelection = ({allocation, contributorList, selectedContributors, onSelectContributor, onChangeAward, onClickPlus5, award}) => ( +const ContributorSelection = ({ + allocation, + contributorList, + selectedContributors, + onSelectContributor, + onChangeAward, + onClickPlus5, + award +}) => (
-
- Enter contributors and award SNT -
+
Enter contributors and award SNT
+5 @@ -37,33 +43,28 @@ const ContributorSelection = ({allocation, contributorList, selectedContributors options={contributorList.sort(sortByAlpha)} placeholder="Choose Contributor(s)..." className="mb-2 contributorSelector" - theme={(theme) => ({ + theme={theme => ({ ...theme, borderRadius: '4px', border: 'none', padding: '10px', colors: { - ...theme.colors, + ...theme.colors, neutral0: '#EEF2F5', - neutral10: '#EEF2F5', + neutral10: '#EEF2F5' }, spacing: { ...theme.spacing, - controlHeight: 50, + controlHeight: 50 } })} />
- +
-
+
); diff --git a/app/js/components/Error.js b/app/js/components/Error.js index 84bf894..b9c2fe1 100644 --- a/app/js/components/Error.js +++ b/app/js/components/Error.js @@ -1,14 +1,18 @@ import React from 'react'; import ErrorIcon from '../../images/error.png'; -import {Button} from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; -const Error = ({onClick, title, message}) => ( +const Error = ({ onClick, title, message }) => (

{title}

{message}

-

+

+ +

-) +); export default Error; diff --git a/app/js/components/Header.js b/app/js/components/Header.js index 4a351f8..ca9f9b5 100644 --- a/app/js/components/Header.js +++ b/app/js/components/Header.js @@ -1,19 +1,25 @@ -import React from 'react' -import {Navbar, Nav} from 'react-bootstrap'; +import React from 'react'; +import { Navbar, Nav } from 'react-bootstrap'; -import './header.scss' +import './header.scss'; import logo from '../../images/logo.png'; -const Header = ({isUserAdmin}) => ( - LogoStatus Meritocracy - - {isUserAdmin && - - } +const Header = ({ isUserAdmin }) => ( + + + Logo + Status Meritocracy + + + {isUserAdmin && ( + + + + )} ); -export default Header +export default Header; diff --git a/app/js/components/History.js b/app/js/components/History.js deleted file mode 100644 index 6ae75f0..0000000 --- a/app/js/components/History.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; - -const History = ({value}) => ( -
- -
-); - -export default Allocation; diff --git a/app/js/components/Home.js b/app/js/components/Home.js index 70bb781..2876681 100644 --- a/app/js/components/Home.js +++ b/app/js/components/Home.js @@ -1,14 +1,15 @@ /*global web3*/ -import React, {Fragment} from 'react'; -import {Row, Col, Alert, Button, Container, Form, Tabs, Tab} from 'react-bootstrap'; +import React, { Fragment } from 'react'; +import { Tabs, Tab } from 'react-bootstrap'; import Meritocracy from 'Embark/contracts/Meritocracy'; -import arrowLeft from '../../images/arrow-left.svg'; -import {getFormattedContributorList, getCurrentContributorData} from '../services/Meritocracy'; +import { getFormattedContributorList, getCurrentContributorData } from '../services/Meritocracy'; import './home.scss'; import Step1 from './Step1'; +import Step2 from './Step2'; import Loading from './Loading'; import Complete from './Complete'; import Error from './Error'; +import Withdrawal from './Withdrawal'; /* TODO: @@ -17,10 +18,8 @@ TODO: */ class Home extends React.Component { - state = { errorMsg: null, - busy: true, selectedContributors: [], contributorList: [], currentContributor: { @@ -32,8 +31,9 @@ class Home extends React.Component { }, award: 0, praise: '', - step: 'ERROR', + step: 'HOME', checkbox: false, + tab: 'reward' }; constructor(props) { @@ -52,9 +52,9 @@ class Home extends React.Component { const currentContributor = await getCurrentContributorData(); - this.setState({busy: false, currentContributor, contributorList}); - } catch (e) { - this.setState({errorMsg: e.message || e}); + this.setState({ busy: false, currentContributor, contributorList }); + } catch (error) { + this.setState({ errorMsg: error.message || error }); } } @@ -65,8 +65,8 @@ class Home extends React.Component { } handleAwardChange(e) { - if(e.target.value.trim() === "") { - this.setState({award: ""}); + if (e.target.value.trim() === '') { + this.setState({ award: '' }); return; } this._setAward(e.target.value); @@ -74,49 +74,54 @@ class Home extends React.Component { handlePlus5 = () => { this._setAward(this.state.award + 5); - } - - _setAward = (value) => { - let _amount = parseInt(value, 10); - if(_amount < 0 || isNaN(_amount)) _amount = 0; - - const { currentContributor: {allocation}, selectedContributors} = this.state; - const maxAllocation = selectedContributors.length ? Math.floor(allocation / selectedContributors.length) : 0; - const award = (_amount <= maxAllocation ? _amount : maxAllocation ); + }; - this.setState({award}); - } + _setAward = value => { + let _amount = parseInt(value, 10); + if (_amount < 0 || isNaN(_amount)) _amount = 0; + + const { + currentContributor: { allocation }, + selectedContributors + } = this.state; + const maxAllocation = selectedContributors.length > 0 ? Math.floor(allocation / selectedContributors.length) : 0; + const award = _amount <= maxAllocation ? _amount : maxAllocation; + + this.setState({ award }); + }; handlePraiseChange(e) { this.setState({ praise: e.target.value }); } - handleCheckbox = (e) => { + handleCheckbox = () => { this.setState(prevState => ({ checkbox: !prevState.checkbox })); - } + }; - resetUIFields(){ + resetUIFields() { this.setState({ praise: '', selectedContributors: [], errorMsg: '', - award: 0 + award: 0, + checkbox: false }); } - async awardTokens(e) { - const {award, selectedContributors, praise} = this.state; + async awardTokens() { + const { award, selectedContributors, praise } = this.state; - this.moveStep('BUSY'); + this.moveStep('BUSY')(); let addresses = selectedContributors.map(a => a.value); - const sntAmount = web3.utils.toWei(award.toString(), "ether"); + const sntAmount = web3.utils.toWei(award.toString(), 'ether'); let toSend; - switch(addresses.length) { + + switch (addresses.length) { case 0: - this.setState({errorMsg: 'No Contributor Selected'}); + this.setState({ errorMsg: 'No Contributor Selected' }); return; case 1: toSend = Meritocracy.methods.award(addresses[0], sntAmount, praise); @@ -127,69 +132,74 @@ class Home extends React.Component { } try { - const estimatedGas = await toSend.estimateGas({from: web3.eth.defaultAccount}); - const receipt = await toSend.send({from: web3.eth.defaultAccount, gas: estimatedGas + 1000}); + const estimatedGas = await toSend.estimateGas({ from: web3.eth.defaultAccount }); + await toSend.send({ from: web3.eth.defaultAccount, gas: estimatedGas + 1000 }); this.resetUIFields(); const currentContributor = await getCurrentContributorData(); - this.setState({currentContributor}); + this.setState({ currentContributor }); this.moveStep('COMPLETE')(); - } catch(e) { - this.setState({errorMsg: 'tx failed? got enough tokens to award?'}); - console.error(e); - } finally { - + } catch (error) { + this.setState({ errorMsg: 'tx failed? got enough tokens to award?' }); + console.error(error); } } - - async withdrawTokens(e) { - const {currentContributor} = this.state; + async withdrawTokens() { + const { currentContributor } = this.state; if (currentContributor.received === 0) { - this.setState({errorMsg: 'can only call withdraw when you have tokens'}); + this.setState({ errorMsg: 'can only call withdraw when you have tokens' }); return; } - if ( currentContributor.allocation > 0 ) { - this.setState({errorMsg: 'you must allocate all your tokens'}); + if (currentContributor.allocation > 0) { + this.setState({ errorMsg: 'you must allocate all your tokens' }); return; } + this.moveStep('BUSY')(); + const toSend = Meritocracy.methods.withdraw(); try { - this.setState({busy: true}); + this.setState({ busy: true }); - const estimatedGas = await toSend.estimateGas({from: web3.eth.defaultAccount}); - const receipt = await toSend.send({from: web3.eth.defaultAccount, gas: estimatedGas + 1000}); + const estimatedGas = await toSend.estimateGas({ from: web3.eth.defaultAccount }); + await toSend.send({ from: web3.eth.defaultAccount, gas: estimatedGas + 1000 }); const currentContributor = await getCurrentContributorData(); - this.setState({currentContributor}); - - } catch(e) { - this.setState({errorMsg: 'tx failed? Did you allocate all your tokens first?'}); - console.error(e); - } finally { - this.setState({busy: false}); + this.setState({ currentContributor }); + + this.moveStep('COMPLETE')(); + } catch (error) { + console.error(error); + this.setState({ errorMsg: 'tx failed? Did you allocate all your tokens first?' }); } } - moveStep = nexStep => () => { - this.setState({step: nexStep}); - } - + this.setState({ step: nexStep, errorMsg: '' }); + }; render() { - const { selectedContributors, contributorList, award, currentContributor, praise, busy, errorMsg, step, checkbox } = this.state; + const { + selectedContributors, + contributorList, + award, + currentContributor, + praise, + errorMsg, + step, + checkbox, + tab + } = this.state; - if(errorMsg) return ; + if (errorMsg) return ; return ( - + this.setState({ tab })}> - {step === 'HOME' && ( -

Research shows that a note of praise and learning how much our work helped others, increases motivation.

-

- { selectedContributors.map(x => x.label).join(', ') } - SNT {award * selectedContributors.length} -

-
- Add note - - -
- - -
-
+ )} - { step === 'BUSY' && } - { step === 'COMPLETE' && } - { step === 'ERROR' && } + {step === 'BUSY' && } + + {step === 'COMPLETE' && } - -

Your Total Received Kudos: {currentContributor.totalReceived || 0} SNT

-

Your Total Forfeited Kudos: {currentContributor.totalForfeited || 0} SNT

- -

Your Kudos History

-

Your Received Kudos: {currentContributor.received} SNT

- -

- -

- - - - {currentContributor.praises && currentContributor.praises.map((item, i) => { - const name = options.find(x => x.value === item.author); - return {(name && name.label) || item.author} has sent - you {web3.utils.fromWei(item.amount, "ether")} SNT {item.praise && "\"" + item.praise + "\""}; - })} - - - + + {step === 'HOME' && ( + + )} + {step === 'BUSY' && } + {step === 'COMPLETE' && } diff --git a/app/js/components/Loading.js b/app/js/components/Loading.js index fe17843..1f3ec65 100644 --- a/app/js/components/Loading.js +++ b/app/js/components/Loading.js @@ -7,6 +7,6 @@ const Loading = () => (
Waiting for the confirmation from miners
-) +); export default Loading; diff --git a/app/js/components/Step1.js b/app/js/components/Step1.js index 70ee3be..1e6e192 100644 --- a/app/js/components/Step1.js +++ b/app/js/components/Step1.js @@ -1,11 +1,22 @@ -import React, {Fragment} from 'react'; +import React, { Fragment } from 'react'; import arrowRight from '../../images/arrow-right.svg'; import ContributorSelection from './ContributorSelection'; -import {Button, Form} from 'react-bootstrap'; +import { Button, Form } from 'react-bootstrap'; -const Step1 = ({allocation, onChangeAward, onSelectContributor, onClickPlus5, contributorList, selectedContributors, award, isChecked, onClickCheckbox, onClickNext}) => ( - - ( + + - - - + + + -
- -
-
+
+ +
+
); -export default Step1; \ No newline at end of file +export default Step1; diff --git a/app/js/components/Step2.js b/app/js/components/Step2.js new file mode 100644 index 0000000..3b9d74b --- /dev/null +++ b/app/js/components/Step2.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { Button, Form } from 'react-bootstrap'; +import arrowLeft from '../../images/arrow-left.svg'; + +const Step2 = ({ selectedContributors, award, praise, onChangeNote, onClickBack, onClickAward }) => ( +
+

+ Research shows that a note of praise and learning how much our work helped others, increases motivation. +

+

+ {selectedContributors.map(x => x.label).join(', ')} + + SNT {award * selectedContributors.length} + +

+
+ Add note + + +
+ + +
+
+); + +export default Step2; diff --git a/app/js/components/Withdrawal.js b/app/js/components/Withdrawal.js new file mode 100644 index 0000000..52ac800 --- /dev/null +++ b/app/js/components/Withdrawal.js @@ -0,0 +1,72 @@ +/* global web3 */ +import React, { Fragment } from 'react'; +import { Row, Col, Button, Container } from 'react-bootstrap'; +import moment from 'moment'; +import info from '../../images/red-info.svg'; +import Address from './Address'; + +import './withdrawal.scss'; + +const Withdrawal = ({ totalReceived, allocation, onClick, contributorList, praises }) => ( + +
+

You have been awarded

+

+ {totalReceived || 0} SNT +

+

Available for withdraw

+
+ + + {praises && + praises.map((item, i) => { + const name = contributorList.find(x => x.value === item.author); + const date = moment.unix(item.time).fromNow(); + return ( + + + {!item.praise && ( + + {(name && name.label) ||
} has sent you{' '} + {web3.utils.fromWei(item.amount, 'ether')} SNT {date} + + )} + + {item.praise && ( + + {(name && name.label) || item.author}, {date} +
+ "{item.praise}" + {web3.utils.fromWei(item.amount, 'ether')} SNT +
+
+ )} + + + ); + })} + + +

+ +

+ + {allocation !== '0' && ( +
+ +

+ Your budget wasn’t fullly rewarded to others. Note that you can only withdraw your own reward if you’ve spend + your full budget to reward others. +

+
+ )} + +); + +export default Withdrawal; diff --git a/app/js/components/allocation.scss b/app/js/components/allocation.scss deleted file mode 100644 index 3f144a3..0000000 --- a/app/js/components/allocation.scss +++ /dev/null @@ -1,15 +0,0 @@ -.learn-more { - display: flex; - - img { - width: 25px; - margin: 0 10px 0 0; - object-fit: contain; - align-self: flex-start; - } - - p { - flex: 1 1 auto; - } - -} diff --git a/app/js/components/home.scss b/app/js/components/home.scss index 65f871f..b75a4fd 100644 --- a/app/js/components/home.scss +++ b/app/js/components/home.scss @@ -37,3 +37,26 @@ font-size: 13px; } } + +.withdraw-panel { + .awarded { + font-size: 32px; + } +} + +.learn-more { + display: flex; + + img { + width: 25px; + margin: 0 10px 0 0; + object-fit: contain; + align-self: flex-start; + } + + p { + flex: 1 1 auto; + } + +} + diff --git a/app/js/components/withdrawal.scss b/app/js/components/withdrawal.scss new file mode 100644 index 0000000..2888e7b --- /dev/null +++ b/app/js/components/withdrawal.scss @@ -0,0 +1,4 @@ +.chatBubble { + background: #ECEFFC; + border-radius: 8px; +} \ No newline at end of file diff --git a/app/js/contributors.js b/app/js/contributors.js index 01d396c..73a72b6 100644 --- a/app/js/contributors.js +++ b/app/js/contributors.js @@ -1,49 +1,49 @@ const contributors = [ - { 'label' : 'Andreas S.', 'value' : '0x4923121411e884a4af66ec025712eba600a782d3' }, - { 'label' : 'andrey.dev', 'value' : '0xA4EcA293cb578a68b190e3e07c2B170dc753fe44' }, - { 'label' : 'Anna', 'value': '0x2e1ce0f514387a188f4aeff4ceb6c2c0dea66ca7'}, - { 'label' : 'barry', 'value' : '0xa46b0546481a04b7de049a8a20f8a9b2b2c5cc05' }, - { 'label' : 'BrianXV', 'value' : '0x03b832b3fa819d7a4b6c819e4df1e60a173e739a' }, - { 'label' : 'cammellos', 'value' : '0xd0ec8a940fe9712c1521c2190f41604ecaa7ec9e' }, - { 'label' : 'Carl', 'value': '0x9fb937ab76b68dae29e3de20cf797d44f00e6410'}, - { 'label' : 'ceri', 'value' : '0x68f47e153e1aa7d6529e078feff86eada87ddee3' }, - { 'label' : 'Dani', 'value' : '0x89c010bc7085eb150b66582f13681f9e36904bea' }, - { 'label' : 'dmitryn', 'value' : '0x6b0d7ba67aa3d84122749dc7906b8e7f25ed1af8' }, - { 'label' : 'gravityblast', 'value' : '0xb5a2c17c7fd72070fcf078bb8458f2f595441066' }, - { 'label' : 'guylouis.stateofus.eth', 'value' : '0x6913f3bdbb7c303977d6244c0e0071b4ebc6f359' }, - { 'label' : 'Hester', 'value' : '0x8c4f71b3cf6a76de2cc239a6fa84e1a80e589598' }, - { 'label' : 'Hutch', 'value' : '0x34a4b73100d11815ee4bb0ebcc86ba5824b12134' }, - { 'label' : 'igor.stateofus.eth', 'value' : '0xff91043525391cd3a316450bc80ef874fb0ef446' }, - { 'label' : 'jakubgs.eth', 'value' : '0x9b64770c9485A5188D238C305E53627A67C05D7D'}, - { 'label' : 'Jinho', 'value' : '0x7407bF49004ee99d9B2caA2fb90B476bfF2DbCaf' }, - { 'label' : 'Jonathan Barker', 'value' : '0xf23d05F375A8367b150f7Ad1A37DFd9E3c35eE56' }, - { 'label' : 'Jonathan Rainville', 'value' : '0x9ce0056c5fc6bb9459a4dcfa35eaad8c1fee5ce9' }, - { 'label' : 'Jonny Z', 'value' : '0xa40b07ac80d1f89b233b74e78d254c90906c33ee' }, - { 'label' : 'Julien', 'value' : '0x6c618ddbf53aa9540c279e3670d4d26fb367fd4e' }, - { 'label' : 'Maciej', 'value' : '0x227612e69b1d06250e7035c1c12840561ebf3c56' }, - { 'label' : 'michele', 'value' : '0x658a1d2c105b35d9aaad38480dbbfe47b9054962' }, - { 'label' : 'Nabil', 'value' : '0x528c9e62bb0e7083f4b42802297b38ba237776a0' }, - { 'label' : 'Oskar', 'value' : '0x3fd6e2dfa535ce8b1e7eb7116a009eba3890b6bd' }, - { 'label' : 'PascalPrecht', 'value' : '0x6f490165DdD8d604b52dB9D9BF9b63aE997DC11C' }, - { 'label' : 'pedro.stateofus.eth', 'value' : '0x78EA50b13de394671474314aA261556717bF9185' }, - { 'label' : 'Rachel', 'value' : '0x4b9ba5B0dEE90f5B84Bcbfbf921cF02e1C8da113' }, - { 'label' : 'Rajanie', 'value' : '0x8af0d6fabc4a90ea0b95f80ab62beb816ed32a69' }, - { 'label' : 'Ricardo Schmidt <3esmit>', 'value' : '0x3D597789ea16054a084ac84ce87F50df9198F415' }, - { 'label' : 'Sergey', 'value' : '0xb9f914fe1c6edae2351fb42276868470083a3cd2' }, - { 'label' : 'shemnon', 'value' : '0x82ad1b2419fd71dfe2d5db9b3c832c60ec96c53b' }, - { 'label' : 'sonja.stateofus.eth', 'value' : '0xCF03738e9605C0B38cEAa7349bF6926463f01A25' }, - { 'label' : 'Swader', 'value' : '0x9702797d92e2a06070b446e49a594a943686e28f' }, - { 'label' : 'yenda', 'value' : '0xe829f7947175fe6a338344e70aa770a8c134372c' }, - { 'label' : 'petty', 'value' : '0x2942577508e060ea092c0CD7802ae42c1CEA2BAe' }, - { 'label' : 'chu', 'value' : '0xd21DB0e43048AcB94f428eD61dC244c82f1ff2a8' }, - { 'label' : 'Yessin', 'value' : '0xbaba92b7822a56c05554ab5d1bc1d0b7e212499d' }, - { 'label' : 'michaelb', 'value' : '0xdba0bade45727776bbb0d93176ee1ddba830f319' }, - { 'label' : 'cryptowanderer', 'value' : '0x406abd306b633b6460666b4092784a3330370c7b' }, - { 'label' : 'adam.stateofus.eth', 'value' : '0x074032269ca1775896c92304d45f80b5a67a5bcb' }, - { 'label' : 'André Medeiros', 'value' : '0xf062E478870B17B55d1dC64888914B82aD9808B4' }, - { 'label' : 'rramos', 'value' : '0xc379330ae48716b81d7411813c3250cd89271788' }, - { 'label' : 'emizzle', 'value' : '0x91Ef8ef20Adf13E42757a3Ed6Ff2b1249bE15544' }, - { 'label' : 'jason.stateofus.eth', 'value' : '0x4636fb2F6D1DC335EA655795064c2092c89148aB' } + { label: 'Andreas S.', value: '0x4923121411e884a4af66ec025712eba600a782d3' }, + { label: 'andrey.dev', value: '0xA4EcA293cb578a68b190e3e07c2B170dc753fe44' }, + { label: 'Anna', value: '0x2e1ce0f514387a188f4aeff4ceb6c2c0dea66ca7' }, + { label: 'barry', value: '0xa46b0546481a04b7de049a8a20f8a9b2b2c5cc05' }, + { label: 'BrianXV', value: '0x03b832b3fa819d7a4b6c819e4df1e60a173e739a' }, + { label: 'cammellos', value: '0xd0ec8a940fe9712c1521c2190f41604ecaa7ec9e' }, + { label: 'Carl', value: '0x9fb937ab76b68dae29e3de20cf797d44f00e6410' }, + { label: 'ceri', value: '0x68f47e153e1aa7d6529e078feff86eada87ddee3' }, + { label: 'Dani', value: '0x89c010bc7085eb150b66582f13681f9e36904bea' }, + { label: 'dmitryn', value: '0x6b0d7ba67aa3d84122749dc7906b8e7f25ed1af8' }, + { label: 'gravityblast', value: '0xb5a2c17c7fd72070fcf078bb8458f2f595441066' }, + { label: 'guylouis.stateofus.eth', value: '0x6913f3bdbb7c303977d6244c0e0071b4ebc6f359' }, + { label: 'Hester', value: '0x8c4f71b3cf6a76de2cc239a6fa84e1a80e589598' }, + { label: 'Hutch', value: '0x34a4b73100d11815ee4bb0ebcc86ba5824b12134' }, + { label: 'igor.stateofus.eth', value: '0xff91043525391cd3a316450bc80ef874fb0ef446' }, + { label: 'jakubgs.eth', value: '0x9b64770c9485A5188D238C305E53627A67C05D7D' }, + { label: 'Jinho', value: '0x7407bF49004ee99d9B2caA2fb90B476bfF2DbCaf' }, + { label: 'Jonathan Barker', value: '0xf23d05F375A8367b150f7Ad1A37DFd9E3c35eE56' }, + { label: 'Jonathan Rainville', value: '0x9ce0056c5fc6bb9459a4dcfa35eaad8c1fee5ce9' }, + { label: 'Jonny Z', value: '0xa40b07ac80d1f89b233b74e78d254c90906c33ee' }, + { label: 'Julien', value: '0x6c618ddbf53aa9540c279e3670d4d26fb367fd4e' }, + { label: 'Maciej', value: '0x227612e69b1d06250e7035c1c12840561ebf3c56' }, + { label: 'michele', value: '0x658a1d2c105b35d9aaad38480dbbfe47b9054962' }, + { label: 'Nabil', value: '0x528c9e62bb0e7083f4b42802297b38ba237776a0' }, + { label: 'Oskar', value: '0x3fd6e2dfa535ce8b1e7eb7116a009eba3890b6bd' }, + { label: 'PascalPrecht', value: '0x6f490165DdD8d604b52dB9D9BF9b63aE997DC11C' }, + { label: 'pedro.stateofus.eth', value: '0x78EA50b13de394671474314aA261556717bF9185' }, + { label: 'Rachel', value: '0x4b9ba5B0dEE90f5B84Bcbfbf921cF02e1C8da113' }, + { label: 'Rajanie', value: '0x8af0d6fabc4a90ea0b95f80ab62beb816ed32a69' }, + { label: 'Ricardo Schmidt <3esmit>', value: '0x3D597789ea16054a084ac84ce87F50df9198F415' }, + { label: 'Sergey', value: '0xb9f914fe1c6edae2351fb42276868470083a3cd2' }, + { label: 'shemnon', value: '0x82ad1b2419fd71dfe2d5db9b3c832c60ec96c53b' }, + { label: 'sonja.stateofus.eth', value: '0xCF03738e9605C0B38cEAa7349bF6926463f01A25' }, + { label: 'Swader', value: '0x9702797d92e2a06070b446e49a594a943686e28f' }, + { label: 'yenda', value: '0xe829f7947175fe6a338344e70aa770a8c134372c' }, + { label: 'petty', value: '0x2942577508e060ea092c0CD7802ae42c1CEA2BAe' }, + { label: 'chu', value: '0xd21DB0e43048AcB94f428eD61dC244c82f1ff2a8' }, + { label: 'Yessin', value: '0xbaba92b7822a56c05554ab5d1bc1d0b7e212499d' }, + { label: 'michaelb', value: '0xdba0bade45727776bbb0d93176ee1ddba830f319' }, + { label: 'cryptowanderer', value: '0x406abd306b633b6460666b4092784a3330370c7b' }, + { label: 'adam.stateofus.eth', value: '0x074032269ca1775896c92304d45f80b5a67a5bcb' }, + { label: 'André Medeiros', value: '0xf062E478870B17B55d1dC64888914B82aD9808B4' }, + { label: 'rramos', value: '0xc379330ae48716b81d7411813c3250cd89271788' }, + { label: 'emizzle', value: '0x91Ef8ef20Adf13E42757a3Ed6Ff2b1249bE15544' }, + { label: 'jason.stateofus.eth', value: '0x4636fb2F6D1DC335EA655795064c2092c89148aB' } ]; module.exports = contributors; diff --git a/app/js/index.js b/app/js/index.js index aad5514..d1cc81b 100644 --- a/app/js/index.js +++ b/app/js/index.js @@ -1,13 +1,10 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; - -import App from './App'; - -import '../css/fonts/Inter/inter.css'; -import '../css/bootstrap-overrides.scss'; -import '../css/index.scss'; - -ReactDOM.render( - , - document.getElementById('app') -); +import React from 'react'; +import ReactDOM from 'react-dom'; + +import App from './App'; + +import '../css/fonts/Inter/inter.css'; +import '../css/bootstrap-overrides.scss'; +import '../css/index.scss'; + +ReactDOM.render(, document.querySelector('#app')); diff --git a/app/js/services/Meritocracy.js b/app/js/services/Meritocracy.js index 23ae98a..36f3cd4 100644 --- a/app/js/services/Meritocracy.js +++ b/app/js/services/Meritocracy.js @@ -2,7 +2,6 @@ import Meritocracy from 'Embark/contracts/Meritocracy'; import EmbarkJS from 'Embark/EmbarkJS'; - let contributorList; export function addContributor(name, address) { @@ -10,19 +9,19 @@ export function addContributor(name, address) { const mainAccount = web3.eth.defaultAccount; try { const list = await getContributorList(); - list.push({label: name, value: address}); + list.push({ label: name, value: address }); const newHash = await saveContributorList(list); const addContributor = Meritocracy.methods.addContributor(address, web3.utils.toHex(newHash)); - let gas = await addContributor.estimateGas({from: mainAccount}); - const receipt = await addContributor.send({from: mainAccount, gas: gas + 1000}); + let gas = await addContributor.estimateGas({ from: mainAccount }); + const receipt = await addContributor.send({ from: mainAccount, gas: gas + 1000 }); resolve(receipt); - } catch (e) { + } catch (error) { const message = 'Error adding contributor'; console.error(message); - console.error(e); + console.error(error); reject(message); } }); @@ -32,7 +31,7 @@ export function removeContributor(address) { return new Promise(async (resolve, reject) => { const mainAccount = web3.eth.defaultAccount; try { - const registry = await Meritocracy.methods.getRegistry().call({from: mainAccount}); + const registry = await Meritocracy.methods.getRegistry().call({ from: mainAccount }); let index = registry.indexOf(address); const list = await getContributorList(); @@ -42,14 +41,14 @@ export function removeContributor(address) { const newHash = await saveContributorList(list); const removeContributor = Meritocracy.methods.removeContributor(index, web3.utils.toHex(newHash)); - let gas = await removeContributor.estimateGas({from: mainAccount}); - const receipt = await removeContributor.send({from: mainAccount, gas: gas + 1000}); + let gas = await removeContributor.estimateGas({ from: mainAccount }); + const receipt = await removeContributor.send({ from: mainAccount, gas: gas + 1000 }); resolve(receipt); - } catch (e) { + } catch (error) { const message = 'Error removing contributor'; console.error(message); - console.error(e); + console.error(error); reject(message); } }); @@ -66,10 +65,10 @@ export function getContributorList(hash) { const content = await EmbarkJS.Storage.get(hash); contributorList = JSON.parse(content); resolve(contributorList); - } catch (e) { + } catch (error) { const message = 'Error getting contributor file on IPFS'; console.error(message); - console.error(e); + console.error(error); reject(message); } }); @@ -82,23 +81,27 @@ export async function getFormattedContributorList(hash) { let list = await getContributorList(hash); list = list.map(prepareOptions); - const registry = await Meritocracy.methods.getRegistry().call({from: mainAccount}); - list = list.filter(contributorData => registry.includes(contributorData.value) && contributorData.value !== mainAccount); + const registry = await Meritocracy.methods.getRegistry().call({ from: mainAccount }); + list = list.filter( + contributorData => registry.includes(contributorData.value) && contributorData.value !== mainAccount + ); resolve(list); - } catch (e) { + } catch (error) { const message = 'Error getting formatted contributor file on IPFS'; console.error(message); - console.error(e); + console.error(error); reject(message); } }); } const prepareOptions = option => { - if (option.value.match(/^0x[0-9A-Za-z]{40}$/)) { // Address + if (option.value.match(/^0x[0-9A-Za-z]{40}$/)) { + // Address option.value = web3.utils.toChecksumAddress(option.value); - } else { // ENS Name + } else { + // ENS Name // TODO: resolve ENS names // EmbarkJS.Names.resolve("ethereum.eth").then(address => { // console.log("the address for ethereum.eth is: " + address); @@ -107,12 +110,12 @@ const prepareOptions = option => { return option; }; -export async function getCurrentContributorData(){ +export async function getCurrentContributorData() { const mainAccount = web3.eth.defaultAccount; const currentContributor = await getContributor(mainAccount); let praises = []; - for(let i = 0; i < currentContributor.praiseNum; i++){ + for (let i = 0; i < currentContributor.praiseNum; i++) { praises.push(Meritocracy.methods.getStatus(mainAccount, i).call()); } @@ -121,13 +124,13 @@ export async function getCurrentContributorData(){ } const contribData = contributorList.find(x => x.value === mainAccount); - if(contribData) currentContributor.name = contribData.label; + if (contribData) currentContributor.name = contribData.label; currentContributor.praises = await Promise.all(praises); - currentContributor.allocation = web3.utils.fromWei(currentContributor.allocation, "ether"); - currentContributor.totalForfeited = web3.utils.fromWei(currentContributor.totalForfeited, "ether"); - currentContributor.totalReceived = web3.utils.fromWei(currentContributor.totalReceived, "ether"); - currentContributor.received = web3.utils.fromWei(currentContributor.received, "ether"); + currentContributor.allocation = web3.utils.fromWei(currentContributor.allocation, 'ether'); + currentContributor.totalForfeited = web3.utils.fromWei(currentContributor.totalForfeited, 'ether'); + currentContributor.totalReceived = web3.utils.fromWei(currentContributor.totalReceived, 'ether'); + currentContributor.received = web3.utils.fromWei(currentContributor.received, 'ether'); return currentContributor; } @@ -144,10 +147,10 @@ export function saveContributorList(list) { contributorList = list; const newHash = await EmbarkJS.Storage.saveText(JSON.stringify(list)); resolve(newHash); - } catch (e) { + } catch (error) { const message = 'Error saving contributor file on IPFS'; console.error(message); - console.error(e); + console.error(error); reject(message); } }); @@ -158,12 +161,11 @@ export function isAdmin(address) { try { const result = await Meritocracy.methods.admins(address).call(); resolve(result); - } catch (e) { + } catch (error) { const message = 'Could not get status of user'; console.error(message); - console.error(e); + console.error(error); reject(message); } }); } - diff --git a/app/js/validators.js b/app/js/validators.js index 53d4c50..81d45d4 100644 --- a/app/js/validators.js +++ b/app/js/validators.js @@ -1,60 +1,96 @@ /*global Web3*/ import React from 'react'; -import {Form} from 'react-bootstrap'; +import { Form } from 'react-bootstrap'; -export const required = (value) => { - if (!value.toString().trim().length) { - return This field is required; +export const required = value => { + if (value.toString().trim().length === 0) { + return ( + + This field is required + + ); } }; -export const isInteger = (value) => { +export const isInteger = value => { value = parseFloat(value); if (!Number.isInteger(value)) { - return This field needs to be an integer; + return ( + + This field needs to be an integer + + ); } }; -export const isNumber = (value) => { +export const isNumber = value => { if (Number.isNaN(value)) { - return This field needs to be an number; + return ( + + This field needs to be an number + + ); } }; export const lowerThan = (max, value) => { if (value >= max) { - return This field needs to be lower than {max}; + return ( + + This field needs to be lower than {max} + + ); } }; export const lowerEqThan = (max, value) => { if (value > max) { - return This field needs to be lower or equal than {max}; + return ( + + This field needs to be lower or equal than {max} + + ); } }; export const higherThan = (min, value) => { if (value <= min) { - return This field needs to be higher than {min}; + return ( + + This field needs to be higher than {min} + + ); } }; export const higherEqThan = (min, value) => { if (value < min) { - return This field needs to be higher or equal than {min}; + return ( + + This field needs to be higher or equal than {min} + + ); } }; -export const isAddress = (value) => { +export const isAddress = value => { if (!Web3.utils.isAddress(value)) { - return This field needs to be a valid Ethereum address; + return ( + + This field needs to be a valid Ethereum address + + ); } }; -export const isJSON = (value) => { +export const isJSON = value => { try { JSON.parse(value); - } catch (e) { - return This field needs to be a valid JSON string; + } catch (error) { + return ( + + This field needs to be a valid JSON string + + ); } }; From 9cd9b61637bf7fdf06f66f6d43b65dc61a389b30 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Sun, 28 Apr 2019 12:43:52 -0400 Subject: [PATCH 5/7] Updated contract address --- config/contracts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/contracts.js b/config/contracts.js index 9fdd230..f636fa4 100644 --- a/config/contracts.js +++ b/config/contracts.js @@ -197,7 +197,7 @@ module.exports = { "address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e" }, "Meritocracy": { - "address": "0x3d8ec98c08b55ec42310aace562e077d784591d6" + "address": "0x0c869a3f3e915b49727669b5ea28c2efdf9a0a66" } }, deployment: { From f93fd4a1ba6ffdc0b18b255c0aeeae3e97ca3c3e Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Sun, 28 Apr 2019 14:06:37 -0400 Subject: [PATCH 6/7] fix: header links and allocation warning --- app/js/components/Header.js | 6 +++--- app/js/components/Withdrawal.js | 6 +++--- config/contracts.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/js/components/Header.js b/app/js/components/Header.js index ca9f9b5..40fb9f5 100644 --- a/app/js/components/Header.js +++ b/app/js/components/Header.js @@ -6,7 +6,7 @@ import logo from '../../images/logo.png'; const Header = ({ isUserAdmin }) => ( - + Logo Status Meritocracy @@ -14,8 +14,8 @@ const Header = ({ isUserAdmin }) => ( {isUserAdmin && ( )} diff --git a/app/js/components/Withdrawal.js b/app/js/components/Withdrawal.js index 52ac800..378e4b7 100644 --- a/app/js/components/Withdrawal.js +++ b/app/js/components/Withdrawal.js @@ -56,12 +56,12 @@ const Withdrawal = ({ totalReceived, allocation, onClick, contributorList, prais Withdraw

- - {allocation !== '0' && ( + + {parseInt(allocation, 10) > 0 && (

- Your budget wasn’t fullly rewarded to others. Note that you can only withdraw your own reward if you’ve spend + Your budget wasn’t fully rewarded to others. Note that you can only withdraw your own reward if you’ve spend your full budget to reward others.

diff --git a/config/contracts.js b/config/contracts.js index f636fa4..8cd2a1e 100644 --- a/config/contracts.js +++ b/config/contracts.js @@ -8,7 +8,7 @@ function getContributors () { return addresses; } -const OG_IPFS_HASH = '0x516d617555364a6b66767038756a44444259784b3553797a58325831635842616642344259584e6838514d4b6e31'; +const OG_IPFS_HASH = '0x516d5968703543324c75646d45333239436d41594671625767733869577036625177396355714576544742356163'; module.exports = { // default applies to all environments From 83ded6bfc18f2252545696e7eac14750faf2a154 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Wed, 1 May 2019 09:29:36 -0400 Subject: [PATCH 7/7] added higher resolution icon --- app/images/favicon/favicon-150x150.png | Bin 0 -> 5907 bytes app/index.html | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 app/images/favicon/favicon-150x150.png diff --git a/app/images/favicon/favicon-150x150.png b/app/images/favicon/favicon-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..7daeda2b71000ee9262cf207a238c1f9209e526c GIT binary patch literal 5907 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 T)nxMidj&|-K%-I3G46i>sD+lT literal 0 HcmV?d00001 diff --git a/app/index.html b/app/index.html index 1f9ee64..c4e0d2b 100644 --- a/app/index.html +++ b/app/index.html @@ -2,11 +2,11 @@ Meritocracy - - - - - + + + + +