diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a2c5852 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules +src/serviceWorker.js \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ee137ad --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,31 @@ +{ + "parser": "babel-eslint", + "env": { + "browser": true, + "es6": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:prettier/recommended", + "airbnb", + "prettier", + "prettier/react" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 11, + "sourceType": "module" + }, + "plugins": ["react", "react-hooks", "prettier"], + "rules": { + "react-hooks/rules-of-hooks": "error", // Checks rules of Hooks + "react-hooks/exhaustive-deps": "warn" // Checks effect dependencies + } +} \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..384b6c7 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "trailingComma": "es6", + "tabWidth": 4, + "singleQuote": true +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index be85aa7..dd65358 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "eslint.autoFixOnSave": true + "eslint.autoFixOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c735cd8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +# build environment +FROM node:12.2.0-alpine as build +WORKDIR /app +ENV PATH /app/node_modules/.bin:$PATH +COPY package.json /app/package.json + +# To handle 'not get uid/gid' +RUN npm config set unsafe-perm true + +RUN npm install --silent +RUN npm install react-scripts@3.0.1 -g --silent +COPY . /app +RUN npm run build + +# production environment +FROM nginx:1.16.0-alpine +COPY --from=build /app/build /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0904c30 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +version: '3.4' + +services: + ctf_client: + build: . + image: "${REGISTRY_NAME}devclubiitd/ctf_client:0.1" + ports: + - ${PORT}:80 + healthcheck: + test: ["CMD", "curl", "http://localhost"] + interval: 1m30s + timeout: 10s + retries: 3 + start_period: 40s + restart: "unless-stopped" + networks: + - "internal" + - "reverseproxy" + env_file: + - ./.env + environment: + - VIRTUAL_HOST + +networks: + reverseproxy: + external: + name: "reverseproxy" + internal: diff --git a/package-lock.json b/package-lock.json index 8c2efbe..823035b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "requires": { "@babel/highlight": "^7.0.0" } @@ -148,6 +148,14 @@ "to-fast-properties": "^2.0.0" } }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -156,15 +164,14 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { @@ -541,25 +548,33 @@ "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } } } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-hoist-variables": { @@ -829,6 +844,14 @@ "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } } } }, @@ -938,6 +961,14 @@ "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } } } }, @@ -995,14 +1026,6 @@ } } }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, "@babel/helper-validator-identifier": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", @@ -1114,6 +1137,14 @@ "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } } } }, @@ -1222,13 +1253,21 @@ "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } } } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -1236,9 +1275,9 @@ } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.8.3", @@ -2085,9 +2124,9 @@ } }, "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", + "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -2109,38 +2148,83 @@ } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "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.5", - "@babel/types": "^7.4.4", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "requires": { + "@babel/types": "^7.12.11" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -2164,30 +2248,30 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@date-io/core": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.7.tgz", - "integrity": "sha512-oHFBOjQskqrFngyDnJPOM1o4FVpKPyNe/aDtkj1HQEfCe7BV3cggwuTll0AOchNdiYY0yJEVyUl8Vi63HZxfBA==" + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz", + "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==" }, "@date-io/date-fns": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-1.3.7.tgz", - "integrity": "sha512-7TqK8xhCrWVY6L3/o/DfTXtJq7HV4KMiiQ6WPsR/mmvWXPrH5AFvjEAPJoFLBYEtX5KqpXbp5lRDwVlH9ZSVQw==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-1.3.13.tgz", + "integrity": "sha512-yXxGzcRUPcogiMj58wVgFjc9qUYrCnnU9eLcyNbsQCmae4jPuZCDoIBR21j8ZURsM7GRtU62VOw5yNd4dDHunA==", "requires": { - "@date-io/core": "^1.3.7" + "@date-io/core": "^1.3.13" } }, "@date-io/moment": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-1.3.7.tgz", - "integrity": "sha512-DpXK6s5f9HOoPPURmqSUN0mwFTTorSXfJyJA42PspJ8ZTJLIeuWUXRkjJKS6hdXUfy3PmshEQTzWbhoOiDwjfw==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-1.3.13.tgz", + "integrity": "sha512-3kJYusJtQuOIxq6byZlzAHoW/18iExJer9qfRF5DyyzdAk074seTuJfdofjz4RFfTd/Idk8WylOQpWtERqvFuQ==", "requires": { - "@date-io/core": "^1.3.7" + "@date-io/core": "^1.3.13" } }, "@emotion/hash": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.1.tgz", - "integrity": "sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", + "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" }, "@hapi/address": { "version": "2.1.4", @@ -2268,6 +2352,11 @@ "strip-ansi": "^5.0.0" }, "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -2423,85 +2512,206 @@ } }, "@material-ui/core": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.1.1.tgz", - "integrity": "sha512-dZVuVFqKnG3uf+s32U5wMTAXYBGBM6e2LF4fz4ud9woaYcthRiEFJTg2idt0j1jBMg99gqLuznR5+A9TCQbgxQ==", - "requires": { - "@babel/runtime": "^7.2.0", - "@material-ui/styles": "^4.1.1", - "@material-ui/system": "^4.2.0", - "@material-ui/types": "^4.1.0", - "@material-ui/utils": "^4.1.0", - "@types/react-transition-group": "^2.0.16", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.8.2.tgz", + "integrity": "sha512-4dILME6TVCTyi9enavqbYLU8HueaX5YQxfn2IiCiGwHpqp4pIhJCVUVlBf0ADG6lL2K1tWrsawGs/hePpHxAYw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.8.2", + "@material-ui/system": "^4.7.1", + "@material-ui/types": "^4.1.1", + "@material-ui/utils": "^4.7.1", + "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.2", - "convert-css-length": "^2.0.0", - "debounce": "^1.1.0", - "deepmerge": "^3.0.0", + "convert-css-length": "^2.0.1", "hoist-non-react-statics": "^3.2.1", - "is-plain-object": "^3.0.0", "normalize-scroll-left": "^0.2.0", "popper.js": "^1.14.1", "prop-types": "^15.7.2", - "react-event-listener": "^0.6.6", - "react-transition-group": "^4.0.0", - "warning": "^4.0.1" + "react-is": "^16.8.0", + "react-transition-group": "^4.3.0" + }, + "dependencies": { + "react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } } }, "@material-ui/icons": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.2.0.tgz", - "integrity": "sha512-v+rz61KzH+qR8x17BrfOF73f75x+wUNiBhv9tsKnEed+ElROMK2dqfMAlsdgEP+wgGl4VOcxzUQqWHcaApZ+CA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.5.1.tgz", + "integrity": "sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==", "requires": { - "@babel/runtime": "^7.2.0" + "@babel/runtime": "^7.4.4" } }, "@material-ui/styles": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.1.1.tgz", - "integrity": "sha512-BmtfLRY0CqAkYPdcFmNcD1/zyU6ATRx9vaBxJ31//YVxfRsyPOuQXW6fvAoDvQt/hbZpTR4E0K/+4D3wHHTdHQ==", - "requires": { - "@babel/runtime": "^7.2.0", - "@emotion/hash": "^0.7.1", - "@material-ui/types": "^4.1.0", - "@material-ui/utils": "^4.1.0", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.8.2.tgz", + "integrity": "sha512-r5U+93pkpwQOmHTmwyn2sqTio6PHd873xvSHiKP6fdybAXXX6CZgVvh3W8saZNbYr/QXsS8OHmFv7sYJLt5Yfg==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.7.4", + "@material-ui/types": "^4.1.1", + "@material-ui/utils": "^4.7.1", "clsx": "^1.0.2", "csstype": "^2.5.2", - "deepmerge": "^3.0.0", "hoist-non-react-statics": "^3.2.1", - "jss": "10.0.0-alpha.17", - "jss-plugin-camel-case": "10.0.0-alpha.17", - "jss-plugin-default-unit": "10.0.0-alpha.17", - "jss-plugin-global": "10.0.0-alpha.17", - "jss-plugin-nested": "10.0.0-alpha.17", - "jss-plugin-props-sort": "10.0.0-alpha.17", - "jss-plugin-rule-value-function": "10.0.0-alpha.17", - "jss-plugin-vendor-prefixer": "10.0.0-alpha.17", - "prop-types": "^15.7.2", - "warning": "^4.0.1" + "jss": "^10.0.0", + "jss-plugin-camel-case": "^10.0.0", + "jss-plugin-default-unit": "^10.0.0", + "jss-plugin-global": "^10.0.0", + "jss-plugin-nested": "^10.0.0", + "jss-plugin-props-sort": "^10.0.0", + "jss-plugin-rule-value-function": "^10.0.0", + "jss-plugin-vendor-prefixer": "^10.0.0", + "prop-types": "^15.7.2" + }, + "dependencies": { + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "jss": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.0.tgz", + "integrity": "sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "indefinite-observable": "^2.0.1", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz", + "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw==" + } + } + }, + "jss-plugin-camel-case": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz", + "integrity": "sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.5.0" + } + }, + "jss-plugin-default-unit": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz", + "integrity": "sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-global": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz", + "integrity": "sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-nested": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz", + "integrity": "sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz", + "integrity": "sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz", + "integrity": "sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz", + "integrity": "sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.5.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "@material-ui/system": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.2.0.tgz", - "integrity": "sha512-t51525FWVDjca/3UPwN99vqyvbfGNtBVesGYH2UpxVgKOdiP1ZINeHhBrZ8h4uOu5ZwgO4aceuk1TuM9uMttYw==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.7.1.tgz", + "integrity": "sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==", "requires": { - "@babel/runtime": "^7.2.0", - "deepmerge": "^3.0.0", - "prop-types": "^15.7.2", - "warning": "^4.0.1" + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.7.1", + "prop-types": "^15.7.2" } }, "@material-ui/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-4.1.0.tgz", - "integrity": "sha512-F4z7GOAeEucPjrrhJ2PHBhMZjhggE6Jjnzmap5W2PdZ3TSWNlqucB+oOzT6EzWRkHDDhVmANMU8QMfT/kcZtOg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-4.1.1.tgz", + "integrity": "sha512-AN+GZNXytX9yxGi0JOfxHrRTbhFybjUJ05rnsBVjcB+16e466Z0Xe5IxawuOayVZgTBNDxmPKo5j4V6OnMtaSQ==", + "requires": { + "@types/react": "*" + } }, "@material-ui/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-muwmVU799tzPjzb+Q5E/CTDle0rXwkCAdvMVyU0BfbJhenkUsFmuYiCmbvMVOU1m6F1S5HWfXz8EP4pXwwAvrw==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.7.1.tgz", + "integrity": "sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==", "requires": { - "@babel/runtime": "^7.2.0", + "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", "react-is": "^16.8.0" } @@ -2718,6 +2928,12 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -2734,9 +2950,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { - "version": "15.7.1", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", - "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/q": { "version": "1.5.2", @@ -2744,9 +2960,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/react": { - "version": "16.8.19", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.19.tgz", - "integrity": "sha512-QzEzjrd1zFzY9cDlbIiFvdr+YUmefuuRYrPxmkwG0UQv5XF35gFIi7a95m1bNVcFU0VimxSZ5QVGSiBmlggQXQ==", + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -2761,9 +2977,9 @@ } }, "@types/react-transition-group": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.9.2.tgz", - "integrity": "sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz", + "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==", "requires": { "@types/react": "*" } @@ -2871,6 +3087,14 @@ "tsutils": "^3.17.1" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", @@ -3085,14 +3309,15 @@ "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + } } }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true - }, "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", @@ -3132,9 +3357,9 @@ } }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -3163,9 +3388,13 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, "ansi-html": { "version": "0.0.7", @@ -3173,9 +3402,10 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -3236,6 +3466,12 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", @@ -3247,12 +3483,13 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, "array-union": { @@ -3274,58 +3511,134 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" }, "dependencies": { "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "has-symbols": "^1.0.1" } }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } } } @@ -3376,6 +3689,12 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -3445,29 +3764,6 @@ "requires": { "follow-redirects": "1.5.10", "is-buffer": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "axobject-query": { @@ -3527,32 +3823,6 @@ } } }, - "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-extract-comments": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", @@ -3881,11 +4151,6 @@ "kind-of": "^6.0.2" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4024,11 +4289,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -4149,6 +4409,13 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } } }, "buffer-from": { @@ -4225,13 +4492,16 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, "call-me-maybe": { @@ -4428,11 +4698,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -4456,15 +4721,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "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", @@ -4485,6 +4741,16 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -4515,21 +4781,6 @@ "kind-of": "^3.0.2", "lazy-cache": "^1.0.3", "shallow-clone": "^0.1.2" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } } }, "clsx": { @@ -4686,6 +4937,11 @@ "typedarray": "^0.0.6" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4725,11 +4981,6 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, - "console-polyfill": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/console-polyfill/-/console-polyfill-0.1.2.tgz", - "integrity": "sha1-ls/tUcr3gYn2mVcubxgnHcN8DjA=" - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4738,7 +4989,8 @@ "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true }, "content-disposition": { "version": "0.5.3", @@ -4754,13 +5006,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-css-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-2.0.0.tgz", - "integrity": "sha512-ygBgHNzImHJ/kjgqdzC0oaY2+EMID3s88/CZD2C9O1stM3PwsOwXzzlFTTkZy/bPZe0wjyt1UoYjilfunQGjlw==", - "requires": { - "console-polyfill": "^0.1.2", - "parse-unit": "^1.0.1" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-2.0.1.tgz", + "integrity": "sha512-iGpbcvhLPRKUbBc0Quxx7w/bV14AC3ItuBEGMahA5WTYqB8lq9jH0kTXFheCBASsYnqeMFZhiTruNxr1N59Axg==" }, "convert-source-map": { "version": "1.7.0", @@ -4887,9 +5135,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -5043,15 +5291,6 @@ } } }, - "css-vendor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.2.tgz", - "integrity": "sha512-Xn5ZAlI00d8HaQ8/oQ8d+iBzSF//NCc77LPzsucM32X/R/yTqmXy6otVsAM0XleXk6HjPuXoVZwXsayky/fsFQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "is-in-browser": "^1.0.2" - } - }, "css-what": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", @@ -5181,9 +5420,9 @@ } }, "csstype": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", - "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==" + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" }, "cyclist": { "version": "1.0.1", @@ -5234,17 +5473,19 @@ } } }, - "debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "decamelize": { @@ -5275,11 +5516,6 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, - "deepmerge": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", - "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==" - }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -5332,11 +5568,6 @@ "kind-of": "^6.0.2" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -5510,11 +5741,12 @@ } }, "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", + "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", "requires": { - "@babel/runtime": "^7.1.2" + "@babel/runtime": "^7.6.3", + "csstype": "^2.6.7" } }, "dom-serializer": { @@ -5611,6 +5843,11 @@ "stream-shift": "^1.0.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -5669,9 +5906,10 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "emojis-list": { "version": "2.1.0", @@ -5701,6 +5939,11 @@ "tapable": "^1.0.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -5756,22 +5999,27 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5807,6 +6055,16 @@ "ext": "^1.1.2" } }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5838,207 +6096,534 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "color-convert": "^2.0.1" } }, - "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 + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true - } - } - }, - "eslint-config-airbnb": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz", - "integrity": "sha512-R9jw28hFfEQnpPau01NO5K/JWMGLi6aymiF6RsnMURjTk+MqZKllCqGK/0tOvHkPi/NWSSOU2Ced/GX++YxLnw==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^13.1.0", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4" - } - }, - "eslint-config-airbnb-base": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz", - "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==", - "dev": true, - "requires": { - "eslint-restricted-globals": "^0.1.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4" - } - }, - "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { - "ms": "2.0.0" + "color-name": "~1.1.4" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-loader": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", - "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, "requires": { - "locate-path": "^2.0.0" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "escape-string-regexp": "^1.0.5" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { - "p-try": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, "requires": { - "p-limit": "^1.1.0" + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.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=" + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "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 + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.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" + }, + "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-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "dependencies": { + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + } + } + }, + "eslint-config-prettier": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz", + "integrity": "sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA==", + "dev": true + }, + "eslint-config-react-app": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", + "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", + "requires": { + "confusing-browser-globals": "^1.0.9" + } + }, + "eslint-config-standard": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", + "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", + "dev": true + }, + "eslint-loader": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.4.tgz", + "integrity": "sha512-I496aBd+Hi23Y0Cx+sKvw+VwlJre4ScIRlkrvTO6Scq68X/UXbN6F3lAhN8b0Zv8atAyprkyrA42K5QBJtCyaw==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.3", + "loader-utils": "^1.2.3", + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + } + }, + "object-hash": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } }, "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, "requires": { - "find-up": "^2.1.0" + "eslint-visitor-keys": "^1.1.0" } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true } } }, @@ -6051,28 +6636,31 @@ } }, "eslint-plugin-import": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", - "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "debug": { "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" } @@ -6081,23 +6669,52 @@ "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" } }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "^2.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "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", @@ -6109,6 +6726,7 @@ "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" @@ -6117,12 +6735,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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" } @@ -6131,6 +6751,7 @@ "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" } @@ -6138,12 +6759,14 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "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" } @@ -6152,6 +6775,7 @@ "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" } @@ -6159,12 +6783,23 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "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" + } }, "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", @@ -6175,10 +6810,21 @@ "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" } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } } } }, @@ -6198,30 +6844,85 @@ "jsx-ast-utils": "^2.2.1" }, "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "jsx-ast-utils": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true } } }, + "eslint-plugin-prettier": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true + }, "eslint-plugin-react": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz", - "integrity": "sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz", + "integrity": "sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==", "dev": true, "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.1.0", - "object.fromentries": "^2.0.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.10.1" + "resolve": "^1.18.1", + "string.prototype.matchall": "^4.0.2" }, "dependencies": { "doctrine": { @@ -6233,12 +6934,115 @@ "esutils": "^2.0.2" } }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "dependencies": { + "array-includes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", + "is-string": "^1.0.5" + } + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", + "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } } @@ -6249,19 +7053,39 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, - "eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "dependencies": { + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + } } }, "eslint-utils": { @@ -6280,20 +7104,9 @@ } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" - }, - "espree": { - "version": "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" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "esprima": { "version": "4.0.1", @@ -6301,11 +7114,18 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, "esrecurse": { @@ -6317,14 +7137,14 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -6495,6 +7315,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -6538,26 +7363,13 @@ "requires": { "is-plain-object": "^2.0.4" } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -6638,6 +7450,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, + "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-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -6673,15 +7491,21 @@ } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -6703,15 +7527,6 @@ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, - "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", @@ -6813,9 +7628,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" }, "flatten": { "version": "1.0.3", @@ -6831,6 +7646,11 @@ "readable-stream": "^2.3.6" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -6856,21 +7676,11 @@ } }, "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } + "debug": "=3.1.0" } }, "for-in": { @@ -6950,6 +7760,11 @@ "readable-stream": "^2.0.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -7003,6 +7818,11 @@ "readable-stream": "1 || 2" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -7058,6 +7878,17 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -7085,9 +7916,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7250,9 +8081,9 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, "has-value": { "version": "1.0.0", @@ -7262,13 +8093,6 @@ "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } } }, "has-values": { @@ -7324,16 +8148,28 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, "history": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz", - "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", + "resolve-pathname": "^3.0.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0", - "value-equal": "^0.4.0" + "value-equal": "^1.0.1" + }, + "dependencies": { + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + } } }, "hmac-drbg": { @@ -7347,9 +8183,9 @@ } }, "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", "requires": { "react-is": "^16.7.0" } @@ -7370,6 +8206,11 @@ "wbuf": "^1.1.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -7427,6 +8268,76 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, + "html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "requires": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + } + } + }, "html-minifier-terser": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz", @@ -7507,6 +8418,13 @@ "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "http-parser-js": { @@ -7550,6 +8468,12 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "hyphenate-style-name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", @@ -7638,6 +8562,14 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "indefinite-observable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz", + "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==", + "requires": { + "symbol-observable": "1.2.0" + } + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -7663,52 +8595,14 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", - "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" - } - } - } + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "internal-ip": { "version": "4.3.0", @@ -7837,14 +8731,14 @@ } }, "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "2.0.0", @@ -7867,6 +8761,15 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -7876,9 +8779,9 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { "version": "0.1.6", @@ -7918,9 +8821,10 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-generator-fn": { "version": "2.1.0", @@ -7940,6 +8844,12 @@ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -7980,11 +8890,11 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "^4.0.0" + "isobject": "^3.0.1" } }, "is-promise": { @@ -7993,11 +8903,11 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "requires": { - "has": "^1.0.1" + "has": "^1.0.3" } }, "is-regexp": { @@ -8034,11 +8944,11 @@ } }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -8056,20 +8966,15 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isstream": { "version": "0.1.2", @@ -8127,6 +9032,19 @@ "source-map": "^0.6.1" }, "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8264,6 +9182,11 @@ "jsdom": "^14.1.0" }, "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, "jsdom": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", @@ -9133,6 +10056,13 @@ "chalk": "^2.0.1", "jest-util": "^24.9.0", "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + } } }, "jest-worker": { @@ -9288,90 +10218,10 @@ "verror": "1.10.0" } }, - "jss": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0-alpha.17.tgz", - "integrity": "sha512-egGIUg+YRu0+U+XXlD0gmVtU/gW5sn7+qmDv7opwK5s8emZBE/VoN55X6CaMrAa0kLeGMldnI43KOWea6M9/mA==", - "requires": { - "@babel/runtime": "^7.3.1", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-camel-case": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0-alpha.17.tgz", - "integrity": "sha512-aPY4kr6MwliH7KToLRzeSk1NxXUo9n7MQsAa0Hghwj01x9UnMkDkGAKENMKUtPjGkQZfiJpB9tTLFrSJ/6VrIQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.0.0-alpha.17" - } - }, - "jss-plugin-default-unit": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0-alpha.17.tgz", - "integrity": "sha512-KQgiXczvzJ9AlFdD8NS7FZLub0NSctSrCA9Yi/GqdsfJg4ZCriU4DzIybCZBHCi/INFGJmLIESYWSxnuhAzgSQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.0-alpha.17" - } - }, - "jss-plugin-global": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.0-alpha.17.tgz", - "integrity": "sha512-WYxiwwI+CLk0ozW8loeceqXBAZXBMsLBEZeRwVf9WX+FljdJkGwVZpRCk6LBX4aXnqAGyKqCxIAIJ3KP2yBdEg==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.0-alpha.17" - } - }, - "jss-plugin-nested": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.0-alpha.17.tgz", - "integrity": "sha512-onpFqv904KCujryf2t6IIV1/QoB7cSF7ojrd4UujcN5TPvYOvXF5bchi7jnHG5U0SLlRSDGMLJ9fhtoCknhEbw==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.0-alpha.17", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-props-sort": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0-alpha.17.tgz", - "integrity": "sha512-KnbyrxCbtQTqpDx2mSZU/r/E5QnDPIVfIxRi8K+W/q4gZpomBvqWC+xgvAk9hbpmA6QBoQaOilV8o12w2IZ6fg==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.0-alpha.17" - } - }, - "jss-plugin-rule-value-function": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0-alpha.17.tgz", - "integrity": "sha512-8AuJB44Q+ehfkWVRi2XlRbUf6SrLmrHTa5EXd6dgQRCCRuvGmqX8Dl4fZvNeKRFjTLPZgzg9+31rqeOMhKa2vA==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.0-alpha.17" - } - }, - "jss-plugin-vendor-prefixer": { - "version": "10.0.0-alpha.17", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0-alpha.17.tgz", - "integrity": "sha512-wDq9EL0QaoMGSGifPEBb+/SA9LBcqPEW0jpL9ht+Z2t+lV7NNz0j7uCEOuE6FvNWqHzUKTsiATs1rTHPkzNBEQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.1", - "jss": "10.0.0-alpha.17" - } - }, - "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=" }, "killable": { "version": "1.0.1", @@ -9689,6 +10539,14 @@ "tslib": "^1.9.3" }, "dependencies": { + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -9748,6 +10606,11 @@ "readable-stream": "^2.0.1" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -9861,12 +10724,6 @@ "mime-db": "1.43.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, "mini-create-react-context": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", @@ -10053,6 +10910,12 @@ "run-queue": "^1.0.3" } }, + "mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10072,11 +10935,32 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + } + } }, "nanomatch": { "version": "1.2.13", @@ -10177,6 +11061,11 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -10212,6 +11101,13 @@ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } } } @@ -10356,12 +11252,6 @@ } } }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", - "dev": true - }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -10419,18 +11309,6 @@ "has": "^1.0.3" } }, - "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" - } - }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", @@ -10588,15 +11466,6 @@ "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" - } - }, "open": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", @@ -10641,6 +11510,13 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } } }, "original": { @@ -10751,6 +11627,11 @@ "readable-stream": "^2.1.5" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -10821,11 +11702,6 @@ "json-parse-better-errors": "^1.0.1" } }, - "parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" - }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -10885,11 +11761,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -11940,6 +12811,21 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "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" + } + }, "pretty-bytes": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", @@ -11972,6 +12858,208 @@ } } }, + "pretty-quick": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.0.tgz", + "integrity": "sha512-DtxIxksaUWCgPFN7E1ZZk4+Aav3CCuRdhrDSFZENb404sYMtuo9Zka823F+Mgeyt8Zt3bUiCjFzzWYE9LYqkmQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -12502,6 +13590,14 @@ "warning": "^4.0.1" } }, + "react-flash-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-flash-message/-/react-flash-message-1.0.5.tgz", + "integrity": "sha512-Xaza4Tub+ByjaPkBlMYFCh34rZsyxSK1A63lpot10a8I+D8hUt9GfW2Sy1GVfUaClRBc2sBT7kYYXg7KGZTW4w==", + "requires": { + "prop-types": "^15.6.1" + } + }, "react-is": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", @@ -12604,7 +13700,6 @@ "eslint-config-react-app": "^5.2.1", "eslint-loader": "3.0.3", "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.1", "eslint-plugin-jsx-a11y": "6.2.3", "eslint-plugin-react": "7.19.0", "eslint-plugin-react-hooks": "^1.6.1", @@ -12832,6 +13927,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -13230,6 +14333,85 @@ } } }, + "react-swipeable-views": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz", + "integrity": "sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg==", + "requires": { + "@babel/runtime": "7.0.0", + "prop-types": "^15.5.4", + "react-swipeable-views-core": "^0.13.7", + "react-swipeable-views-utils": "^0.13.9", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "react-swipeable-views-core": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz", + "integrity": "sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w==", + "requires": { + "@babel/runtime": "7.0.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "react-swipeable-views-utils": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz", + "integrity": "sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw==", + "requires": { + "@babel/runtime": "7.0.0", + "keycode": "^2.1.7", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.0", + "react-swipeable-views-core": "^0.13.7", + "shallow-equal": "^1.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, "react-text-mask": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.4.3.tgz", @@ -13238,17 +14420,6 @@ "prop-types": "^15.5.6" } }, - "react-transition-group": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.1.1.tgz", - "integrity": "sha512-K/N1wqJ2GRP2yj3WBqEUYa0KV5fiaAWpUfU9SpHOHefeKvyrO+VrnMBML21M19QZoVbDZKmuQFHZYoMMi1xuJA==", - "requires": { - "@babel/runtime": "^7.4.5", - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -13294,6 +14465,26 @@ "util.promisify": "^1.0.0" } }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, "recursive-readdir": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", @@ -13626,11 +14817,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -13678,16 +14864,6 @@ } } }, - "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" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -13767,15 +14943,6 @@ "aproba": "^1.1.1" } }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "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", @@ -14017,6 +15184,11 @@ "statuses": ">= 1.4.0 < 2" } }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -14129,6 +15301,11 @@ } } }, + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -14247,6 +15424,13 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + } } }, "snapdragon": { @@ -14488,6 +15672,16 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + } } }, "spdy-transport": { @@ -14501,6 +15695,16 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + } } }, "split-string": { @@ -14589,6 +15793,11 @@ "readable-stream": "^2.0.2" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -14634,6 +15843,11 @@ "xtend": "^4.0.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -14684,6 +15898,13 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + } } }, "string.prototype.matchall": { @@ -14747,6 +15968,16 @@ } } }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -14765,6 +15996,16 @@ "function-bind": "^1.1.1" } }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14803,6 +16044,13 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } } }, "strip-bom": { @@ -14824,10 +16072,10 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, - "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=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "style-loader": { @@ -14932,6 +16180,16 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -15110,6 +16368,11 @@ "xtend": "~4.0.1" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -15235,16 +16498,34 @@ "punycode": "^2.1.0" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, "ts-pnp": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz", "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==" }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -15313,6 +16594,30 @@ "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-0.0.54.tgz", "integrity": "sha512-sOFA1FXgP0gOgBYlS6irwq6hHYA370KE3dPlgYEJHL3PJd5X8gQE0RmL79ONif6fL5JZuGDj+rtOrFeOqz5IZQ==" }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -15423,6 +16728,11 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -15435,6 +16745,12 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -15564,6 +16880,11 @@ "requires": { "has": "^1.0.3" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -15596,11 +16917,6 @@ "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", - "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -16203,6 +17519,11 @@ "binary-extensions": "^1.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -16318,6 +17639,15 @@ "y18n": "^4.0.0" } }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -16470,6 +17800,14 @@ } } }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, "fsevents": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", @@ -16990,12 +18328,19 @@ } }, "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=" + }, + "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "normalize-path": { "version": "3.0.0", @@ -17074,6 +18419,14 @@ "strip-ansi": "^3.0.1" }, "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -17233,11 +18586,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, "workbox-background-sync": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", @@ -17430,6 +18778,16 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -17559,6 +18917,16 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", diff --git a/package.json b/package.json index febb600..93da867 100755 --- a/package.json +++ b/package.json @@ -14,9 +14,11 @@ "prop-types": "^15.7.2", "react": "^16.8.6", "react-dom": "^16.8.6", + "react-flash-message": "^1.0.5", "react-redux": "^7.1.0", "react-router-dom": "^5.0.1", - "react-scripts": "^3.4.1", + "react-scripts": "^3.3.0", + "react-swipeable-views": "^0.13.8", "redux": "^4.0.1", "redux-thunk": "^2.3.0", "typeface-roboto": "0.0.54" @@ -25,7 +27,13 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "eslint-test": "eslint './**/*.js' './**/*.jsx'", + "eslint-fix": "eslint --fix './**/*.js' './**/*.jsx'", + "prettier-test": "prettier --check './**/*.js' './**/*.jsx' './**/*.css'", + "prettier-fix": "prettier --write './**/*.js' './**/*.jsx' './**/*.css'", + "lint-tests": "npm run eslint-test;npm run prettier-test", + "lint-fixes": "npm run eslint-fix;npm run prettier-fix" }, "eslintConfig": { "extends": "react-app" @@ -43,11 +51,20 @@ ] }, "devDependencies": { - "babel-eslint": "^10.0.1", - "eslint": "^5.16.0", - "eslint-config-airbnb": "^17.1.0", - "eslint-loader": "^2.1.2", - "eslint-plugin-react": "^7.13.0", + "eslint": "^6.8.0", + "eslint-config-airbnb": "^18.2.1", + "eslint-config-prettier": "^7.1.0", + "eslint-config-standard": "^14.1.0", + "eslint-loader": "^3.0.3", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.0.0", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-standard": "^4.0.1", + "html-loader": "^0.5.5", + "prettier": "^2.2.1", + "pretty-quick": "^3.1.0", "minimist": "^1.2.5", "redux-devtools-extension": "^2.13.8" } diff --git a/src/App.css b/src/App.css index 3671a26..4931613 100644 --- a/src/App.css +++ b/src/App.css @@ -1,7 +1,3 @@ .App { text-align: center; } - - - - diff --git a/src/App.jsx b/src/App.jsx index 2dedef5..06d569a 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,48 +1,81 @@ -import React, { PureComponent } from 'react'; -import './App.css'; -import 'typeface-roboto'; -import { Route } from 'react-router-dom'; -import Header from './components/header/header'; -import Home from './containers/home/home'; -import About from './containers/about/about'; -import Practice from './containers/practice/practice'; -import Contact from './containers/contactUs/contactUs'; -import Competitions from './containers/competitions/competitions'; -import Profile from './containers/profile/profile'; -import addCompetitionForm from './components/forms/addCompetitionForm/addCompetitionForm'; -import addProbelmForm from './components/forms/addProblemForm/addProblemForm'; -import SignUp from './components/auth/signUp/signUp'; -import categories from './containers/practice/Categories/categories'; -import Problems from './containers/practice/Problems/Problems'; -import rules from './containers/practice/Rules/rules'; -import leaderboard from './containers/practice/Leaderboard/Leaderboard'; -import category from './containers/practice/Categories/category/category'; -import Competition from './containers/competitions/competition/competition'; - +import React, { PureComponent } from "react"; +import "./App.css"; +import "typeface-roboto"; +import { Route, withRouter } from "react-router-dom"; +import { connect } from "react-redux"; +import * as actions from "./store/actions/index"; +import Header from "./components/header/header"; +import Home from "./containers/home/home"; +import About from "./containers/about/about"; +import Practice from "./containers/practice/practice"; +import Contact from "./containers/contactUs/contactUs"; +import Competitions from "./containers/competitions/competitions"; +import Profile from "./containers/profile/profile"; +import addCompetitionForm from "./components/forms/addCompetitionForm/addCompetitionForm"; +import addProbelmForm from "./components/forms/addProblemForm/addProblemForm"; +import SignUp from "./components/auth/signUp/signUp"; +import categories from "./containers/practice/Categories/categories"; +import Problems from "./containers/practice/Problems/Problems"; +import rules from "./containers/practice/Rules/rules"; +import leaderboard from "./containers/practice/Leaderboard/Leaderboard"; +import category from "./containers/practice/Categories/category/category"; +import Competition from "./containers/competitions/competition/competition"; +import LogOut from "./components/auth/logOut/logOut"; +// import Walkthrough from './containers/walkthrough/walkthrough' class App extends PureComponent { + componentDidMount() { + const { onCheckAuthState } = this.props; + onCheckAuthState(); + } + render() { + const { profile } = this.props; + let protectedRoutes = null; + if (profile) { + if (profile.isAdmin === 1) { + protectedRoutes = ( +
+ + +
+ ); + } + } return (
- - + + - - + + {protectedRoutes} + {/* */}
); } } -export default App; +const mapStateToProps = (state) => ({ + profile: state.profile, +}); + +const mapDispatchToProps = (dispatch) => ({ + onCheckAuthState: () => dispatch(actions.authCheckState()), +}); + +export default withRouter(connect(mapStateToProps, mapDispatchToProps)(App)); diff --git a/src/App.test.jsx b/src/App.test.jsx index a754b20..23c181f 100644 --- a/src/App.test.jsx +++ b/src/App.test.jsx @@ -1,9 +1,9 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App'; +import React from "react"; +import ReactDOM from "react-dom"; +import App from "./App"; -it('renders without crashing', () => { - const div = document.createElement('div'); +it("renders without crashing", () => { + const div = document.createElement("div"); ReactDOM.render(, div); ReactDOM.unmountComponentAtNode(div); }); diff --git a/src/axios.js b/src/axios.js index 7825a8d..9d47ee2 100644 --- a/src/axios.js +++ b/src/axios.js @@ -1,7 +1,7 @@ -import axios from 'axios'; +import axios from "axios"; const instance = axios.create({ - baseURL: 'https://ctf-apis.firebaseio.com/', + baseURL: "https://ctf-apis.firebaseio.com/", }); export default instance; diff --git a/src/components/ComplexButton/complexButton.jsx b/src/components/ComplexButton/complexButton.jsx index e4e69b1..3eefa60 100644 --- a/src/components/ComplexButton/complexButton.jsx +++ b/src/components/ComplexButton/complexButton.jsx @@ -1,81 +1,87 @@ -import React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import ButtonBase from '@material-ui/core/ButtonBase'; -import Typography from '@material-ui/core/Typography'; -import PropTypes from 'prop-types'; -import { Link } from 'react-router-dom'; +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import ButtonBase from "@material-ui/core/ButtonBase"; +import Typography from "@material-ui/core/Typography"; +import PropTypes from "prop-types"; +import { Link } from "react-router-dom"; - -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ root: { - display: 'flex', - flexWrap: 'wrap', - minWidth: 300, - width: '100%', + display: "flex", + flexWrap: "wrap", + width: "300px", + height: "200px", + borderRadius: "20px", + marginTop: "20px", }, image: { - position: 'relative', + borderRadius: "20px", + position: "relative", height: 200, - [theme.breakpoints.down('xs')]: { - width: '100% !important', // Overrides inline-style + [theme.breakpoints.down("xs")]: { + width: "100% !important", // Overrides inline-style height: 100, }, - '&:hover, &$focusVisible': { + "&:hover, &$focusVisible": { zIndex: 1, - '& $imageBackdrop': { + "& $imageBackdrop": { opacity: 0.15, }, - '& $imageMarked': { + "& $imageMarked": { opacity: 0, }, - '& $imageTitle': { - border: '4px solid currentColor', + "& $imageTitle": { + border: "4px solid currentColor", }, }, }, focusVisible: {}, imageButton: { - position: 'absolute', + borderRadius: "20px", + position: "absolute", left: 0, right: 0, top: 0, bottom: 0, - display: 'flex', - alignItems: 'center', - justifyContent: 'center', + display: "flex", + alignItems: "center", + justifyContent: "center", color: theme.palette.common.white, }, imageSrc: { - position: 'absolute', + position: "absolute", left: 0, right: 0, top: 0, bottom: 0, - backgroundSize: 'cover', - backgroundPosition: 'center 40%', + backgroundSize: "cover", + backgroundPosition: "center 40%", }, imageBackdrop: { - position: 'absolute', + borderRadius: "20px", + position: "absolute", left: 0, right: 0, top: 0, bottom: 0, backgroundColor: theme.palette.common.black, opacity: 0.4, - transition: theme.transitions.create('opacity'), + transition: theme.transitions.create("opacity"), }, imageTitle: { - position: 'relative', - padding: `${theme.spacing(2)}px ${theme.spacing(4)}px ${theme.spacing(1) + 6}px`, + position: "relative", + padding: `${theme.spacing(2)}px ${theme.spacing(4)}px ${ + theme.spacing(1) + 6 + }px`, }, imageMarked: { height: 3, width: 18, backgroundColor: theme.palette.common.white, - position: 'absolute', + position: "absolute", bottom: -2, - left: 'calc(50% - 9px)', - transition: theme.transitions.create('opacity'), + left: "calc(50% - 9px)", + transition: theme.transitions.create("opacity"), }, })); @@ -83,15 +89,16 @@ const ButtonBases = ({ name, to }) => { const classes = useStyles(); const images = [ { - url: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRdFRZXA04LwaQNU6rNo7-_MjixkxBcVfE_ciwpLxT3-yjeuWx6', + url: + "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRdFRZXA04LwaQNU6rNo7-_MjixkxBcVfE_ciwpLxT3-yjeuWx6", title: name, - width: '60%', + width: "60%", }, ]; return (
- {images.map(image => ( + {images.map((image) => ( { - const [values, setValues] = useState(null); +const CompProblems = ({ + updateUI, + startTime, + endTime, + problemsSolved, + participant, + eventScore, + token, + challenges, +}) => { + const [values, setValues] = useState(new Map()); const answerInput = (event) => { event.preventDefault(); - const answer = event.target.value; - setValues({ answer }); + values.set(event.target.name, event.target.value); }; - const submitAnswerHandler = () => { - Axios.post('Post Link', values); + const [open, setOpen] = React.useState(false); + const [message, setMessage] = React.useState(""); + + const openSnack = (mess) => { + setMessage(mess); + setOpen(true); + }; + + const handleClose = (event, reason) => { + if (reason === "clickaway") { + return; + } + setOpen(false); + }; + const isSolved = (problemId) => problemsSolved.includes(problemId); + const submitAnswerHandler = async (problem) => { + const participantId = participant._id; + const url = `http://localhost:3000/api/participant/${participantId}`; + const response = await Axios({ + method: "PUT", + url, + data: { + problemId: problem._id, + score: problem.score, + answer: values.get(problem.name), + startTime, + endTime, + eventScore, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + openSnack(response.data.message); + updateUI(); }; const display = (

- Problems +
Problems
- Users Solved +
Users Solved
- Score +
Score
- Status +
Status
- -
-
); - const prob = Object.values(challenges).map(el => ( -
+ const prob = challenges.map((el) => ( +
} @@ -49,31 +93,19 @@ const CompProblems = ({ challenges }) => { > - - {el.name} - {' '} - + {el.name} - - {el.userSolved} - {' '} - + {el.userSolved} - - {el.score} - {' '} - + {el.score} - {el.status ? 'Solved' : 'Unsolved'} - {' '} + {isSolved(el._id) ? "Solved" : "Unsolved"}{" "} - - @@ -81,7 +113,7 @@ const CompProblems = ({ challenges }) => { {el.details}
{ InputLabelProps={{ shrink: true, }} + name={el.name} onChange={answerInput} /> - -
+
)); @@ -112,6 +149,13 @@ const CompProblems = ({ challenges }) => { CompProblems.propTypes = { challenges: PropTypes.node.isRequired, + token: PropTypes.node.isRequired, + eventId: PropTypes.node.isRequired, + participant: PropTypes.node.isRequired, + problemsSolved: PropTypes.node.isRequired, + startTime: PropTypes.node.isRequired, + endTime: PropTypes.node.isRequired, + level: PropTypes.node.isRequired, }; export default CompProblems; diff --git a/src/components/Problem/CompProblems/CompProblems.module.css b/src/components/Problem/CompProblems/CompProblems.module.css new file mode 100644 index 0000000..b601efa --- /dev/null +++ b/src/components/Problem/CompProblems/CompProblems.module.css @@ -0,0 +1,5 @@ +.tableHeading { + font-size: 20px; + font-weight: 500; + margin-bottom: 10px; +} diff --git a/src/components/Table/CompLeaderboard/CompLeaderboard.jsx b/src/components/Table/CompLeaderboard/CompLeaderboard.jsx index 0b3f88b..54d7429 100644 --- a/src/components/Table/CompLeaderboard/CompLeaderboard.jsx +++ b/src/components/Table/CompLeaderboard/CompLeaderboard.jsx @@ -1,41 +1,37 @@ -import React from 'react'; -import { Typography, Box } from '@material-ui/core'; -import PropTypes from 'prop-types'; -import classes from './CompLeaderboard.module.css'; +import React, { useEffect, useState } from "react"; +import { Typography, Box } from "@material-ui/core"; +import PropTypes from "prop-types"; +import Axios from "axios"; +import classes from "./CompLeaderboard.module.css"; -const compLeaderboard = ({ leaderboard }) => { - // const user = [ - // { - // id: 1, - // name: 'Max', - // rank: 1, - // score: 22, - // }, - // { - // id: 2, - // name: 'Rocky', - // rank: 2, - // score: 14, - // }, - // { - // id: 3, - // name: 'Tommy', - // rank: 3, - // score: 2, - // }, +import Spinner from "../../UI/Spinner/Spinner"; - // ]; +const CompLeaderboard = ({ userId, leaderboard }) => { + let table = ; + let userRank = ; + if (leaderboard) { + for (let i = 0; i < leaderboard.length; i++) { + if (leaderboard[i].userId === userId) { + userRank = ( +
+

Rank : {i + 1}

+

Score: {leaderboard[i].score}

+
+ ); + } + } + table = leaderboard.map((el, rank) => ( + + {rank + 1} + {el.handle} + {el.score} + + )); + } - const table = Object.values(leaderboard).map(el => ( - - {el.rank} - {el.name} - {el.score} - - )); return ( -
- User Ranking +
+ {userRank} @@ -44,14 +40,12 @@ const compLeaderboard = ({ leaderboard }) => { {table}
Rank
-
- ); }; -compLeaderboard.propTypes = { - leaderboard: PropTypes.node.isRequired, +CompLeaderboard.propTypes = { + eventId: PropTypes.node.isRequired, }; -export default compLeaderboard; +export default CompLeaderboard; diff --git a/src/components/Table/CompLeaderboard/CompLeaderboard.module.css b/src/components/Table/CompLeaderboard/CompLeaderboard.module.css index f747c6b..f5a46fb 100644 --- a/src/components/Table/CompLeaderboard/CompLeaderboard.module.css +++ b/src/components/Table/CompLeaderboard/CompLeaderboard.module.css @@ -1,15 +1,16 @@ .table { - font-family: arial, sans-serif; - border-collapse: collapse; - width: 100%; + font-family: arial, sans-serif; + border-collapse: collapse; + width: 100%; } -td, th { - border: 1px solid #dddddd; - text-align: left; - padding: 8px; - } +td, +th { + border: 1px solid #dddddd; + text-align: left; + padding: 8px; +} - tr:nth-child(even) { - background-color: #dddddd; - } \ No newline at end of file +tr:nth-child(even) { + background-color: #dddddd; +} diff --git a/src/components/Table/CompTable/CompTable.jsx b/src/components/Table/CompTable/CompTable.jsx index 82a1f47..078a7a2 100644 --- a/src/components/Table/CompTable/CompTable.jsx +++ b/src/components/Table/CompTable/CompTable.jsx @@ -1,55 +1,43 @@ -import React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import Link from '@material-ui/core/Link'; -import Paper from '@material-ui/core/Paper'; -import Typography from '@material-ui/core/Typography'; -import Box from '@material-ui/core/Box'; - -const useStyles = makeStyles(theme => ({ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import { Link } from "react-router-dom"; +import Paper from "@material-ui/core/Paper"; +import Typography from "@material-ui/core/Typography"; +import Box from "@material-ui/core/Box"; +import classesExt from "./CompTable.module.css"; + +const useStyles = makeStyles((theme) => ({ root: { - padding: theme.spacing(7, 5), - spacing: 118, + padding: "40px", + backgroundColor: "rgba(245,245,245,0.6)", + position: "relative", + // top: '-150px' }, })); - -export default function PaperSheet() { +export default function PaperSheet({ eventList }) { const classes = useStyles(); - const dudUrl = '/competition/'; - + const dudUrl = "/event/"; + let table = No competitions to show; + if (eventList) { + table = eventList.map((event) => ( +
+ +
{event.name}
+ +
+ )); + } return (
- - - Competitions - -
- - - - Competition 1 - - - - - - - - - Competition 2 - - - - - - - - - Competition 3 - - - - + +
Competitions
+
+
{table}
); diff --git a/src/components/Table/CompTable/CompTable.module.css b/src/components/Table/CompTable/CompTable.module.css index e69de29..d7dd6a1 100644 --- a/src/components/Table/CompTable/CompTable.module.css +++ b/src/components/Table/CompTable/CompTable.module.css @@ -0,0 +1,37 @@ +.cardTitle { + font-weight: 700; + font-size: 40px; + text-transform: uppercase; +} +.miniLineCenter { + margin-left: auto; + margin-right: auto; + margin-top: 25px; + height: 8px; + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + border-radius: 3px; +} +.competitionList { + width: auto; + height: auto; + /* background-color: red; */ + margin-top: 20px; + /* padding: 20px; */ +} +.competitionLink { + font-style: none; + text-decoration: none; + color: black; + padding: 20px; + width: auto; + font-size: 20px; + font-weight: 600; + border-radius: 10px; + text-align: center; +} +.competitionLink:hover { + background-color: rgba(245, 0, 87, 1); + color: white; +} diff --git a/src/components/Table/UserTable/UserTable.jsx b/src/components/Table/UserTable/UserTable.jsx index 0ccaad1..0f00ef4 100644 --- a/src/components/Table/UserTable/UserTable.jsx +++ b/src/components/Table/UserTable/UserTable.jsx @@ -1,14 +1,14 @@ -import React from 'react'; -import { withStyles, makeStyles } from '@material-ui/core/styles'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; -import Paper from '@material-ui/core/Paper'; -import PropTypes from 'prop-types'; +import React from "react"; +import { withStyles, makeStyles } from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import Paper from "@material-ui/core/Paper"; +import PropTypes from "prop-types"; -const StyledTableCell = withStyles(theme => ({ +const StyledTableCell = withStyles((theme) => ({ head: { backgroundColor: theme.palette.common.black, color: theme.palette.common.white, @@ -18,9 +18,9 @@ const StyledTableCell = withStyles(theme => ({ }, }))(TableCell); -const StyledTableRow = withStyles(theme => ({ +const StyledTableRow = withStyles((theme) => ({ root: { - '&:nth-of-type(odd)': { + "&:nth-of-type(odd)": { backgroundColor: theme.palette.background.default, }, }, @@ -31,27 +31,26 @@ function createData(rank, name, score) { } const rows = [ - createData(1, 'Max', 667), - createData(2, 'Scooby', 660), - createData(3, 'Planck', 632), - createData(4, 'Tommy', 611), - createData(5, 'Rocky', 566), + createData(1, "Max", 667), + createData(2, "Scooby", 660), + createData(3, "Planck", 632), + createData(4, "Tommy", 611), + createData(5, "Rocky", 566), ]; - function CustomizedTables({ width }) { - let wid = '30%'; - if (width) { - wid = width; - } - const useStyles = makeStyles(theme => ({ + // idk what this code was for ---------------- + // let wid = '30%'; + // if (width) { + // wid = width; + // } + const useStyles = makeStyles((theme) => ({ root: { - width: wid, - marginTop: theme.spacing(3), - overflowX: 'auto', + width: "300px", + padding: "0px", }, table: { - minWidth: 250, + width: "300px", }, })); @@ -68,7 +67,7 @@ function CustomizedTables({ width }) { - {rows.map(row => ( + {rows.map((row) => ( {row.rank} diff --git a/src/components/UI/Spinner/Spinner.jsx b/src/components/UI/Spinner/Spinner.jsx index 1817ce7..e6f6eb1 100644 --- a/src/components/UI/Spinner/Spinner.jsx +++ b/src/components/UI/Spinner/Spinner.jsx @@ -1,6 +1,6 @@ -import React from 'react'; -import classes from './Spinner.module.css'; +import React from "react"; +import classes from "./Spinner.module.css"; -const spinner = () => (
Loading...
); +const spinner = () =>
Loading...
; export default spinner; diff --git a/src/components/UI/Spinner/Spinner.module.css b/src/components/UI/Spinner/Spinner.module.css index 8b5ef00..c29e383 100644 --- a/src/components/UI/Spinner/Spinner.module.css +++ b/src/components/UI/Spinner/Spinner.module.css @@ -1,70 +1,85 @@ .Loader { - color: black; - font-size: 20px; - margin: 100px auto; - width: 1em; - height: 1em; - border-radius: 50%; - position: relative; - text-indent: -9999em; - -webkit-animation: load4 1.3s infinite linear; - animation: load4 1.3s infinite linear; - -webkit-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); - } - @-webkit-keyframes load4 { - 0%, - 100% { - box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; - } - 12.5% { - box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; - } - 25% { - box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; - } - 37.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; - } - 50% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; - } - 62.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; - } - 75% { - box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; - } - 87.5% { - box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; - } - } - @keyframes load4 { - 0%, - 100% { - box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; - } - 12.5% { - box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; - } - 25% { - box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; - } - 37.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; - } - 50% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; - } - 62.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; - } - 75% { - box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; - } - 87.5% { - box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; - } - } - \ No newline at end of file + color: black; + font-size: 20px; + margin: 100px auto; + width: 1em; + height: 1em; + border-radius: 50%; + position: relative; + text-indent: -9999em; + -webkit-animation: load4 1.3s infinite linear; + animation: load4 1.3s infinite linear; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} +@-webkit-keyframes load4 { + 0%, + 100% { + box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; + } + 12.5% { + box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 25% { + box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, + 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 37.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, + 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 50% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, + 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 62.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, + 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; + } + 75% { + box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; + } + 87.5% { + box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; + } +} +@keyframes load4 { + 0%, + 100% { + box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; + } + 12.5% { + box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 25% { + box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, + 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 37.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, + 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 50% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, + 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 62.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, + 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; + } + 75% { + box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; + } + 87.5% { + box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, + 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; + } +} diff --git a/src/components/UI/Timer/timer.jsx b/src/components/UI/Timer/timer.jsx new file mode 100644 index 0000000..1d4c7fb --- /dev/null +++ b/src/components/UI/Timer/timer.jsx @@ -0,0 +1,267 @@ +import React, { Component } from "react"; +import PropTypes from "prop-types"; +import "./timer.module.css"; + +const calculateStateFromProps = (props) => { + const { dateTo, numberOfFigures, mostSignificantFigure } = props; + const currentDate = new Date(); + const targetDate = new Date(dateTo); + const diff = targetDate - currentDate; + let significance = ["year", "month", "day", "hour", "min", "sec"]; + + let year = Math.floor(diff / 31104000000); // time diff in years + let month = Math.floor((diff / 2592000000) % 12); // time diff in months (modulated to 12) + let day = Math.floor((diff / 86400000) % 30); // time diff in days (modulated to 30) + let hour = Math.floor((diff / 3600000) % 24); // time diff's hours (modulated to 24) + let min = Math.floor((diff / 60000) % 60); // time diff's minutes (modulated to 60) + let sec = Math.floor((diff / 1000) % 60); // time diff's seconds (modulated to 60) + + if (mostSignificantFigure === "none") { + if (year === 0) { + significance = significance.slice(1); + if (month === 0) { + significance = significance.slice(1); + if (day === 0) { + significance = significance.slice(1); + if (hour === 0) { + significance = significance.slice(1); + if (min === 0) { + significance = significance.slice(1); + } + } + } + } + } + } else { + significance = significance.slice( + significance.indexOf(mostSignificantFigure) + ); + } + significance = significance.slice(0, numberOfFigures); + + if (significance.indexOf("year") === -1) { + month += year * 12; + year = 0; + } + if (significance.indexOf("month") === -1) { + day += month * 30; + month = 0; + } + if (significance.indexOf("day") === -1) { + hour += day * 24; + day = 0; + } + if (significance.indexOf("hour") === -1) { + min += hour * 60; + hour = 0; + } + if (significance.indexOf("min") === -1) { + sec += min * 60; + min = 0; + } + if (diff <= 0) props.callback(); + return { + speed: 250, + diff, + significance, + year, + month, + day, + hour, + min, + sec, + }; +}; + +class Timer extends Component { + constructor(props) { + super(props); + this.state = {}; + } + + componentDidMount() { + this.setState(calculateStateFromProps(this.props), () => { + if (this.state.diff > 0) { + const tickId = setInterval(this.tick, 1000); + this.setState({ tickId }); + } + }); + } + + static getDerivedStateFromProps(props, state) { + const newState = calculateStateFromProps(props); + return newState; + } + + componentWillUnmount() { + clearInterval(this.state.tickId); + } + + animateAndChangeIfNeeded = (unit, prevUnit) => { + const { speed, significance } = this.state; + + if (significance.indexOf(unit) !== -1) { + const unitSpan = this.refs[unit]; + const digits = unitSpan.children; + for (let i = 0; i < digits.length; i++) { + if (i === digits.length - 1) { + setTimeout(() => { + digits[i].classList.toggle("odometerEnd"); + setTimeout(() => { + digits[i].classList.toggle("odometerEnd"); + digits[i].classList.toggle("odometerStart"); + if (prevUnit !== "none") { + const newState = {}; + newState[prevUnit] = 59; + newState[unit] = this.state[unit] - 1; + this.setState(newState); + } + setTimeout( + () => digits[i].classList.toggle("odometerStart"), + speed + ); + }, speed); + }, 1000 - speed); + } else { + let allZeros = true; + for (let j = i + 1; j < digits.length; j++) { + if (digits[j].innerHTML === "0") { + allZeros = true; + } else { + allZeros = false; + break; + } + } + if (allZeros) { + setTimeout(() => { + digits[i].classList.toggle("odometerEnd"); + setTimeout(() => { + digits[i].classList.toggle("odometerEnd"); + digits[i].classList.toggle("odometerStart"); + if (prevUnit !== "none") { + const newState = {}; + newState[prevUnit] = 59; + newState[unit] = this.state[unit] - 1; + this.setState(newState); + } + setTimeout( + () => digits[i].classList.toggle("odometerStart"), + speed + ); + }, speed); + }, 1000 - speed); + } + } + } + } + }; + + tick = () => { + this.setState({ sec: this.state.sec - 1 }); + this.animateAndChangeIfNeeded("sec", "none"); + + if (this.state.sec === 0) { + this.animateAndChangeIfNeeded("min", "sec"); + + if (this.state.min === 0) { + this.animateAndChangeIfNeeded("hour", "min"); + + if (this.state.hour === 0) { + this.animateAndChangeIfNeeded("day", "hour"); + + if (this.state.day === 0) { + this.animateAndChangeIfNeeded("month", "day"); + + if (this.state.month === 0) { + this.animateAndChangeIfNeeded("year", "month"); + } + } + } + } + } + + if ( + this.state.sec === 0 && + this.state.min === 0 && + this.state.hour === 0 && + this.state.day === 0 && + this.state.month === 0 && + this.state.year === 0 + ) { + this.setState({ diff: -1 }); + clearInterval(this.state.tickId); + this.props.callback(); + } + }; + + dissect = (value, unit) => { + let valStr = Number(value).toString(); + if (valStr.length === 1) { + valStr = `0${valStr}`; + } + return valStr.split("").map((digit, key) => ( + + {digit} + + )); + }; + + render() { + const { significance } = this.state; + const { locales, locales_plural } = this.props; + const units = ["year", "month", "day", "hour", "min", "sec"]; + + if (this.state.diff < 0) { + // past date + return ( + + {units.map((unit, key) => { + if (significance.indexOf(unit) !== -1) { + return 0 {locales[key]} ; + } + return null; + })} + + ); + } + return ( + + {units.map((unit, key) => { + if (significance.indexOf(unit) !== -1) { + return ( + + + {this.dissect(this.state[unit], unit)} + {" "} + {this.state[unit] <= 1 && locales[key]} + {this.state[unit] > 1 && locales_plural[key]} + {` `} + + ); + } + return null; + })} + + ); + } +} + +Timer.propTypes = { + locales: PropTypes.array, + locales_plural: PropTypes.array, + dateTo: PropTypes.string.isRequired, + callback: PropTypes.func, + mostSignificantFigure: PropTypes.string, + numberOfFigures: PropTypes.number, +}; + +Timer.defaultProps = { + locales: ["year", "month", "day", "hour", "minute", "second"], + locales_plural: ["years", "months", "days", "hours", "minutes", "seconds"], + dateTo: new Date().toString(), + callback: () => null, + mostSignificantFigure: "none", + numberOfFigures: 6, +}; + +export default Timer; diff --git a/src/components/UI/Timer/timer.module.css b/src/components/UI/Timer/timer.module.css new file mode 100644 index 0000000..50a1577 --- /dev/null +++ b/src/components/UI/Timer/timer.module.css @@ -0,0 +1,40 @@ +@keyframes moveup { + 0% { + opacity: 0; + transform: translateY(12px); + } + 100% { + opacity: 1; + transform: translateY(0px); + } +} + +@keyframes movedown { + 0% { + opacity: 1; + transform: translateY(0px); + } + 100% { + opacity: 0; + transform: translateY(-12px); + } +} + +.odometerStart { + display: inline-block; + animation-name: modeup 0.25s; + -webkit-animation: moveup 0.25s; + animation-fill-mode: forwards; +} +.odometerEnd { + display: inline-block; + animation-name: movedown 0.25s; + -webkit-animation: movedown 0.25s; + animation-fill-mode: forwards; +} + +.odometer-block { + display: inline-block; + justify-content: center; + align-items: center; +} diff --git a/src/components/UI/snackbar/snackbar.jsx b/src/components/UI/snackbar/snackbar.jsx new file mode 100644 index 0000000..2ab951b --- /dev/null +++ b/src/components/UI/snackbar/snackbar.jsx @@ -0,0 +1,44 @@ +import React from "react"; +import Button from "@material-ui/core/Button"; +import Snackbar from "@material-ui/core/Snackbar"; +import { makeStyles } from "@material-ui/core/styles"; +import CloseIcon from "@material-ui/icons/Close"; +import IconButton from "@material-ui/core/IconButton"; + +const useStyles = makeStyles((theme) => ({ + root: { + width: "100%", + "& > * + *": { + marginTop: theme.spacing(2), + }, + }, +})); + +export default function Notif(props) { + const classes = useStyles(); + + return ( +
+ + + + } + /> +
+ ); +} diff --git a/src/components/about/about.jsx b/src/components/about/about.jsx deleted file mode 100644 index 2669536..0000000 --- a/src/components/about/about.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; - -const about = () => ( -

About

-); - -export default about; diff --git a/src/components/auth/admin/admin.jsx b/src/components/auth/admin/admin.jsx new file mode 100644 index 0000000..0ba562b --- /dev/null +++ b/src/components/auth/admin/admin.jsx @@ -0,0 +1,95 @@ +import React from "react"; +import PropTypes from "prop-types"; +import SwipeableViews from "react-swipeable-views"; +import { makeStyles, useTheme } from "@material-ui/core/styles"; +import AppBar from "@material-ui/core/AppBar"; +import Tabs from "@material-ui/core/Tabs"; +import Tab from "@material-ui/core/Tab"; +import Typography from "@material-ui/core/Typography"; +import Box from "@material-ui/core/Box"; +import Login from "../login/login"; +import SignUp from "./signUp/signUp"; + +function TabPanel(props) { + const { children, value, index, ...other } = props; + + return ( + + ); +} + +TabPanel.propTypes = { + children: PropTypes.node, + index: PropTypes.any.isRequired, + value: PropTypes.any.isRequired, +}; + +function a11yProps(index) { + return { + id: `full-width-tab-${index}`, + "aria-controls": `full-width-tabpanel-${index}`, + }; +} + +const useStyles = makeStyles((theme) => ({ + root: { + backgroundColor: theme.palette.background.paper, + // width: 300, + textAlign: "center", + }, + appbar: { + alignItems: "center", + }, +})); + +export default function FullWidthTabs() { + const classes = useStyles(); + const theme = useTheme(); + const [value, setValue] = React.useState(0); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + const handleChangeIndex = (index) => { + setValue(index); + }; + + return ( +
+ + + + + + + + + Login + + + Sign Up + + +
+ ); +} diff --git a/src/components/auth/admin/signUp/signUp.jsx b/src/components/auth/admin/signUp/signUp.jsx new file mode 100644 index 0000000..e479a02 --- /dev/null +++ b/src/components/auth/admin/signUp/signUp.jsx @@ -0,0 +1,116 @@ +import React from "react"; +import clsx from "clsx"; +import { connect } from "react-redux"; +import TextField from "@material-ui/core/TextField"; +import { Container, Button } from "@material-ui/core"; +import Icon from "@material-ui/core/Icon"; +import Visibility from "@material-ui/icons/Visibility"; +import VisibilityOff from "@material-ui/icons/VisibilityOff"; +import FormControl from "@material-ui/core/FormControl"; +import IconButton from "@material-ui/core/IconButton"; +import Input from "@material-ui/core/Input"; +import InputLabel from "@material-ui/core/InputLabel"; +import InputAdornment from "@material-ui/core/InputAdornment"; +import PropTypes from "prop-types"; +import classes from "./signUp.module.css"; +import * as actions from "../../../../store/actions/index"; + +const SignUp = (props) => { + const [values, setValues] = React.useState({ + username: "", + password: "", + email: "", + secret: "", + }); + const handleChange = (prop) => (event) => { + setValues({ ...values, [prop]: event.target.value }); + }; + const handleClickShowPassword = () => { + setValues({ ...values, showPassword: !values.showPassword }); + }; + const loginSubmitHandler = (event) => { + event.preventDefault(); + props.onAuth(values, false); + }; + return ( + +
Sign Up
+
+
+ +
+ + Password + + + {values.showPassword ? : } + + + } + /> + +
+ +
+ +
+
+
+ +
+
+ + ); +}; + +SignUp.propTypes = { + onAuth: PropTypes.func.isRequired, +}; + +const mapStateToProps = (state) => ({ + loading: state.loading, +}); + +const mapDispatchToProps = (dispatch) => ({ + onAuth: (authData, isLogin) => dispatch(actions.auth(authData, isLogin)), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(SignUp); diff --git a/src/components/auth/admin/signUp/signUp.module.css b/src/components/auth/admin/signUp/signUp.module.css new file mode 100644 index 0000000..78c2ffc --- /dev/null +++ b/src/components/auth/admin/signUp/signUp.module.css @@ -0,0 +1,27 @@ +.container { + text-align: center; +} +.modalTitle { + font-size: 40px; + font-weight: 700; + text-transform: uppercase; +} +.miniLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin: auto; + margin-top: 25px; + margin-bottom: 0px; + border-radius: 3px; + height: 8px; +} +.textField { + display: flex; + justify-content: flex-start; + margin-right: 200px; + width: 350px; +} +.btnText { + margin-right: 10px; +} diff --git a/src/components/auth/logOut/logOut.jsx b/src/components/auth/logOut/logOut.jsx new file mode 100644 index 0000000..8e4c442 --- /dev/null +++ b/src/components/auth/logOut/logOut.jsx @@ -0,0 +1,21 @@ +import React, { Component } from "react"; +import { Redirect } from "react-router-dom"; +import { connect } from "react-redux"; + +import * as actions from "../../../store/actions/index"; + +class Logout extends Component { + componentDidMount() { + this.props.onLogout(); + } + + render() { + return ; + } +} + +const mapDispatchToProps = (dispatch) => ({ + onLogout: () => dispatch(actions.logout()), +}); + +export default connect(null, mapDispatchToProps)(Logout); diff --git a/src/components/auth/login/login.jsx b/src/components/auth/login/login.jsx index a8c915e..da76173 100644 --- a/src/components/auth/login/login.jsx +++ b/src/components/auth/login/login.jsx @@ -1,70 +1,96 @@ -import React from 'react'; -import clsx from 'clsx'; -import TextField from '@material-ui/core/TextField'; -import { Typography, Container, Button } from '@material-ui/core'; -import Icon from '@material-ui/core/Icon'; -import Visibility from '@material-ui/icons/Visibility'; -import VisibilityOff from '@material-ui/icons/VisibilityOff'; -import FormControl from '@material-ui/core/FormControl'; -import IconButton from '@material-ui/core/IconButton'; -import Input from '@material-ui/core/Input'; -import InputLabel from '@material-ui/core/InputLabel'; -import InputAdornment from '@material-ui/core/InputAdornment'; -import Axios from 'axios'; -import classes from './login.module.css'; +import React from "react"; +import { connect } from "react-redux"; +import clsx from "clsx"; +import TextField from "@material-ui/core/TextField"; +import { Typography, Container, Button } from "@material-ui/core"; +import Icon from "@material-ui/core/Icon"; +import Visibility from "@material-ui/icons/Visibility"; +import VisibilityOff from "@material-ui/icons/VisibilityOff"; +import FormControl from "@material-ui/core/FormControl"; +import IconButton from "@material-ui/core/IconButton"; +import Input from "@material-ui/core/Input"; +import InputLabel from "@material-ui/core/InputLabel"; +import InputAdornment from "@material-ui/core/InputAdornment"; +import classes from "./login.module.css"; +import Spinner from "../../UI/Spinner/Spinner"; +import * as actions from "../../../store/actions/index"; -const Login = () => { +const Login = (props) => { const [values, setValues] = React.useState({ - username: '', - password: '', + username: "", + password: "", }); - const handleChange = prop => (event) => { + const handleChange = (prop) => (event) => { setValues({ ...values, [prop]: event.target.value }); }; const handleClickShowPassword = () => { setValues({ ...values, showPassword: !values.showPassword }); }; - const loginSubmitHandler = () => { - Axios.post('Post Link', values); + const loginSubmitHandler = (event) => { + event.preventDefault(); + props.onAuth(values, true); }; - return ( + let display = ( - Login +
Login
+
+

Password - + {values.showPassword ? : } -)} + } />

-

); + if (props.loading) { + display = ; + } + return
{display}
; }; -export default Login; +const mapStateToProps = (state) => ({ + loading: state.loading, +}); + +const mapDispatchToProps = (dispatch) => ({ + onAuth: (authData, isLogin) => dispatch(actions.auth(authData, isLogin)), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(Login); diff --git a/src/components/auth/login/login.module.css b/src/components/auth/login/login.module.css index 70a652b..78c2ffc 100644 --- a/src/components/auth/login/login.module.css +++ b/src/components/auth/login/login.module.css @@ -1,10 +1,27 @@ .container { - text-align: center; + text-align: center; +} +.modalTitle { + font-size: 40px; + font-weight: 700; + text-transform: uppercase; +} +.miniLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin: auto; + margin-top: 25px; + margin-bottom: 0px; + border-radius: 3px; + height: 8px; } - .textField { - display: flex; - justify-content: flex-start; - margin-right: 200px; - width:200px -} \ No newline at end of file + display: flex; + justify-content: flex-start; + margin-right: 200px; + width: 350px; +} +.btnText { + margin-right: 10px; +} diff --git a/src/components/auth/signUp/signUp.jsx b/src/components/auth/signUp/signUp.jsx index 06f7962..d0f8032 100644 --- a/src/components/auth/signUp/signUp.jsx +++ b/src/components/auth/signUp/signUp.jsx @@ -1,104 +1,143 @@ -import React from 'react'; -import clsx from 'clsx'; -import TextField from '@material-ui/core/TextField'; -import { Typography, Container, Button } from '@material-ui/core'; -import Icon from '@material-ui/core/Icon'; -import Visibility from '@material-ui/icons/Visibility'; -import VisibilityOff from '@material-ui/icons/VisibilityOff'; -import FormControl from '@material-ui/core/FormControl'; -import IconButton from '@material-ui/core/IconButton'; -import Input from '@material-ui/core/Input'; -import InputLabel from '@material-ui/core/InputLabel'; -import InputAdornment from '@material-ui/core/InputAdornment'; -import Axios from 'axios'; -import classes from './signUp.module.css'; -import Modal from '../../modal/modal'; -import Login from '../login/login'; +import React from "react"; +import clsx from "clsx"; +import { connect } from "react-redux"; +import TextField from "@material-ui/core/TextField"; +import { Typography, Container, Button } from "@material-ui/core"; +import Icon from "@material-ui/core/Icon"; +import Visibility from "@material-ui/icons/Visibility"; +import VisibilityOff from "@material-ui/icons/VisibilityOff"; +import FormControl from "@material-ui/core/FormControl"; +import IconButton from "@material-ui/core/IconButton"; +import Input from "@material-ui/core/Input"; +import InputLabel from "@material-ui/core/InputLabel"; +import InputAdornment from "@material-ui/core/InputAdornment"; +import classes from "./signUp.module.css"; +import Modal from "../../modal/modal"; +import Login from "../login/login"; +import Admin from "../admin/admin"; +import Spinner from "../../UI/Spinner/Spinner"; +import * as actions from "../../../store/actions/index"; -const SignUp = () => { +const SignUp = (props) => { const [values, setValues] = React.useState({ - name: '', - emailId: '', - number: 0, - username: '', - password: '', + name: "", + email: "", + number: "", + username: "", + password: "", }); - const handleChange = prop => (event) => { + const handleChange = (prop) => (event) => { setValues({ ...values, [prop]: event.target.value }); }; const handleClickShowPassword = () => { setValues({ ...values, showPassword: !values.showPassword }); }; - const loginSubmitHandler = () => { - Axios.post('Post Link', values); + const loginSubmitHandler = (event) => { + event.preventDefault(); + props.onAuth(values, false); }; - return ( + let display = ( - Sign Up - -
- -
- -
- -
- - Password - - - {values.showPassword ? : } - - -)} - /> - -
-
- -
- +
+
+
Sign Up
+
+
+ + + + OR + + + +
+
+
+ +
+ +
+ +
+ +
+ + Password + + + {values.showPassword ? : } + + + } + /> + +
+
+ +
); + + if (props.loading) { + display = ; + } + return
{display}
; }; -export default SignUp; +const mapStateToProps = (state) => ({ + loading: state.loading, + error: state.error, +}); + +const mapDispatchToProps = (dispatch) => ({ + onAuth: (authData, isLogin) => dispatch(actions.auth(authData, isLogin)), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(SignUp); diff --git a/src/components/auth/signUp/signUp.module.css b/src/components/auth/signUp/signUp.module.css index 7d6c3a8..0025079 100644 --- a/src/components/auth/signUp/signUp.module.css +++ b/src/components/auth/signUp/signUp.module.css @@ -1,10 +1,69 @@ .container { -text-align: center; + text-align: center; +} +.mainCont { + display: flex; + flex-direction: row; + position: absolute; + top: 150px; + height: calc(100% - 150px); + width: 100%; + left: 0px; + justify-content: center; + align-items: center; + /* background-color: green; */ +} +.pageTitle { + font-weight: 700; + font-size: 50px; + margin-top: 30px; + text-transform: uppercase; + letter-spacing: 1px; +} +.miniLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin: auto; + margin-top: 25px; + margin-bottom: 0px; + border-radius: 3px; + height: 8px; +} +.left { + width: 40%; + /* background-color: red; */ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} +.right { + width: 40%; + /* background-color: green; */ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} +.modalRow { + margin-top: 30px; + width: 200px; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; +} +.modalRow .orSym { + width: 40px; + line-height: 40px; + height: 40px; + border-radius: 20px; + border: 1px solid black; } - .textField { - display: flex; - justify-content: flex-start; - margin-right: 200px; - width:200px -} \ No newline at end of file + width: 350px; +} +.btnText { + margin-right: 10px; +} diff --git a/src/components/competition/competition.jsx b/src/components/competition/competition.jsx index 453fbc7..5c29108 100644 --- a/src/components/competition/competition.jsx +++ b/src/components/competition/competition.jsx @@ -1,7 +1,5 @@ -import React from 'react'; +import React from "react"; -const competition = () => ( -

Competition

-); +const competition = () =>

Competition

; export default competition; diff --git a/src/components/contactUs/contactUs.jsx b/src/components/contactUs/contactUs.jsx index 74be985..688fb8b 100644 --- a/src/components/contactUs/contactUs.jsx +++ b/src/components/contactUs/contactUs.jsx @@ -1,7 +1,5 @@ -import React from 'react'; +import React from "react"; -const contactUs = () => ( -

Contact Us

-); +const contactUs = () =>

Contact Us

; export default contactUs; diff --git a/src/components/forms/addCompetitionForm/addCompetitionForm.jsx b/src/components/forms/addCompetitionForm/addCompetitionForm.jsx index 8b1ffe7..3f1e1dd 100644 --- a/src/components/forms/addCompetitionForm/addCompetitionForm.jsx +++ b/src/components/forms/addCompetitionForm/addCompetitionForm.jsx @@ -1,104 +1,146 @@ -import React, { useState } from 'react'; -import TextField from '@material-ui/core/TextField'; -import { Typography, Container, Button } from '@material-ui/core'; -import Icon from '@material-ui/core/Icon'; -import { - DateTimePicker, - MuiPickersUtilsProvider, -} from 'material-ui-pickers'; -import MomentUtils from '@date-io/moment'; -import Axios from 'axios'; -import classes from './addCompetitionForm.module.css'; -import Modal from '../../modal/modal'; -import ProblemAdderDialog from './problemAdderDialog/problemAdderDialog'; +import React, { useState } from "react"; +import { connect } from "react-redux"; +import TextField from "@material-ui/core/TextField"; +import { Typography, Container, Button } from "@material-ui/core"; +import Icon from "@material-ui/core/Icon"; +import { DateTimePicker, MuiPickersUtilsProvider } from "material-ui-pickers"; +import MomentUtils from "@date-io/moment"; +import Axios from "axios"; +import classes from "./addCompetitionForm.module.css"; +import Modal from "../../modal/modal"; +import ProblemAdderDialog from "./problemAdderDialog/problemAdderDialog"; +import * as actions from "../../../store/actions/index"; +import Snackbar from "../../UI/snackbar/snackbar"; - -const AddCompetitionForm = () => { +const AddCompetitionForm = (props) => { const [values, setValues] = useState({ - name: '', + name: "", challenges: [], - details: '', + details: "", + level: 0, + levelScore: new Map(), }); const [startDate, handleStartDateChange] = useState(new Date()); const [endDate, handleEndDateChange] = useState(new Date()); + const [open, setOpen] = React.useState(false); + const [message, setMessage] = React.useState(""); + + const openSnack = (mess) => { + setMessage(mess); + setOpen(true); + }; + + const handleClose = (event, reason) => { + if (reason === "clickaway") { + return; + } + setOpen(false); + }; - const changeHandler = name => (event) => { + const changeHandler = (name) => (event) => { setValues({ ...values, [name]: event.target.value }); }; const submitHandler = (event) => { event.preventDefault(); - const send = { ...values, ...startDate, ...endDate }; - Axios.post('Post Link', send); + const req = { + ...values, + startTime: startDate, + endTime: endDate, + }; + const { addEvent, token } = props; + // console.log(req.levelScore) + addEvent(req, token); + openSnack("Competition Created Successfully"); }; - const problemSubmitHandler = (challenges) => { - setValues({ ...values, challenges }); + const problemSubmitHandler = (challenges, levels) => { + const level = levels.size; + setValues({ ...values, challenges, levelScore: levels, level }); + openSnack("Problems added Successfully"); }; - return ( -
- Add a Competition -
-
- - - -
-
- - +
+
Add a Competition
+
+ + - -
-
- - +
+ + + +
+
+ + + +
+
+
+ -
-
-
-
- -
-
- - - +
+
+ + + +
+ + +
+ ); }; -export default AddCompetitionForm; +const mapStateToProps = (state) => ({ + token: state.token, +}); + +const mapDispatchToProps = (dispatch) => ({ + addEvent: (event, token) => dispatch(actions.onitEvent(event, token)), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(AddCompetitionForm); diff --git a/src/components/forms/addCompetitionForm/addCompetitionForm.module.css b/src/components/forms/addCompetitionForm/addCompetitionForm.module.css index 0c1eeca..4f87767 100644 --- a/src/components/forms/addCompetitionForm/addCompetitionForm.module.css +++ b/src/components/forms/addCompetitionForm/addCompetitionForm.module.css @@ -1,6 +1,40 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: flex-start; + /* background-color: red; */ + justify-content: flex-start; + position: absolute; + top: 150px; + /* height: calc(100% - 150px); */ + width: 100%; + left: 0px; + padding-bottom: 100px; +} +.miniLine { + width: 40px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 25px; + border-radius: 3px; +} +.subCont { + /* margin-left: 50px; */ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: auto; + margin-top: 50px; +} +.title { + font-size: 50px; + font-weight: 700; +} .textField { - display: flex; - justify-content: flex-start; - margin-right: 200px; - width:200px -} \ No newline at end of file + display: flex; + justify-content: flex-start; + margin-right: 200px; + width: 450px; +} diff --git a/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.jsx b/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.jsx index fe0807e..cb70b25 100644 --- a/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.jsx +++ b/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.jsx @@ -1,24 +1,31 @@ -import React, { Component } from 'react'; +import React, { Component } from "react"; import { - Typography, ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Grid, Container, -} from '@material-ui/core'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; -import Spinner from '../../../UI/Spinner/Spinner'; -import * as probelmActions from '../../../../store/actions/index'; - + Typography, + ExpansionPanel, + ExpansionPanelSummary, + ExpansionPanelDetails, + Grid, + Container, + Button, +} from "@material-ui/core"; +import Icon from "@material-ui/core/Icon"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import Spinner from "../../../UI/Spinner/Spinner"; +import * as probelmActions from "../../../../store/actions/index"; +import classes from "./problemAdderDialog.module.css"; class problems extends Component { - state={ - challenges: [], - }; - - componentDidMount() { - const { onInitProblems } = this.props; - onInitProblems(); - } + state = { + challenges: [], + levels: new Map(), + }; + componentDidMount() { + const { onInitProblems } = this.props; + onInitProblems("2"); + } checkBoxChangeHandler = (element) => { const { challenges } = this.state; @@ -27,29 +34,44 @@ class problems extends Component { if (i === element) { flag = false; } - return ''; + return ""; }); + const { levels } = this.state; + const level = element.level.toString(); if (flag === true) { - this.setState({ challenges: [...challenges, element] }); + if (!levels.has(level)) { + levels.set(level, 0); + } + levels.set( + level, + (parseInt(levels.get(level), 10) + element.score).toString() + ); + this.setState({ challenges: [...challenges, element._id], levels }); } else { let temp = [...challenges]; - temp = temp.filter(item => item !== element); - this.setState({ challenges: temp }); + if (levels.has(level)) { + levels.set( + levels.get(level), + (parseInt(levels.get(level), 10) - element.score).toString() + ); + } + temp = temp.filter((item) => item !== element); + this.setState({ challenges: temp, levels }); } }; submitHandler = () => { - const { challenges } = this.state; + const { challenges, levels } = this.state; const { problemSubmit } = this.props; - problemSubmit(challenges); - } + problemSubmit(challenges, levels); + }; render() { const { problemsList } = this.props; let prob = null; if (problemsList) { - prob = Object.values(problemsList).map(el => ( -
+ prob = Object.values(problemsList).map((el) => ( +
} @@ -58,38 +80,29 @@ class problems extends Component { > - - this.checkBoxChangeHandler(el)} /> - {el.name} - {' '} - +
+ + this.checkBoxChangeHandler(el)} + /> + + {el.name} +
- - {el.userSolved} - {' '} - + {el.userSolved} - - {el.score} - {' '} - + {el.score} - - {el.status ? 'Solved' : 'Unsolved'} - {' '} - + {el.status ? "Solved" : "Unsolved"} - -
- - {el.details} - + {el.details}
@@ -103,39 +116,38 @@ class problems extends Component {
- Problems +
Problems
- Users Solved +
Users Solved
- Score +
Score
- Status +
Status
- -
-
); } - return (
- - Problems - +
Problems
{display} {prob} - - +
- -
); } @@ -147,12 +159,12 @@ problems.propTypes = { problemSubmit: PropTypes.node.isRequired, }; -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ problemsList: state.problems, }); -const mapDispatchToProps = dispatch => ({ - onInitProblems: () => dispatch(probelmActions.initProbelms()), +const mapDispatchToProps = (dispatch) => ({ + onInitProblems: (problemType) => + dispatch(probelmActions.initProbelms(problemType)), }); - export default connect(mapStateToProps, mapDispatchToProps)(problems); diff --git a/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.module.css b/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.module.css new file mode 100644 index 0000000..ae77b1e --- /dev/null +++ b/src/components/forms/addCompetitionForm/problemAdderDialog/problemAdderDialog.module.css @@ -0,0 +1,19 @@ +.title { + font-size: 40px; + text-align: center; + text-transform: uppercase; + font-weight: 700; +} +.tableTitle { + font-size: 17px; + font-weight: 500; + margin-top: 20px; + margin-bottom: 20px; +} +.column1 { + display: flex; + flex-direction: row; +} +.checkBox { + margin-right: 10px; +} diff --git a/src/components/forms/addProblemForm/addProblemForm.jsx b/src/components/forms/addProblemForm/addProblemForm.jsx index 204d039..1eec5fe 100644 --- a/src/components/forms/addProblemForm/addProblemForm.jsx +++ b/src/components/forms/addProblemForm/addProblemForm.jsx @@ -1,55 +1,90 @@ -import React, { useState } from 'react'; -import TextField from '@material-ui/core/TextField'; -import { Typography, Container, Button } from '@material-ui/core'; -import Icon from '@material-ui/core/Icon'; -import Axios from 'axios'; -import classes from './addProblemForm.module.css'; +import React, { useState } from "react"; +import TextField from "@material-ui/core/TextField"; +import { Typography, Container, Button } from "@material-ui/core"; +import Icon from "@material-ui/core/Icon"; +import Axios from "axios"; +import { connect } from "react-redux"; +import InputLabel from "@material-ui/core/InputLabel"; +import MenuItem from "@material-ui/core/MenuItem"; +import FormControl from "@material-ui/core/FormControl"; +import Select from "@material-ui/core/Select"; +import Snackbar from "../../UI/snackbar/snackbar"; +import * as actions from "../../../store/actions/index"; +import classes from "./addProblemForm.module.css"; - -const AddProbelmForm = () => { +const AddProbelmForm = (props) => { const [formElements, setFormElement] = useState({ - name: '', - category: '', - details: '', - difficulty: '', - answer: '', + name: "", + category: "", + details: "", + difficulty: "", + answer: "", + level: 1, + score: 0, + isActive: 1, }); + const [open, setOpen] = React.useState(false); + const [message, setMessage] = React.useState(""); + + const openSnack = (mess) => { + setMessage(mess); + setOpen(true); + }; - const changeHandler = name => (event) => { + const handleClose = (event, reason) => { + if (reason === "clickaway") { + return; + } + setOpen(false); + }; + + const changeHandler = (name) => (event) => { setFormElement({ ...formElements, [name]: event.target.value }); }; const submitHandler = (event) => { event.preventDefault(); - Axios.post('https://ctf-apis.firebaseio.com/problems.json', formElements); + const { addProblem, token } = props; + addProblem(formElements, token); + openSnack("Problem added Successfully"); }; - return ( - -
- Add a Problem -
+
+
+
Add a Problem
+
- -
- + + Category + + + +

{ rows="10" className={classes.textField} fullWidth="true" - onChange={changeHandler('details')} + onChange={changeHandler("details")} variant="outlined" />
+
+ + Difficulty + + +
+
{ className={classes.textField} margin="normal" name="answer" - onChange={changeHandler('answer')} + onChange={changeHandler("answer")} />
+ + Activity + + +

- +
- +
); }; -export default AddProbelmForm; +const mapStateToProps = (state) => ({ + token: state.token, +}); + +const mapDispatchToProps = (dispatch) => ({ + addProblem: (problem, token) => dispatch(actions.onitProblem(problem, token)), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(AddProbelmForm); + +// diff --git a/src/components/forms/addProblemForm/addProblemForm.module.css b/src/components/forms/addProblemForm/addProblemForm.module.css index 0c1eeca..4f87767 100644 --- a/src/components/forms/addProblemForm/addProblemForm.module.css +++ b/src/components/forms/addProblemForm/addProblemForm.module.css @@ -1,6 +1,40 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: flex-start; + /* background-color: red; */ + justify-content: flex-start; + position: absolute; + top: 150px; + /* height: calc(100% - 150px); */ + width: 100%; + left: 0px; + padding-bottom: 100px; +} +.miniLine { + width: 40px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 25px; + border-radius: 3px; +} +.subCont { + /* margin-left: 50px; */ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: auto; + margin-top: 50px; +} +.title { + font-size: 50px; + font-weight: 700; +} .textField { - display: flex; - justify-content: flex-start; - margin-right: 200px; - width:200px -} \ No newline at end of file + display: flex; + justify-content: flex-start; + margin-right: 200px; + width: 450px; +} diff --git a/src/components/header/header.jsx b/src/components/header/header.jsx index 42190d3..15e6f21 100644 --- a/src/components/header/header.jsx +++ b/src/components/header/header.jsx @@ -1,12 +1,14 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { makeStyles } from '@material-ui/core/styles'; -import AppBar from '@material-ui/core/AppBar'; -import Tabs from '@material-ui/core/Tabs'; -import Tab from '@material-ui/core/Tab'; -import Typography from '@material-ui/core/Typography'; -import { Link, withRouter } from 'react-router-dom'; - +import React from "react"; +import PropTypes from "prop-types"; +import { makeStyles } from "@material-ui/core/styles"; +import AppBar from "@material-ui/core/AppBar"; +import Tabs from "@material-ui/core/Tabs"; +import Tab from "@material-ui/core/Tab"; +import { connect } from "react-redux"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import Box from "@material-ui/core/Box"; +import { Link, withRouter, Redirect } from "react-router-dom"; function TabContainer(props) { const { children } = props; @@ -33,8 +35,7 @@ function LinkTab(props) { ); } - -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ root: { flexGrow: 1, backgroundColor: theme.palette.background.dark, @@ -43,11 +44,31 @@ const useStyles = makeStyles(theme => ({ margin: theme.spacing(1), }, input: { - display: 'none', + display: "none", + }, + logOut: { + "& > *": { + // margin: theme.spacing(1) + }, + }, + headerTitleBox: { + display: "flex", + flexDirection: "row", + justifyContent: "center", + alignItems: "center", + }, + headerLogoutBtn: { + marginLeft: "auto", + marginRight: "100px", + }, + headerTitle: { + marginLeft: "100px", + marginRight: "100px", + // backgroundColor: 'red' }, })); -const NavTabs = ({ location }) => { +const NavTabs = ({ location, isAuthenticated }) => { const classes = useStyles(); const [value, setValue] = React.useState(0); @@ -56,139 +77,130 @@ const NavTabs = ({ location }) => { } const current = () => { let currentPath = location.pathname.substr(1); - const breakPoint = currentPath.indexOf('/'); + const breakPoint = currentPath.indexOf("/"); currentPath = currentPath.substr(0, breakPoint); switch (currentPath) { - case 'home': return 0; - case 'about': return 1; - case 'practice': return 2; - case 'competitions': return 3; - case 'competition': return 3; - case 'contactUs': return 4; - case 'signUp': return 5; - case 'profile': return 5; - - default: return 0; + case "home": + return 0; + case "about": + return 1; + case "practice": + return 2; + case "competitions": + return 3; + case "competition": + return 3; + case "contactUs": + return 4; + case "signUp": + return 5; + case "profile": + return 5; + + default: + return 0; } }; + let tab = ; + let red = null; + let logOut = null; + if (isAuthenticated) { + tab = ; + red = ; + logOut = ( + +
+ + + +
+
+ ); + } + return (
- - -

Capture The Flag

- +
+ + +

+ Capture The Flag +

+
+ {logOut} +
+
+ - + - + {tab}
{value === 0 && ( - -
- - -
- -
- {' '} -
- {' '} -
-
- - -
- - -
+ +
+
+


+
+
+
)} {value === 1 && ( - -
-
- {' '} -
- {' '} -
- {' '} -
- -
- -
+ +
+



+
+
)} {value === 2 && ( - -
-
-
-
-
- - -
- - -
+ +
+
+
+
+
+
+
)} {value === 3 && ( - -
-
- {' '} -
- {' '} -
- {' '} -
- - -
- - -
+ +
+



+
+
)} {value === 4 && ( - -
-
- {' '} -
- {' '} -
- {' '} -
- - -
- - -
+ +
+



+
+
)} {value === 5 && ( - -
-
- {' '} -
- {' '} -
- {' '} -
- - -
- - -
+ +
+



+
+
)} - + {red}
); }; @@ -196,5 +208,9 @@ NavTabs.propTypes = { location: PropTypes.objectOf(PropTypes.string).isRequired, }; +const mapStateToProps = (state) => ({ + loading: state.loading, + isAuthenticated: state.token !== null, +}); -export default withRouter(NavTabs); +export default connect(mapStateToProps)(withRouter(NavTabs)); diff --git a/src/components/header/header.module.css b/src/components/header/header.module.css index a6fadd4..c353fd9 100644 --- a/src/components/header/header.module.css +++ b/src/components/header/header.module.css @@ -1,5 +1,4 @@ .header { - display: flex; - justify-content: flex-end; - -} \ No newline at end of file + display: flex; + justify-content: flex-end; +} diff --git a/src/components/home/home.jsx b/src/components/home/home.jsx index b0606af..dce6814 100644 --- a/src/components/home/home.jsx +++ b/src/components/home/home.jsx @@ -1,7 +1,5 @@ -import React from 'react'; +import React from "react"; -const home = () => ( -

Home

-); +const home = () =>

Home

; export default home; diff --git a/src/components/modal/modal.jsx b/src/components/modal/modal.jsx index f2b3dc2..03f6013 100644 --- a/src/components/modal/modal.jsx +++ b/src/components/modal/modal.jsx @@ -1,16 +1,16 @@ -import React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import Modal from '@material-ui/core/Modal'; -import Button from '@material-ui/core/Button'; -import PropTypes from 'prop-types'; +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import Modal from "@material-ui/core/Modal"; +import Button from "@material-ui/core/Button"; +import PropTypes from "prop-types"; function rand() { return Math.round(Math.random() * 20) - 10; } function getModalStyle() { - const top = 50 + rand(); - const left = 50 + rand(); + const top = 50; + const left = 50; return { top: `${top}%`, @@ -19,14 +19,14 @@ function getModalStyle() { }; } -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme) => ({ paper: { - position: 'absolute', + position: "absolute", width: 900, backgroundColor: theme.palette.background.paper, boxShadow: theme.shadows[5], padding: theme.spacing(4), - outline: 'none', + outline: "none", }, })); diff --git a/src/components/practice/practice.jsx b/src/components/practice/practice.jsx index 777c618..616cd8e 100644 --- a/src/components/practice/practice.jsx +++ b/src/components/practice/practice.jsx @@ -1,7 +1,5 @@ -import React from 'react'; +import React from "react"; -const practice = () => ( -

Practice

-); +const practice = () =>

Practice

; export default practice; diff --git a/src/containers/about/about.jsx b/src/containers/about/about.jsx index 9cc7408..940fde2 100644 --- a/src/containers/about/about.jsx +++ b/src/containers/about/about.jsx @@ -1,30 +1,32 @@ -import React from 'react'; -import { Container } from '@material-ui/core'; -import classes from './about.module.css'; +import React from "react"; +import { Container } from "@material-ui/core"; +import classes from "./about.module.css"; const about = () => ( -
+

Why CTF?

-

CTF gives you a platform to learn and show your talent as hackers

+
+

+ {" "} + CTF gives you a platform to learn and show your talent as hackers{" "} +

-
-

About

- -

CTF stands for Capture The Flag. A flag is associated with every challenge.

- -

- {' '} -Once you have solved a particular challenge you would get the hidden +

+
About
+
+
+ CTF stands for Capture The Flag. A flag is associated with every + challenge. +
+
+ Once you have solved a particular challenge you would get the hidden flag which you need to submit back to us for getting points. -

+
- - - ); export default about; diff --git a/src/containers/about/about.module.css b/src/containers/about/about.module.css index b053801..ffc762a 100644 --- a/src/containers/about/about.module.css +++ b/src/containers/about/about.module.css @@ -1,15 +1,57 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: center; + /* background-color: red; */ + justify-content: center; + position: absolute; + top: 150px; + height: calc(100% - 150px); + width: 100%; + left: 0px; +} +.topbox { + font-family: "Roboto", sans-serif; + background-color: #e6e6e6; + border-radius: 20px; + text-align: center; + padding: 40px; + width: calc(63% - 80px); + margin-left: auto; + margin-right: auto; + margin-bottom: 30px; +} .whyctf { - padding-top: 80px; - padding-bottom: 0px; - color: #89D6F3; - - text-align: center; - } - - .topbox { - font-family: "Roboto", sans-serif; - background-color: #1D6B87; - text-align: center; - padding-bottom: 80px; - color : #FFFFFF; - } \ No newline at end of file + /* padding-bottom: 0px; */ + text-align: center; +} +.whyDesc { + font-style: italic; +} +.subText { + width: 60%; + margin-top: 30px; +} +.miniLine { + width: 40px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 25px; + border-radius: 3px; +} +.miniLineCenter { + margin-left: auto; + margin-right: auto; + margin-top: 5px; + height: 3px; +} +.aboutTitle { + font-size: 40px; + font-weight: 700; + text-transform: uppercase; +} +.aboutText { + margin-top: 25px; + font-size: 16px; +} diff --git a/src/containers/competitions/competition/competition.jsx b/src/containers/competitions/competition/competition.jsx index 2c5629a..9615959 100644 --- a/src/containers/competitions/competition/competition.jsx +++ b/src/containers/competitions/competition/competition.jsx @@ -1,65 +1,239 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { Typography, Container, Box } from '@material-ui/core'; -import { connect } from 'react-redux'; -import classes from './competition.module.css'; -import CompLeaderboard from '../../../components/Table/CompLeaderboard/CompLeaderboard'; -import CompProblems from '../../../components/Problem/CompProblems/CompProblems'; -import * as CompetitionActions from '../../../store/actions/index'; -import Spinner from '../../../components/UI/Spinner/Spinner'; - +import React, { Component } from "react"; +import PropTypes from "prop-types"; +import { Typography, Container, Box, Paper, Button } from "@material-ui/core"; +import { connect } from "react-redux"; +import Timer from "../../../components/UI/Timer/timer"; +import classes from "./competition.module.css"; +import CompLeaderboard from "../../../components/Table/CompLeaderboard/CompLeaderboard"; +import CompProblems from "../../../components/Problem/CompProblems/CompProblems"; +import * as CompetitionActions from "../../../store/actions/index"; +import Spinner from "../../../components/UI/Spinner/Spinner"; +import Snackbar from "../../../components/UI/snackbar/snackbar"; class competition extends Component { componentDidMount() { - const { onInitCompetition, history } = this.props; - const id = history.location.pathname.substr(13); - onInitCompetition(id); + const { + onInitCompetition, + location, + token, + onInitLeaderboard, + } = this.props; + const { _id } = location.state; + onInitCompetition(_id, token, 1); + onInitLeaderboard(_id); + } + + constructor(props) { + super(props); + this.state = { + level: 1, + eventId: null, + leaderboardShow: true, + open: false, + message: "", + dummy: true, + }; + this.openSnack = this.openSnack.bind(this); + this.closeSnack = this.closeSnack.bind(this); + } + + openSnack(mess) { + this.setState({ + open: true, + message: mess, + }); + } + + closeSnack() { + this.setState({ + open: false, + }); } + updateUI = () => { + const { level } = this.state; + const { + onInitCompetition, + location, + token, + onInitProfile, + onInitLeaderboard, + userId, + } = this.props; + const { _id } = location.state; + onInitCompetition(_id, token, level); + onInitProfile(userId, token); + onInitLeaderboard(_id); + }; + + nextButtonHandler = (participant) => { + const { + token, + compDetails, + location, + onInitCompetitionLevelProblems, + } = this.props; + const { level } = this.state; + const { _id } = location.state; + if (level === compDetails.levels) { + this.openSnack("This is the Final level!!"); + } + if (participant.level > level) { + const updatedLevel = level + 1; + onInitCompetitionLevelProblems(_id, token, updatedLevel, participant._id); + this.setState({ level: updatedLevel }); + } else { + this.openSnack("Level not Unlocked yet!!"); + } + }; + + prevButtonHandler = () => { + const { + profile, + location, + token, + onInitCompetitionLevelProblems, + } = this.props; + const { level } = this.state; + const { _id } = location.state; + let participant = null; + if (level > 1) { + const updatedLevel = level - 1; + if (profile) { + participant = profile.participant[profile.participant.length - 1]; + } + onInitCompetitionLevelProblems(_id, token, updatedLevel, participant._id); + this.setState({ level: updatedLevel }); + } else { + this.openSnack("This is the first level"); + } + }; + + showLeaderboardHandler = (eventId, leaderboardStatus, token) => { + const { onInitLeaderboardStatus, onInitLeaderboard } = this.props; + onInitLeaderboardStatus(eventId, leaderboardStatus, token); + + const { dummy } = this.state; + setTimeout(() => { + // this.forceUpdate() + onInitLeaderboard(eventId); + this.setState({ dummy: !dummy }); + }, 2000); + }; + render() { - const { compDetails } = this.props; + const { + compDetails, + token, + profile, + leaderboard, + leaderboardStatus, + } = this.props; + const { open, message } = this.state; + const { level } = this.state; + let participant = null; + let problemsSolved = null; + let userId = null; + if (compDetails && profile) { + userId = profile._id; + participant = compDetails.participants.filter( + (el) => el.userId === userId + ); + if (!participant) { + this.forceUpdate(); + } + participant = participant[0]; + problemsSolved = participant.problemsSolved; + problemsSolved = problemsSolved.map((prb) => { + const prbId = Object.keys(prb)[1]; + return prbId; + }); + } let data = ; - if (compDetails) { + let leaderboardShow = null; + if (leaderboard.length !== 0 && leaderboardStatus) { + leaderboardShow = ( + + ); + } + if (compDetails && profile) { data = (
-
- - {compDetails.name} - -
-
- - {compDetails.details} - +
{compDetails.name}
+
+
+ {new Date(compDetails.endTime) > new Date() ? ( + + ) : ( +

Competition Over

+ )}
+
+
{compDetails.details}
- - Rules and Regulations : -
- - The rules are as follow, Blah Blah Blah Blah and so on. - +
+
Rules and Regulations:
+
+
Rule Details
-
- Challenges - +
+
Challenges:
+
+ +
+ Level {level} + + + +
+ + +
- -
- +
+
User Ranking:
+
+ {leaderboardShow} + +
); } return ( - - - {data} - +
{data}
+
- - ); } } @@ -68,14 +242,39 @@ competition.propTypes = { onInitCompetition: PropTypes.node.isRequired, compDetails: PropTypes.node.isRequired, history: PropTypes.node.isRequired, + location: PropTypes.node.isRequired, + token: PropTypes.node.isRequired, + profile: PropTypes.node.isRequired, }; -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ compDetails: state.competition, + token: state.token, + profile: state.profile, + leaderboard: state.leaderboard, + userId: state.userId, + leaderboardStatus: state.leaderboardStatus, }); -const mapDispatchToProps = dispatch => ({ - onInitCompetition: id => dispatch(CompetitionActions.initCompetition(id)), +const mapDispatchToProps = (dispatch) => ({ + onInitProfile: (userId, token) => + dispatch(CompetitionActions.initProfile(userId, token)), + onInitCompetition: (id, token, level) => + dispatch(CompetitionActions.initCompetition(id, token, level)), + onInitLeaderboard: (eventId) => + dispatch(CompetitionActions.initLeaderboard(eventId)), + onInitLeaderboardStatus: (eventId, leaderboardStatus) => + dispatch( + CompetitionActions.initLeaderboardStatus(eventId, leaderboardStatus) + ), + onInitCompetitionLevelProblems: (eventId, token, level, participantId) => + dispatch( + CompetitionActions.initCompetitionLevelProblems( + eventId, + token, + level, + participantId + ) + ), }); - export default connect(mapStateToProps, mapDispatchToProps)(competition); diff --git a/src/containers/competitions/competition/competition.module.css b/src/containers/competitions/competition/competition.module.css index 2937e9b..fe026b8 100644 --- a/src/containers/competitions/competition/competition.module.css +++ b/src/containers/competitions/competition/competition.module.css @@ -1,17 +1,61 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + position: absolute; + top: 150px; + width: 100%; + left: 0px; + padding-bottom: 80px; +} .title { - padding : 50px; - -} - -.para { - padding:20px; - -} - - - -.flex { - display:flex; - flex-direction: row-reverse; - -} \ No newline at end of file + font-size: 50px; + font-weight: 700; + text-align: center; + text-transform: uppercase; + margin-top: 50px; +} +.miniLineCol { + width: 40px; + background-color: rgba(245, 0, 87, 1); + /* background-color: rgba(0,0,0,0.8); */ + margin: auto; + margin-bottom: 0px; + margin-top: 20px; + border-radius: 3px; + height: 8px; +} +.details { + font-size: 16px; + margin: auto; + text-align: center; + margin-top: 20px; + width: 60%; +} +.ruleCont, +.challengesCont, +.rankingCont { + width: 100%; + margin: auto; +} +.subTitle { + font-weight: 600; + font-size: 35px; + margin: auto; + margin-top: 40px; +} +.miniLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 20px; + margin-left: 10px; + border-radius: 3px; + height: 8px; +} +.ruleDetails { + margin: auto; + margin-top: 20px; + width: 98%; +} diff --git a/src/containers/competitions/competitions.jsx b/src/containers/competitions/competitions.jsx index a3c3155..c4dc6f8 100644 --- a/src/containers/competitions/competitions.jsx +++ b/src/containers/competitions/competitions.jsx @@ -1,72 +1,202 @@ -import React, { Component } from 'react'; +import React, { Component } from "react"; import { - Typography, CssBaseline, Paper, Grid, Container, Box, -} from '@material-ui/core'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; -import classes from './competitions.module.css'; -import Spinner from '../../components/UI/Spinner/Spinner'; -import * as CompetitionActions from '../../store/actions/index'; + Typography, + Paper, + Grid, + Container, + Box, + Fab, + Button, +} from "@material-ui/core"; +import PropTypes from "prop-types"; +import NavigationIcon from "@material-ui/icons/Navigation"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import Axios from "axios"; +import classes from "./competitions.module.css"; +import Spinner from "../../components/UI/Spinner/Spinner"; +import * as CompetitionActions from "../../store/actions/index"; +import Snackbar from "../../components/UI/snackbar/snackbar"; class competitions extends Component { + constructor(props) { + super(props); + this.state = { + open: false, + message: "", + }; + this.openSnack = this.openSnack.bind(this); + this.closeSnack = this.closeSnack.bind(this); + } + componentDidMount() { const { onInitCompetitions } = this.props; onInitCompetitions(); } + openSnack(mess) { + this.setState({ + open: true, + message: mess, + }); + } + + closeSnack() { + this.setState({ + open: false, + }); + } + + // constructor(props){ + // super(props); + // this.state = { + // render: false, + // } + // } + + deleteEventHandler = async (eventId) => { + const { token } = this.props; + const url = `http://localhost:3000/api/event/${eventId}`; + const response = await Axios({ + method: "DELETE", + url, + headers: { Authorization: `Bearer ${token}` }, + }); + }; + + registerHandler = async (event) => { + const { token, userId, profile, registerCompetition } = this.props; + if (!token) { + this.openSnack("Login to Register!!"); + return; + } + if (new Date(event.startTime) > new Date()) { + this.openSnack("Registration has not started yet!!"); + return; + } + const profileParticipantsId = profile.participant.map((el) => el._id); + const isParticipated = profileParticipantsId.some((item) => + event.participants.includes(item) + ); + if (isParticipated) { + this.openSnack("Already Registered !!"); + return; + } + await registerCompetition(token, userId, profile, event); + const { onInitCompetitions, onInitProfile } = this.props; + await onInitProfile(userId, token); + await onInitCompetitions(); + this.forceUpdate(); + this.openSnack("Successfully Registered!!"); + }; + render() { - const { competitionsList } = this.props; + const { open, message } = this.state; + const { competitionsList, profile } = this.props; + let isAdmin = null; + if (profile) { + isAdmin = profile.isAdmin; + } let compList = ; if (competitionsList) { - compList = Object.values(competitionsList).map(el => ( -
- - -
{ + const { token, profile } = this.props; + let reg = null; + let profileParticipantsId = null; + let isParticipated = null; + if (profile) { + profileParticipantsId = profile.participant.map((el) => el._id); + isParticipated = profileParticipantsId.some((item) => + el.participants.includes(item) + ); + } + if (!token) { + reg = "Login to Register"; + } else if (!isParticipated) { + reg = "Register"; + } else { + reg = "Registered"; + } + const startCompetition = () => { + if (!token) { + this.openSnack("Login to Enter Competition"); + return; + } + if (!isParticipated) { + this.openSnack("Register to Enter Competition"); + return; + } + if (new Date(el.startTime) > new Date()) { + this.openSnack("Competition has not started yet!!"); + } + }; + return ( +
+ + startCompetition()} + to={{ + pathname: `/event/${ + isParticipated && + token && + new Date(el.startTime) < new Date() + ? el._id + : "" + }`, + state: { + _id: `${el._id}`, + }, + }} > - - {el.name} - -
- - - -
- - {el.details} - +
{el.name}
+ + {el.details} +
+
+ +
+
+ Registered - {el.participants.length}
- - - Registered -
-
- {el.userReg} -
- - - - -
- )); +
+ {isAdmin ? ( + + ) : null} +
+
+ +
+ ); + }); } return ( + {this.props.red} -
-
- - Competitions - {compList} - Add a new Competition +
+
Competitions
+
+
{compList}
+ {isAdmin ? ( +
+ + + + Add Competition + + +
+ ) : null}
+ - - ); } } @@ -76,11 +206,18 @@ competitions.propTypes = { competitionsList: PropTypes.node.isRequired, }; -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ competitionsList: state.competitions, + token: state.token, + userId: state.userId, + profile: state.profile, }); -const mapDispatchToProps = dispatch => ({ +const mapDispatchToProps = (dispatch) => ({ onInitCompetitions: () => dispatch(CompetitionActions.initCompetitions()), + onInitProfile: (userId, token) => + dispatch(CompetitionActions.initProfile(userId, token)), + registerCompetition: (token, userId, profile, event) => + dispatch(CompetitionActions.regEvent(token, userId, profile, event)), }); export default connect(mapStateToProps, mapDispatchToProps)(competitions); diff --git a/src/containers/competitions/competitions.module.css b/src/containers/competitions/competitions.module.css index abf668c..03c7e20 100644 --- a/src/containers/competitions/competitions.module.css +++ b/src/containers/competitions/competitions.module.css @@ -1,18 +1,85 @@ -.list { - padding: 50px; -} - -.padding { - padding: 20px; -} - -.title { - padding: 20px; - -} - -.title:hover { - cursor: pointer; - color:blue; - text-decoration: underline; -} \ No newline at end of file +.mainCont { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + position: absolute; + top: 150px; + width: 100%; + left: 0px; + padding-bottom: 80px; +} +.pageTitle { + font-weight: 700; + font-size: 50px; + margin-top: 30px; + text-transform: uppercase; + letter-spacing: 1px; +} +.miniLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin: auto; + margin-top: 25px; + border-radius: 3px; + height: 8px; +} +.competitionListCont { + /* background-color: ; */ + border: 2px solid rgba(0, 0, 0, 0.7); + border-radius: 20px; + width: 80%; + display: flex; + padding: 50px; + flex-direction: column; + margin-top: 60px; + padding-top: 10px; +} +.competitionCard { + padding: 20px; + margin-top: 40px; +} +.competitionCardTitle { + color: black; + font-weight: 600; + font-size: 40px; + transition: 0.2s ease-out; +} +.competitionCardTitle:hover { + letter-spacing: 2px; +} +.miniLineCol { + width: 40px; + background-color: rgba(245, 0, 87, 1); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 15px; + margin-left: 5px; + border-radius: 3px; + height: 8px; +} +.competitionCardDetailCont { + width: calc(100% - 20px); + margin-top: 5px; + font-size: 15px; + /* background-color: red; */ + padding: 10px; +} +.thinLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 20px; + border-radius: 3px; + height: 4px; +} +.competitionCardExtras { + margin-top: 20px; + padding: 15px; + font-weight: 300; + font-size: 18px; + border: 1px solid rgba(0, 0, 0, 0.8); +} +.btnCont { + margin-top: 30px; +} diff --git a/src/containers/contactUs/contact.module.css b/src/containers/contactUs/contact.module.css new file mode 100644 index 0000000..8f51614 --- /dev/null +++ b/src/containers/contactUs/contact.module.css @@ -0,0 +1,65 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: flex-start; + /* background-color: red; */ + justify-content: flex-start; + position: absolute; + top: 150px; + height: calc(100% - 150px); + width: 100%; + left: 0px; +} +.contactDetCont { + margin-left: 80px; + margin-top: 80px; + margin-right: 80px; +} +.contactDetTitle { + font-size: 50px; + font-weight: 700; +} +.miniLine { + width: 40px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 25px; + border-radius: 3px; +} +.contactDetDesc { + margin-top: 30px; + font-size: 16px; +} +.iconCont { + background-color: #e6e6e6; + border-radius: 10px; + padding: 15px; + margin-top: 30px; + width: 240px; + justify-content: space-around; + align-items: center; + display: flex; + flex-direction: row; +} +.icon { + border: 2px solid black; + width: 45px; + height: 45px; + line-height: 45px; + text-align: center; + font-size: 30px; + cursor: pointer; + transition: 0.2s ease-out; + text-decoration: none; + color: black; + border-radius: 10px; +} +.icon:hover { + background-color: black; + color: white; +} +.extra { + margin-top: 50px; + font-style: italic; +} diff --git a/src/containers/contactUs/contactUs.jsx b/src/containers/contactUs/contactUs.jsx index 5bd561d..6ea0199 100644 --- a/src/containers/contactUs/contactUs.jsx +++ b/src/containers/contactUs/contactUs.jsx @@ -1,27 +1,51 @@ -import React from 'react'; -import { Container } from '@material-ui/core'; +import React from "react"; +import { Container } from "@material-ui/core"; +import AccessAlarmIcon from "@material-ui/icons/AccessAlarm"; +import classes from "./contact.module.css"; const contactUs = () => ( -
-

Contact Us

-

- We are always a message away on our - {' '} - Facebook page. -

-

- {' '} -We @ DevClub are constantly looking for ways to make our products better. - {' '} - Click here -, If you have any feedback you want to share with us. - {' '} -

+
+
+
Contact Us
+
+
+
+ DevClub is one of the most friendly and open clubs that is there in + the Institute and all of its members are easily accessible.You can + go through our official website and feel free to send us any mail or + message over facebook. +
+
+ Some more contact information below +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+

+ {" "} + We @ DevClub are constantly looking for ways to make our + products better.{" "} + + Click here{" "} + + , If you have any feedback you want to share with us.{" "} +

+
+
- - ); export default contactUs; diff --git a/src/containers/home/home.jsx b/src/containers/home/home.jsx index 452e2a0..a3abb87 100644 --- a/src/containers/home/home.jsx +++ b/src/containers/home/home.jsx @@ -1,66 +1,81 @@ -import React from 'react'; -import { - Container, Grid, Typography, Fab, -} from '@material-ui/core'; -import NavigationIcon from '@material-ui/icons/Navigation'; -import classes from './home.module.css'; -import CompTable from '../../components/Table/CompTable/CompTable'; -import UserTable from '../../components/Table/UserTable/UserTable'; +import React, { useEffect, useState } from "react"; +import { Container, Grid, Typography, Fab } from "@material-ui/core"; +import NavigationIcon from "@material-ui/icons/Navigation"; +import Axios from "axios"; +import classes from "./home.module.css"; +import CompTable from "../../components/Table/CompTable/CompTable"; +import UserTable from "../../components/Table/UserTable/UserTable"; +const Home = () => { + const [event, setEvent] = useState(null); + useEffect(() => { + const getEvents = async (url) => { + const response = await Axios.get(url); + setEvent(response.data); + }; + const url = "http://localhost:3000/api/event/ongoing-events"; + getEvents(url); + }, []); + let eventList = []; + if (event) { + eventList = [...event]; + } + return ( +
+ +
+
+
+
+
Most Wanted
+
+
+ Cyber security is a high priority of companies, small and big, + as cyber attacks have been on the rise in recent years. In + response to these attacks, security professionals and college + students have been through rigorous training as how hackers + are able to get into the companies and how to defend against + them. One way of cyber security training is through a cyber + security capture the flag (CTF) event. A cyber security CTF is + a competition between security professionals and/or students + learning about cyber security. This competition is used as a + learning tool for everyone that is interested in cyber + security and it can help sharpen the tools they have learned + during their training. +
+
+
+
+ If you are new to CTF, we recommend you going through our + walkthrough portal given here. +
+
+
+ +
+
+ +
+
+
+ {/*
+
User Rank
+
+
+ +
+
*/} +
+ +
+ ); +}; -const home = () => ( -
- -
- Most Wanted -
- - - - Cyber security is a high priority of companies, small and big, as cyber attacks - have been on the rise - in recent years. In response to these attacks, security professionals and - college students have been - through rigorous training as how hackers are able to get into the companies and - how to defend against - them. One way of cyber security training is through a cyber security capture - the flag (CTF) event. - A cyber security CTF is a competition between security professionals - and/or students learning about - cyber security. This competition is used as a learning tool for everyone - that is interested in cyber - security and it can help sharpen the tools they have learned - during their training. - -
- - If you are new to CTF, we recommend you going through our - walkthrough portal given here. - -
-
- - -
- - - - -
-
- - - Walkthrough - -
-

User Rank

-
- -
- -
- -
-); - -export default home; +export default Home; diff --git a/src/containers/home/home.module.css b/src/containers/home/home.module.css index e6aaedd..b899c90 100644 --- a/src/containers/home/home.module.css +++ b/src/containers/home/home.module.css @@ -1,7 +1,76 @@ .title { - text-align: center; + text-align: center; } .center { - display: flex; - justify-content: center; -} \ No newline at end of file + display: flex; + justify-content: center; +} +.mainCont { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + position: absolute; + top: 150px; + height: calc(100% - 150px); + width: 100%; + left: 0px; +} +.section { + margin-left: 80px; + margin-top: 80px; + margin-right: 120px; +} +.sectionTitle { + font-size: 80px; + font-weight: 700; +} +.miniLine { + width: 80px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 25px; + border-radius: 3px; +} +.splitSection { + /* margin-top: 30px; */ + display: flex; + flex-direction: row; + justify-content: space-between; +} +.splitSectionLeft { + width: 60%; + font-size: 17px; +} +.splitSectionLeftDesc { + margin-top: 30px; +} +.splitSectionLeftHighlight { + font-size: 16px; + font-style: italic; + font-weight: 300; +} +.splitSectionRight { + display: flex; + justify-content: center; + align-items: center; +} +.section2 { + margin-left: 80px; + margin-right: 80px; + margin-top: 100px; + padding-bottom: 100px; + width: calc(100% - 160px); + text-align: center; +} +.sectionTitleSmall { + font-weight: 700; + font-size: 50px; +} +.userTableCont { + display: flex; + justify-content: center; + align-items: center; + margin-top: 40px; +} diff --git a/src/containers/practice/Categories/categories.jsx b/src/containers/practice/Categories/categories.jsx index 10d1c02..ebfca74 100644 --- a/src/containers/practice/Categories/categories.jsx +++ b/src/containers/practice/Categories/categories.jsx @@ -1,42 +1,71 @@ -import React from 'react'; -import { - Grid, Box, Container, Typography, -} from '@material-ui/core'; -import ComplexButton from '../../../components/ComplexButton/complexButton'; +import React from "react"; +import { Grid, Box, Container, Typography } from "@material-ui/core"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import ComplexButton from "../../../components/ComplexButton/complexButton"; -const Categories = () => ( -
- Categories - - - - - - - - - - - - - - - - - - - - - - - - - - +const Categories = (props) => { + const { profile, token } = props; + let isAdmin = null; + if (profile) { + isAdmin = profile.isAdmin; + } + return ( +
+ + Categories + + + + + + + + + + + + + + + + + + + + {isAdmin && token ? ( + + + + ) : null} + + + +
+ ); +}; -
-); +Categories.propTypes = { + profile: PropTypes.string.isRequired, + token: PropTypes.string.isRequired, +}; +const mapStateToProps = (state) => ({ + token: state.token, + profile: state.profile, +}); -export default Categories; +export default connect(mapStateToProps)(Categories); diff --git a/src/containers/practice/Categories/categories.module.css b/src/containers/practice/Categories/categories.module.css new file mode 100644 index 0000000..64eebc3 --- /dev/null +++ b/src/containers/practice/Categories/categories.module.css @@ -0,0 +1,36 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: flex-start; + /* background-color: red; */ + justify-content: flex-start; + position: absolute; + top: 145px; + height: calc(100% - 145px); + width: calc(100% - 200px); + left: 200px; +} +.innerCont { + width: 80%; + margin: auto; +} +.pageTitle { + font-size: 50px; + font-weight: 700; +} +.miniLine { + width: 40px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 20px; + border-radius: 3px; +} +.pageDetCont { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-around; + align-items: center; + margin-top: 40px; +} diff --git a/src/containers/practice/Categories/category/category.jsx b/src/containers/practice/Categories/category/category.jsx index 6dcf836..a4a9e34 100644 --- a/src/containers/practice/Categories/category/category.jsx +++ b/src/containers/practice/Categories/category/category.jsx @@ -1,38 +1,85 @@ -import React, { Component } from 'react'; +import React, { Component } from "react"; import { - Typography, ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Grid, Container, Box, -} from '@material-ui/core'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; -import Axios from 'axios'; -import Spinner from '../../../../components/UI/Spinner/Spinner'; -import * as probelmActions from '../../../../store/actions/index'; - - -class problems extends Component { + Typography, + ExpansionPanel, + ExpansionPanelSummary, + ExpansionPanelDetails, + Grid, + Container, + TextField, + Button, + Box, +} from "@material-ui/core"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import Axios from "axios"; +import Spinner from "../../../../components/UI/Spinner/Spinner"; +import * as probelmActions from "../../../../store/actions/index"; + +class categories extends Component { componentDidMount() { const { oncategoryFetchProblems, history } = this.props; - oncategoryFetchProblems(history.location.pathname.substring(21)); + const categoryNames = { + 1: "Binary Exploitation", + 2: "Reverse Engineering", + 3: "Web Exploitation", + 4: "Cryptography", + 5: "Forensics", + hidden: "Hidden Problems", + }; + oncategoryFetchProblems( + categoryNames[history.location.pathname.substring(21)] + ); } + status = (_id) => { + const { profile } = this.props; + if (profile) { + if (profile.problems.includes(_id)) { + return true; + } + } + return false; + }; + answerInput = (event) => { event.preventDefault(); const answer = event.target.value; this.setState({ answer }); - } + }; - submitAnswerHandler = () => { + submitAnswerHandler = async (prb) => { + const { profile, token } = this.props; const { answer } = this.state; - Axios.post('Post Link', answer); - } + if (token && prb.answer === answer) { + console.log("Sedning req"); + profile.problems.push(prb._id); + prb.userSolved += 1; + const url = `http://localhost:3000/api/problem/updated_problem/${prb._id}`; + const response = await Axios({ + method: "PUT", + url, + data: { + problems: profile.problems, + userSolved: prb.userSolved, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + alert("Correct Answer"); + } else if (!token) { + alert("Login to answer"); + } else if (prb.answer !== answer) { + alert("Wrong Answer"); + } + }; render() { const { problemsList } = this.props; let prob = null; if (problemsList) { - prob = Object.values(problemsList).map(el => ( -
+ prob = Object.values(problemsList).map((el) => ( +
} @@ -41,39 +88,44 @@ class problems extends Component { > - - {el.name} - {' '} - + {el.name} - - {el.userSolved} - {' '} - + {el.userSolved} - - {el.score} - {' '} - + {el.score} - {el.status ? 'Solved' : 'Unsolved'} - {' '} + {" "} + {this.status(el._id) ? "Solved" : "Unsolved"}{" "} - - {el.details}
- - + +
@@ -89,62 +141,55 @@ class problems extends Component {
- Problems + Problems Users Solved - Score + Score - Status + Status - - -
); } - return (
- Category Problems + Category Problems - - {display} - + {display} {prob} - - -
); } } -problems.propTypes = { +categories.propTypes = { oncategoryFetchProblems: PropTypes.node.isRequired, problemsList: PropTypes.node.isRequired, history: PropTypes.node.isRequired, }; -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ problemsList: state.categoryProblems, + token: state.token, + profile: state.profile, }); -const mapDispatchToProps = dispatch => ({ - oncategoryFetchProblems: category => dispatch(probelmActions.categoryFetchProblems(category)), +const mapDispatchToProps = (dispatch) => ({ + oncategoryFetchProblems: (category) => + dispatch(probelmActions.categoryFetchProblems(category)), }); - -export default connect(mapStateToProps, mapDispatchToProps)(problems); +export default connect(mapStateToProps, mapDispatchToProps)(categories); diff --git a/src/containers/practice/Leaderboard/Leaderboard.jsx b/src/containers/practice/Leaderboard/Leaderboard.jsx index cca57a6..9dc0832 100644 --- a/src/containers/practice/Leaderboard/Leaderboard.jsx +++ b/src/containers/practice/Leaderboard/Leaderboard.jsx @@ -1,6 +1,6 @@ -import React from 'react'; -import { Typography, Container } from '@material-ui/core'; -import UserTable from '../../../components/Table/UserTable/UserTable'; +import React from "react"; +import { Typography, Container } from "@material-ui/core"; +import UserTable from "../../../components/Table/UserTable/UserTable"; class leaderboard extends React.PureComponent { render() { @@ -10,14 +10,15 @@ class leaderboard extends React.PureComponent {

- Leaderboard + Leaderboard
-
+
-
); } diff --git a/src/containers/practice/Problems/Problems.jsx b/src/containers/practice/Problems/Problems.jsx index b45cd4a..62b1218 100644 --- a/src/containers/practice/Problems/Problems.jsx +++ b/src/containers/practice/Problems/Problems.jsx @@ -1,73 +1,106 @@ -import React, { Component } from 'react'; +import React, { Component } from "react"; import { - Typography, ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Grid, Container, Box, - Button, TextField, -} from '@material-ui/core'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { connect } from 'react-redux'; -import { NavLink } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import Axios from 'axios'; -import Spinner from '../../../components/UI/Spinner/Spinner'; -import * as probelmActions from '../../../store/actions/index'; - + Typography, + ExpansionPanel, + ExpansionPanelSummary, + ExpansionPanelDetails, + Grid, + Button, + TextField, + Fab, +} from "@material-ui/core"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import PropTypes from "prop-types"; +import Axios from "axios"; +import NavigationIcon from "@material-ui/icons/Navigation"; +import Spinner from "../../../components/UI/Spinner/Spinner"; +import * as probelmActions from "../../../store/actions/index"; +import classes from "./Problems.module.css"; class problems extends Component { + constructor(props) { + super(props); + this.state = { + answer: "", + id: "", + }; + } + componentDidMount() { const { onInitProblems } = this.props; - onInitProblems(); + onInitProblems("1"); } + status = (_id) => { + const { profile } = this.props; + if (profile) { + if (profile.problems.includes(_id)) { + return true; + } + } + return false; + }; + answerInput = (event) => { event.preventDefault(); const answer = event.target.value; this.setState({ answer }); - } + }; - submitAnswerHandler = () => { + submitAnswerHandler = async (prb) => { + const { profile, token } = this.props; const { answer } = this.state; - Axios.post('Post Link', answer); - } + if (token && prb.answer === answer) { + console.log("Sedning req"); + profile.problems.push(prb._id); + prb.userSolved += 1; + const url = `http://localhost:3000/api/problem/updated_problem/${prb._id}`; + const response = await Axios({ + method: "PUT", + url, + data: { + problems: profile.problems, + userSolved: prb.userSolved, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + alert("Correct Answer"); + } else if (!token) { + alert("Login to answer"); + } else if (prb.answer !== answer) { + alert("Wrong Answer"); + } + }; render() { const { problemsList } = this.props; let prob = null; if (problemsList) { - prob = Object.values(problemsList).map(el => ( -
+ prob = problemsList.map((el) => ( +
} aria-controls="panel1a-content" - id="panel1a-header" + id={el._id} > - - {el.name} - {' '} - + {el.name} - - {el.userSolved} - {' '} - + {el.userSolved} - - {el.score} - {' '} - + {el.score} - {el.status ? 'Solved' : 'Unsolved'} - {' '} + {this.status(el._id) ? "Solved" : "Unsolved"}{" "} - - @@ -75,7 +108,7 @@ class problems extends Component { {el.details}
- -
@@ -101,47 +137,50 @@ class problems extends Component { if (problemsList) { display = (
-
- Problems +
Problems
- Users Solved +
Users Solved
- Score +
Score
- Status +
Status
- -
-
); } + const { profile, token } = this.props; + let isAdmin = null; + if (profile) { + isAdmin = profile.isAdmin; + } return ( -
- - - Problems - - +
+
+
Problems
+
+
{display} - - - {prob} - - - Add a new Problem - - - - +
{prob}
+
+ {isAdmin && token ? ( +
+ + + + Add Problem + + +
+ ) : null} +
); } @@ -152,12 +191,14 @@ problems.propTypes = { problemsList: PropTypes.node.isRequired, }; -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ problemsList: state.problems, + token: state.token, + profile: state.profile, }); -const mapDispatchToProps = dispatch => ({ - onInitProblems: () => dispatch(probelmActions.initProbelms()), +const mapDispatchToProps = (dispatch) => ({ + onInitProblems: (problemType) => + dispatch(probelmActions.initProbelms(problemType)), }); - export default connect(mapStateToProps, mapDispatchToProps)(problems); diff --git a/src/containers/practice/Problems/Problems.module.css b/src/containers/practice/Problems/Problems.module.css index e69de29..8dfbc2e 100644 --- a/src/containers/practice/Problems/Problems.module.css +++ b/src/containers/practice/Problems/Problems.module.css @@ -0,0 +1,46 @@ +.mainCont { + display: flex; + flex-direction: column; + align-items: flex-start; + /* background-color: red; */ + justify-content: flex-start; + position: absolute; + top: 145px; + height: calc(100% - 145px); + width: calc(100% - 200px); + left: 200px; +} +.innerCont { + width: 80%; + margin: auto; +} +.pageDetCont { + margin-left: 80px; + margin-top: 80px; + margin-right: 80px; +} +.pageTitle { + font-size: 50px; + font-weight: 700; +} +.miniLine { + width: 40px; + height: 8px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin-top: 25px; + border-radius: 3px; +} +.tableCont { + margin-top: 20px; +} +.tableFieldTitle { + font-size: 18px; + font-weight: 600; +} +.tableProbs { + margin-top: 20px; +} +.btnCont { + margin-top: 50px; +} diff --git a/src/containers/practice/Rules/rules.jsx b/src/containers/practice/Rules/rules.jsx index 7caf3e4..7530620 100644 --- a/src/containers/practice/Rules/rules.jsx +++ b/src/containers/practice/Rules/rules.jsx @@ -1,9 +1,5 @@ -import React from 'react'; - -const rules = () => ( - -

rules

-); +import React from "react"; +const rules = () =>

rules

; export default rules; diff --git a/src/containers/practice/practice.jsx b/src/containers/practice/practice.jsx index fa04f9c..9b85ebe 100644 --- a/src/containers/practice/practice.jsx +++ b/src/containers/practice/practice.jsx @@ -1,54 +1,33 @@ -import React, { PureComponent } from 'react'; -import { CssBaseline } from '@material-ui/core'; -import { NavLink } from 'react-router-dom'; -import classes from './practice.module.css'; +import React, { PureComponent } from "react"; +import { CssBaseline } from "@material-ui/core"; +import { NavLink } from "react-router-dom"; +import classes from "./practice.module.css"; class practice extends PureComponent { render() { - return ( + const display = (
); + return
{display}
; } } - export default practice; diff --git a/src/containers/practice/practice.module.css b/src/containers/practice/practice.module.css index 128bca4..dfe7c89 100644 --- a/src/containers/practice/practice.module.css +++ b/src/containers/practice/practice.module.css @@ -1,44 +1,42 @@ .body { - margin : 0px; - padding : 0px; + margin: 0px; + padding: 0px; } .center { - display: flex; - justify-content: center; - + display: flex; + justify-content: center; } nav { - position : fixed; - top : 100px; - left : 0px; - width : 200px; - height : 100%; - background : #151719; - display : flex; - flex-direction: column; - align-items: center; - justify-content: center; - + position: fixed; + top: 100px; + left: 0px; + width: 200px; + height: 100%; + background: #151719; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } .catList { - color: rgba(230, 230, 230,0.9); - list-style: none; - padding: 65px 10px; - border-bottom: 1px solid rgba(100,100,100,0.3); - font-size: 20px; - cursor: pointer; + color: rgba(230, 230, 230, 0.9); + list-style: none; + padding: 65px 10px; + border-bottom: 1px solid rgba(100, 100, 100, 0.3); + font-size: 20px; + cursor: pointer; } .catList:hover { - color: blue; + color: blue; } main { - margin-left: 220px; + margin-left: 220px; } a { - text-decoration: none; + text-decoration: none; } diff --git a/src/containers/profile/profile.jsx b/src/containers/profile/profile.jsx index ea4e026..d341089 100644 --- a/src/containers/profile/profile.jsx +++ b/src/containers/profile/profile.jsx @@ -1,115 +1,73 @@ -import React from 'react'; -import { - Container, Typography, Box, Paper, Grid, -} from '@material-ui/core'; -import { Link } from 'react-router-dom'; -import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; -import Spinner from '../../components/UI/Spinner/Spinner'; -import classes from './profile.module.css'; -import * as ProfileActions from '../../store/actions/index'; +import React from "react"; +import { Container, Box } from "@material-ui/core"; + +import { Link } from "react-router-dom"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import Spinner from "../../components/UI/Spinner/Spinner"; +import classes from "./profile.module.css"; +import * as ProfileActions from "../../store/actions/index"; class Profile extends React.PureComponent { componentDidMount() { - const { onInitProfile } = this.props; - onInitProfile(); + const { onInitProfile, userId, token } = this.props; + onInitProfile(userId, token); } - render() { - const { - profile, - } = this.props; + const { profile } = this.props; let compList = ; if (profile) { - compList = Object.values(profile.competitionsList).map(el => ( -
- - -
- - {el.name} - + compList = profile.participant.map((el) => { + if (el.score === 0) { + return null; + } + const { _id } = el; + return ( +
+ +
+
{el.eventName}
- - -
- - Rank: - {' '} - {el.rank} - -
-
- -
- - Score: - {' '} - {el.score} - -
-
- -
- - -
- )); +
+ ); + }); } let display = null; if (profile) { display = ( -
- - {profile.name} - - -
- Profile Pic -
-
- - - UserName: - {' '} - {profile.username} - +
+
{profile.name}
+
+
+ User Name:{" "} + {profile.username} +

+ Email:{" "} + {profile.email} +

+ Phone No:{" "} + {profile.number} +
+
- - Competitions Participated - +
Competitions Participated
+
- - {compList} - - - - Leaderboard - - - - - Rank: - {profile.problems.rank} - - - - - Score: - {profile.problems.score} - - - +
{compList}
); } - return (

@@ -118,20 +76,24 @@ class Profile extends React.PureComponent { {display}
- ); } } Profile.propTypes = { onInitProfile: PropTypes.node.isRequired, profile: PropTypes.node.isRequired, + token: PropTypes.node.isRequired, + userId: PropTypes.node.isRequired, }; -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ profile: state.profile, + userId: state.userId, + token: state.token, }); -const mapDispatchToProps = dispatch => ({ - onInitProfile: () => dispatch(ProfileActions.initProfile()), +const mapDispatchToProps = (dispatch) => ({ + onInitProfile: (userId, token) => + dispatch(ProfileActions.initProfile(userId, token)), }); export default connect(mapStateToProps, mapDispatchToProps)(Profile); diff --git a/src/containers/profile/profile.module.css b/src/containers/profile/profile.module.css index abf668c..b0474d7 100644 --- a/src/containers/profile/profile.module.css +++ b/src/containers/profile/profile.module.css @@ -1,18 +1,81 @@ +.mainCont { + text-align: center; + position: absolute; + top: 150px; + height: calc(100% - 150px); + width: 100%; + left: 0px; + /* background-color: green; */ +} +.pageTitle { + font-weight: 700; + font-size: 50px; + margin-top: 50px; + text-transform: uppercase; + letter-spacing: 1px; +} +.miniLine { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + /* background-color: rgba(0,0,0,0.8); */ + margin: auto; + margin-top: 25px; + margin-bottom: 0px; + border-radius: 3px; + height: 8px; +} +.subDetail { + width: 400px; + /* background-color: red; */ + margin: auto; + margin-top: 15px; + text-align: left; + font-size: 20px; +} +.subDetailTitle { + font-weight: 600; + font-size: 22px; +} +.subDetailDesc { + font-weight: 200; + margin-left: 10px; +} +.miniLineLeft { + width: 40px; + background-color: rgba(63, 81, 181, 0.9); + margin-top: 25px; + margin-bottom: 0px; + border-radius: 3px; + height: 8px; +} +.subTitle { + font-weight: 600; + font-size: 26px; + text-transform: uppercase; + margin-top: 30px; +} +.compListCont { + width: 80%; + margin: auto; + padding-bottom: 100px; +} .list { - padding: 50px; -} - -.padding { - padding: 20px; -} - -.title { - padding: 20px; - -} - -.title:hover { - cursor: pointer; - color:blue; - text-decoration: underline; -} \ No newline at end of file + padding: 10px; + text-align: center; + width: 60%; + margin: auto; + margin-top: 20px; + font-size: 20px; + font-weight: 600; + text-transform: uppercase; + border-radius: 10px; + border: 2px solid rgba(245, 0, 87, 1); + color: rgba(245, 0, 87, 1); + transition: 0.2s ease-out; +} +.list:hover .innerListTitle { + color: white; +} +.list:hover { + background-color: rgba(245, 0, 87, 1); +} diff --git a/src/containers/walkthrough/walkthrough.html b/src/containers/walkthrough/walkthrough.html new file mode 100644 index 0000000..acf6fc8 --- /dev/null +++ b/src/containers/walkthrough/walkthrough.html @@ -0,0 +1,211 @@ +
+ + + + + + +
diff --git a/src/containers/walkthrough/walkthrough.jsx b/src/containers/walkthrough/walkthrough.jsx new file mode 100644 index 0000000..1536e95 --- /dev/null +++ b/src/containers/walkthrough/walkthrough.jsx @@ -0,0 +1,6 @@ +import React from "react"; +import htmlContent from "./walkthrough.html"; + +export default function MyComponent() { + return
; +} diff --git a/src/index.jsx b/src/index.jsx index 70b5389..b32b0f0 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,19 +1,16 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import { BrowserRouter } from 'react-router-dom'; -import { Provider } from 'react-redux'; -import { createStore, applyMiddleware } from 'redux'; -import thunk from 'redux-thunk'; -import { composeWithDevTools } from 'redux-devtools-extension'; -import App from './App'; -import * as serviceWorker from './serviceWorker'; -import reducer from './store/reducer/reducer'; +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import { BrowserRouter } from "react-router-dom"; +import { Provider } from "react-redux"; +import { createStore, applyMiddleware } from "redux"; +import thunk from "redux-thunk"; +import { composeWithDevTools } from "redux-devtools-extension"; +import App from "./App"; +import * as serviceWorker from "./serviceWorker"; +import reducer from "./store/reducer/reducer"; - -const store = createStore(reducer, composeWithDevTools( - applyMiddleware(thunk), -)); +const store = createStore(reducer, composeWithDevTools(applyMiddleware(thunk))); const app = ( @@ -22,7 +19,7 @@ const app = ( ); -ReactDOM.render(app, document.getElementById('root')); +ReactDOM.render(app, document.getElementById("root")); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. diff --git a/src/serviceWorker.js b/src/serviceWorker.js index cabff3d..b719ab4 100644 --- a/src/serviceWorker.js +++ b/src/serviceWorker.js @@ -11,17 +11,17 @@ // opt-in, read https://bit.ly/CRA-PWA const isLocalhost = Boolean( - window.location.hostname === 'localhost' + window.location.hostname === "localhost" || // [::1] is the IPv6 localhost address. - || window.location.hostname === '[::1]' + window.location.hostname === "[::1]" || // 127.0.0.1/8 is considered localhost for IPv4. - || window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/, - ), + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) ); export function register(config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { // The URL constructor is available in all browsers that support SW. const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); if (publicUrl.origin !== window.location.origin) { @@ -31,7 +31,7 @@ export function register(config) { return; } - window.addEventListener('load', () => { + window.addEventListener("load", () => { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; if (isLocalhost) { @@ -42,8 +42,8 @@ export function register(config) { // service worker/PWA documentation. navigator.serviceWorker.ready.then(() => { console.log( - 'This web app is being served cache-first by a service ' - + 'worker. To learn more, visit https://bit.ly/CRA-PWA', + "This web app is being served cache-first by a service " + + "worker. To learn more, visit https://bit.ly/CRA-PWA" ); }); } else { @@ -64,14 +64,14 @@ function registerValidSW(swUrl, config) { return; } installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { + if (installingWorker.state === "installed") { if (navigator.serviceWorker.controller) { // At this point, the updated precached content has been fetched, // but the previous service worker will still serve the older // content until all client tabs are closed. console.log( - 'New content is available and will be used when all ' - + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.', + "New content is available and will be used when all " + + "tabs for this page are closed. See https://bit.ly/CRA-PWA." ); // Execute callback @@ -82,7 +82,7 @@ function registerValidSW(swUrl, config) { // At this point, everything has been precached. // It's the perfect time to display a // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); + console.log("Content is cached for offline use."); // Execute callback if (config && config.onSuccess) { @@ -94,7 +94,7 @@ function registerValidSW(swUrl, config) { }; }) .catch((error) => { - console.error('Error during service worker registration:', error); + console.error("Error during service worker registration:", error); }); } @@ -103,10 +103,10 @@ function checkValidServiceWorker(swUrl, config) { fetch(swUrl) .then((response) => { // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); + const contentType = response.headers.get("content-type"); if ( - response.status === 404 - || (contentType != null && contentType.indexOf('javascript') === -1) + response.status === 404 || + (contentType != null && contentType.indexOf("javascript") === -1) ) { // No service worker found. Probably a different app. Reload the page. navigator.serviceWorker.ready.then((registration) => { @@ -121,13 +121,13 @@ function checkValidServiceWorker(swUrl, config) { }) .catch(() => { console.log( - 'No internet connection found. App is running in offline mode.', + "No internet connection found. App is running in offline mode." ); }); } export function unregister() { - if ('serviceWorker' in navigator) { + if ("serviceWorker" in navigator) { navigator.serviceWorker.ready.then((registration) => { registration.unregister(); }); diff --git a/src/store/actions/actionsTypes.jsx b/src/store/actions/actionsTypes.jsx index 90aff8c..203c4bd 100644 --- a/src/store/actions/actionsTypes.jsx +++ b/src/store/actions/actionsTypes.jsx @@ -1,5 +1,16 @@ -export const SET_PROBLEMS = 'SET_PROBLEMS'; -export const SET_COMPETITIONS = 'SET_COMPETITIONS'; -export const SET_COMPETITION = 'SET_COMPETITION'; -export const CAT_SET_PROBLEMS = 'CAT_SET_PROBLEMS'; -export const SET_PROFILE = 'SET_PROFILE'; +export const SET_PROBLEMS = "SET_PROBLEMS"; +export const SET_COMPETITIONS = "SET_COMPETITIONS"; +export const SET_COMPETITION = "SET_COMPETITION"; +export const CAT_SET_PROBLEMS = "CAT_SET_PROBLEMS"; +export const SET_PROFILE = "SET_PROFILE"; +export const AUTH_START = "AUTH_START"; +export const AUTH_SUCCESS = "AUTH_SUCCESS"; +export const AUTH_FAIL = "AUTH_FAIL"; +export const AUTH_LOGOUT = "AUTH_LOGOUT"; +export const SET_PARTICIPANT = "SET_PARTICIPANT"; +export const ADD_PROBLEM = "ADD_PROBLEM"; +export const ADD_EVENT = "ADD_EVENT"; +export const SET_COMPETITIONS_LEVEL_PROBLEMS = + "SET_COMPETITIONS_LEVEL_PROBLEMS"; +export const SET_LEADERBOARD = "SET_LEADERBOARD"; +export const SET_LEADERBOARD_STATUS = "SET_LEADERBOARD_STATUS"; diff --git a/src/store/actions/auth.jsx b/src/store/actions/auth.jsx new file mode 100644 index 0000000..a20fea3 --- /dev/null +++ b/src/store/actions/auth.jsx @@ -0,0 +1,98 @@ +import axios from "axios"; +import * as actionTypes from "./actionsTypes"; + +export const authStart = () => ({ + type: actionTypes.AUTH_START, +}); + +export const authSuccess = (token, userId) => ({ + type: actionTypes.AUTH_SUCCESS, + idToken: token, + userId, +}); + +export const authFail = (error) => ({ + type: actionTypes.AUTH_FAIL, + error, +}); + +export const logout = () => { + localStorage.removeItem("token"); + localStorage.removeItem("userId"); + localStorage.removeItem("expirationDate"); + return { + type: actionTypes.AUTH_LOGOUT, + }; +}; + +export const checkAuthTimeOut = (expirationTime) => (dispatch) => { + setTimeout(() => { + dispatch(logout()); + }, expirationTime * 10000); +}; + +export const fetchProfile = (profile) => ({ + type: actionTypes.SET_PROFILE, + profile, +}); + +export const initProfile = (userId, token) => async (dispatch) => { + const url = `http://localhost:3000/api/user/${userId}`; + const response = await axios({ + method: "GET", + url, + headers: { Authorization: `Bearer ${token}` }, + }); + dispatch(fetchProfile(response.data.data)); +}; + +export const auth = (authData, isLogin) => (dispatch) => { + dispatch(authStart()); + let url = "http://localhost:3000/api/user/signup"; + if (isLogin) { + url = "http://localhost:3000/api/user/login"; + } + axios + .post(url, authData) + .then((response) => { + if (response.data.status === 200) { + localStorage.setItem("token", response.data.token); + localStorage.setItem("userId", response.data.userId); + const expirationDate = new Date( + new Date().getTime() + response.data.expiresIn * 1000 + ); + localStorage.setItem("expirationDate", expirationDate); + dispatch(authSuccess(response.data.token, response.data.userId)); + dispatch(initProfile(response.data.userId, response.data.token)); + dispatch(checkAuthTimeOut(response.data.expiresIn)); + alert(response.data.message); + return; + } + dispatch(authFail(response.data.message)); + alert(response.data.message); + }) + .catch((err) => { + dispatch(authFail(err)); + }); +}; + +export const authCheckState = () => (dispatch) => { + const token = localStorage.getItem("token"); + if (!token) { + dispatch(logout()); + } else { + const expirationDate = new Date(localStorage.getItem("expirationDate")); + if (expirationDate > new Date()) { + const userId = localStorage.getItem("userId"); + dispatch(authSuccess(token, userId)); + dispatch(initProfile(userId, token)); + dispatch( + checkAuthTimeOut( + (expirationDate.getTime() - new Date().getTime()) / 1000 + ) + ); + } else { + dispatch(logout()); + } + } +}; diff --git a/src/store/actions/competitions.jsx b/src/store/actions/competitions.jsx index 8440824..1a809bc 100644 --- a/src/store/actions/competitions.jsx +++ b/src/store/actions/competitions.jsx @@ -1,27 +1,176 @@ -import Axios from 'axios'; -import * as actionType from './actionsTypes'; +import Axios from "axios"; +import * as actionType from "./actionsTypes"; -export const fetchCompetitions = competitions => ({ +export const fetchCompetitions = (competitions) => ({ type: actionType.SET_COMPETITIONS, competitions, }); +export const fetchProfile = (profile) => ({ + type: actionType.SET_PROFILE, + profile, +}); + export const initCompetitions = () => (dispatch) => { - Axios.get('https://ctf-apis.firebaseio.com/competitionList.json') - .then((response) => { - dispatch(fetchCompetitions(response.data)); - }); + Axios.get("http://localhost:3000/api/event/").then((response) => { + dispatch(fetchCompetitions(response.data.data.reverse())); + }); }; -export const fetchCompetition = competition => ({ +export const fetchCompetition = (competition) => ({ type: actionType.SET_COMPETITION, competition, }); -export const initCompetition = id => (dispatch) => { - const link = `https://ctf-apis.firebaseio.com/competitions/${id}.json`; - Axios.get(link) - .then((response) => { - dispatch(fetchCompetition(response.data)); - }); +export const initCompetition = (eventId, token, level) => async (dispatch) => { + const url = `http://localhost:3000/api/event/${eventId}`; + const response = await Axios({ + method: "GET", + url, + params: { + level, + eventId, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + await dispatch(fetchCompetition(response.data)); +}; + +export const fetchCompetitionLevelProblems = (challenges) => ({ + type: actionType.SET_COMPETITIONS_LEVEL_PROBLEMS, + challenges, +}); + +export const fetchLeaderboard = (leaderboard) => ({ + type: actionType.SET_LEADERBOARD, + leaderboard, +}); + +export const initLeaderboard = (eventId) => async (dispatch) => { + const url = `http://localhost:3000/api/event/leaderboard/${eventId}`; + const response = await Axios.get(url); + console.log(response.data); + await dispatch(fetchLeaderboard(response.data)); +}; + +export const fetchLeaderboardStatus = (leaderboardStatus) => ({ + type: actionType.SET_LEADERBOARD_STATUS, + leaderboardStatus, +}); + +export const initLeaderboardStatus = ( + eventId, + leaderboardStatus, + token +) => async (dispatch) => { + const url = `http://localhost:3000/api/event/leaderboard/${eventId}`; + console.log(leaderboardStatus); + const response = await Axios({ + method: "PUT", + url, + data: { + leaderboardStatus, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + await dispatch(fetchLeaderboardStatus(response.data.showLeaderboard)); +}; + +export const initCompetitionLevelProblems = ( + eventId, + token, + level, + participantId +) => async (dispatch) => { + const url = `http://localhost:3000/api/event/${eventId}/level-probelms`; + const response = await Axios({ + method: "GET", + url, + params: { + eventId, + level, + participantId, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + await dispatch(fetchCompetitionLevelProblems(response.data.data)); +}; + +// Adding an Event or Competition + +export const addEvent = (competition) => ({ + type: actionType.ADD_EVENT, + competition, +}); + +export const onitEvent = (event, token) => async (dispatch) => { + const url = "http://localhost:3000/api/event/"; + const levelScore = JSON.stringify(Array.from(event.levelScore.entries())); + const response = await Axios({ + method: "POST", + url, + data: { + ...event, + levelScore, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + dispatch(addEvent(response.data.data)); +}; + +export const regEvent = (token, userId, profile, event) => async (dispatch) => { + let username = null; + if (profile) { + username = profile.username; + } + let url = "http://localhost:3000/api/participant/"; + const participant = await Axios({ + method: "POST", + url, + data: { + eventId: event._id, + eventName: event.name, + userId, + handle: username, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + if (!participant.data.data) { + console.log("Already Registered!!"); + return; + } + const participantId = participant.data.data._id; + url = `http://localhost:3000/api/event/${event._id}`; + event.participants.push(participantId); + event.leaderboard.push(participantId); + const eventResponse = await Axios({ + method: "PUT", + url, + data: { + participants: event.participants, + leaderboard: event.leaderboard, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + url = `http://localhost:3000/api/user/${userId}`; + const userParticipant = [...profile.participant]; + const userEvent = [...profile.events]; + userEvent.push(event._id); + userParticipant.push(participantId); + const userResponse = await Axios({ + method: "PUT", + url, + data: { + participant: userParticipant, + events: userEvent, + }, + headers: { Authorization: `Bearer ${token}` }, + }); + const updatedProfile = { + ...profile, + participant: userParticipant, + events: userEvent, + }; + dispatch(fetchProfile(updatedProfile)); + // alert('Registered Successfully!!!') }; diff --git a/src/store/actions/index.jsx b/src/store/actions/index.jsx index 20b1702..921f92a 100644 --- a/src/store/actions/index.jsx +++ b/src/store/actions/index.jsx @@ -2,16 +2,21 @@ export { initProbelms, fetchProblems, categoryFetchProblems, -} from './problems'; + onitProblem, +} from "./problems"; export { initCompetitions, fetchCompetitions, initCompetition, fetchCompetition, -} from './competitions'; + onitEvent, + initCompetitionLevelProblems, + regEvent, + initLeaderboard, + initLeaderboardStatus, +} from "./competitions"; -export { - initProfile, - fetchProfile, -} from './profile'; +export { initProfile, fetchProfile } from "./profile"; + +export { auth, logout, authCheckState } from "./auth"; diff --git a/src/store/actions/problems.jsx b/src/store/actions/problems.jsx index 4ffbc70..35222e9 100644 --- a/src/store/actions/problems.jsx +++ b/src/store/actions/problems.jsx @@ -1,19 +1,35 @@ -import Axios from 'axios'; -import * as actionType from './actionsTypes'; +import Axios from "axios"; +import * as actionType from "./actionsTypes"; -export const fetchProblems = problems => ({ +export const fetchProblems = (problems) => ({ type: actionType.SET_PROBLEMS, problems, }); -export const initProbelms = () => (dispatch) => { - Axios.get('https://ctf-apis.firebaseio.com/problems.json') - .then((response) => { - dispatch(fetchProblems(response.data)); - }); +export const initProbelms = (problemType) => (dispatch) => { + const url = `http://localhost:3000/api/problem/all_paroblems/${problemType}`; + Axios.get(url).then((response) => { + dispatch(fetchProblems(response.data.data)); + }); }; -export const categoryFetchProblems = category => ({ +export const categoryFetchProblems = (category) => ({ type: actionType.CAT_SET_PROBLEMS, category, }); + +export const addProblem = (problem) => ({ + type: actionType.ADD_PROBLEM, + problem, +}); + +export const onitProblem = (problem, token) => async (dispatch) => { + const url = "http://localhost:3000/api/problem/"; + const response = await Axios({ + method: "POST", + url, + data: problem, + headers: { Authorization: `Bearer ${token}` }, + }); + dispatch(addProblem(response.data.data)); +}; diff --git a/src/store/actions/profile.jsx b/src/store/actions/profile.jsx index 2d8232b..dddbc08 100644 --- a/src/store/actions/profile.jsx +++ b/src/store/actions/profile.jsx @@ -1,14 +1,17 @@ -import Axios from 'axios'; -import * as actionType from './actionsTypes'; +import Axios from "axios"; +import * as actionType from "./actionsTypes"; -export const fetchProfile = profile => ({ +export const fetchProfile = (profile) => ({ type: actionType.SET_PROFILE, profile, }); -export const initProfile = () => (dispatch) => { - Axios.get('https://ctf-apis.firebaseio.com/profile.json') - .then((response) => { - dispatch(fetchProfile(response.data)); - }); +export const initProfile = (userId, token) => async (dispatch) => { + const url = `http://localhost:3000/api/user/${userId}`; + const response = await Axios({ + method: "GET", + url, + headers: { Authorization: `Bearer ${token}` }, + }); + dispatch(fetchProfile(response.data.data)); }; diff --git a/src/store/reducer/reducer.jsx b/src/store/reducer/reducer.jsx index 896d843..1ee8d32 100644 --- a/src/store/reducer/reducer.jsx +++ b/src/store/reducer/reducer.jsx @@ -1,21 +1,58 @@ -import * as actionTypes from '../actions/actionsTypes'; +import * as actionTypes from "../actions/actionsTypes"; +import { updateObject } from "../utility"; const initialState = { - problems: null, - competitions: null, + problems: [], + competitions: [], competition: null, categoryProblems: null, profile: null, + token: null, + userId: null, + error: null, + loading: false, + leaderboard: [], + leaderboardStatus: true, }; +const authStart = (state, action) => + updateObject(state, { error: null, loading: true }); + +const authSuccess = (state, action) => + updateObject(state, { + token: action.idToken, + userId: action.userId, + error: null, + loading: false, + }); + +const authLogOut = (state, action) => + updateObject(state, { + token: null, + userId: null, + profile: null, + }); + +const authFail = (state, action) => + updateObject(state, { + error: action.error, + loading: false, + }); const reducer = (state = initialState, action) => { + const updatedProblems = [...state.problems]; switch (action.type) { case actionTypes.SET_PROBLEMS: return { ...state, problems: action.problems, }; + case actionTypes.ADD_PROBLEM: + updatedProblems.push(action.problem); + return { + ...state, + problems: updatedProblems, + }; case actionTypes.SET_COMPETITIONS: return { ...state, @@ -26,10 +63,33 @@ const reducer = (state = initialState, action) => { ...state, competition: action.competition, }; + case actionTypes.SET_LEADERBOARD: + return { + ...state, + leaderboard: action.leaderboard, + }; + case actionTypes.SET_LEADERBOARD_STATUS: + return { + ...state, + leaderboardStatus: action.leaderboardStatus, + }; + case actionTypes.SET_COMPETITIONS_LEVEL_PROBLEMS: + return { + ...state, + competition: { + ...state.competition, + challenges: action.challenges, + }, + }; + case actionTypes.ADD_EVENT: + return { + ...state, + competitions: [...state.competitions, action.competition], + }; case actionTypes.CAT_SET_PROBLEMS: { const problemArray = { ...state.problems }; const newarray = Object.values(problemArray).filter( - problemItem => problemItem.category === action.category, + (problemItem) => problemItem.category === action.category ); return { ...state, @@ -41,7 +101,14 @@ const reducer = (state = initialState, action) => { ...state, profile: action.profile, }; - + case actionTypes.AUTH_START: + return authStart(state, action); + case actionTypes.AUTH_SUCCESS: + return authSuccess(state, action); + case actionTypes.AUTH_FAIL: + return authFail(state, action); + case actionTypes.AUTH_LOGOUT: + return authLogOut(state, action); default: return state; } diff --git a/src/store/utility.jsx b/src/store/utility.jsx new file mode 100644 index 0000000..8b9c4e9 --- /dev/null +++ b/src/store/utility.jsx @@ -0,0 +1,4 @@ +export const updateObject = (oldObject, updatedProperties) => ({ + ...oldObject, + ...updatedProperties, +});