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/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 0000000..58641c5
Binary files /dev/null and b/app/images/complete.png differ
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 0000000..b348b73
Binary files /dev/null and b/app/images/error.png differ
diff --git a/app/images/favicon/favicon-150x150.png b/app/images/favicon/favicon-150x150.png
new file mode 100644
index 0000000..7daeda2
Binary files /dev/null and b/app/images/favicon/favicon-150x150.png differ
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/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/images/spinner.png b/app/images/spinner.png
new file mode 100644
index 0000000..435e420
Binary files /dev/null and b/app/images/spinner.png differ
diff --git a/app/images/status-logo.svg b/app/images/status-logo.svg
new file mode 100644
index 0000000..3faf938
--- /dev/null
+++ b/app/images/status-logo.svg
@@ -0,0 +1,3 @@
+
+
+
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
-
-
-
-
-
+
+
+
+
+
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]}/>
-
- this.addContributor(e)}>Add
-
- 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}
-
-
-
- Cancel
+
+ Contributor address
+ this.onChange('contributorAddress', e)}
+ className="form-control"
+ validations={[required, isAddress]}
+ />
+
+ this.addContributor(e)}>
+ Add
-
- Remove
-
-
-
- );
+
+ 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}
+
+
+
+ Cancel
+
+
+ Remove
+
+
+
+
+ );
}
}
diff --git a/app/js/components/Allocation.js b/app/js/components/Allocation.js
new file mode 100644
index 0000000..95520b6
--- /dev/null
+++ b/app/js/components/Allocation.js
@@ -0,0 +1,48 @@
+import React, { Component } from 'react';
+import info from '../../images/info.svg';
+import downArrow from '../../images/down-arrow.svg';
+
+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..01cc8c1
--- /dev/null
+++ b/app/js/components/Complete.js
@@ -0,0 +1,18 @@
+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.
+
+
+ Back
+
+
+
+);
+
+export default Complete;
diff --git a/app/js/components/ContributorSelection.js b/app/js/components/ContributorSelection.js
new file mode 100644
index 0000000..10f23be
--- /dev/null
+++ b/app/js/components/ContributorSelection.js
@@ -0,0 +1,71 @@
+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
+
+
+
+
+
+
+ ({
+ ...theme,
+ borderRadius: '4px',
+ border: 'none',
+ padding: '10px',
+ colors: {
+ ...theme.colors,
+ neutral0: '#EEF2F5',
+ neutral10: '#EEF2F5'
+ },
+ spacing: {
+ ...theme.spacing,
+ controlHeight: 50
+ }
+ })}
+ />
+
+
+
+
+
+
+
+);
+
+export default ContributorSelection;
diff --git a/app/js/components/Error.js b/app/js/components/Error.js
new file mode 100644
index 0000000..b9c2fe1
--- /dev/null
+++ b/app/js/components/Error.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import ErrorIcon from '../../images/error.png';
+import { Button } from 'react-bootstrap';
+
+const Error = ({ onClick, title, message }) => (
+
+
+
{title}
+
{message}
+
+
+ Back
+
+
+
+);
+
+export default Error;
diff --git a/app/js/components/Header.js b/app/js/components/Header.js
index 4a351f8..40fb9f5 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}) => (
- Status Meritocracy
-
- {isUserAdmin &&
-
- Home
- Admin
-
- }
+const Header = ({ isUserAdmin }) => (
+
+
+
+ Status Meritocracy
+
+
+ {isUserAdmin && (
+
+
+ Home
+ Admin
+
+
+ )}
);
-export default Header
+export default Header;
diff --git a/app/js/components/Home.js b/app/js/components/Home.js
index 2227195..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 NumericInput from 'react-numeric-input';
-import Select from 'react-select';
-
+import React, { Fragment } from 'react';
+import { Tabs, Tab } from 'react-bootstrap';
import Meritocracy from 'Embark/contracts/Meritocracy';
-
-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: {
@@ -31,7 +30,10 @@ class Home extends React.Component {
status: []
},
award: 0,
- praise: ''
+ praise: '',
+ step: 'HOME',
+ checkbox: false,
+ tab: 'reward'
};
constructor(props) {
@@ -50,54 +52,76 @@ 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 });
}
}
handleContributorSelection(_selectedContributors) {
- this.setState({ selectedContributors: _selectedContributors });
+ this.setState({ selectedContributors: _selectedContributors }, () => {
+ this._setAward(this.state.award);
+ });
}
- handleAwardChange(_amount) {
- const { currentContributor: {allocation}, selectedContributors} = this.state;
-
- const maxAllocation = allocation / selectedContributors.length;
- const award = (_amount <= maxAllocation ? _amount : maxAllocation );
- this.setState({award});
+ handleAwardChange(e) {
+ if (e.target.value.trim() === '') {
+ this.setState({ award: '' });
+ return;
+ }
+ this._setAward(e.target.value);
}
+ 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 > 0 ? Math.floor(allocation / selectedContributors.length) : 0;
+ const award = _amount <= maxAllocation ? _amount : maxAllocation;
+
+ this.setState({ award });
+ };
+
handlePraiseChange(e) {
this.setState({ praise: e.target.value });
}
- resetUIFields(){
+ handleCheckbox = () => {
+ this.setState(prevState => ({ checkbox: !prevState.checkbox }));
+ };
+
+ 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;
- // TODO some sanity checks
- if(award <= 0) {
- this.setState({errorMsg: 'amount must be more than 0'});
- return;
- }
+ 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);
@@ -108,126 +132,123 @@ class Home extends React.Component {
}
try {
- 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 });
this.resetUIFields();
const currentContributor = await getCurrentContributorData();
- this.setState({currentContributor});
- } catch(e) {
- this.setState({errorMsg: 'tx failed? got enough tokens to award?'});
- console.error(e);
- } finally {
- this.setState({busy: false});
+ this.setState({ currentContributor });
+ this.moveStep('COMPLETE')();
+ } 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, errorMsg: '' });
+ };
+
render() {
- const { selectedContributors, contributorList, award, currentContributor, praise, busy, errorMsg } = this.state;
+ const {
+ selectedContributors,
+ contributorList,
+ award,
+ currentContributor,
+ praise,
+ errorMsg,
+ step,
+ checkbox,
+ tab
+ } = this.state;
- const maxAllocation = selectedContributors.length ? currentContributor.allocation / selectedContributors.length : 0;
+ if (errorMsg) return ;
- const orderedContributors = contributorList.sort((a,b) => {
- if (a.label < b.label) return -1;
- if (a.label > b.label) return 1;
- return 0;
- });
+ return (
+
+ this.setState({ tab })}>
+
+ {step === 'HOME' && (
+
+ )}
- return (
- {errorMsg && {errorMsg} }
- {busy && Working...
}
+ {step === 'PRAISE' && (
+
+ )}
-
-
-
-
Reward Status contributors for all the times they impressed you.
-
{currentContributor.allocation} SNT
-
Available
-
+ {step === 'BUSY' && }
-
+ {step === 'COMPLETE' && }
+
- {selectedContributors.length === 0 &&
- Please select one or more contributors
- }
+
+ {step === 'HOME' && (
+
+ )}
-
+ {step === 'BUSY' && }
-
-
- Total Awarding: {award * selectedContributors.length} SNT
- Award
-
-
-
- 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
-
-
-
- Withdraw
-
-
-
-
-
- {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 === 'COMPLETE' && }
+
+
+
+ );
}
}
diff --git a/app/js/components/Loading.js b/app/js/components/Loading.js
new file mode 100644
index 0000000..1f3ec65
--- /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..1e6e192
--- /dev/null
+++ b/app/js/components/Step1.js
@@ -0,0 +1,52 @@
+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
+}) => (
+
+
+
+
+
+
+
+
+
0) || !isChecked}
+ onClick={onClickNext}
+ variant="link"
+ className="float-right p-3"
+ >
+ Next
+
+
+
+);
+
+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
+
+
+
+
+ Back
+
+
+ Award
+
+
+
+);
+
+export default Step2;
diff --git a/app/js/components/Withdrawal.js b/app/js/components/Withdrawal.js
new file mode 100644
index 0000000..378e4b7
--- /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
+
+
+ )}
+
+
+ );
+ })}
+
+
+
+
+ Withdraw
+
+
+
+ {parseInt(allocation, 10) > 0 && (
+
+
+
+ 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.
+
+
+ )}
+
+);
+
+export default Withdrawal;
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..b75a4fd 100644
--- a/app/js/components/home.scss
+++ b/app/js/components/home.scss
@@ -23,11 +23,40 @@
}
.reward-panel {
+ padding-bottom: 70px;
+
.allocation {
font-size: 32px;
}
- .react-numeric-input {
+ .TOC {
+ font-size: 15px;
+ }
+ .small-text {
+ 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/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); } }
+}
+
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
+
+ );
}
};
diff --git a/config/contracts.js b/config/contracts.js
index 9fdd230..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
@@ -197,7 +197,7 @@ module.exports = {
"address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e"
},
"Meritocracy": {
- "address": "0x3d8ec98c08b55ec42310aace562e077d784591d6"
+ "address": "0x0c869a3f3e915b49727669b5ea28c2efdf9a0a66"
}
},
deployment: {
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
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",