From 28c41a30990890b1dc41b59f34182b8ba833ecac Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 22 Aug 2020 00:54:34 +0100 Subject: [PATCH 01/61] [B][LINT] re-init eslint --- backend/.eslintrc.js | 19 +- backend/package-lock.json | 1099 +++++++++++++++++++++++++++---------- backend/package.json | 4 +- 3 files changed, 819 insertions(+), 303 deletions(-) diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index fbb7592..881df0b 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -1,12 +1,11 @@ module.exports = { env: { browser: true, + commonjs: true, es6: true, - jest: true }, extends: [ - 'plugin:react/recommended', - 'airbnb', + 'airbnb-base', ], globals: { Atomics: 'readonly', @@ -14,16 +13,12 @@ module.exports = { }, parserOptions: { ecmaVersion: 2018, - sourceType: 'module', }, rules: { - "semi": [ - "error", - "never" + semi: [ + 'error', + 'never', ], - "import/extensions": "off", - "no-console": "off", - "no-alert": "off", - "no-shadow": "off", + 'no-underscore-dangle': 'off', }, -}; +} diff --git a/backend/package-lock.json b/backend/package-lock.json index c6dbf5a..09306cf 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -452,6 +452,12 @@ "@babel/types": "^7.3.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -474,6 +480,12 @@ "@types/istanbul-lib-report": "*" } }, + "@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/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -533,9 +545,9 @@ } }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "acorn-walk": { @@ -554,6 +566,12 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -629,11 +647,104 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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" + } + } + } + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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" + } + } + } + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -959,12 +1070,6 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "chownr": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", @@ -996,21 +1101,6 @@ } } }, - "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" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -1107,11 +1197,23 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -1398,6 +1500,15 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1456,22 +1567,23 @@ } }, "eslint": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", - "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", + "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -1480,32 +1592,76 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash": "^4.17.19", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { + "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": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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" + } + }, + "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" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1516,47 +1672,364 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" } }, + "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 + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "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 + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "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 }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.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.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + } + }, + "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" + }, + "dependencies": { + "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" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "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" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "dev": true, + "requires": { + "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.3", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "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" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "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" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1564,35 +2037,35 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.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" } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^7.3.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" }, "dependencies": { "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true } } @@ -1603,12 +2076,20 @@ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" }, "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==", "dev": true, "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==", + "dev": true + } } }, "esrecurse": { @@ -1765,28 +2246,6 @@ } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -1874,15 +2333,6 @@ "bser": "^2.0.0" } }, - "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "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", @@ -1958,9 +2408,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "for-in": { @@ -2566,9 +3016,9 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -2773,95 +3223,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, - "inquirer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", - "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "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-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "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 - } - } - } - } - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -3015,12 +3376,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -3034,6 +3389,12 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -3560,9 +3921,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3933,12 +4294,6 @@ "mime-db": "1.42.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 - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4090,12 +4445,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -4330,6 +4679,65 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -4347,6 +4755,54 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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" + } + } + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -4368,15 +4824,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -4730,9 +5177,9 @@ "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "remove-trailing-separator": { @@ -4863,16 +5310,6 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "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" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -4891,24 +5328,6 @@ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "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", @@ -5361,6 +5780,52 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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" + } + } + } + }, "string.prototype.trimleft": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", @@ -5379,6 +5844,52 @@ "function-bind": "^1.1.1" } }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5546,21 +6057,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -5626,11 +6122,34 @@ "punycode": "^2.1.0" } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "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" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } }, "tunnel-agent": { "version": "0.6.0", @@ -5773,9 +6292,9 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { diff --git a/backend/package.json b/backend/package.json index 4d531e1..d93b97f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -22,6 +22,8 @@ "supertest": "^4.0.2" }, "devDependencies": { - "eslint": "^6.7.2" + "eslint": "^7.7.0", + "eslint-config-airbnb-base": "^14.2.0", + "eslint-plugin-import": "^2.22.0" } } From ea64562298a08baa1ac0fb2c1156d77bec6463ec Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 22 Aug 2020 01:23:56 +0100 Subject: [PATCH 02/61] [B][LINT] fix eslint errors --- backend/.eslintrc.js | 3 + backend/app.js | 19 +- backend/controllers/index.js | 5 +- backend/controllers/login.js | 39 ++-- backend/controllers/questions.js | 225 ++++++++++----------- backend/controllers/users.js | 101 +++++----- backend/index.js | 2 +- backend/jest.config.js | 4 +- backend/models/comment.js | 13 +- backend/models/question.js | 13 +- backend/models/user.js | 12 +- backend/tests/login.test.js | 21 +- backend/tests/question.test.js | 336 ++++++++++++++----------------- backend/tests/user.test.js | 115 +++++------ backend/utils/middleware.js | 11 +- backend/utils/testHelper.js | 26 +-- backend/utils/validator.js | 34 ++-- 17 files changed, 459 insertions(+), 520 deletions(-) diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index 881df0b..64e159b 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -3,6 +3,7 @@ module.exports = { browser: true, commonjs: true, es6: true, + jest: true, }, extends: [ 'airbnb-base', @@ -20,5 +21,7 @@ module.exports = { 'never', ], 'no-underscore-dangle': 'off', + 'no-shadow': 'off', + 'no-param-reassign': 'off', }, } diff --git a/backend/app.js b/backend/app.js index bfaa3f1..1af516c 100644 --- a/backend/app.js +++ b/backend/app.js @@ -3,6 +3,8 @@ const express = require('express') const path = require('path') const fs = require('fs') const logger = require('morgan') +const mongoose = require('mongoose') +const cors = require('cors') const middleware = require('./utils/middleware') const indexRouter = require('./controllers/index') @@ -10,28 +12,25 @@ const usersRouter = require('./controllers/users') const questionRouter = require('./controllers/questions') const loginRouter = require('./controllers/login') -const mongoose = require('mongoose') -const cors = require('cors') - const app = express() app.use(logger('dev')) const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' }) app.use(logger('combined', { stream: accessLogStream })) -const DB = process.env.DB +const { DB } = process.env console.log(DB) mongoose.connect('mongodb://127.0.0.1:27017/qaTEST', { useNewUrlParser: true, useUnifiedTopology: true, - useCreateIndex: true + useCreateIndex: true, }) .then(() => { - console.log("connected to db") - }) - .catch(error => { - console.log(error) - }) + console.log('connected to db') + }) + .catch((error) => { + console.log(error) + }) app.use(cors()) app.use(express.json()) diff --git a/backend/controllers/index.js b/backend/controllers/index.js index 49978ed..f168078 100644 --- a/backend/controllers/index.js +++ b/backend/controllers/index.js @@ -1,9 +1,10 @@ const express = require('express') + const router = express.Router() /* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); +router.get('/', (req, res) => { + res.render('index', { title: 'Express' }) }) module.exports = router diff --git a/backend/controllers/login.js b/backend/controllers/login.js index ee49541..f38ee8f 100644 --- a/backend/controllers/login.js +++ b/backend/controllers/login.js @@ -1,36 +1,34 @@ const router = require('express').Router() -const User = require('../models/user') const jwt = require('jsonwebtoken') const bcrypt = require('bcrypt') - +const User = require('../models/user') router.post('/', async (request, response, next) => { try { - const username = request.body.username - const password = request.body.password + const { username } = request.body + const { password } = request.body - const user = await User.findOne({username}) + const user = await User.findOne({ username }) if (!user || !password) { return response.json({ - error: "user doesn't exist" + error: "user doesn't exist", }) } - const isPasswordCorrect = user === null ? - false : await bcrypt.compare(password, user.passwordHash) + const isPasswordCorrect = user === null + ? false : await bcrypt.compare(password, user.passwordHash) if (isPasswordCorrect) { - // update lastSignedInDate const updatedUser = { ...user._doc, - lastSignedInDate: new Date() + lastSignedInDate: new Date(), } await User.findByIdAndUpdate(user.id, updatedUser) const userTokenObj = { - username: username, - id: user.id + username, + id: user.id, } const token = jwt.sign(userTokenObj, process.env.SECRET) @@ -39,19 +37,16 @@ router.post('/', async (request, response, next) => { .json({ username, token, - id: user._id + id: user._id, }) - - } else { - return response.status(401) - .json({ - error: "invalid password" - }) } - } catch(error) { - next(error) + return response.status(401) + .json({ + error: 'invalid password', + }) + } catch (error) { + return next(error) } }) - module.exports = router diff --git a/backend/controllers/questions.js b/backend/controllers/questions.js index 56e8a1c..5f1a77b 100644 --- a/backend/controllers/questions.js +++ b/backend/controllers/questions.js @@ -1,9 +1,10 @@ const express = require('express') + const router = express.Router() +const jwt = require('jsonwebtoken') const Question = require('../models/question') const User = require('../models/user') const Comment = require('../models/comment') -const jwt = require('jsonwebtoken') router.get('/', async (request, response, next) => { try { @@ -11,55 +12,54 @@ router.get('/', async (request, response, next) => { .populate({ path: 'postedBy', model: 'User', - select: 'username' + select: 'username', }) .populate({ path: 'comments', populate: { path: 'postedBy', model: 'User', - select: 'username' - } + select: 'username', + }, }) return response.json(questions) } catch (error) { - next(error) + return next(error) } }) // used to show a question in frontend router.get('/:id', async (request, response, next) => { - const id = request.params.id + const { id } = request.params try { const question = await Question.findById(id) .populate({ path: 'postedBy', model: 'User', - select: 'username' + select: 'username', }) .populate({ path: 'comments', populate: { path: 'postedBy', model: 'User', - select: 'username' - } + select: 'username', + }, }) if (question) { return response.json(question) - } else { - return response.status(404) - .end() } + return response.status(404) + .end() } catch (error) { - next(error) + return next(error) } }) // create a new question router.post('/', async (request, response, next) => { try { - const body = request.body + const { body } = request const decodedToken = jwt.decode(request.token, process.env.SECRET) // if the token is invalid @@ -75,7 +75,7 @@ router.post('/', async (request, response, next) => { if (!body.title || !body.content) { return response.status(401) - .json({ error: 'title and content must be provided' }) + .json({ error: 'title and content must be provided' }) } const newQuestion = new Question({ @@ -83,11 +83,11 @@ router.post('/', async (request, response, next) => { content: body.content, solved: false, likes: [{ - value: 0 + value: 0, }], postedDate: new Date(), tags: body.tags ? body.tags : [], - postedBy: user.id + postedBy: user.id, }) const question = await newQuestion.save() @@ -97,17 +97,16 @@ router.post('/', async (request, response, next) => { await User.findByIdAndUpdate(user.id, user) return response.status(201) - .json(question) - + .json(question) } catch (error) { - next(error) + return next(error) } }) router.put('/:id', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -150,16 +149,15 @@ router.put('/:id', async (request, response, next) => { return response.status(200) .json(question) - } catch (error) { - next(error) + return next(error) } }) router.post('/:id/title-content', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -180,7 +178,7 @@ router.post('/:id/title-content', async (request, response, next) => { if (!body.title || !body.content) { return response.status(401) - .json({ error: 'title and content must be provided' }) + .json({ error: 'title and content must be provided' }) } if (question.postedBy.toString() !== user._id.toString()) { @@ -190,21 +188,20 @@ router.post('/:id/title-content', async (request, response, next) => { const updatedQuestion = { ...question._doc, title: body.title, - content: body.content + content: body.content, } await Question.findByIdAndUpdate(id, updatedQuestion) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) router.post('/:id/new-comment', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -225,29 +222,28 @@ router.post('/:id/new-comment', async (request, response, next) => { if (!body.content) { return response.status(401) - .json({ error: 'content must be provided' }) + .json({ error: 'content must be provided' }) } const comment = new Comment({ content: body.content, likes: [{ - value: 0 + value: 0, }], - postedBy: user.id + postedBy: user.id, }) await comment.save() const updatedQuestion = { ...question._doc, - comments: question._doc.comments.concat(comment) + comments: question._doc.comments.concat(comment), } await Question.findByIdAndUpdate(id, updatedQuestion) return response.status(200).json(comment) - } catch (error) { - next(error) + return next(error) } }) @@ -257,9 +253,8 @@ router.post('/:id/new-comment', async (request, response, next) => { * */ router.delete('/:questionID/delete-comment/:commentID', async (request, response, next) => { try { - const body = request.body - const questionID = request.params.questionID - const commentID = request.params.commentID + const { questionID } = request.params + const { commentID } = request.params const comment = await Comment.findById(commentID) const question = await Question.findById(questionID) @@ -285,14 +280,16 @@ router.delete('/:questionID/delete-comment/:commentID', async (request, response const updatedQuestion = { ...question._doc, - comments: question._doc.comments.filter(commentId => commentId != commentID) + comments: question._doc.comments.filter((commentId) => commentId !== commentID), } - await Promise.all([Question.findByIdAndUpdate(questionID, updatedQuestion), Comment.findByIdAndRemove(commentID)]) + await Promise.all([ + Question.findByIdAndUpdate(questionID, updatedQuestion), + Comment.findByIdAndRemove(commentID), + ]) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) @@ -301,9 +298,9 @@ router.delete('/:questionID/delete-comment/:commentID', async (request, response * */ router.post('/:questionID/likes/:commentID', async (request, response, next) => { try { - const body = request.body - const questionID = request.params.questionID - const commentID = request.params.commentID + const { body } = request + const { questionID } = request.params + const { commentID } = request.params const comment = await Comment.findById(commentID) const question = await Question.findById(questionID) @@ -325,46 +322,44 @@ router.post('/:questionID/likes/:commentID', async (request, response, next) => if (!body.likes) { return response.status(401) - .json({ error: 'value must be provided as a number' }) + .json({ error: 'value must be provided as a number' }) } - const likeUsers = comment.likes.map(like => like.likedBy) + const likeUsers = comment.likes.map((like) => like.likedBy) // if the user upvotes or downvotes again if (likeUsers.includes(user.id)) { const currentLike = body.likes >= 0 ? 1 : -1 - const userLikes = comment.likes.filter(like => like.likedBy == user.id) + const userLikes = comment.likes.filter((like) => String(like.likedBy) === String(user.id)) const userLike = userLikes[userLikes.length - 1].value - if (currentLike === userLike || currentLike * 2 == userLike) { + if (currentLike === userLike || currentLike * 2 === userLike) { return response.status(401).end() - } else { - - const updatedComment = { - ...comment._doc, - likes: comment.likes.concat({ - value: body.likes >= 0 ? 2 : -2, - likedBy: user.id - }) - } - - await Comment.findByIdAndUpdate(comment.id, updatedComment) - return response.status(200).end() } + + const updatedComment = { + ...comment._doc, + likes: comment.likes.concat({ + value: body.likes >= 0 ? 2 : -2, + likedBy: user.id, + }), + } + + await Comment.findByIdAndUpdate(comment.id, updatedComment) + return response.status(200).end() } const updatedComment = { ...comment._doc, likes: comment.likes.concat({ value: body.likes >= 0 ? 1 : -1, - likedBy: user.id - }) + likedBy: user.id, + }), } await Comment.findByIdAndUpdate(comment.id, updatedComment) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) @@ -373,9 +368,9 @@ router.post('/:questionID/likes/:commentID', async (request, response, next) => * */ router.post('/:questionID/edit-comment/:commentID', async (request, response, next) => { try { - const body = request.body - const questionID = request.params.questionID - const commentID = request.params.commentID + const { body } = request + const { questionID } = request.params + const { commentID } = request.params const comment = await Comment.findById(commentID) const question = await Question.findById(questionID) @@ -401,26 +396,25 @@ router.post('/:questionID/edit-comment/:commentID', async (request, response, ne if (!body.content) { return response.status(401) - .json({ error: 'content must be provided' }) + .json({ error: 'content must be provided' }) } const updatedComment = { ...comment._doc, - content: body.content + content: body.content, } await Comment.findByIdAndUpdate(commentID, updatedComment) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) router.post('/:id/tags', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -445,26 +439,25 @@ router.post('/:id/tags', async (request, response, next) => { if (!body.tags) { return response.status(401) - .json({ error: 'tags must be provided' }) + .json({ error: 'tags must be provided' }) } const updatedQuestion = { ...question._doc, - tags: body.tags + tags: body.tags, } await Question.findByIdAndUpdate(id, updatedQuestion) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) router.post('/:id/solved', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -489,32 +482,29 @@ router.post('/:id/solved', async (request, response, next) => { if (!body.solved) { return response.status(401) - .json({ error: 'solved must be provided' }) + .json({ error: 'solved must be provided' }) } const updatedQuestion = { ...question._doc, - solved: body.solved + solved: body.solved, } await Question.findByIdAndUpdate(id, updatedQuestion) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) - - /** * increases the number of likes based on the likes object that's posted * if likes >= 0 then the likes are increased by 1, else decreased by 1 * */ router.post('/:id/likes', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -535,51 +525,53 @@ router.post('/:id/likes', async (request, response, next) => { if (!body.likes) { return response.status(401) - .json({ error: 'likes must be provided as a number' }) + .json({ error: 'likes must be provided as a number' }) } - const likeUsers = question.likes.map(like => like.likedBy) + const likeUsers = question.likes.map((like) => like.likedBy) // if the user upvotes or downvotes again if (likeUsers.includes(user.id)) { const currentLike = body.likes >= 0 ? 1 : -1 - const userLikes = question.likes.filter(like => like.likedBy == user.id) + const userLikes = question.likes.filter((like) => String(like.likedBy) === String(user.id)) const userLike = userLikes[userLikes.length - 1].value - if (currentLike === userLike || currentLike * 2 == userLike) { + if (currentLike === userLike || currentLike * 2 === userLike) { return response.status(401).end() - } else { - const updatedQuestion = { - ...question._doc, - likes: question.likes.concat({ - value: body.likes >= 0 ? 2 : -2, // if the question had 3 likes, and the user upvote, it becomes 4, then he downvotes, it should be (init value - 1) which is (4 - 2) - likedBy: user.id - }) - } - await Question.findByIdAndUpdate(id, updatedQuestion) - return response.status(200).end() } + + // if the question had 3 likes, and the user upvote, + // it becomes 4, then he downvotes, + // it should be (init value - 1) which is (4 - 2) + const updatedQuestion = { + ...question._doc, + likes: question.likes.concat({ + value: body.likes >= 0 ? 2 : -2, + likedBy: user.id, + }), + } + await Question.findByIdAndUpdate(id, updatedQuestion) + return response.status(200).end() } const updatedQuestion = { ...question._doc, likes: question.likes.concat({ value: body.likes >= 0 ? 1 : -1, - likedBy: user.id - }) + likedBy: user.id, + }), } await Question.findByIdAndUpdate(id, updatedQuestion) return response.status(200).end() - } catch (error) { - next(error) + return next(error) } }) // delete a question router.delete('/:id', async (request, response, next) => { try { - const id = request.params.id + const { id } = request.params const question = await Question.findById(id) if (!question) { @@ -602,17 +594,22 @@ router.delete('/:id', async (request, response, next) => { return response.status(401).json({ error: 'a questions can be deleted by authors only' }) } - const updatedUserQuestion = user._doc.questions.filter(userQuestion => userQuestion.toString() !== question.id.toString()) + const updatedUserQuestion = user._doc.questions + .filter((userQuestion) => userQuestion.toString() !== question.id.toString()) + const updatedUser = { ...user._doc, - questions: updatedUserQuestion + questions: updatedUserQuestion, } - await Promise.all([User.findByIdAndUpdate(user.id, updatedUser), Question.findByIdAndRemove(id)]) + await Promise.all([ + User.findByIdAndUpdate(user.id, updatedUser), + Question.findByIdAndRemove(id), + ]) return response.status(204).end() } catch (error) { - next(error) + return next(error) } }) diff --git a/backend/controllers/users.js b/backend/controllers/users.js index 11d8cd4..a0b54e1 100644 --- a/backend/controllers/users.js +++ b/backend/controllers/users.js @@ -1,59 +1,53 @@ const express = require('express') + const router = express.Router() const bcrypt = require('bcrypt') -const User = require('../models/user') const jwt = require('jsonwebtoken') +const User = require('../models/user') const validator = require('../utils/validator') -router.get('/', async(request, response, next) => { - +router.get('/', async (request, response, next) => { try { const users = await User.find({}) - .populate({ - path: 'questions', - model: 'Question', - select: ['title', 'likes'] - }) + .populate({ + path: 'questions', + model: 'Question', + select: ['title', 'likes'], + }) return response.json(users) } catch (error) { - next(error) + return next(error) } - }) - // used for a user page router.get('/:id', async (request, response, next) => { - try { - const id = request.params.id; + const { id } = request.params const user = await User.findById(id).populate({ path: 'questions', model: 'Question', - select: ['title', 'likes'] + select: ['title', 'likes'], }) return response.json(user) } catch (error) { - next(error) + return next(error) } +}) -}); - - -router.post('/', async(request, response, next) => { - const body = request.body +router.post('/', async (request, response, next) => { + const { body } = request const salt = 10 - if(body.password === undefined || body.username === undefined || body.email === undefined){ - response.status(400).send({ - error:'error: Both username and password and email must be given' + if (body.password === undefined || body.username === undefined || body.email === undefined) { + return response.status(400).send({ + error: 'error: Both username and password and email must be given', }) - return } const error = await validator.validate(body.username, body.password, body.email, body.dateOfBirth) - if(error){ + if (error) { return response.status(400).send(error) } @@ -62,7 +56,7 @@ router.post('/', async(request, response, next) => { const newUser = new User({ username: body.username, - passwordHash: passwordHash, + passwordHash, email: body.email, dateOfBirth: body.dateOfBirth, registerDate: new Date(), @@ -71,20 +65,17 @@ router.post('/', async(request, response, next) => { }) await newUser.save() - return response.status(200).json(newUser); - + return response.status(200).json(newUser) } catch (error) { - next(error) + return next(error) } +}) -}); - - -//used to update a user's info +// used to update a user's info router.put('/:id', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const decodedToken = jwt.decode(request.token, process.env.SECRET) if (!decodedToken.id || decodedToken.id !== id) { @@ -97,21 +88,22 @@ router.put('/:id', async (request, response, next) => { return response.status(401).json({ error: 'token missing or invalid' }) } - const isPasswordCorrect = user === null ? - false : await bcrypt.compare(body.password, user.passwordHash) + const isPasswordCorrect = user === null + ? false : await bcrypt.compare(body.password, user.passwordHash) - if(!isPasswordCorrect) { - return response.status(401).json({error: 'wrong password'}) + if (!isPasswordCorrect) { + return response.status(401).json({ error: 'wrong password' }) } - if(!body.email || !body.dateOfBirth || !body.fullname) { + if (!body.email || !body.dateOfBirth || !body.fullname) { return response.status(401) - .json({error: 'email, dateOfBirth, fullname must be provided'}) + .json({ error: 'email, dateOfBirth, fullname must be provided' }) } - const error = await validator.validate(body.username, body.password, body.email, body.dateOfBirth) + const error = await validator + .validate(body.username, body.password, body.email, body.dateOfBirth) - if(error){ + if (error) { return response.status(400).send(error) } @@ -120,21 +112,20 @@ router.put('/:id', async (request, response, next) => { email: body.email, dateOfBirth: body.dateOfBirth, location: body.location, - fullname: body.fullname + fullname: body.fullname, } const updatedUser = await User.findByIdAndUpdate(id, updatedUserObj) return response.status(200).json(updatedUser) } catch (error) { - next(error) + return next(error) } }) - // used to delete a user -router.delete('/:id', async (request, response, next) => { +router.delete('/:id', async (request, response, next) => { try { - const body = request.body - const id = request.params.id + const { body } = request + const { id } = request.params const decodedToken = jwt.decode(request.token, process.env.SECRET) if (!decodedToken.id || decodedToken.id !== id) { @@ -147,18 +138,18 @@ router.delete('/:id', async (request, response, next) => { return response.status(401).json({ error: 'token missing or invalid' }) } - const isPasswordCorrect = user === null ? - false : await bcrypt.compare(body.password, user.passwordHash) + const isPasswordCorrect = user === null + ? false : await bcrypt.compare(body.password, user.passwordHash) - if(!isPasswordCorrect) { - return response.status(401).json({error: 'wrong password'}) + if (!isPasswordCorrect) { + return response.status(401).json({ error: 'wrong password' }) } await User.findByIdAndRemove(id) return response.status(204).end() } catch (error) { - next(error) + return next(error) } }) -module.exports = router; +module.exports = router diff --git a/backend/index.js b/backend/index.js index f71e868..5e5dbef 100644 --- a/backend/index.js +++ b/backend/index.js @@ -5,4 +5,4 @@ const server = http.createServer(app) server.listen(3000, () => { console.log('server started on localhost:3000') -}) \ No newline at end of file +}) diff --git a/backend/jest.config.js b/backend/jest.config.js index 1886c68..b5e3f8a 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -1,3 +1,3 @@ module.exports = { - testEnvironment: 'node' -} \ No newline at end of file + testEnvironment: 'node', +} diff --git a/backend/models/comment.js b/backend/models/comment.js index 48c88fe..f2bcb8c 100644 --- a/backend/models/comment.js +++ b/backend/models/comment.js @@ -3,28 +3,27 @@ const mongoose = require('mongoose') const commentSchema = mongoose.Schema({ content: { type: String, - required: true + required: true, }, likes: [{ value: Number, likedBy: { type: mongoose.Schema.Types.ObjectId, - ref: 'User' - } + ref: 'User', + }, }], postedBy: { type: mongoose.Schema.Types.ObjectId, - ref: 'User' - } + ref: 'User', + }, }) - commentSchema.set('toJSON', { transform: (document, returnedObject) => { returnedObject.id = returnedObject._id.toString() delete returnedObject._id delete returnedObject.__v - } + }, }) const Comment = mongoose.model('Comment', commentSchema) diff --git a/backend/models/question.js b/backend/models/question.js index f61427a..5e8d19a 100644 --- a/backend/models/question.js +++ b/backend/models/question.js @@ -1,7 +1,6 @@ const mongoose = require('mongoose') const uniqueValidator = require('mongoose-unique-validator') - const questionSchema = mongoose.Schema({ title: { type: String, @@ -17,19 +16,19 @@ const questionSchema = mongoose.Schema({ tags: [], comments: [{ type: mongoose.Schema.Types.ObjectId, - ref: 'Comment' + ref: 'Comment', }], likes: [{ value: Number, likedBy: { type: mongoose.Schema.Types.ObjectId, - ref: 'User' - } + ref: 'User', + }, }], postedBy: { type: mongoose.Schema.Types.ObjectId, - ref: 'User' - } + ref: 'User', + }, }) questionSchema.plugin(uniqueValidator) @@ -39,7 +38,7 @@ questionSchema.set('toJSON', { returnedObject.id = returnedObject._id.toString() delete returnedObject._id delete returnedObject.__v - } + }, }) const Question = mongoose.model('Question', questionSchema) diff --git a/backend/models/user.js b/backend/models/user.js index 1845f51..b74323f 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -6,8 +6,8 @@ const userSchema = mongoose.Schema({ username: { type: String, unique: true, - required:true, - minlength: 3 + required: true, + minlength: 3, }, passwordHash: String, dateOfBirth: Date, @@ -15,7 +15,7 @@ const userSchema = mongoose.Schema({ type: String, unique: true, required: true, - minlength: 6 + minlength: 6, }, location: String, registerDate: Date, @@ -23,7 +23,7 @@ const userSchema = mongoose.Schema({ questions: [ { type: mongoose.Schema.Types.ObjectId, - ref: 'Question' + ref: 'Question', }, ], }) @@ -37,11 +37,9 @@ userSchema.set('toJSON', { delete returnedObject.__v // the passwordHash should not be revealed delete returnedObject.passwordHash - } + }, }) - const User = mongoose.model('User', userSchema) module.exports = User - diff --git a/backend/tests/login.test.js b/backend/tests/login.test.js index 9cec2c0..f61760f 100644 --- a/backend/tests/login.test.js +++ b/backend/tests/login.test.js @@ -1,22 +1,20 @@ +const superTest = require('supertest') const testHelper = require('../utils/testHelper') const app = require('../app') const User = require('../models/user') -const superTest = require('supertest') const api = superTest(app) - beforeEach(async () => { await User.deleteMany({}) }) describe('auth', () => { - test('a user can be logged in', async () => { const usersInDb = testHelper.getInitialUsers() const user = { username: usersInDb[0].username, - password: usersInDb[0].password + password: usersInDb[0].password, } // register the user @@ -48,22 +46,19 @@ describe('auth', () => { const usersInDb = testHelper.getInitialUsers() const user = { username: usersInDb[0].username, - password: 'bad_password' + password: 'bad_password', } // register the user await api.post('/api/users') - .send(usersInDb[0]) + .send(usersInDb[0]) // login const response = await api.post('/api/login') - .send(user) - .expect(401) - .expect('Content-Type', /application\/json/) + .send(user) + .expect(401) + .expect('Content-Type', /application\/json/) expect(response.body.error).toBe('invalid password') - }) - - -}); +}) diff --git a/backend/tests/question.test.js b/backend/tests/question.test.js index 8162fcc..ccbb7ef 100644 --- a/backend/tests/question.test.js +++ b/backend/tests/question.test.js @@ -1,83 +1,77 @@ +const supertest = require('supertest') +const mongoose = require('mongoose') const app = require('../app') const Question = require('../models/question') const User = require('../models/user') const Comment = require('../models/comment') -const supertest = require('supertest') + const api = supertest(app) -const mongoose = require('mongoose') const testHelper = require('../utils/testHelper') beforeEach(async () => { - // clear the database await Question.deleteMany({}) await User.deleteMany({}) // add initial questions to the db const questions = testHelper.getInitialQuestions() - .map(question => new Question(question)) + .map((question) => new Question(question)) - const promiseArray = questions.map(question => question.save()) + const promiseArray = questions.map((question) => question.save()) await Promise.all(promiseArray) - }) /** * userIndex is the index of user in initialUsers * returns the response of user login * */ -const getUserResponse = async (userIndex=0) => { +const getUserResponse = async (userIndex = 0) => { const initialUsers = testHelper.getInitialUsers() const user = { username: initialUsers[userIndex].username, - password: initialUsers[userIndex].password + password: initialUsers[userIndex].password, } // register the user await api.post('/api/users') - .send(initialUsers[userIndex]) + .send(initialUsers[userIndex]) // login the user to get jwt const response = await api.post('/api/login') - .send(user) + .send(user) return response } describe('question crud', () => { - - test("all questions are returned", async() => { + test('all questions are returned', async () => { const initialQuestions = await testHelper.getQuestionsInDb() - const response = await api.get("/api/questions") - .expect(200) + const response = await api.get('/api/questions') + .expect(200) - console.log(response.text) const finalQuestions = JSON.parse(response.text) expect(finalQuestions.sort()).toEqual(initialQuestions.sort()) - }) - test("a proper question can be created", async () => { + test('a proper question can be created', async () => { const initialQuestions = await testHelper.getQuestionsInDb() const initialUsers = testHelper.getInitialUsers() - console.log(initialUsers) - const user = { username: initialUsers[0].username, - password: initialUsers[0].password + password: initialUsers[0].password, } // register the user const userPostResponse = await api.post('/api/users') - .send(initialUsers[0]) + .send(initialUsers[0]) // login the user to get jwt const response = await api.post('/api/login') - .send(user) + .send(user) const newQuestion = { title: 'first question', @@ -86,9 +80,9 @@ describe('question crud', () => { } const questionResponse = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${response.body.token}`) + .send(newQuestion) + .expect(201) const userGetResponse = await api.get(`/api/users/${userPostResponse.body.id}`) const finalQuestions = await testHelper.getQuestionsInDb() @@ -96,22 +90,19 @@ describe('question crud', () => { const userQuestions = userGetResponse.body.questions expect(finalQuestions.length).toBe(initialQuestions.length + 1) - expect(userQuestions.map(question => question.id )).toContain(questionResponse.body.id) + expect(userQuestions.map((question) => question.id)).toContain(questionResponse.body.id) }) - test('a specific question is returned', async () => { const question = (await testHelper.getQuestionsInDb())[0] const response = await api.get(`/api/questions/${question.id}`) - .expect(200) - .expect('Content-Type', /application\/json/) + .expect(200) + .expect('Content-Type', /application\/json/) const returnedQuestion = JSON.parse(response.text) expect(returnedQuestion).toEqual(question) - }) - }) describe('question deletion', () => { @@ -126,14 +117,14 @@ describe('question deletion', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${response.body.token}`) + .send(newQuestion) + .expect(201) - const deleteResponse = await api.delete(`/api/questions/${question.body.id}`) - .set('Authorization', `bearer ${response.body.token}`) - .send() - .expect(204) + await api.delete(`/api/questions/${question.body.id}`) + .set('Authorization', `bearer ${response.body.token}`) + .send() + .expect(204) // expect the question to be deleted from the user question list const userResponse = await api.get(`/api/users/${response.body.id}`) @@ -158,27 +149,24 @@ describe('question deletion', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${responseOne.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${responseOne.body.token}`) + .send(newQuestion) + .expect(201) const deleteResponse = await api.delete(`/api/questions/${question.body.id}`) - .set('Authorization', `bearer ${responseTwo.body.token}`) - .send() - .expect(401) + .set('Authorization', `bearer ${responseTwo.body.token}`) + .send() + .expect(401) const finalQuestions = await testHelper.getQuestionsInDb() expect(finalQuestions.length).toBe(initialQuestions.length + 1) expect(deleteResponse.body.error).toBe('a questions can be deleted by authors only') - }) }) describe('question updation', () => { - test('a question can be updated', async () => { - const initialQuestions = await testHelper.getQuestionsInDb() const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -211,11 +199,11 @@ describe('question updation', () => { .expect(401) const finalQuestions = await testHelper.getQuestionsInDb() - const finalQuestion = finalQuestions.filter(finalQuestion => finalQuestion.id === question.body.id)[0] + const finalQuestion = finalQuestions + .filter((finalQuestion) => finalQuestion.id === question.body.id)[0] expect(finalQuestion.title) .toBe(editedQuestion.title) - }) test('a question\'s with title and content can be updated by the author', async () => { @@ -229,34 +217,31 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${response.body.token}`) + .send(newQuestion) + .expect(201) // edit title and content const editedQuestion = { title: 'this question has been edited', - content: 'this question has been edited' + content: 'this question has been edited', } await api.post(`/api/questions/${question.body.id}/title-content`) - .set('Authorization', `bearer ${response.body.token}`) - .send(editedQuestion) - .expect(200) + .set('Authorization', `bearer ${response.body.token}`) + .send(editedQuestion) + .expect(200) - const finalQuestions = (await testHelper.getQuestionsInDb()).map(question => { - return { - title: question.title, - content: question.content - } - }) + const finalQuestions = (await testHelper.getQuestionsInDb()).map((question) => ({ + title: question.title, + content: question.content, + })) expect(finalQuestions.length).toBe(initialQuestions.length + 1) expect(finalQuestions).toContainEqual(editedQuestion) - }) - test("a question with title and content cannot be updated by the user that didnt create it", async () => { + test('a question with title and content cannot be updated by the user that didnt create it', async () => { const initialQuestions = await testHelper.getQuestionsInDb() const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -268,29 +253,27 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(newQuestion) + .expect(201) // edit title and content const editedQuestion = { title: 'this question has been edited', - content: 'this question has been edited' + content: 'this question has been edited', } await api.post(`/api/questions/${question.body.id}/title-content`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(editedQuestion) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(editedQuestion) + .expect(401) const finalQuestions = await testHelper.getQuestionsInDb() expect(finalQuestions.length).toBe(initialQuestions.length + 1) - }) - test("the number of likes can be increased, decreased", async () => { - + test('the number of likes can be increased, decreased', async () => { const response = await getUserResponse() const secondUserResponse = await getUserResponse(1) const initLikes = 0 @@ -302,51 +285,48 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${response.body.token}`) + .send(newQuestion) + .expect(201) await api.post(`/api/questions/${question.body.id}/likes`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send({likes: 1}) - .expect(200) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send({ likes: 1 }) + .expect(200) await api.post(`/api/questions/${question.body.id}/likes`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send({likes: 1}) + .send({ likes: 1 }) .expect(401) const questionIncreased = (await testHelper.getQuestionsInDb()) - .filter(incQuestion => incQuestion.id === question.body.id)[0] + .filter((incQuestion) => incQuestion.id === question.body.id)[0] - const increasedLikes = questionIncreased.likes.map(like => like.value) + const increasedLikes = questionIncreased.likes.map((like) => like.value) .reduce((a, b) => a + b, 0) - expect(increasedLikes).toBe(initLikes + 1) + expect(increasedLikes).toBe(initLikes + 1) await api.post(`/api/questions/${question.body.id}/likes`) - .set('Authorization', `bearer ${response.body.token}`) - .send({likes: -1}) - .expect(200) + .set('Authorization', `bearer ${response.body.token}`) + .send({ likes: -1 }) + .expect(200) await api.post(`/api/questions/${question.body.id}/likes`) .set('Authorization', `bearer ${response.body.token}`) - .send({likes: -1}) + .send({ likes: -1 }) .expect(401) const questionDecreased = (await testHelper.getQuestionsInDb()) - .filter(decQuestion => decQuestion.id === question.body.id)[0] + .filter((decQuestion) => decQuestion.id === question.body.id)[0] - const decreasedLikes = questionDecreased.likes.map(like => like.value) + const decreasedLikes = questionDecreased.likes.map((like) => like.value) .reduce((a, b) => a + b, 0) expect(decreasedLikes).toBe(increasedLikes - 1) - - }) - test("question tags can be updated by the author", async () => { - const initialQuestions = await testHelper.getQuestionsInDb() + test('question tags can be updated by the author', async () => { const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -357,31 +337,29 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(newQuestion) + .expect(201) const tags = { - tags:['new_tag', 'react', 'redux'] + tags: ['new_tag', 'react', 'redux'], } await api.post(`/api/questions/${question.body.id}/tags`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(tags) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(tags) + .expect(200) await api.post(`/api/questions/${question.body.id}/tags`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(tags) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(tags) + .expect(401) const authorQuestion = await api.get(`/api/questions/${question.body.id}`) expect(authorQuestion.body.tags.sort()).toEqual(tags.tags.sort()) - }) - test("question can be set to solved by the author", async () => { - const initialQuestions = await testHelper.getQuestionsInDb() + test('question can be set to solved by the author', async () => { const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -392,31 +370,29 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(newQuestion) + .expect(201) const solved = { - solved:true + solved: true, } await api.post(`/api/questions/${question.body.id}/solved`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(solved) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(solved) + .expect(200) await api.post(`/api/questions/${question.body.id}/solved`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(solved) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(solved) + .expect(401) const authorQuestion = await api.get(`/api/questions/${question.body.id}`) expect(authorQuestion.body.solved).toBeTruthy() - }) - test("a comment can by added by any user", async () => { - + test('a comment can by added by any user', async () => { const response = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -431,27 +407,25 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${response.body.token}`) + .send(newQuestion) + .expect(201) const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(newComment) - .expect(200) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(newComment) + .expect(200) const finalQuestion = (await testHelper.getQuestionsInDb()) - .filter(finalQuestion => finalQuestion.id === question.body.id)[0] + .filter((finalQuestion) => finalQuestion.id === question.body.id)[0] const comment = await Comment.findById(commentResponse.body.id) expect(finalQuestion.comments.length).toBe(1) expect(comment).toBeTruthy() - }) - - test("comment can be deleted to solved by the author", async () => { + test('comment can be deleted to solved by the author', async () => { const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -462,41 +436,39 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(newQuestion) + .expect(201) const comment = { - content: 'another comment, thanks' + content: 'another comment, thanks', } await api.post(`/api/questions/${question.body.id}/new-comment`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send({ - content: 'new comment, thanks' - }) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send({ + content: 'new comment, thanks', + }) + .expect(200) const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(comment) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(comment) + .expect(200) await api.delete(`/api/questions/${question.body.id}/delete-comment/${commentResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .expect(401) await api.delete(`/api/questions/${question.body.id}/delete-comment/${commentResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .expect(200) const authorQuestion = await api.get(`/api/questions/${question.body.id}`) expect(authorQuestion.body.comments.length).toBe(1) - }) - test("likes of a comment can be increased, decreased", async () => { - + test('likes of a comment can be increased, decreased', async () => { const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -507,50 +479,47 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(newQuestion) + .expect(201) const comment = { - content: 'new comment' + content: 'new comment', } const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(comment) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(comment) + .expect(200) await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send({likes: 1}) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send({ likes: 1 }) + .expect(200) await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send({likes: 1}) + .send({ likes: 1 }) .expect(401) await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send({likes: -1}) - .expect(200) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send({ likes: -1 }) + .expect(200) await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send({likes: -1}) + .send({ likes: -1 }) .expect(401) const finalComment = await Comment.findById(commentResponse.body.id) - const finalCommentLikes = finalComment.likes.map(like => like.value) + const finalCommentLikes = finalComment.likes.map((like) => like.value) .reduce((a, b) => a + b, 0) expect(finalCommentLikes).toBe(0) - - }) - test("a comment can be edited by the author", async () => { - + test('a comment can be edited by the author', async () => { const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -561,36 +530,33 @@ describe('question updation', () => { } const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(newQuestion) + .expect(201) const comment = { - content: 'new comment' + content: 'new comment', } const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(comment) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(comment) + .expect(200) await api.post(`/api/questions/${question.body.id}/edit-comment/${commentResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send({content: 'comment is edited'}) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send({ content: 'comment is edited' }) + .expect(200) await api.post(`/api/questions/${question.body.id}/edit-comment/${commentResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send({content: 'comment is edited'}) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send({ content: 'comment is edited' }) + .expect(401) const finalComment = await Comment.findById(commentResponse.body.id) expect(finalComment.content).toBe('comment is edited') - - }) - }) afterAll(() => { diff --git a/backend/tests/user.test.js b/backend/tests/user.test.js index 1a53679..1f721b1 100644 --- a/backend/tests/user.test.js +++ b/backend/tests/user.test.js @@ -1,32 +1,30 @@ +const supertest = require('supertest') +const mongoose = require('mongoose') const app = require('../app') const User = require('../models/user') -const supertest = require('supertest') + const api = supertest(app) -const mongoose = require('mongoose') const testHelper = require('../utils/testHelper') beforeEach(async () => { - // clear the database await User.deleteMany({}) // add initial users to the db const users = testHelper.getInitialUsers() - const promiseArray = users.map(user => api.post('/api/users').send(user)) + const promiseArray = users.map((user) => api.post('/api/users').send(user)) await Promise.all(promiseArray) - }) describe('user crud', () => { - - test("all users are returned", async() => { + test('all users are returned', async () => { const initialUsers = await testHelper.getUsersInDb() - const response = await api.get("/api/users") - .expect(200) + const response = await api.get('/api/users') + .expect(200) - const finalUsers = JSON.parse(response.text).map(user => { + const finalUsers = JSON.parse(response.text).map((user) => { const userObj = { username: user.username, email: user.email, @@ -41,90 +39,83 @@ describe('user crud', () => { }) expect(finalUsers.sort()).toEqual(initialUsers.sort()) - }) - test("a proper user can be registered", async () => { - + test('a proper user can be registered', async () => { const initialUsers = await testHelper.getUsersInDb() const newUser = { - username: "fibi", - password: "ayoFibCome6layHere", - email: "fibi@fibi.fr", - dateOfBirth: "06-22-1955" + username: 'fibi', + password: 'ayoFibCome6layHere', + email: 'fibi@fibi.fr', + dateOfBirth: '06-22-1955', } - const response = await api.post('/api/users') - .send(newUser) - .expect(200) + await api.post('/api/users') + .send(newUser) + .expect(200) const finalUsers = await testHelper.getUsersInDb() - const usernames = finalUsers.map(user => user.username) + const usernames = finalUsers.map((user) => user.username) expect(finalUsers.length).toBe(initialUsers.length + 1) expect(usernames).toContain(newUser.username) - }) test('a user can be deleted', async () => { - const initialUsers = testHelper.getInitialUsers() const firstUser = { username: initialUsers[0].username, - password: initialUsers[0].password + password: initialUsers[0].password, } const secondUser = { username: initialUsers[1].username, - password: initialUsers[1].password + password: initialUsers[1].password, } const firstUserResponse = await api.post('/api/login') - .send(firstUser) + .send(firstUser) const secondUserResponse = await api.post('/api/login') - .send(secondUser) + .send(secondUser) // bad token and bad password await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(secondUser) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(secondUser) + .expect(401) // bad token and good password await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(firstUser) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(firstUser) + .expect(401) // good token and bad password await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(secondUser) - .expect(401) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(secondUser) + .expect(401) // good token and good password await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(firstUser) - .expect(204) - + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(firstUser) + .expect(204) const finalUsers = await testHelper.getUsersInDb() - const finalUsernames = finalUsers.map(user => user.username) + const finalUsernames = finalUsers.map((user) => user.username) expect(finalUsers.length).toBe(initialUsers.length - 1) expect(finalUsernames).not.toContain(firstUser.username) - }) test('a user can be updated', async () => { const initialUsers = testHelper.getInitialUsers() - const updatedUser = { ...initialUsers[0], email: 'newemailwho@dis.com', @@ -132,56 +123,55 @@ describe('user crud', () => { const firstUser = { username: initialUsers[0].username, - password: initialUsers[0].password + password: initialUsers[0].password, } const secondUser = { username: initialUsers[1].username, - password: initialUsers[1].password + password: initialUsers[1].password, } // login both users const firstUserResponse = await api.post('/api/login') - .send(firstUser) + .send(firstUser) const secondUserResponse = await api.post('/api/login') - .send(secondUser) + .send(secondUser) // bad token and bad password await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(secondUser) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(secondUser) + .expect(401) // bad token and good password await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send(firstUser) - .expect(401) + .set('Authorization', `bearer ${secondUserResponse.body.token}`) + .send(firstUser) + .expect(401) // good token and bad password await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(secondUser) - .expect(401) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(secondUser) + .expect(401) // good token and good password await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(updatedUser) - .expect(200) + .set('Authorization', `bearer ${firstUserResponse.body.token}`) + .send(updatedUser) + .expect(200) const finalUsers = await testHelper.getUsersInDb() - const finalUser = finalUsers.filter(user => user.username === initialUsers[0].username)[0] + const finalUser = finalUsers.filter((user) => user.username === initialUsers[0].username)[0] expect(finalUser.email).toEqual(updatedUser.email) - }) test('a specific user is returned', async () => { const initialUsers = await testHelper.getUsersInDb() const response = await api.get(`/api/users/${initialUsers[0].id}`) - .expect(200) + .expect(200) const user = JSON.parse(response.text) const finalUser = { @@ -197,7 +187,6 @@ describe('user crud', () => { expect(finalUser).toEqual(initialUsers[0]) }) - }) afterAll(() => { diff --git a/backend/utils/middleware.js b/backend/utils/middleware.js index cf12ef2..2dc8961 100644 --- a/backend/utils/middleware.js +++ b/backend/utils/middleware.js @@ -21,12 +21,13 @@ const unknownEndpoint = (request, response) => { response.status(404).send({ error: 'unknown endpoint' }) } +// eslint-disable-next-line no-unused-vars,consistent-return const errorHandler = (error, request, response, next) => { - if (error.name === 'CastError' && error.kind === 'ObjectId'){ + if (error.name === 'CastError' && error.kind === 'ObjectId') { return response.status(400).send({ error: 'malformed id' }) - } else if (error.name === 'ValidationError') { + } if (error.name === 'ValidationError') { return response.status(400).json({ error: error.message }) - } else if (error.name === 'JsonWebTokenError') { + } if (error.name === 'JsonWebTokenError') { return response.status(401).json({ error: 'invalid token' }) } } @@ -35,5 +36,5 @@ module.exports = { tokenExtractor, errorLogger, errorHandler, - unknownEndpoint -} \ No newline at end of file + unknownEndpoint, +} diff --git a/backend/utils/testHelper.js b/backend/utils/testHelper.js index ae72086..ca73828 100644 --- a/backend/utils/testHelper.js +++ b/backend/utils/testHelper.js @@ -7,28 +7,28 @@ const initialUsers = [ email: 'john@doe.com', password: 'johnnyBoy123', dateOfBirth: '1994-12-12', - fullname: 'john doe' + fullname: 'john doe', }, - + { username: 'karen88', email: 'kkkk@doe.com', password: 'Ayylmao123', dateOfBirth: '1998-01-23', - fullname: 'karen doe' - } + fullname: 'karen doe', + }, ] const initialQuestion = [ { title: 'is this a valid proof?', content: 'prove that for all x < x^3 => x^2 < x^4\nmy solution is: (x < x^3 ) * x QED', - tags: ['proof', 'analysis'] + tags: ['proof', 'analysis'], }, { title: 'How to un-commit last un-pushed git commit without losing the changes', content: ' there a way to revert a commit so that my local copy keeps the changes made in that commit, but they become non-committed changes in my working copy?', - tags: ['git'] + tags: ['git'], }, ] @@ -36,10 +36,11 @@ const getInitialUsers = () => initialUsers const getUsersInDb = async () => { try { - const users = await User.find({}) - return users.map(user => user.toJSON()) + const users = await User.find({}) + return users.map((user) => user.toJSON()) } catch (error) { console.log(error) + return error } } @@ -48,15 +49,16 @@ const getInitialQuestions = () => initialQuestion const getQuestionsInDb = async () => { try { const questions = await Question.find({}) - return questions.map(question => question.toJSON()) + return questions.map((question) => question.toJSON()) } catch (error) { console.log(error) + return error } } -module.exports = { +module.exports = { getInitialUsers, getUsersInDb, getQuestionsInDb, - getInitialQuestions -} \ No newline at end of file + getInitialQuestions, +} diff --git a/backend/utils/validator.js b/backend/utils/validator.js index 3c20085..a44323a 100644 --- a/backend/utils/validator.js +++ b/backend/utils/validator.js @@ -2,9 +2,13 @@ const Joi = require('@hapi/joi') /** * validates user fields as follows - * username: must be a string with alphanumerical characters, with length less that 30 and bigger than 3 - * password: must be between 8 to 32 characters long, must include one lowercase letter, one uppercase letter + * username: must be a string with alphanumerical characters, + * with length less that 30 and bigger than 3 + * + * password: must be between 8 to 32 characters long, + * must include one lowercase letter, one uppercase letter * numbers, and no spaces + * * email: must be a valid email with valid tlds, ie (something@asd.fb) is not allowed * check: https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains * dateOfBirth: must be a string in american format (month-day-year) @@ -12,27 +16,27 @@ const Joi = require('@hapi/joi') const validate = async (username, password, email, dateOfBirth) => { const schema = Joi.object({ username: Joi.string() - .alphanum() - .min(3) - .max(30) - .required(), + .alphanum() + .min(3) + .max(30) + .required(), password: Joi.string() - .pattern(new RegExp('^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s).{8,32}$')), + .pattern(new RegExp('^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s).{8,32}$')), dateOfBirth: Joi.date(), email: Joi.string() - .email() + .email(), }) const { error } = await schema.validate({ - username: username, - password: password, - email: email, - dateOfBirth: dateOfBirth - }); + username, + password, + email, + dateOfBirth, + }) return error } module.exports = { - validate -} \ No newline at end of file + validate, +} From 0141331c0afea591ecce313293e1c245bc144c28 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 22 Aug 2020 01:42:57 +0100 Subject: [PATCH 03/61] [B][C][questions] move logic for jwt validation to a helper function --- backend/controllers/questions.js | 147 +++++++------------------------ backend/utils/user.js | 29 ++++++ 2 files changed, 63 insertions(+), 113 deletions(-) create mode 100644 backend/utils/user.js diff --git a/backend/controllers/questions.js b/backend/controllers/questions.js index 5f1a77b..f888462 100644 --- a/backend/controllers/questions.js +++ b/backend/controllers/questions.js @@ -1,10 +1,10 @@ const express = require('express') const router = express.Router() -const jwt = require('jsonwebtoken') const Question = require('../models/question') const User = require('../models/user') const Comment = require('../models/comment') +const userService = require('../utils/user') router.get('/', async (request, response, next) => { try { @@ -60,17 +60,10 @@ router.get('/:id', async (request, response, next) => { router.post('/', async (request, response, next) => { try { const { body } = request - const decodedToken = jwt.decode(request.token, process.env.SECRET) - // if the token is invalid - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (!body.title || !body.content) { @@ -114,18 +107,9 @@ router.put('/:id', async (request, response, next) => { .json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401) - .json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401) - .json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (!body.title || !body.content) { @@ -164,16 +148,9 @@ router.post('/:id/title-content', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (!body.title || !body.content) { @@ -208,16 +185,9 @@ router.post('/:id/new-comment', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (!body.content) { @@ -262,16 +232,9 @@ router.delete('/:questionID/delete-comment/:commentID', async (request, response return response.status(401).json({ error: 'invalid comment id or question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (comment.postedBy.toString() !== user._id.toString()) { @@ -308,16 +271,9 @@ router.post('/:questionID/likes/:commentID', async (request, response, next) => return response.status(401).json({ error: 'invalid comment id or question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (!body.likes) { @@ -378,16 +334,9 @@ router.post('/:questionID/edit-comment/:commentID', async (request, response, ne return response.status(401).json({ error: 'invalid comment id or question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (comment.postedBy.toString() !== user._id.toString()) { @@ -421,16 +370,9 @@ router.post('/:id/tags', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (question.postedBy.toString() !== user._id.toString()) { @@ -464,16 +406,9 @@ router.post('/:id/solved', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (question.postedBy.toString() !== user._id.toString()) { @@ -511,16 +446,9 @@ router.post('/:id/likes', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (!body.likes) { @@ -578,16 +506,9 @@ router.delete('/:id', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(decodedToken.id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } if (question.postedBy.toString() !== user._id.toString()) { diff --git a/backend/utils/user.js b/backend/utils/user.js new file mode 100644 index 0000000..8cd73e6 --- /dev/null +++ b/backend/utils/user.js @@ -0,0 +1,29 @@ +const jwt = require('jsonwebtoken') +const User = require('../models/user') + +/** + * Checks if a user is logged in or not + * @param id: mongodb id of the user + * @param user: the token the user used in the request + * @return user object if the user is authenticated, error object otherwise + * */ +const isAuthenticated = async (token) => { + const decodedToken = jwt.decode(token, process.env.SECRET) + const errorObj = { error: 'token missing or invalid' } + + if (!decodedToken.id) { + return errorObj + } + + const user = await User.findById(decodedToken.id) + + if (!user) { + return errorObj + } + + return user +} + +module.exports = { + isAuthenticated, +} From 7274e2c08052c2b26135c8e97b2225de504af161 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sun, 23 Aug 2020 16:33:13 +0100 Subject: [PATCH 04/61] [B][U][user] add userId to isAuthenticated to authenticate User "Modify" operations --- backend/utils/user.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/utils/user.js b/backend/utils/user.js index 8cd73e6..4a7c4e3 100644 --- a/backend/utils/user.js +++ b/backend/utils/user.js @@ -3,11 +3,18 @@ const User = require('../models/user') /** * Checks if a user is logged in or not - * @param id: mongodb id of the user - * @param user: the token the user used in the request + * + * If userId is undefined, that's because it's not needed to + * authenticate the user, like if the user is posting a new question + * + * If a user is updating/deleting a User object, then userId must be defined to make sure + * that the token provided in the request belongs to the user with userId + * + * @param userId: mongodb id of the user + * @param token: the token the user used in the request * @return user object if the user is authenticated, error object otherwise * */ -const isAuthenticated = async (token) => { +const isAuthenticated = async (token, userId) => { const decodedToken = jwt.decode(token, process.env.SECRET) const errorObj = { error: 'token missing or invalid' } @@ -15,7 +22,12 @@ const isAuthenticated = async (token) => { return errorObj } - const user = await User.findById(decodedToken.id) + if (userId && (!decodedToken.id || decodedToken.id !== userId)) { + return errorObj + } + + const id = userId || decodedToken.id + const user = await User.findById(id) if (!user) { return errorObj From e162b6828f1b570680dda1330a67043c66374743 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sun, 23 Aug 2020 16:34:17 +0100 Subject: [PATCH 05/61] [B][C][users] use isAuthenticated helper in routes --- backend/controllers/users.js | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/backend/controllers/users.js b/backend/controllers/users.js index a0b54e1..a27da57 100644 --- a/backend/controllers/users.js +++ b/backend/controllers/users.js @@ -2,9 +2,9 @@ const express = require('express') const router = express.Router() const bcrypt = require('bcrypt') -const jwt = require('jsonwebtoken') const User = require('../models/user') const validator = require('../utils/validator') +const userService = require('../utils/user') router.get('/', async (request, response, next) => { try { @@ -76,20 +76,13 @@ router.put('/:id', async (request, response, next) => { try { const { body } = request const { id } = request.params - const decodedToken = jwt.decode(request.token, process.env.SECRET) - if (!decodedToken.id || decodedToken.id !== id) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) } - const user = await User.findById(id) - - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const isPasswordCorrect = user === null - ? false : await bcrypt.compare(body.password, user.passwordHash) + const isPasswordCorrect = await bcrypt.compare(body.password, user.passwordHash) if (!isPasswordCorrect) { return response.status(401).json({ error: 'wrong password' }) @@ -126,16 +119,10 @@ router.delete('/:id', async (request, response, next) => { try { const { body } = request const { id } = request.params - const decodedToken = jwt.decode(request.token, process.env.SECRET) - - if (!decodedToken.id || decodedToken.id !== id) { - return response.status(401).json({ error: 'token missing or invalid' }) - } - - const user = await User.findById(id) - if (!user) { - return response.status(401).json({ error: 'token missing or invalid' }) + const user = await userService.isAuthenticated(request.token, id) + if (user.error) { + return response.status(401).json(user.error) } const isPasswordCorrect = user === null From 0401ca587ae1c1b121011ff0ec096516aafb60e2 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sun, 30 Aug 2020 18:07:57 +0100 Subject: [PATCH 06/61] [B][C][comments] export comment routes to their own module --- backend/controllers/comments.js | 180 +++++++++++++++++++++++++++++ backend/controllers/questions.js | 192 +------------------------------ backend/tests/question.test.js | 30 ++--- 3 files changed, 201 insertions(+), 201 deletions(-) create mode 100644 backend/controllers/comments.js diff --git a/backend/controllers/comments.js b/backend/controllers/comments.js new file mode 100644 index 0000000..b12f9fa --- /dev/null +++ b/backend/controllers/comments.js @@ -0,0 +1,180 @@ +const express = require('express') + +const router = express.Router() +const Question = require('../models/question') +const Comment = require('../models/comment') +const userService = require('../utils/user') + +router.post('/', async (request, response, next) => { + try { + const { body, questionId } = request + const question = await Question.findById(questionId) + + if (!question) { + return response.status(401).json({ error: 'invalid question id' }) + } + + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) + } + + if (!body.content) { + return response.status(401) + .json({ error: 'content must be provided' }) + } + + const comment = new Comment({ + content: body.content, + likes: [{ + value: 0, + }], + postedBy: user.id, + }) + + await comment.save() + + const updatedQuestion = { + ...question._doc, + comments: question._doc.comments.concat(comment), + } + + await Question.findByIdAndUpdate(questionId, updatedQuestion) + return response.status(200).json(comment) + } catch (error) { + return next(error) + } +}) + +router.post('/:commentId/likes', async (request, response, next) => { + try { + const { body, questionId } = request + const { commentId } = request.params + const comment = await Comment.findById(commentId) + const question = await Question.findById(questionId) + + if (!comment || !question) { + return response.status(401).json({ error: 'invalid comment id or question id' }) + } + + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) + } + + if (!body.likes) { + return response.status(401) + .json({ error: 'value must be provided as a number' }) + } + + const likeUsers = comment.likes.map((like) => like.likedBy) + + // if the user upvotes or downvotes again + if (likeUsers.includes(user.id)) { + const currentLike = body.likes >= 0 ? 1 : -1 + const userLikes = comment.likes.filter((like) => String(like.likedBy) === String(user.id)) + const userLike = userLikes[userLikes.length - 1].value + if (currentLike === userLike || currentLike * 2 === userLike) { + return response.status(401).end() + } + + const updatedComment = { + ...comment._doc, + likes: comment.likes.concat({ + value: body.likes >= 0 ? 2 : -2, + likedBy: user.id, + }), + } + + await Comment.findByIdAndUpdate(comment.id, updatedComment) + return response.status(200).end() + } + + const updatedComment = { + ...comment._doc, + likes: comment.likes.concat({ + value: body.likes >= 0 ? 1 : -1, + likedBy: user.id, + }), + } + + await Comment.findByIdAndUpdate(comment.id, updatedComment) + return response.status(200).end() + } catch (error) { + return next(error) + } +}) + +router.put('/:commentId', async (request, response, next) => { + try { + const { body, questionId } = request + const { commentId } = request.params + const comment = await Comment.findById(commentId) + const question = await Question.findById(questionId) + + if (!comment || !question) { + return response.status(401).json({ error: 'invalid comment id or question id' }) + } + + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) + } + + if (comment.postedBy.toString() !== user._id.toString()) { + return response.status(401).json({ error: 'comments can be deleted by authors only' }) + } + + if (!body.content) { + return response.status(401) + .json({ error: 'content must be provided' }) + } + + const updatedComment = { + ...comment._doc, + content: body.content, + } + + await Comment.findByIdAndUpdate(commentId, updatedComment) + return response.status(200).end() + } catch (error) { + return next(error) + } +}) + +router.delete('/:commentId', async (request, response, next) => { + try { + const { questionId } = request + const { commentId } = request.params + const comment = await Comment.findById(commentId) + const question = await Question.findById(questionId) + + if (!comment || !question) { + return response.status(401).json({ error: 'invalid comment id or question id' }) + } + + const user = await userService.isAuthenticated(request.token) + if (user.error) { + return response.status(401).json(user.error) + } + + if (comment.postedBy.toString() !== user._id.toString()) { + return response.status(401).json({ error: 'comments can be deleted by authors only' }) + } + + const updatedQuestion = { + ...question._doc, + comments: question._doc.comments.filter((commentID) => commentID !== commentId), + } + + await Promise.all([ + Question.findByIdAndUpdate(questionId, updatedQuestion), + Comment.findByIdAndRemove(commentId), + ]) + return response.status(200).end() + } catch (error) { + return next(error) + } +}) + +module.exports = router diff --git a/backend/controllers/questions.js b/backend/controllers/questions.js index f888462..580cea7 100644 --- a/backend/controllers/questions.js +++ b/backend/controllers/questions.js @@ -3,8 +3,13 @@ const express = require('express') const router = express.Router() const Question = require('../models/question') const User = require('../models/user') -const Comment = require('../models/comment') const userService = require('../utils/user') +const commentsRouter = require('./comments') + +router.use('/:questionId/comments/', (request, response, next) => { + request.questionId = request.params.questionId + next() +}, commentsRouter) router.get('/', async (request, response, next) => { try { @@ -175,191 +180,6 @@ router.post('/:id/title-content', async (request, response, next) => { } }) -router.post('/:id/new-comment', async (request, response, next) => { - try { - const { body } = request - const { id } = request.params - const question = await Question.findById(id) - - if (!question) { - return response.status(401).json({ error: 'invalid question id' }) - } - - const user = await userService.isAuthenticated(request.token) - if (user.error) { - return response.status(401).json(user.error) - } - - if (!body.content) { - return response.status(401) - .json({ error: 'content must be provided' }) - } - - const comment = new Comment({ - content: body.content, - likes: [{ - value: 0, - }], - postedBy: user.id, - }) - - await comment.save() - - const updatedQuestion = { - ...question._doc, - comments: question._doc.comments.concat(comment), - } - - await Question.findByIdAndUpdate(id, updatedQuestion) - return response.status(200).json(comment) - } catch (error) { - return next(error) - } -}) - -/** - * deletes the comment with the given id, - * since every comment has its id, there's no need to specify the id of the question - * */ -router.delete('/:questionID/delete-comment/:commentID', async (request, response, next) => { - try { - const { questionID } = request.params - const { commentID } = request.params - const comment = await Comment.findById(commentID) - const question = await Question.findById(questionID) - - if (!comment || !question) { - return response.status(401).json({ error: 'invalid comment id or question id' }) - } - - const user = await userService.isAuthenticated(request.token) - if (user.error) { - return response.status(401).json(user.error) - } - - if (comment.postedBy.toString() !== user._id.toString()) { - return response.status(401).json({ error: 'comments can be deleted by authors only' }) - } - - const updatedQuestion = { - ...question._doc, - comments: question._doc.comments.filter((commentId) => commentId !== commentID), - } - - await Promise.all([ - Question.findByIdAndUpdate(questionID, updatedQuestion), - Comment.findByIdAndRemove(commentID), - ]) - return response.status(200).end() - } catch (error) { - return next(error) - } -}) - -/** - * increases or decreases the number of likes of a comment - * */ -router.post('/:questionID/likes/:commentID', async (request, response, next) => { - try { - const { body } = request - const { questionID } = request.params - const { commentID } = request.params - const comment = await Comment.findById(commentID) - const question = await Question.findById(questionID) - - if (!comment || !question) { - return response.status(401).json({ error: 'invalid comment id or question id' }) - } - - const user = await userService.isAuthenticated(request.token) - if (user.error) { - return response.status(401).json(user.error) - } - - if (!body.likes) { - return response.status(401) - .json({ error: 'value must be provided as a number' }) - } - - const likeUsers = comment.likes.map((like) => like.likedBy) - - // if the user upvotes or downvotes again - if (likeUsers.includes(user.id)) { - const currentLike = body.likes >= 0 ? 1 : -1 - const userLikes = comment.likes.filter((like) => String(like.likedBy) === String(user.id)) - const userLike = userLikes[userLikes.length - 1].value - if (currentLike === userLike || currentLike * 2 === userLike) { - return response.status(401).end() - } - - const updatedComment = { - ...comment._doc, - likes: comment.likes.concat({ - value: body.likes >= 0 ? 2 : -2, - likedBy: user.id, - }), - } - - await Comment.findByIdAndUpdate(comment.id, updatedComment) - return response.status(200).end() - } - - const updatedComment = { - ...comment._doc, - likes: comment.likes.concat({ - value: body.likes >= 0 ? 1 : -1, - likedBy: user.id, - }), - } - - await Comment.findByIdAndUpdate(comment.id, updatedComment) - return response.status(200).end() - } catch (error) { - return next(error) - } -}) - -/** - * increases or decreases the number of likes of a comment - * */ -router.post('/:questionID/edit-comment/:commentID', async (request, response, next) => { - try { - const { body } = request - const { questionID } = request.params - const { commentID } = request.params - const comment = await Comment.findById(commentID) - const question = await Question.findById(questionID) - - if (!comment || !question) { - return response.status(401).json({ error: 'invalid comment id or question id' }) - } - - const user = await userService.isAuthenticated(request.token) - if (user.error) { - return response.status(401).json(user.error) - } - - if (comment.postedBy.toString() !== user._id.toString()) { - return response.status(401).json({ error: 'comments can be deleted by authors only' }) - } - - if (!body.content) { - return response.status(401) - .json({ error: 'content must be provided' }) - } - - const updatedComment = { - ...comment._doc, - content: body.content, - } - - await Comment.findByIdAndUpdate(commentID, updatedComment) - return response.status(200).end() - } catch (error) { - return next(error) - } -}) - router.post('/:id/tags', async (request, response, next) => { try { const { body } = request diff --git a/backend/tests/question.test.js b/backend/tests/question.test.js index ccbb7ef..ce5d09c 100644 --- a/backend/tests/question.test.js +++ b/backend/tests/question.test.js @@ -392,7 +392,7 @@ describe('question updation', () => { expect(authorQuestion.body.solved).toBeTruthy() }) - test('a comment can by added by any user', async () => { + test('a comment can be added by any user', async () => { const response = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -411,7 +411,7 @@ describe('question updation', () => { .send(newQuestion) .expect(201) - const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) + const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) .send(newComment) .expect(200) @@ -425,7 +425,7 @@ describe('question updation', () => { expect(comment).toBeTruthy() }) - test('comment can be deleted to solved by the author', async () => { + test('a comment can be deleted the author', async () => { const firstUserResponse = await getUserResponse() const secondUserResponse = await getUserResponse(1) @@ -444,23 +444,23 @@ describe('question updation', () => { content: 'another comment, thanks', } - await api.post(`/api/questions/${question.body.id}/new-comment`) + await api.post(`/api/questions/${question.body.id}/comments`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send({ content: 'new comment, thanks', }) .expect(200) - const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) + const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send(comment) .expect(200) - await api.delete(`/api/questions/${question.body.id}/delete-comment/${commentResponse.body.id}`) + await api.delete(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) .expect(401) - await api.delete(`/api/questions/${question.body.id}/delete-comment/${commentResponse.body.id}`) + await api.delete(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .expect(200) @@ -487,27 +487,27 @@ describe('question updation', () => { content: 'new comment', } - const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) + const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send(comment) .expect(200) - await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) + await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send({ likes: 1 }) .expect(200) - await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) + await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send({ likes: 1 }) .expect(401) - await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) + await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) .send({ likes: -1 }) .expect(200) - await api.post(`/api/questions/${question.body.id}/likes/${commentResponse.body.id}`) + await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) .send({ likes: -1 }) .expect(401) @@ -538,17 +538,17 @@ describe('question updation', () => { content: 'new comment', } - const commentResponse = await api.post(`/api/questions/${question.body.id}/new-comment`) + const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send(comment) .expect(200) - await api.post(`/api/questions/${question.body.id}/edit-comment/${commentResponse.body.id}`) + await api.put(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .set('Authorization', `bearer ${firstUserResponse.body.token}`) .send({ content: 'comment is edited' }) .expect(200) - await api.post(`/api/questions/${question.body.id}/edit-comment/${commentResponse.body.id}`) + await api.put(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .set('Authorization', `bearer ${secondUserResponse.body.token}`) .send({ content: 'comment is edited' }) .expect(401) From ecfeb8bc6bc87f7e1d63bd9325e65542926fbbcc Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 12 Sep 2020 13:07:15 +0100 Subject: [PATCH 07/61] [B][C][users] add isAuthorized function for users --- backend/controllers/users.js | 19 ++-------- backend/utils/user.js | 68 +++++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/backend/controllers/users.js b/backend/controllers/users.js index a27da57..819ba9a 100644 --- a/backend/controllers/users.js +++ b/backend/controllers/users.js @@ -1,7 +1,6 @@ const express = require('express') const router = express.Router() -const bcrypt = require('bcrypt') const User = require('../models/user') const validator = require('../utils/validator') const userService = require('../utils/user') @@ -77,17 +76,11 @@ router.put('/:id', async (request, response, next) => { const { body } = request const { id } = request.params - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthorized(request.token, id, body.password) if (user.error) { return response.status(401).json(user.error) } - const isPasswordCorrect = await bcrypt.compare(body.password, user.passwordHash) - - if (!isPasswordCorrect) { - return response.status(401).json({ error: 'wrong password' }) - } - if (!body.email || !body.dateOfBirth || !body.fullname) { return response.status(401) .json({ error: 'email, dateOfBirth, fullname must be provided' }) @@ -120,18 +113,10 @@ router.delete('/:id', async (request, response, next) => { const { body } = request const { id } = request.params - const user = await userService.isAuthenticated(request.token, id) + const user = await userService.isAuthorized(request.token, id, body.password) if (user.error) { return response.status(401).json(user.error) } - - const isPasswordCorrect = user === null - ? false : await bcrypt.compare(body.password, user.passwordHash) - - if (!isPasswordCorrect) { - return response.status(401).json({ error: 'wrong password' }) - } - await User.findByIdAndRemove(id) return response.status(204).end() } catch (error) { diff --git a/backend/utils/user.js b/backend/utils/user.js index 4a7c4e3..629ff0c 100644 --- a/backend/utils/user.js +++ b/backend/utils/user.js @@ -1,36 +1,71 @@ const jwt = require('jsonwebtoken') +const bcrypt = require('bcrypt') const User = require('../models/user') +const TOKEN_ERROR = { error: 'token missing or invalid' } +const PASSWORD_ERROR = { error: 'wrong password' } + +const decodeToken = (token) => { + const decodedToken = jwt.decode(token, process.env.SECRET) + return decodedToken +} + /** * Checks if a user is logged in or not * - * If userId is undefined, that's because it's not needed to - * authenticate the user, like if the user is posting a new question - * - * If a user is updating/deleting a User object, then userId must be defined to make sure - * that the token provided in the request belongs to the user with userId - * - * @param userId: mongodb id of the user * @param token: the token the user used in the request * @return user object if the user is authenticated, error object otherwise * */ -const isAuthenticated = async (token, userId) => { - const decodedToken = jwt.decode(token, process.env.SECRET) - const errorObj = { error: 'token missing or invalid' } +const isAuthenticated = async (token) => { + const decodedToken = decodeToken(token) if (!decodedToken.id) { - return errorObj + return TOKEN_ERROR } + const { id } = decodedToken + const user = await User.findById(id) + + if (!user) { + return TOKEN_ERROR + } + + return user +} + +/** + * Checks if the user is authorized to do some operations + * usually these operations are user related, like deleting a user or + * updating a user + * + * A user is authorized if their token is valid, and they have the right + * to update/delete their account + * + * @param token: the token the user used in the request + * @param userId: the id of the user + * @param password: the password the user provided as password confirmation + * @return user object if the user is authorized, error object otherwise + * */ +const isAuthorized = async (token, userId, password) => { + const decodedToken = decodeToken(token) + if (userId && (!decodedToken.id || decodedToken.id !== userId)) { - return errorObj + return TOKEN_ERROR } - const id = userId || decodedToken.id - const user = await User.findById(id) + const user = await isAuthenticated(token, userId) - if (!user) { - return errorObj + if (user.error) { + return user + } + + if (password) { + const isPasswordCorrect = user === null + ? false : await bcrypt.compare(password, user.passwordHash) + + if (!isPasswordCorrect) { + return PASSWORD_ERROR + } } return user @@ -38,4 +73,5 @@ const isAuthenticated = async (token, userId) => { module.exports = { isAuthenticated, + isAuthorized, } From 1ef7342f6830e7e80d12ac7a9e580504d0a12d33 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 12 Sep 2020 13:17:32 +0100 Subject: [PATCH 08/61] [B][C] add port environment variable, start script cleanup --- backend/.env | 1 + backend/app.js | 3 +-- backend/index.js | 6 +++--- backend/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/.env b/backend/.env index ae13b88..52381c8 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,3 @@ DB=mongodb://127.0.0.1:27017/qaTEST +PORT=1530 SECRET='SECRET' diff --git a/backend/app.js b/backend/app.js index 1af516c..ee45be2 100644 --- a/backend/app.js +++ b/backend/app.js @@ -18,9 +18,8 @@ const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), app.use(logger('combined', { stream: accessLogStream })) const { DB } = process.env -console.log(DB) -mongoose.connect('mongodb://127.0.0.1:27017/qaTEST', { +mongoose.connect(DB, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, diff --git a/backend/index.js b/backend/index.js index 5e5dbef..2e0da5a 100644 --- a/backend/index.js +++ b/backend/index.js @@ -2,7 +2,7 @@ const http = require('http') const app = require('./app') const server = http.createServer(app) - -server.listen(3000, () => { - console.log('server started on localhost:3000') +const { PORT } = process.env +server.listen(PORT, () => { + console.log(`server started on localhost:${PORT}`) }) diff --git a/backend/package.json b/backend/package.json index d93b97f..a6823bf 100644 --- a/backend/package.json +++ b/backend/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www", + "start": "node index.js", "test": "jest --runInBand --detectOpenHandles --forceExit" }, "dependencies": { From 4c0ed525d841703304df22571c275e424e390fd9 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 12 Sep 2020 13:24:19 +0100 Subject: [PATCH 09/61] [F][S] read baseUrl from .env instead of hard-coding it --- frontend/.env | 2 +- frontend/src/services/questions.js | 2 +- frontend/src/services/users.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/.env b/frontend/.env index 1aa167b..c07a342 100644 --- a/frontend/.env +++ b/frontend/.env @@ -1,2 +1,2 @@ REACT_APP_URL=/ -REACT_APP_BACKEND_URL=http://localhost:3001/api +REACT_APP_BACKEND_URL=http://localhost:1530/api diff --git a/frontend/src/services/questions.js b/frontend/src/services/questions.js index e66b21b..23f328d 100644 --- a/frontend/src/services/questions.js +++ b/frontend/src/services/questions.js @@ -1,6 +1,6 @@ import axios from 'axios' -const baseUrl = 'http://localhost:3001/api' +const baseUrl = process.env.REACT_APP_BACKEND_URL let token = null let config = null diff --git a/frontend/src/services/users.js b/frontend/src/services/users.js index c3a0d2c..0ae2d75 100644 --- a/frontend/src/services/users.js +++ b/frontend/src/services/users.js @@ -1,6 +1,6 @@ import axios from 'axios' -const baseUrl = 'http://localhost:3001/api' +const baseUrl = process.env.REACT_APP_BACKEND_URL // eslint-disable-next-line no-unused-vars let token = null From 44a381c43c99e508a1fbfbdc90b33a63a944377a Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 12 Sep 2020 17:54:25 +0100 Subject: [PATCH 10/61] [F][C][NoQuestions] add NoQuestions component --- .../src/components/NoQuestions/NoQuestions.js | 86 ++++++++++++++++++ .../src/components/Questions/Questions.js | 4 + .../src/resources/images/no-questions.png | Bin 0 -> 371390 bytes 3 files changed, 90 insertions(+) create mode 100644 frontend/src/components/NoQuestions/NoQuestions.js create mode 100644 frontend/src/resources/images/no-questions.png diff --git a/frontend/src/components/NoQuestions/NoQuestions.js b/frontend/src/components/NoQuestions/NoQuestions.js new file mode 100644 index 0000000..6f4f531 --- /dev/null +++ b/frontend/src/components/NoQuestions/NoQuestions.js @@ -0,0 +1,86 @@ +import React from 'react' +import Paper from '@material-ui/core/Paper' +import Typography from '@material-ui/core/Typography' +import Grid from '@material-ui/core/Grid' +import Button from '@material-ui/core/Button' +import AddIcon from '@material-ui/icons/Add' +import { makeStyles, withStyles } from '@material-ui/core/styles' +import { lightBlue } from '@material-ui/core/colors' +import { useHistory } from 'react-router-dom' +import noQuestionsImg from '../../resources/images/no-questions.png' + + +const AddQuestionButton = withStyles({ + root: { + backgroundColor: lightBlue[700], + border: '1px solid', + boxShadow: 'none', + '&:hover': { + backgroundColor: lightBlue[800], + boxShadow: 'none', + }, + }, +})(Button) + +const useStyles = makeStyles((theme) => ({ + paper: { + [theme.breakpoints.down('sm')]: { + width: '90%', + }, + [theme.breakpoints.up('sm')]: { + width: 500, + }, + [theme.breakpoints.up('md')]: { + width: 600, + }, + paddingBottom: 16, + }, + image: { + width: '60%', + }, + +})) + +const NoQuestions = () => { + const classes = useStyles() + const history = useHistory() + + return ( + ( + + + + + {noQuestionsImg} + + No questions exist, be the first one that asks a question + + send} + onClick={() => history.push('/question/new')} + > + Ask a Question + + + + + + ) + ) +} + +export default NoQuestions diff --git a/frontend/src/components/Questions/Questions.js b/frontend/src/components/Questions/Questions.js index 65d7e93..4933389 100644 --- a/frontend/src/components/Questions/Questions.js +++ b/frontend/src/components/Questions/Questions.js @@ -6,6 +6,7 @@ import Notification from '../Notification/Notification' import questionService from '../../services/questions' import QPaper from '../QPaper/QPaper' import LoadingScreen from '../LoadingScreen/LoadingScreen' +import NoQuestions from '../NoQuestions/NoQuestions' const useStyles = makeStyles(() => ({ container: { @@ -66,6 +67,9 @@ const Questions = ({ user }) => { return } + if (questions.length === 0) { + return + } return (
diff --git a/frontend/src/resources/images/no-questions.png b/frontend/src/resources/images/no-questions.png new file mode 100644 index 0000000000000000000000000000000000000000..f05fd5e4b34734adc5733c95f425e15271df0fdd GIT binary patch literal 371390 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 Date: Sat, 12 Sep 2020 18:02:28 +0100 Subject: [PATCH 11/61] [F][C][Copyrights] change background color --- frontend/src/components/Copyrights/Copyrights.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Copyrights/Copyrights.js b/frontend/src/components/Copyrights/Copyrights.js index 30a1133..78563bd 100644 --- a/frontend/src/components/Copyrights/Copyrights.js +++ b/frontend/src/components/Copyrights/Copyrights.js @@ -3,13 +3,13 @@ import Typography from '@material-ui/core/Typography' import Link from '@material-ui/core/Link' import { makeStyles } from '@material-ui/core/styles' import Grid from '@material-ui/core/Grid' -import grey from '@material-ui/core/colors/grey' +import blue from '@material-ui/core/colors/blue' const useStyles = makeStyles(() => ({ copyright: { flexShrink: 0, paddingBottom: '2.5 rem', - background: grey[400], + background: blue[200], bottom: 0, width: '100%', }, From 3cad0683aabb509bbac4a86ab96ded2f5f1cb444 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sun, 13 Sep 2020 14:19:39 +0100 Subject: [PATCH 12/61] [F][C][NewQuestionForm] add question information and instructions --- frontend/package-lock.json | 1196 +++++++++++++---- frontend/package.json | 15 +- .../NewQuestionForm/NewQuestionForm.js | 206 ++- .../QuestionInstructionSmall.js | 39 + .../NewQuestionForm/QuestionInstructions.js | 66 + 5 files changed, 1167 insertions(+), 355 deletions(-) create mode 100644 frontend/src/components/NewQuestionForm/QuestionInstructionSmall.js create mode 100644 frontend/src/components/NewQuestionForm/QuestionInstructions.js diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a6a63c5..bae734c 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -244,6 +244,11 @@ "@babel/types": "^7.7.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, "@babel/helper-wrap-function": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", @@ -937,12 +942,19 @@ } }, "@babel/runtime-corejs3": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.7.tgz", - "integrity": "sha512-kr3W3Fw8mB/CTru2M5zIRQZZgC/9zOxNSoJ/tVCzjPt3H1/p5uuGbz6WwmaQy/TLQcW31rUhUUWKY28sXFRelA==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", + "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", "requires": { "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "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==" + } } }, "@babel/template": { @@ -1001,9 +1013,9 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@emotion/hash": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", - "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@hapi/address": { "version": "2.1.4", @@ -1242,26 +1254,34 @@ } }, "@material-ui/core": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.2.tgz", - "integrity": "sha512-fSf/yBuE5GR7dA+FiQAAGY7HrCN/8RaYApi9tx3IKMiJIJkRCHk+E2lktgJZ+QRsaqCACLo2lwhU2CW5aeO0UQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.0.tgz", + "integrity": "sha512-bYo9uIub8wGhZySHqLQ833zi4ZML+XCBE1XwJ8EuUVSpTWWG57Pm+YugQToJNFsEyiKFhPh8DPD0bgupz8n01g==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.9.0", - "@material-ui/system": "^4.9.1", - "@material-ui/types": "^5.0.0", - "@material-ui/utils": "^4.7.1", + "@material-ui/styles": "^4.10.0", + "@material-ui/system": "^4.9.14", + "@material-ui/types": "^5.1.0", + "@material-ui/utils": "^4.10.2", "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.2", - "convert-css-length": "^2.0.1", + "clsx": "^1.0.4", "hoist-non-react-statics": "^3.3.2", - "normalize-scroll-left": "^0.2.0", - "popper.js": "^1.14.1", + "popper.js": "1.16.1-lts", "prop-types": "^15.7.2", "react-is": "^16.8.0", - "react-transition-group": "^4.3.0" + "react-transition-group": "^4.4.0" }, "dependencies": { + "@material-ui/utils": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz", + "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -1281,29 +1301,29 @@ } }, "@material-ui/lab": { - "version": "4.0.0-alpha.42", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.42.tgz", - "integrity": "sha512-JbKEMIXSslh03u6HNU1Pp1VXd9ycJ1dqkI+iQK6yR+Sng2mvMKzJ80GCV5ROXAXwwNnD8zHOopLZNIpTsEAVgQ==", + "version": "4.0.0-alpha.56", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.56.tgz", + "integrity": "sha512-xPlkK+z/6y/24ka4gVJgwPfoCF4RCh8dXb1BNE7MtF9bXEBLN/lBxNTK8VAa0qm3V2oinA6xtUIdcRh0aeRtVw==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.7.1", + "@material-ui/utils": "^4.10.2", "clsx": "^1.0.4", "prop-types": "^15.7.2", "react-is": "^16.8.0" } }, "@material-ui/styles": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.0.tgz", - "integrity": "sha512-nJHum4RqYBPWsjL/9JET8Z02FZ9gSizlg/7LWVFpIthNzpK6OQ5OSRR4T4x9/p+wK3t1qNn3b1uI4XpnZaPxOA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.10.0.tgz", + "integrity": "sha512-XPwiVTpd3rlnbfrgtEJ1eJJdFCXZkHxy8TrdieaTvwxNYj42VnnCyFzxYeNW9Lhj4V1oD8YtQ6S5Gie7bZDf7Q==", "requires": { "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.7.4", - "@material-ui/types": "^5.0.0", - "@material-ui/utils": "^4.7.1", - "clsx": "^1.0.2", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.1.0", + "@material-ui/utils": "^4.9.6", + "clsx": "^1.0.4", "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.2.1", + "hoist-non-react-statics": "^3.3.2", "jss": "^10.0.3", "jss-plugin-camel-case": "^10.0.3", "jss-plugin-default-unit": "^10.0.3", @@ -1316,24 +1336,37 @@ } }, "@material-ui/system": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.1.tgz", - "integrity": "sha512-CLrJK2aKNWNwruGVTRf+rLz96P4jmozpY2UaCE6hBTa1oGsQ396YXOQQABQ4c0igawmdyf5iQb0zs9j5zsAf1w==", + "version": "4.9.14", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.14.tgz", + "integrity": "sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.7.1", + "@material-ui/utils": "^4.9.6", + "csstype": "^2.5.2", "prop-types": "^15.7.2" + }, + "dependencies": { + "@material-ui/utils": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz", + "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + } } }, "@material-ui/types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.0.tgz", - "integrity": "sha512-UeH2BuKkwDndtMSS0qgx1kCzSMw+ydtj0xx/XbFtxNSTlXydKwzs5gVW5ZKsFlAkwoOOQ9TIsyoCC8hq18tOwg==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" }, "@material-ui/utils": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.7.1.tgz", - "integrity": "sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz", + "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==", "requires": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -1470,43 +1503,75 @@ } }, "@testing-library/dom": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.21.0.tgz", - "integrity": "sha512-S8TTMCd7qCkLs6bhdh2+fk7/pIrD16UKvnwa6gJICalZzV1xoAxDY9Isp6qmelizYH4P1Tz+O5Y4nMmjx3x0uQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.24.1.tgz", + "integrity": "sha512-TemHWY59gvzcScGiE5eooZpzYk9GaED0TuuK4WefbIc/DQg0L5wOpnj7MIEeAGF3B7Ekf1kvmVnQ97vwz4Lmhg==", "requires": { + "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.10.3", "@types/aria-query": "^4.2.0", "aria-query": "^4.2.2", - "dom-accessibility-api": "^0.4.6", - "pretty-format": "^25.5.0" + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.1", + "pretty-format": "^26.4.2" }, "dependencies": { - "@babel/runtime": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", - "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "regenerator-runtime": "^0.13.4" + "@babel/highlight": "^7.10.4" } }, - "@babel/runtime-corejs3": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz", - "integrity": "sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A==", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" } }, "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "*" } }, "@types/yargs": { @@ -1517,31 +1582,32 @@ "@types/yargs-parser": "*" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "color-convert": { @@ -1563,28 +1629,31 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.3.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + } } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -1867,6 +1936,12 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" }, + "@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", @@ -1911,9 +1986,9 @@ } }, "@types/react-transition-group": { - "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==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", + "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", "requires": { "@types/react": "*" } @@ -2414,12 +2489,27 @@ } }, "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "arity-n": { @@ -2489,6 +2579,17 @@ "es-abstract": "^1.17.0-next.1" } }, + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2597,6 +2698,12 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, + "axe-core": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", + "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==", + "dev": true + }, "axios": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", @@ -2629,13 +2736,9 @@ } }, "axobject-query": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", - "integrity": "sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==", - "requires": { - "@babel/runtime": "^7.7.4", - "@babel/runtime-corejs3": "^7.7.4" - } + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "babel-code-frame": { "version": "6.26.0", @@ -4344,11 +4447,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "convert-css-length": { - "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", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -4644,12 +4742,27 @@ "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" }, "css-vendor": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", - "integrity": "sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==", + "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.6.2", + "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "css-what": { @@ -4785,9 +4898,9 @@ } }, "damerau-levenshtein": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", - "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" }, "dashdash": { "version": "1.14.1", @@ -5072,9 +5185,9 @@ } }, "dom-accessibility-api": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.4.6.tgz", - "integrity": "sha512-qxFVFR/ymtfamEQT/AsYLe048sitxFCoCHiM+vuOdR3fE94i3so2SCFJxyz/RxV69PZ+9FgToYWOd7eqJqcbYw==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.2.tgz", + "integrity": "sha512-k7hRNKAiPJXD2aBqfahSo4/01cTsKWXf+LqJgglnkN2Nz8TsxXKQBXHhKe0Ye9fEfHEZY49uSA5Sr3AqP/sWKA==" }, "dom-converter": { "version": "0.2.0", @@ -5085,12 +5198,32 @@ } }, "dom-helpers": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", - "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", + "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", "requires": { - "@babel/runtime": "^7.6.3", - "csstype": "^2.6.7" + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "csstype": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + }, + "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==" + } } }, "dom-serializer": { @@ -5109,11 +5242,6 @@ } } }, - "dom-testing-library": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-5.0.0.tgz", - "integrity": "sha512-1Rx62geC7F3RGYW7HODhTKOMxsQZyHmlHUDcvpbc88ndPo0Wa7U2dNny4NO/Jsndp7qLpnjrlW8gWi7YkOrHgQ==" - }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -5493,25 +5621,119 @@ } }, "eslint-config-airbnb": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz", - "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", + "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", "dev": true, "requires": { - "eslint-config-airbnb-base": "^14.0.0", + "eslint-config-airbnb-base": "^14.2.0", "object.assign": "^4.1.0", - "object.entries": "^1.1.0" + "object.entries": "^1.1.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + } + } } }, "eslint-config-airbnb-base": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", - "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.7", + "confusing-browser-globals": "^1.0.9", "object.assign": "^4.1.0", - "object.entries": "^1.1.0" + "object.entries": "^1.1.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + } + } } }, "eslint-config-react-app": { @@ -5637,25 +5859,37 @@ } }, "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.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", "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.3", + "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": { + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5675,6 +5909,45 @@ "isarray": "^1.0.0" } }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "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", @@ -5684,6 +5957,21 @@ "locate-path": "^2.0.0" } }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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" + } + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -5760,6 +6048,15 @@ "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", @@ -5780,47 +6077,131 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", + "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", + "dev": true, "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", + "@babel/runtime": "^7.10.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", + "axe-core": "^3.5.4", + "axobject-query": "^2.1.2", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" + "jsx-ast-utils": "^2.4.1", + "language-tags": "^1.0.5" }, "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", + "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==", + "dev": true + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.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==", + "dev": true } } }, "eslint-plugin-react": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.3.tgz", - "integrity": "sha512-Bt56LNHAQCoou88s8ViKRjMB2+36XRejCQ1VoLj716KI1MoE99HpTVvIThJ0rvFmG4E4Gsq+UgToEjn+j044Bg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz", + "integrity": "sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==", "dev": true, "requires": { "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", + "jsx-ast-utils": "^2.4.1", + "object.entries": "^1.1.2", "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.14.2", + "resolve": "^1.17.0", "string.prototype.matchall": "^4.0.2" }, "dependencies": { @@ -5845,28 +6226,64 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "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", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" } }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -6779,11 +7196,6 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, "gzip-size": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", @@ -6956,9 +7368,9 @@ } }, "hoist-non-react-statics": { - "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==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" } @@ -7151,9 +7563,9 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "hyphenate-style-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", - "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "iconv-lite": { "version": "0.4.24", @@ -7470,6 +7882,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.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -8816,80 +9234,88 @@ } }, "jss": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.4.tgz", - "integrity": "sha512-GqHmeDK83qbqMAVjxyPfN1qJVTKZne533a9bdCrllZukUM8npG/k+JumEPI86IIB5ifaZAHG2HAsUziyxOiooQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.4.0.tgz", + "integrity": "sha512-l7EwdwhsDishXzqTc3lbsbyZ83tlUl5L/Hb16pHCvZliA9lRDdNBZmHzeJHP0sxqD0t1mrMmMR8XroR12JBYzw==", "requires": { "@babel/runtime": "^7.3.1", - "csstype": "^2.6.5", + "csstype": "^3.0.2", "is-in-browser": "^1.1.3", "tiny-warning": "^1.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + } } }, "jss-plugin-camel-case": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.4.tgz", - "integrity": "sha512-+wnqxJsyfUnOn0LxVg3GgZBSjfBCrjxwx7LFxwVTUih0ceGaXKZoieheNOaTo5EM4w8bt1nbb8XonpQCj67C6A==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.4.0.tgz", + "integrity": "sha512-9oDjsQ/AgdBbMyRjc06Kl3P8lDCSEts2vYZiPZfGAxbGCegqE4RnMob3mDaBby5H9vL9gWmyyImhLRWqIkRUCw==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.0.4" + "jss": "10.4.0" } }, "jss-plugin-default-unit": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.4.tgz", - "integrity": "sha512-T0mhL/Ogp/quvod/jAHEqKvptLDxq7Cj3a+7zRuqK8HxUYkftptN89wJElZC3rshhNKiogkEYhCWenpJdFvTBg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.4.0.tgz", + "integrity": "sha512-BYJ+Y3RUYiMEgmlcYMLqwbA49DcSWsGgHpVmEEllTC8MK5iJ7++pT9TnKkKBnNZZxTV75ycyFCR5xeLSOzVm4A==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "jss": "10.4.0" } }, "jss-plugin-global": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.4.tgz", - "integrity": "sha512-N8n9/GHENZce+sqE4UYiZiJtI+t+erT/BypHOrNYAfIoNEj7OYsOEKfIo2P0GpLB3QyDAYf5eo9XNdZ8veEkUA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.4.0.tgz", + "integrity": "sha512-b8IHMJUmv29cidt3nI4bUI1+Mo5RZE37kqthaFpmxf5K7r2aAegGliAw4hXvA70ca6ckAoXMUl4SN/zxiRcRag==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "jss": "10.4.0" } }, "jss-plugin-nested": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.4.tgz", - "integrity": "sha512-QM21BKVt8LDeoRfowvAMh/s+/89VYrreIIE6ch4pvw0oAXDWw1iorUPlqLZ7uCO3UL0uFtQhJq3QMLN6Lr1v0A==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.4.0.tgz", + "integrity": "sha512-cKgpeHIxAP0ygeWh+drpLbrxFiak6zzJ2toVRi/NmHbpkNaLjTLgePmOz5+67ln3qzJiPdXXJB1tbOyYKAP4Pw==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.4", + "jss": "10.4.0", "tiny-warning": "^1.0.2" } }, "jss-plugin-props-sort": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.4.tgz", - "integrity": "sha512-WoETdOCjGskuin/OMt2uEdDPLZF3vfQuHXF+XUHGJrq0BAapoyGQDcv37SeReDlkRAbVXkEZPsIMvYrgHSHFiA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.4.0.tgz", + "integrity": "sha512-j/t0R40/2fp+Nzt6GgHeUFnHVY2kPGF5drUVlgkcwYoHCgtBDOhTTsOfdaQFW6sHWfoQYgnGV4CXdjlPiRrzwA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "jss": "10.4.0" } }, "jss-plugin-rule-value-function": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.4.tgz", - "integrity": "sha512-0hrzOSWRF5ABJGaHrlnHbYZjU877Ofzfh2id3uLtBvemGQLHI+ldoL8/+6iPSRa7M8z8Ngfg2vfYhKjUA5gA0g==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.4.0.tgz", + "integrity": "sha512-w8504Cdfu66+0SJoLkr6GUQlEb8keHg8ymtJXdVHWh0YvFxDG2l/nS93SI5Gfx0fV29dO6yUugXnKzDFJxrdFQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "jss": "10.4.0", + "tiny-warning": "^1.0.2" } }, "jss-plugin-vendor-prefixer": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.4.tgz", - "integrity": "sha512-4JgEbcrdeMda1qvxTm1CnxFJAWVV++VLpP46HNTrfH7VhVlvUpihnUNs2gAlKuRT/XSBuiWeLAkrTqF4NVrPig==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.4.0.tgz", + "integrity": "sha512-DpF+/a+GU8hMh/948sBGnKSNfKkoHg2p9aRFUmyoyxgKjOeH9n74Ht3Yt8lOgdZsuWNJbPrvaa3U4PXKwxVpTQ==", "requires": { "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.7", - "jss": "10.0.4" + "css-vendor": "^2.0.8", + "jss": "10.4.0" } }, "jsx-ast-utils": { @@ -8919,6 +9345,21 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -9355,13 +9796,12 @@ "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", - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", "requires": { - "@babel/runtime": "^7.4.0", - "gud": "^1.0.0", - "tiny-warning": "^1.0.2" + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" } }, "mini-css-extract-plugin": { @@ -9759,11 +10199,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, - "normalize-scroll-left": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz", - "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==" - }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -10378,9 +10813,9 @@ } }, "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" }, "portfinder": { "version": "1.0.25", @@ -11616,9 +12051,9 @@ } }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -11788,14 +12223,14 @@ } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.1" } }, "react-error-overlay": { @@ -11809,15 +12244,15 @@ "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "react-router": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.3.0", + "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -11841,15 +12276,15 @@ } }, "react-router-dom": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", - "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.1.2", + "react-router": "5.2.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } @@ -11914,6 +12349,15 @@ "workbox-webpack-plugin": "4.3.1" }, "dependencies": { + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -11931,6 +12375,11 @@ "isarray": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "eslint-plugin-import": { "version": "2.18.2", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", @@ -11949,6 +12398,22 @@ "resolve": "^1.11.0" } }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + } + }, "eslint-plugin-react": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", @@ -12072,9 +12537,9 @@ } }, "react-transition-group": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", - "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -12665,9 +13130,9 @@ } }, "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -12908,13 +13373,56 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "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.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + } } }, "signal-exit": { @@ -13437,22 +13945,83 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "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", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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" } } } @@ -13475,6 +14044,52 @@ "function-bind": "^1.1.1" } }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "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" + } + } + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13828,9 +14443,9 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, "tiny-invariant": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", - "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" }, "tiny-warning": { "version": "1.0.3", @@ -13920,6 +14535,29 @@ "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" }, + "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", diff --git a/frontend/package.json b/frontend/package.json index 0d7321b..71c096b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,13 +7,14 @@ "@material-ui/core": "^4.9.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.42", + "@material-ui/styles": "^4.10.0", "@testing-library/dom": "^7.21.0", "@testing-library/user-event": "^7.2.1", "axios": "^0.19.2", - "react": "^16.12.0", + "react": "^16.13.1", "react-copy-to-clipboard": "^5.0.2", - "react-dom": "^16.12.0", - "react-router-dom": "^5.1.2", + "react-dom": "^16.13.1", + "react-router-dom": "^5.2.0", "react-scripts": "3.3.0" }, "scripts": { @@ -41,10 +42,10 @@ "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "eslint": "^6.8.0", - "eslint-config-airbnb": "^18.0.1", - "eslint-plugin-import": "^2.20.1", - "eslint-plugin-jsx-a11y": "^6.2.3", - "eslint-plugin-react": "^7.18.3", + "eslint-config-airbnb": "^18.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.6", "eslint-plugin-react-hooks": "^1.7.0" } } diff --git a/frontend/src/components/NewQuestionForm/NewQuestionForm.js b/frontend/src/components/NewQuestionForm/NewQuestionForm.js index 6118bad..95c5892 100644 --- a/frontend/src/components/NewQuestionForm/NewQuestionForm.js +++ b/frontend/src/components/NewQuestionForm/NewQuestionForm.js @@ -2,37 +2,87 @@ import React, { useState, useContext } from 'react' import Button from '@material-ui/core/Button' import TextField from '@material-ui/core/TextField' import Grid from '@material-ui/core/Grid' -import { makeStyles } from '@material-ui/core/styles' +import { makeStyles, withStyles } from '@material-ui/core/styles' import Paper from '@material-ui/core/Paper' import { useHistory } from 'react-router-dom' +import Typography from '@material-ui/core/Typography' +import { ThemeProvider } from '@material-ui/styles' +import { createMuiTheme } from '@material-ui/core' +import { blue, lightBlue, pink } from '@material-ui/core/colors' import UserContext from '../UserContext/UserContext' import Notification from '../Notification/Notification' import questionService from '../../services/questions' import validator from '../../services/validator' +import QuestionInstructions from './QuestionInstructions' +import QuestionInstructionSmall from './QuestionInstructionSmall' const useStyles = makeStyles((theme) => ({ root: { - width: 600, overflow: 'hidden', backgroundColor: theme.palette.background.paper, - paddingBottom: 24, + paddingBottom: 64, }, - paper: { minWidth: 340, - prefWidth: 600, - width: 600, + width: '40%', + [theme.breakpoints.down('sm')]: { + width: '80%', + marginRight: 0, + }, padding: 16, display: 'flex', flexWrap: 'wrap', justifyContent: 'center', + marginRight: 20, + marginBottom: 16, + }, + instructionPaper: { + width: 300, + height: 100, + display: 'flex', + flexWrap: 'wrap', + justifyContent: 'center', + paddingBottom: 64, + [theme.breakpoints.down('sm')]: { + display: 'none', + }, }, - item: { marginTop: 8, }, })) +const theme = createMuiTheme({ + palette: { + primary: blue, + }, +}) + +const SubmitButton = withStyles({ + root: { + border: '1px solid', + boxShadow: 'none', + borderColor: lightBlue[600], + color: lightBlue[700], + '&:hover': { + borderColor: lightBlue[400], + backgroundColor: lightBlue[100], + }, + }, +})(Button) + +const ClearButton = withStyles({ + root: { + border: '1px solid', + boxShadow: 'none', + borderColor: pink[600], + color: pink[700], + '&:hover': { + borderColor: pink[400], + backgroundColor: pink[100], + }, + }, +})(Button) const NewQuestionForm = () => { const classes = useStyles() @@ -48,7 +98,6 @@ const NewQuestionForm = () => { const [user] = useContext(UserContext) const history = useHistory() - /** * Updates questionTitle to user input, validates the title * Updates tagsHelperText to an error message if validation fails, @@ -171,67 +220,83 @@ const NewQuestionForm = () => { data-testid="questionForm-container" > -

+ - - 0} - helperText={titleHelperText} - id="title" - placeholder="Title" - multiline - fullWidth - variant="outlined" - value={questionTitle} - onChange={titleOnChange} - inputProps={{ - 'data-testid': 'title-input', - }} - /> - - - 0} - helperText={contentHelperText} - id="content" - placeholder="Content" - multiline - rows={3} - rowsMax={8} - fullWidth - variant="outlined" - value={questionContent} - onChange={contentOnChange} - inputProps={{ - 'data-testid': 'content-input', - }} - /> - - - 0} - helperText={tagsHelperText} - id="tags" - placeholder="Tags" - multiline - fullWidth - variant="outlined" - value={questionTags} - onChange={tagsOnChange} - inputProps={{ - 'data-testid': 'tags-input', - }} - /> - + + + Title + + Be specific and imagine you’re asking a question to another person + + 0} + helperText={titleHelperText} + id="title" + placeholder="Ex: how do i undo git commit without losing changes?" + multiline + fullWidth + variant="outlined" + value={questionTitle} + onChange={titleOnChange} + inputProps={{ + 'data-testid': 'title-input', + }} + /> + + + Body + + Include all the information someone would need to answer your question + + 0} + helperText={contentHelperText} + id="content" + placeholder="Content" + multiline + rows={3} + rowsMax={8} + fullWidth + variant="outlined" + value={questionContent} + onChange={contentOnChange} + inputProps={{ + 'data-testid': 'content-input', + }} + /> + + + Tags + + Add tags to describe what your question is about (tags are separated by space) + + 0} + helperText={tagsHelperText} + id="tags" + placeholder="Ex: Java Spring_boot" + multiline + fullWidth + variant="outlined" + value={questionTags} + onChange={tagsOnChange} + inputProps={{ + 'data-testid': 'tags-input', + }} + /> + + - - + -
+ + + +
) } diff --git a/frontend/src/components/NewQuestionForm/QuestionInstructionSmall.js b/frontend/src/components/NewQuestionForm/QuestionInstructionSmall.js new file mode 100644 index 0000000..9817308 --- /dev/null +++ b/frontend/src/components/NewQuestionForm/QuestionInstructionSmall.js @@ -0,0 +1,39 @@ +import Typography from '@material-ui/core/Typography' +import Paper from '@material-ui/core/Paper' +import React from 'react' +import { makeStyles } from '@material-ui/core/styles' + +const useStyles = makeStyles((theme) => ({ + instructionPaperSmall: { + width: '80%', + display: 'none', + flexWrap: 'wrap', + justifyContent: 'center', + marginBottom: 16, + textAlign: 'left', + [theme.breakpoints.down('sm')]: { + display: 'flex', + flexDirection: 'column', + }, + }, +})) + +/** + * Question instruction for small screens + * */ +const QuestionInstructionSmall = () => { + const classes = useStyles() + return ( + + Tips on getting good answers quickly +
    +
  • Include details about your goal
  • +
  • Make sure your question has not been asked already
  • +
  • Keep your question short and to the point
  • +
  • Double-check grammar and spelling
  • +
+
+ ) +} + +export default QuestionInstructionSmall diff --git a/frontend/src/components/NewQuestionForm/QuestionInstructions.js b/frontend/src/components/NewQuestionForm/QuestionInstructions.js new file mode 100644 index 0000000..1321b3f --- /dev/null +++ b/frontend/src/components/NewQuestionForm/QuestionInstructions.js @@ -0,0 +1,66 @@ +import React from 'react' +import { makeStyles } from '@material-ui/core/styles' +import Accordion from '@material-ui/core/Accordion' +import AccordionSummary from '@material-ui/core/AccordionSummary' +import AccordionDetails from '@material-ui/core/AccordionDetails' +import Typography from '@material-ui/core/Typography' +import ExpandMoreIcon from '@material-ui/icons/ExpandMore' + +const useStyles = makeStyles((theme) => ({ + root: { + width: '100%', + }, + heading: { + fontSize: theme.typography.pxToRem(16), + fontWeight: theme.typography.fontWeightBold, + }, + title: { + margin: 8, + }, +})) + +const QuestionInstructions = () => { + const classes = useStyles() + + return ( +
+ Tips on getting good answers quickly + + } + aria-controls="panel1a-content" + id="panel1a-header" + > + Summarize the problem + + +
    +
  • Include details about your goal
  • +
  • Describe expected and actual results
  • +
  • Include any error messages
  • +
  • Make sure your question has not been asked already
  • +
  • Keep your question short and to the point
  • +
  • Double-check grammar and spelling
  • +
+
+
+ + } + aria-controls="panel1a-content" + id="panel1a-header" + > + Describe what you've tried + + + + Show what you’ve tried and tell us what you found (on this site or elsewhere) and + why it didn’t meet your needs. You can get better answers when you provide research. + + + +
+ ) +} + +export default QuestionInstructions From bde1a5f2f688c7980fd2210af2c0fd98bd0f507b Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 24 Sep 2020 16:06:38 +0100 Subject: [PATCH 13/61] [B][C][users] add missing import --- backend/controllers/users.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/controllers/users.js b/backend/controllers/users.js index 819ba9a..9131e9d 100644 --- a/backend/controllers/users.js +++ b/backend/controllers/users.js @@ -1,3 +1,5 @@ +const bcrypt = require('bcrypt') + const express = require('express') const router = express.Router() From 8adfbd4bf87fed15e4c70aeb371db87ac4d2d2bc Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 24 Sep 2020 16:26:38 +0100 Subject: [PATCH 14/61] [B] use .env, add execution info --- backend/app.js | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/backend/app.js b/backend/app.js index ee45be2..810092f 100644 --- a/backend/app.js +++ b/backend/app.js @@ -19,18 +19,41 @@ app.use(logger('combined', { stream: accessLogStream })) const { DB } = process.env -mongoose.connect(DB, { +if (!DB) { + console.log('no database uri was found in .env, please provide one') + console.log('quitting') + process.exit(0) +} + +let TIMEOUT_SECONDS = 1000 + +if (process.env.NODE_ENV === 'PROD') { + TIMEOUT_SECONDS = 10000 + console.log("NOTE THAT IF THE SERVER CAN'T ESTABLISH A CONNECTION TO THE DATABASE") + console.log(`IT WILL KEEP TRYING TO ESTABLISH ONE FOR ${TIMEOUT_SECONDS} MS`) + console.log(`AND YOU WON'T GET ANY ERRORS UNTIL ${TIMEOUT_SECONDS} MS PASS`) + console.log('read more about that here https://mongoosejs.com/docs/connections.html') +} + +const mongooseOptions = { useNewUrlParser: true, - useUnifiedTopology: true, useCreateIndex: true, -}) + useUnifiedTopology: true, + serverSelectionTimeoutMS: TIMEOUT_SECONDS, +} + +mongoose.connect(DB, mongooseOptions) .then(() => { + // eslint-disable-next-line no-console console.log('connected to db') }) - .catch((error) => { - console.log(error) + .catch((err) => { + // eslint-disable-next-line no-console + console.log(`Error on start: ${err.stack}`) + process.exit(1) }) + app.use(cors()) app.use(express.json()) app.use(middleware.tokenExtractor) From 6a2ef79d6c58a9c61a200a8703e36171de995668 Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 24 Sep 2020 16:27:22 +0100 Subject: [PATCH 15/61] [B] use .env, add execution info --- backend/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/index.js b/backend/index.js index 2e0da5a..4ec2b63 100644 --- a/backend/index.js +++ b/backend/index.js @@ -2,7 +2,12 @@ const http = require('http') const app = require('./app') const server = http.createServer(app) -const { PORT } = process.env +const { PORT } = process.env || 3000 + +if (!PORT) { + console.log("no port was provided in .env, port 3000 will be used by default") +} + server.listen(PORT, () => { console.log(`server started on localhost:${PORT}`) }) From 89b3faa3e58ed43962e4e4aaa09efd552acef0f1 Mon Sep 17 00:00:00 2001 From: Fibii Date: Fri, 25 Sep 2020 17:45:16 +0100 Subject: [PATCH 16/61] [B][C] use cookies to store jwt, add route to verify user cookie --- backend/.env | 1 + backend/app.js | 10 ++- backend/controllers/comments.js | 8 +- backend/controllers/login.js | 15 +++- backend/controllers/questions.js | 15 ++-- backend/controllers/users.js | 4 +- backend/package-lock.json | 130 +++++++++++++++++++++++++------ backend/package.json | 5 +- 8 files changed, 140 insertions(+), 48 deletions(-) diff --git a/backend/.env b/backend/.env index 52381c8..8680724 100644 --- a/backend/.env +++ b/backend/.env @@ -1,3 +1,4 @@ DB=mongodb://127.0.0.1:27017/qaTEST PORT=1530 SECRET='SECRET' +FRONTEND=http://localhost:3000 diff --git a/backend/app.js b/backend/app.js index 810092f..bd9047d 100644 --- a/backend/app.js +++ b/backend/app.js @@ -5,6 +5,7 @@ const fs = require('fs') const logger = require('morgan') const mongoose = require('mongoose') const cors = require('cors') +const cookieParser = require('cookie-parser') const middleware = require('./utils/middleware') const indexRouter = require('./controllers/index') @@ -17,7 +18,7 @@ app.use(logger('dev')) const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' }) app.use(logger('combined', { stream: accessLogStream })) -const { DB } = process.env +const { DB, FRONTEND } = process.env if (!DB) { console.log('no database uri was found in .env, please provide one') @@ -53,8 +54,11 @@ mongoose.connect(DB, mongooseOptions) process.exit(1) }) - -app.use(cors()) +app.use(cookieParser()) +app.use(cors({ + origin: FRONTEND, + credentials: true, +})) app.use(express.json()) app.use(middleware.tokenExtractor) app.use(express.urlencoded({ extended: false })) diff --git a/backend/controllers/comments.js b/backend/controllers/comments.js index b12f9fa..2f8c766 100644 --- a/backend/controllers/comments.js +++ b/backend/controllers/comments.js @@ -14,7 +14,7 @@ router.post('/', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -57,7 +57,7 @@ router.post('/:commentId/likes', async (request, response, next) => { return response.status(401).json({ error: 'invalid comment id or question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -116,7 +116,7 @@ router.put('/:commentId', async (request, response, next) => { return response.status(401).json({ error: 'invalid comment id or question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -153,7 +153,7 @@ router.delete('/:commentId', async (request, response, next) => { return response.status(401).json({ error: 'invalid comment id or question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } diff --git a/backend/controllers/login.js b/backend/controllers/login.js index f38ee8f..41020c8 100644 --- a/backend/controllers/login.js +++ b/backend/controllers/login.js @@ -2,16 +2,24 @@ const router = require('express').Router() const jwt = require('jsonwebtoken') const bcrypt = require('bcrypt') const User = require('../models/user') +const userService = require('../utils/user') + +router.get('/isValidToken', async (request, response, next) => { + const user = await userService.isAuthenticated(request.token) + if (user) { + return response.status(200) + } + return response.status(403) +}) router.post('/', async (request, response, next) => { try { const { username } = request.body const { password } = request.body - const user = await User.findOne({ username }) if (!user || !password) { - return response.json({ + return response.status(404).json({ error: "user doesn't exist", }) } @@ -32,11 +40,10 @@ router.post('/', async (request, response, next) => { } const token = jwt.sign(userTokenObj, process.env.SECRET) - + response.cookie('token', token, { httpOnly: true, secure: false }) return response.status(200) .json({ username, - token, id: user._id, }) } diff --git a/backend/controllers/questions.js b/backend/controllers/questions.js index 580cea7..b446449 100644 --- a/backend/controllers/questions.js +++ b/backend/controllers/questions.js @@ -65,8 +65,7 @@ router.get('/:id', async (request, response, next) => { router.post('/', async (request, response, next) => { try { const { body } = request - - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -112,7 +111,7 @@ router.put('/:id', async (request, response, next) => { .json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -153,7 +152,7 @@ router.post('/:id/title-content', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -190,7 +189,7 @@ router.post('/:id/tags', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -226,7 +225,7 @@ router.post('/:id/solved', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -266,7 +265,7 @@ router.post('/:id/likes', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } @@ -326,7 +325,7 @@ router.delete('/:id', async (request, response, next) => { return response.status(401).json({ error: 'invalid question id' }) } - const user = await userService.isAuthenticated(request.token) + const user = await userService.isAuthenticated(request.cookies.token) if (user.error) { return response.status(401).json(user.error) } diff --git a/backend/controllers/users.js b/backend/controllers/users.js index 9131e9d..28d8413 100644 --- a/backend/controllers/users.js +++ b/backend/controllers/users.js @@ -78,7 +78,7 @@ router.put('/:id', async (request, response, next) => { const { body } = request const { id } = request.params - const user = await userService.isAuthorized(request.token, id, body.password) + const user = await userService.isAuthorized(request.cookies.token, id, body.password) if (user.error) { return response.status(401).json(user.error) } @@ -115,7 +115,7 @@ router.delete('/:id', async (request, response, next) => { const { body } = request const { id } = request.params - const user = await userService.isAuthorized(request.token, id, body.password) + const user = await userService.isAuthorized(request.cookies.token, id, body.password) if (user.error) { return response.status(401).json(user.error) } diff --git a/backend/package-lock.json b/backend/package-lock.json index 09306cf..6e87202 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1238,12 +1238,19 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-parser": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", - "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", "requires": { - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + } } }, "cookie-signature": { @@ -2325,6 +2332,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", @@ -2434,9 +2446,9 @@ } }, "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" }, "forwarded": { "version": "0.1.2", @@ -5922,34 +5934,70 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, @@ -5960,6 +6008,38 @@ "requires": { "methods": "^1.1.2", "superagent": "^3.8.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + } + } } }, "supports-color": { diff --git a/backend/package.json b/backend/package.json index a6823bf..44b9b5f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -3,13 +3,13 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node index.js", + "start": "NODE_ENV=ENV node index.js", "test": "jest --runInBand --detectOpenHandles --forceExit" }, "dependencies": { "@hapi/joi": "^16.1.8", "bcrypt": "^3.0.7", - "cookie-parser": "~1.4.4", + "cookie-parser": "^1.4.5", "cors": "^2.8.5", "debug": "~2.6.9", "dotenv": "^8.2.0", @@ -19,6 +19,7 @@ "mongoose": "^5.7.13", "mongoose-unique-validator": "^2.0.3", "morgan": "~1.9.1", + "superagent": "^6.1.0", "supertest": "^4.0.2" }, "devDependencies": { From f0f79e05821832c49c8105415eb764eb736954b6 Mon Sep 17 00:00:00 2001 From: Fibii Date: Fri, 25 Sep 2020 17:46:07 +0100 Subject: [PATCH 17/61] [B][T][questions] refactor tests to use cookies instead of token --- backend/tests/question.test.js | 347 +++++++++++++++------------------ 1 file changed, 160 insertions(+), 187 deletions(-) diff --git a/backend/tests/question.test.js b/backend/tests/question.test.js index ce5d09c..22a7568 100644 --- a/backend/tests/question.test.js +++ b/backend/tests/question.test.js @@ -4,10 +4,40 @@ const app = require('../app') const Question = require('../models/question') const User = require('../models/user') const Comment = require('../models/comment') - -const api = supertest(app) const testHelper = require('../utils/testHelper') +const agent = supertest.agent(app) + +/** + * + * logs in a user, and updates the cookie of agent to the user's cookie + * + * @param userIndex: the index of user in initialUsers + * @returns the response of user login + * */ +const createSession = async (userIndex = 0, createUser = true) => { + const initialUsers = testHelper.getInitialUsers() + const user = initialUsers[userIndex] + + if (createUser) { + // register the user + await agent.post('/api/users') + .send(initialUsers[userIndex]) + } + + // login + const response = await agent + .post('/api/login') + .send(user) + + const cookie = response + .headers['set-cookie'][0] + .split(',') + .map((item) => item.split(';')[0]) + agent.jar.setCookie(cookie[0]) + return response +} + beforeEach(async () => { // clear the database await Question.deleteMany({}) @@ -21,34 +51,11 @@ beforeEach(async () => { await Promise.all(promiseArray) }) -/** - * userIndex is the index of user in initialUsers - * returns the response of user login - * */ -const getUserResponse = async (userIndex = 0) => { - const initialUsers = testHelper.getInitialUsers() - - const user = { - username: initialUsers[userIndex].username, - password: initialUsers[userIndex].password, - } - - // register the user - await api.post('/api/users') - .send(initialUsers[userIndex]) - - // login the user to get jwt - const response = await api.post('/api/login') - .send(user) - - return response -} - describe('question crud', () => { test('all questions are returned', async () => { const initialQuestions = await testHelper.getQuestionsInDb() - const response = await api.get('/api/questions') + const response = await agent.get('/api/questions') .expect(200) const finalQuestions = JSON.parse(response.text) @@ -58,33 +65,19 @@ describe('question crud', () => { test('a proper question can be created', async () => { const initialQuestions = await testHelper.getQuestionsInDb() - const initialUsers = testHelper.getInitialUsers() - - const user = { - username: initialUsers[0].username, - password: initialUsers[0].password, - } - - // register the user - const userPostResponse = await api.post('/api/users') - .send(initialUsers[0]) - - // login the user to get jwt - const response = await api.post('/api/login') - .send(user) + const response = await createSession() const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const questionResponse = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) + const questionResponse = await agent.post('/api/questions') .send(newQuestion) .expect(201) - const userGetResponse = await api.get(`/api/users/${userPostResponse.body.id}`) + const userGetResponse = await agent.get(`/api/users/${response.body.id}`) const finalQuestions = await testHelper.getQuestionsInDb() const userQuestions = userGetResponse.body.questions @@ -95,7 +88,7 @@ describe('question crud', () => { test('a specific question is returned', async () => { const question = (await testHelper.getQuestionsInDb())[0] - const response = await api.get(`/api/questions/${question.id}`) + const response = await agent.get(`/api/questions/${question.id}`) .expect(200) .expect('Content-Type', /application\/json/) @@ -108,7 +101,7 @@ describe('question crud', () => { describe('question deletion', () => { test('a question can be deleted by the user that created it', async () => { const initialQuestions = await testHelper.getQuestionsInDb() - const response = await getUserResponse() + const response = await createSession() const newQuestion = { title: 'first question', @@ -116,18 +109,16 @@ describe('question deletion', () => { tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) + const question = await agent.post('/api/questions') .send(newQuestion) .expect(201) - await api.delete(`/api/questions/${question.body.id}`) - .set('Authorization', `bearer ${response.body.token}`) + await agent.delete(`/api/questions/${question.body.id}`) .send() .expect(204) // expect the question to be deleted from the user question list - const userResponse = await api.get(`/api/users/${response.body.id}`) + const userResponse = await agent.get(`/api/users/${response.body.id}`) const finalQuestions = await testHelper.getQuestionsInDb() expect(finalQuestions.length).toBe(initialQuestions.length) @@ -137,24 +128,24 @@ describe('question deletion', () => { test("a question cannot be deleted with a user that didn't create it", async () => { const initialQuestions = await testHelper.getQuestionsInDb() - // login the user to get jwt - const responseOne = await getUserResponse(0) - - const responseTwo = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${responseOne.body.token}`) + // login the user to get jwt + await createSession(0) + + const question = await agent.post('/api/questions') .send(newQuestion) .expect(201) - const deleteResponse = await api.delete(`/api/questions/${question.body.id}`) - .set('Authorization', `bearer ${responseTwo.body.token}`) + // create another user with a different cookie + await createSession(1) + + // this delete will use the 2nd user cookie + const deleteResponse = await agent.delete(`/api/questions/${question.body.id}`) .send() .expect(401) @@ -167,20 +158,12 @@ describe('question deletion', () => { describe('question updation', () => { test('a question can be updated', async () => { - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - // edit title and content const editedQuestion = { title: 'this question has been edited', @@ -188,13 +171,19 @@ describe('question updation', () => { tags: ['newTags'], } - await api.put(`/api/questions/${question.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + await agent.put(`/api/questions/${question.body.id}`) .send(editedQuestion) .expect(200) - await api.put(`/api/questions/${question.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await createSession(1) + + await agent.put(`/api/questions/${question.body.id}`) .send(editedQuestion) .expect(401) @@ -206,9 +195,12 @@ describe('question updation', () => { .toBe(editedQuestion.title) }) + /** + * partial update + * */ test('a question\'s with title and content can be updated by the author', async () => { const initialQuestions = await testHelper.getQuestionsInDb() - const response = await getUserResponse() + await createSession() const newQuestion = { title: 'first question', @@ -216,8 +208,7 @@ describe('question updation', () => { tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) + const question = await agent.post('/api/questions') .send(newQuestion) .expect(201) @@ -227,8 +218,7 @@ describe('question updation', () => { content: 'this question has been edited', } - await api.post(`/api/questions/${question.body.id}/title-content`) - .set('Authorization', `bearer ${response.body.token}`) + await agent.post(`/api/questions/${question.body.id}/title-content`) .send(editedQuestion) .expect(200) @@ -241,10 +231,11 @@ describe('question updation', () => { expect(finalQuestions).toContainEqual(editedQuestion) }) + /** + * partial update that should fail + * */ test('a question with title and content cannot be updated by the user that didnt create it', async () => { const initialQuestions = await testHelper.getQuestionsInDb() - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) const newQuestion = { title: 'first question', @@ -252,53 +243,50 @@ describe('question updation', () => { tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - - // edit title and content const editedQuestion = { title: 'this question has been edited', content: 'this question has been edited', } - await api.post(`/api/questions/${question.body.id}/title-content`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + await createSession(1) + + await agent.post(`/api/questions/${question.body.id}/title-content`) .send(editedQuestion) .expect(401) const finalQuestions = await testHelper.getQuestionsInDb() - expect(finalQuestions.length).toBe(initialQuestions.length + 1) }) - test('the number of likes can be increased, decreased', async () => { - const response = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const initLikes = 0 - + test('question likes can be increased, decreased by multiple users', async () => { const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') .send(newQuestion) .expect(201) - await api.post(`/api/questions/${question.body.id}/likes`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await agent.post(`/api/questions/${question.body.id}/likes`) .send({ likes: 1 }) .expect(200) - await api.post(`/api/questions/${question.body.id}/likes`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await agent.post(`/api/questions/${question.body.id}/likes`) .send({ likes: 1 }) .expect(401) + const initLikes = 0 + const questionIncreased = (await testHelper.getQuestionsInDb()) .filter((incQuestion) => incQuestion.id === question.body.id)[0] @@ -307,13 +295,13 @@ describe('question updation', () => { expect(increasedLikes).toBe(initLikes + 1) - await api.post(`/api/questions/${question.body.id}/likes`) - .set('Authorization', `bearer ${response.body.token}`) + await createSession(1) + + await agent.post(`/api/questions/${question.body.id}/likes`) .send({ likes: -1 }) .expect(200) - await api.post(`/api/questions/${question.body.id}/likes`) - .set('Authorization', `bearer ${response.body.token}`) + await agent.post(`/api/questions/${question.body.id}/likes`) .send({ likes: -1 }) .expect(401) @@ -327,75 +315,67 @@ describe('question updation', () => { }) test('question tags can be updated by the author', async () => { - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - const tags = { tags: ['new_tag', 'react', 'redux'], } - await api.post(`/api/questions/${question.body.id}/tags`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await createSession() + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + await agent.post(`/api/questions/${question.body.id}/tags`) .send(tags) .expect(200) - await api.post(`/api/questions/${question.body.id}/tags`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await createSession(1) + + await agent.post(`/api/questions/${question.body.id}/tags`) .send(tags) .expect(401) - const authorQuestion = await api.get(`/api/questions/${question.body.id}`) + const authorQuestion = await agent.get(`/api/questions/${question.body.id}`) expect(authorQuestion.body.tags.sort()).toEqual(tags.tags.sort()) }) test('question can be set to solved by the author', async () => { - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - const solved = { solved: true, } - await api.post(`/api/questions/${question.body.id}/solved`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + await agent.post(`/api/questions/${question.body.id}/solved`) .send(solved) .expect(200) - await api.post(`/api/questions/${question.body.id}/solved`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await createSession(1) + + await agent.post(`/api/questions/${question.body.id}/solved`) .send(solved) .expect(401) - const authorQuestion = await api.get(`/api/questions/${question.body.id}`) + const authorQuestion = await agent.get(`/api/questions/${question.body.id}`) expect(authorQuestion.body.solved).toBeTruthy() }) test('a comment can be added by any user', async () => { - const response = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', @@ -406,16 +386,18 @@ describe('question updation', () => { content: 'first comment added for the sake of testing', } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${response.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') .send(newQuestion) .expect(201) - const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + const commentResponse = await agent.post(`/api/questions/${question.body.id}/comments`) .send(newComment) .expect(200) + await createSession(1) + const finalQuestion = (await testHelper.getQuestionsInDb()) .filter((finalQuestion) => finalQuestion.id === question.body.id)[0] @@ -426,91 +408,85 @@ describe('question updation', () => { }) test('a comment can be deleted the author', async () => { - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - const comment = { content: 'another comment, thanks', } - await api.post(`/api/questions/${question.body.id}/comments`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + await agent.post(`/api/questions/${question.body.id}/comments`) .send({ content: 'new comment, thanks', }) .expect(200) - const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + const commentResponse = await agent.post(`/api/questions/${question.body.id}/comments`) .send(comment) .expect(200) - await api.delete(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await createSession(1) + + await agent.delete(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .expect(401) - await api.delete(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + // login as user 0 + await createSession(0, false) + + await agent.delete(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .expect(200) - const authorQuestion = await api.get(`/api/questions/${question.body.id}`) + const authorQuestion = await agent.get(`/api/questions/${question.body.id}`) expect(authorQuestion.body.comments.length).toBe(1) }) - test('likes of a comment can be increased, decreased', async () => { - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - + test('comment likes can be increased, decreased by multiple users', async () => { const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - const comment = { content: 'new comment', } - const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + const commentResponse = await agent.post(`/api/questions/${question.body.id}/comments`) .send(comment) .expect(200) - await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await agent.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .send({ likes: 1 }) .expect(200) - await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await agent.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .send({ likes: 1 }) .expect(401) - await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await agent.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) .send({ likes: -1 }) .expect(200) - await api.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) - .send({ likes: -1 }) - .expect(401) + await createSession(1) + + await agent.post(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}/likes`) + .send({ likes: 1 }) + .expect(200) const finalComment = await Comment.findById(commentResponse.body.id) const finalCommentLikes = finalComment.likes.map((like) => like.value) @@ -520,36 +496,33 @@ describe('question updation', () => { }) test('a comment can be edited by the author', async () => { - const firstUserResponse = await getUserResponse() - const secondUserResponse = await getUserResponse(1) - const newQuestion = { title: 'first question', content: 'first question added for the sake of testing', tags: ['testing', 'hello_world'], } - const question = await api.post('/api/questions') - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(newQuestion) - .expect(201) - const comment = { content: 'new comment', } - const commentResponse = await api.post(`/api/questions/${question.body.id}/comments`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await createSession() + + const question = await agent.post('/api/questions') + .send(newQuestion) + .expect(201) + + const commentResponse = await agent.post(`/api/questions/${question.body.id}/comments`) .send(comment) .expect(200) - await api.put(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + await agent.put(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .send({ content: 'comment is edited' }) .expect(200) - await api.put(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + await createSession(1) + + await agent.put(`/api/questions/${question.body.id}/comments/${commentResponse.body.id}`) .send({ content: 'comment is edited' }) .expect(401) From b39d723386cda65bd82ae115f59bedc01e02357e Mon Sep 17 00:00:00 2001 From: Fibii Date: Fri, 25 Sep 2020 17:46:24 +0100 Subject: [PATCH 18/61] [B][T][users] refactor tests to use cookies instead of token --- backend/tests/user.test.js | 104 +++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/backend/tests/user.test.js b/backend/tests/user.test.js index 1f721b1..d12f5b6 100644 --- a/backend/tests/user.test.js +++ b/backend/tests/user.test.js @@ -2,10 +2,34 @@ const supertest = require('supertest') const mongoose = require('mongoose') const app = require('../app') const User = require('../models/user') - -const api = supertest(app) const testHelper = require('../utils/testHelper') +const agent = supertest.agent(app) + +/** + * + * logs in a user, and updates the cookie of agent to the user's cookie + * + * @param userIndex: the index of user in initialUsers + * @returns the response of user login + * */ +const createSession = async (userIndex = 0) => { + const initialUsers = testHelper.getInitialUsers() + const user = initialUsers[userIndex] + + // login + const response = await agent + .post('/api/login') + .send(user) + + const cookie = response + .headers['set-cookie'][0] + .split(',') + .map((item) => item.split(';')[0]) + agent.jar.setCookie(cookie[0]) + return response +} + beforeEach(async () => { // clear the database await User.deleteMany({}) @@ -13,7 +37,7 @@ beforeEach(async () => { // add initial users to the db const users = testHelper.getInitialUsers() - const promiseArray = users.map((user) => api.post('/api/users').send(user)) + const promiseArray = users.map((user) => agent.post('/api/users').send(user)) await Promise.all(promiseArray) }) @@ -21,7 +45,7 @@ describe('user crud', () => { test('all users are returned', async () => { const initialUsers = await testHelper.getUsersInDb() - const response = await api.get('/api/users') + const response = await agent.get('/api/users') .expect(200) const finalUsers = JSON.parse(response.text).map((user) => { @@ -51,7 +75,7 @@ describe('user crud', () => { dateOfBirth: '06-22-1955', } - await api.post('/api/users') + await agent.post('/api/users') .send(newUser) .expect(200) @@ -76,48 +100,47 @@ describe('user crud', () => { password: initialUsers[1].password, } - const firstUserResponse = await api.post('/api/login') - .send(firstUser) + const firstUserResponse = await createSession() - const secondUserResponse = await api.post('/api/login') + // bad cookie and bad password + await agent.delete(`/api/users/${firstUserResponse.body.id}`) .send(secondUser) + .expect(401) - // bad token and bad password - await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + // good cookie and bad password + await agent.delete(`/api/users/${firstUserResponse.body.id}`) .send(secondUser) .expect(401) - // bad token and good password - await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + const secondUserResponse = await createSession(1) + + // bad cookie and good password + await agent.delete(`/api/users/${firstUserResponse.body.id}`) .send(firstUser) .expect(401) - // good token and bad password - await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(secondUser) + // good cookie and bad password + await agent.delete(`/api/users/${secondUserResponse.body.id}`) + .send(firstUser) .expect(401) - // good token and good password - await api.delete(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) - .send(firstUser) + // good cookie and good password + await agent.delete(`/api/users/${secondUserResponse.body.id}`) + .send(secondUser) .expect(204) const finalUsers = await testHelper.getUsersInDb() const finalUsernames = finalUsers.map((user) => user.username) expect(finalUsers.length).toBe(initialUsers.length - 1) - expect(finalUsernames).not.toContain(firstUser.username) + expect(finalUsernames).not.toContain(secondUser.username) }) test('a user can be updated', async () => { const initialUsers = testHelper.getInitialUsers() const updatedUser = { - ...initialUsers[0], + ...initialUsers[1], email: 'newemailwho@dis.com', } @@ -131,46 +154,39 @@ describe('user crud', () => { password: initialUsers[1].password, } - // login both users - const firstUserResponse = await api.post('/api/login') - .send(firstUser) - - const secondUserResponse = await api.post('/api/login') - .send(secondUser) + const firstUserResponse = await createSession() - // bad token and bad password - await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + // good cookie and bad password + await agent.put(`/api/users/${firstUserResponse.body.id}`) .send(secondUser) .expect(401) - // bad token and good password - await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${secondUserResponse.body.token}`) + const secondUserResponse = await createSession(1) + + // bad cookie and good password + await agent.put(`/api/users/${firstUserResponse.body.id}`) .send(firstUser) .expect(401) - // good token and bad password - await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + // bad cookie and bad password + await agent.put(`/api/users/${firstUserResponse.body.id}`) .send(secondUser) .expect(401) - // good token and good password - await api.put(`/api/users/${firstUserResponse.body.id}`) - .set('Authorization', `bearer ${firstUserResponse.body.token}`) + // good cookie and good password + await agent.put(`/api/users/${secondUserResponse.body.id}`) .send(updatedUser) .expect(200) const finalUsers = await testHelper.getUsersInDb() - const finalUser = finalUsers.filter((user) => user.username === initialUsers[0].username)[0] + const finalUser = finalUsers.filter((user) => user.username === initialUsers[1].username)[0] expect(finalUser.email).toEqual(updatedUser.email) }) test('a specific user is returned', async () => { const initialUsers = await testHelper.getUsersInDb() - const response = await api.get(`/api/users/${initialUsers[0].id}`) + const response = await agent.get(`/api/users/${initialUsers[0].id}`) .expect(200) const user = JSON.parse(response.text) From 5ebf3b84aa79d5dfaffdd6d1a0960a794f3e19e9 Mon Sep 17 00:00:00 2001 From: Fibii Date: Fri, 25 Sep 2020 18:52:43 +0100 Subject: [PATCH 19/61] [B][C][login] fix isValidToken route --- backend/controllers/login.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/controllers/login.js b/backend/controllers/login.js index 41020c8..a9b8670 100644 --- a/backend/controllers/login.js +++ b/backend/controllers/login.js @@ -5,11 +5,15 @@ const User = require('../models/user') const userService = require('../utils/user') router.get('/isValidToken', async (request, response, next) => { - const user = await userService.isAuthenticated(request.token) - if (user) { - return response.status(200) + try { + const user = await userService.isAuthenticated(request.cookies.token) + if (user.id) { + return response.status(200).end() + } + return response.status(403).end() + } catch (error) { + return next(error) } - return response.status(403) }) router.post('/', async (request, response, next) => { From 07226e8ee8d3a9981b797ddbc6ab53afb6a122d4 Mon Sep 17 00:00:00 2001 From: Fibii Date: Fri, 25 Sep 2020 18:53:14 +0100 Subject: [PATCH 20/61] [B][T][login] add /isValidToken test --- backend/tests/login.test.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/backend/tests/login.test.js b/backend/tests/login.test.js index f61760f..feab68c 100644 --- a/backend/tests/login.test.js +++ b/backend/tests/login.test.js @@ -4,6 +4,7 @@ const app = require('../app') const User = require('../models/user') const api = superTest(app) +const agent = superTest.agent(app) beforeEach(async () => { await User.deleteMany({}) @@ -61,4 +62,28 @@ describe('auth', () => { expect(response.body.error).toBe('invalid password') }) + + test('user cookie can be verified', async () => { + const initialUsers = testHelper.getInitialUsers() + const user = { + username: initialUsers[0].username, + password: initialUsers[0].password, + } + + await agent.post('/api/users') + .send(initialUsers[0]) + + const response = await agent + .post('/api/login') + .send(user) + + const cookie = response + .headers['set-cookie'][0] + .split(',') + .map((item) => item.split(';')[0]) + agent.jar.setCookie(cookie[0]) + + await agent.get('/api/login/isValidToken') + .expect(200) + }) }) From 910a8b52194a777caa2d00ffceb5bdf6905426af Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 16:51:44 +0100 Subject: [PATCH 21/61] [F][S][users] use cookies instead of header token --- frontend/src/services/users.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/frontend/src/services/users.js b/frontend/src/services/users.js index 0ae2d75..559b138 100644 --- a/frontend/src/services/users.js +++ b/frontend/src/services/users.js @@ -1,16 +1,14 @@ import axios from 'axios' const baseUrl = process.env.REACT_APP_BACKEND_URL -// eslint-disable-next-line no-unused-vars -let token = null -const setToken = (newToken) => { - token = `bearer ${newToken}` +const config = { + withCredentials: true, } const login = async (credentials) => { try { - const response = await axios.post(`${baseUrl}/login/`, credentials) + const response = await axios.post(`${baseUrl}/login/`, credentials, config) return response.data } catch (error) { console.log(error) @@ -20,7 +18,7 @@ const login = async (credentials) => { const createUser = async (user) => { try { - const response = await axios.post(`${baseUrl}/users`, user) + const response = await axios.post(`${baseUrl}/users`, user, config) return response.data } catch (error) { console.log(error) @@ -42,5 +40,4 @@ export default { login, createUser, getUser, - setToken, } From cb249d2d54b528012524ab112a28770433cc177a Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 16:53:29 +0100 Subject: [PATCH 22/61] [B][S][users] add function that checks if token cookie is valid or not --- frontend/src/resources/images/login.png | Bin 0 -> 54019 bytes frontend/src/resources/svg/login.svg | 419 ++++++++++++++++++++++++ frontend/src/services/users.js | 12 + 3 files changed, 431 insertions(+) create mode 100644 frontend/src/resources/images/login.png create mode 100644 frontend/src/resources/svg/login.svg diff --git a/frontend/src/resources/images/login.png b/frontend/src/resources/images/login.png new file mode 100644 index 0000000000000000000000000000000000000000..64a14c1f50fa3672a23ac9ee74566e2af49c25ef GIT binary patch literal 54019 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
1v%=2Hn^OX+E0rcl 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 VbtcA}m6{;nGtf1GR%pW`{|7cB*(Cq~ literal 0 HcmV?d00001 diff --git a/frontend/src/resources/svg/login.svg b/frontend/src/resources/svg/login.svg new file mode 100644 index 0000000..ee397b9 --- /dev/null +++ b/frontend/src/resources/svg/login.svg @@ -0,0 +1,419 @@ + + + + + + image/svg+xml + + + + + + + + + security_SVG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/services/users.js b/frontend/src/services/users.js index 559b138..00951c4 100644 --- a/frontend/src/services/users.js +++ b/frontend/src/services/users.js @@ -36,8 +36,20 @@ const getUser = async (userId) => { return false } +const isValidToken = async () => { + try { + const response = await axios.get(`${baseUrl}/login/isValidToken`, config) + console.log('response', response) + return response.status === 200 + } catch (error) { + console.log(error) + return false + } +} + export default { login, createUser, getUser, + isValidToken, } From 8ee79e63cfb828a24a99b4a7a2754e64b60b6695 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 16:57:34 +0100 Subject: [PATCH 23/61] [F][S][questions] use cookies instead of header token --- frontend/src/services/questions.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/frontend/src/services/questions.js b/frontend/src/services/questions.js index 23f328d..ec678fa 100644 --- a/frontend/src/services/questions.js +++ b/frontend/src/services/questions.js @@ -1,14 +1,9 @@ import axios from 'axios' const baseUrl = process.env.REACT_APP_BACKEND_URL -let token = null -let config = null -const setToken = (newToken) => { - token = `bearer ${newToken}` - config = { - headers: { Authorization: token }, - } +const config = { + withCredentials: true, } const getAll = async () => { @@ -34,7 +29,7 @@ const get = async (id) => { const addComment = async (id, comment) => { try { const response = await axios - .post(`${baseUrl}/questions/${id}/new-comment`, comment, config) + .post(`${baseUrl}/questions/${id}/comments`, comment, config) return response } catch (error) { console.log(error) @@ -134,7 +129,6 @@ const updateQuestion = async (id, updatedQuestion) => { export default { getAll, - setToken, get, addComment, addQuestion, From dfc7b4ee24508d0f6bac13d052aa62e8937ef058 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 17:07:58 +0100 Subject: [PATCH 24/61] [F][S][questions] update comments endpoint url --- frontend/src/services/questions.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/services/questions.js b/frontend/src/services/questions.js index ec678fa..a3157ec 100644 --- a/frontend/src/services/questions.js +++ b/frontend/src/services/questions.js @@ -40,7 +40,7 @@ const addComment = async (id, comment) => { const deleteComment = async (questionId, commentId) => { try { const response = await axios - .delete(`${baseUrl}/questions/${questionId}/delete-comment/${commentId}`, config) + .delete(`${baseUrl}/questions/${questionId}/comments/${commentId}`, config) return response.status === 200 } catch (error) { console.log(error) @@ -50,7 +50,7 @@ const deleteComment = async (questionId, commentId) => { const upvoteComment = async (questionId, commentId) => { try { - const response = await axios.post(`${baseUrl}/questions/${questionId}/likes/${commentId}`, { likes: 1 }, config) + const response = await axios.post(`${baseUrl}/questions/${questionId}/comments/${commentId}/likes`, { likes: 1 }, config) return response.status === 200 } catch (error) { console.log(error) @@ -60,7 +60,7 @@ const upvoteComment = async (questionId, commentId) => { const downvoteComment = async (questionId, commentId) => { try { - const response = await axios.post(`${baseUrl}/questions/${questionId}/likes/${commentId}`, { likes: -1 }, config) + const response = await axios.post(`${baseUrl}/questions/${questionId}/comments/${commentId}/likes`, { likes: -1 }, config) return response.status === 200 } catch (error) { console.log(error) From 591707f41876578f4f193f2f8d6becad462bff11 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 17:10:43 +0100 Subject: [PATCH 25/61] [B][C][login] add an endpoint to validate token cookie --- backend/controllers/login.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/controllers/login.js b/backend/controllers/login.js index a9b8670..a5ca16a 100644 --- a/backend/controllers/login.js +++ b/backend/controllers/login.js @@ -6,11 +6,14 @@ const userService = require('../utils/user') router.get('/isValidToken', async (request, response, next) => { try { + if (!request.cookies.token) { + return response.status(401).end() + } const user = await userService.isAuthenticated(request.cookies.token) if (user.id) { return response.status(200).end() } - return response.status(403).end() + return response.status(401).end() } catch (error) { return next(error) } @@ -20,6 +23,7 @@ router.post('/', async (request, response, next) => { try { const { username } = request.body const { password } = request.body + const { rememberMe } = request.body const user = await User.findOne({ username }) if (!user || !password) { @@ -44,7 +48,12 @@ router.post('/', async (request, response, next) => { } const token = jwt.sign(userTokenObj, process.env.SECRET) - response.cookie('token', token, { httpOnly: true, secure: false }) + const today = new Date() + const tomorrow = new Date(today) + tomorrow.setDate(tomorrow.getDate() + 1) + const expires = rememberMe ? tomorrow : false + console.log('remember me: ', rememberMe) + response.cookie('token', token, { httpOnly: true, secure: false, expires }) return response.status(200) .json({ username, From ae39bb3223e6f8513459fa48ed4cbba750b17b9b Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 17:24:55 +0100 Subject: [PATCH 26/61] [F][S][users] remove isValidToken, add function that loads user from localStorage and validates token cookie --- frontend/src/services/users.js | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/frontend/src/services/users.js b/frontend/src/services/users.js index 00951c4..f44b12c 100644 --- a/frontend/src/services/users.js +++ b/frontend/src/services/users.js @@ -36,20 +36,33 @@ const getUser = async (userId) => { return false } -const isValidToken = async () => { - try { +/** + * check if there's a logged in user saved in localStorage + * @return true if there's a user saved in localStorage with a valid token cookie, + * false otherwise + * */ +const getSavedUser = async () => { + const loggedUser = JSON.parse(window.localStorage.getItem('qa_userLoggedIn')) + const rememberMe = JSON.parse(window.localStorage.getItem('qa_userRememberMe')) + console.log('lu', loggedUser) + console.log('rm', rememberMe) + if (loggedUser != null || rememberMe != null) { + console.log('we here chief') const response = await axios.get(`${baseUrl}/login/isValidToken`, config) - console.log('response', response) - return response.status === 200 - } catch (error) { - console.log(error) - return false + const isValidToken = response.status === 200 + console.log('vt', isValidToken) + if (isValidToken) { + return loggedUser + } + window.localStorage.removeItem('qa_userLoggedIn') + window.localStorage.removeItem('qa_userRememberMe') } + return null } export default { login, createUser, getUser, - isValidToken, + getSavedUser, } From aef4f7995c25f89f9ac3f09361cfd62d65ac2224 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 17:26:48 +0100 Subject: [PATCH 27/61] [F][C][MainApp] refactor loading localStorage users, add loading screen --- frontend/src/components/MainApp/MainApp.js | 40 +++++++++------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/frontend/src/components/MainApp/MainApp.js b/frontend/src/components/MainApp/MainApp.js index 0cebe18..29ff2f9 100644 --- a/frontend/src/components/MainApp/MainApp.js +++ b/frontend/src/components/MainApp/MainApp.js @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react' import { - Route, Switch, useLocation, useHistory, + Route, Switch, useHistory, } from 'react-router-dom' import grey from '@material-ui/core/colors/grey' import { makeStyles } from '@material-ui/core/styles' @@ -14,13 +14,11 @@ import SignupForm from '../SignupForm/SignupForm' import NewQuestionForm from '../NewQuestionForm/NewQuestionForm' import Question from '../Question/Question' import Questions from '../Questions/Questions' - -import questionService from '../../services/questions' import userService from '../../services/users' import { setErrorMessage } from '../../actions/questionActions' import Profile from '../Profile/Profile' -import Notification from '../Notification/Notification' import Footer from '../Footer/Footer' +import LoadingScreen from '../LoadingScreen/LoadingScreen' const useStyles = makeStyles(() => ({ container: { @@ -38,34 +36,28 @@ const useStyles = makeStyles(() => ({ const MainApp = () => { const [user, setUser] = useState(null) - const location = useLocation() + const [isLoading, setIsLoading] = useState(true) const history = useHistory() const classes = useStyles() useEffect(() => { - try { - const loggedUser = JSON.parse(window.localStorage.getItem('qa_userLoggedIn')) - if (loggedUser) { - setUser(loggedUser) - questionService.setToken(loggedUser.token) - userService.setToken(loggedUser.token) + const before = async () => { + try { + const user = await userService.getSavedUser() + if (user !== null) { + setUser(user) + } + } catch (error) { + setErrorMessage('error while loading the saved in user') } - } catch (error) { - setErrorMessage('error while loading the saved in user') + setIsLoading(false) } + + before() }, []) - if (user) { - if (location.pathname === '/login' || location.pathname === '/register') { - setTimeout(() => history.push('/'), 5000) - return ( - - ) - } + if (isLoading) { + return } return ( From cafbec6ed41f9a317fb696319cda41926c859a92 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 17:31:16 +0100 Subject: [PATCH 28/61] [F][C][QuestionIconsView] fix share icon width taking 80% of footer --- frontend/src/components/QuestionIcons/QuestionIconsView.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/components/QuestionIcons/QuestionIconsView.js b/frontend/src/components/QuestionIcons/QuestionIconsView.js index 283c9d8..b60e286 100644 --- a/frontend/src/components/QuestionIcons/QuestionIconsView.js +++ b/frontend/src/components/QuestionIcons/QuestionIconsView.js @@ -36,7 +36,6 @@ const QuestionIconsView = ({ } } - const handleQuestionUpdate = async () => { const tags = state.editedQuestionTags.split(' ') .map((tag) => tag.replace(/^\s+|\s+$/gm, '')) @@ -97,7 +96,7 @@ const QuestionIconsView = ({ }} > - + @@ -106,5 +105,4 @@ const QuestionIconsView = ({ ) } - export default QuestionIconsView From 009626d2232f3298f2acb392f434864c990795ff Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 26 Sep 2020 17:32:25 +0100 Subject: [PATCH 29/61] [F][C][AddCommentForm] use dispatch to update comment value --- frontend/src/components/Question/AddCommentForm.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/Question/AddCommentForm.js b/frontend/src/components/Question/AddCommentForm.js index 6423303..4dfb4e9 100644 --- a/frontend/src/components/Question/AddCommentForm.js +++ b/frontend/src/components/Question/AddCommentForm.js @@ -4,8 +4,7 @@ import Grid from '@material-ui/core/Grid' import TextField from '@material-ui/core/TextField' import Button from '@material-ui/core/Button' import UserContext from '../UserContext/UserContext' -import questionActions from '../../actions/questionAction' -import { setErrorMessage, setQuestion } from '../../actions/questionActions' +import { setCommentContent, setErrorMessage, setQuestion } from '../../actions/questionActions' import questionService from '../../services/questions' const AddCommentForm = ({ state, dispatch }) => { @@ -15,11 +14,10 @@ const AddCommentForm = ({ state, dispatch }) => { /** * wrappers for useState setter functions * */ - const setCommentContent = (commentContent) => { - dispatch({ - type: questionActions.SET_COMMENT_CONTENT, - commentContent, - }) + const handleCommentChange = (event) => { + event.preventDefault() + const { value } = event.target + dispatch(setCommentContent(value)) } const handleCommentPost = async () => { @@ -68,7 +66,7 @@ const AddCommentForm = ({ state, dispatch }) => { fullWidth variant="outlined" value={commentContent} - onChange={(event) => setCommentContent(event.target.value)} + onChange={(event) => handleCommentChange(event)} /> Date: Fri, 2 Oct 2020 17:24:55 +0100 Subject: [PATCH 30/61] [F][C][QuestionIconsView] fix share icon onClick not copying question link to clipboards --- .../components/QuestionIcons/QuestionIconsView.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/QuestionIcons/QuestionIconsView.js b/frontend/src/components/QuestionIcons/QuestionIconsView.js index b60e286..5b282e3 100644 --- a/frontend/src/components/QuestionIcons/QuestionIconsView.js +++ b/frontend/src/components/QuestionIcons/QuestionIconsView.js @@ -1,7 +1,4 @@ import Grid from '@material-ui/core/Grid' -import { CopyToClipboard } from 'react-copy-to-clipboard' -import IconButton from '@material-ui/core/IconButton' -import ShareIcon from '@material-ui/icons/Share' import React, { useContext } from 'react' import { useParams, useHistory } from 'react-router-dom' import useMediaQuery from '@material-ui/core/useMediaQuery' @@ -95,11 +92,11 @@ const QuestionIconsView = ({ flexDirection: isMobile ? 'column' : 'row', }} > - - - - - + )} ) From d46af36449b5197239b7750d99bcd6e2472edead Mon Sep 17 00:00:00 2001 From: Fibii Date: Sun, 11 Oct 2020 14:00:41 +0100 Subject: [PATCH 31/61] [B][C][users] add logic to close other accordion when a new one is opened --- .../NewQuestionForm/QuestionInstructions.js | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/NewQuestionForm/QuestionInstructions.js b/frontend/src/components/NewQuestionForm/QuestionInstructions.js index 1321b3f..2fdb5d1 100644 --- a/frontend/src/components/NewQuestionForm/QuestionInstructions.js +++ b/frontend/src/components/NewQuestionForm/QuestionInstructions.js @@ -6,6 +6,8 @@ import AccordionDetails from '@material-ui/core/AccordionDetails' import Typography from '@material-ui/core/Typography' import ExpandMoreIcon from '@material-ui/icons/ExpandMore' +const { useState } = require('react') + const useStyles = makeStyles((theme) => ({ root: { width: '100%', @@ -21,11 +23,23 @@ const useStyles = makeStyles((theme) => ({ const QuestionInstructions = () => { const classes = useStyles() + const [firstExpanded, setFirstExpanded] = useState(false) + const [secondExpanded, setSecondExpanded] = useState(false) + + const firstOnChange = (event, expanded) => { + setFirstExpanded(expanded) + setSecondExpanded(false) + } + + const secondOnChange = (event, expanded) => { + setSecondExpanded(expanded) + setFirstExpanded(false) + } return (

Tips on getting good answers quickly - + } aria-controls="panel1a-content" @@ -44,13 +58,13 @@ const QuestionInstructions = () => { - + } aria-controls="panel1a-content" id="panel1a-header" > - Describe what you've tried + Describe what you've tried From b81a6157c0cda71eba04e56e2133d9da3c3b71da Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 16:25:40 +0100 Subject: [PATCH 32/61] [F][C][Question] join edited tags with space instead of a comma (,) --- frontend/src/components/Question/Question.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Question/Question.js b/frontend/src/components/Question/Question.js index 43bce65..4e6427c 100644 --- a/frontend/src/components/Question/Question.js +++ b/frontend/src/components/Question/Question.js @@ -42,7 +42,7 @@ const Question = () => { } if (state.editedQuestionTags === null && question.tags) { - dispatch(setEditedQuestionTags(question.tags.join(', '))) + dispatch(setEditedQuestionTags(question.tags.join(' '))) } } setIsLoading(false) From 1fe044d992f2dce6cdcc7eb5e1568d54eba8d26d Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 16:42:19 +0100 Subject: [PATCH 33/61] [F][C][HVContainer] add HVContainer --- .../Containers/HVContainer/HVContainer.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 frontend/src/components/Containers/HVContainer/HVContainer.js diff --git a/frontend/src/components/Containers/HVContainer/HVContainer.js b/frontend/src/components/Containers/HVContainer/HVContainer.js new file mode 100644 index 0000000..a25de6d --- /dev/null +++ b/frontend/src/components/Containers/HVContainer/HVContainer.js @@ -0,0 +1,25 @@ +import React from 'react' +import Grid from '@material-ui/core/Grid' +import { makeStyles } from '@material-ui/core/styles' + +const useStyles = makeStyles(() => ({ + container: { + height: '100%', + }, +})) + +/** + * A Grid that centers it's child horizontally then vertically + * */ +const HVContainer = ({ children, style, dataTestId }) => { + const classes = useStyles() + return ( + + + {children} + + + ) +} + +export default HVContainer From 8eaa4d3f242d79befe898516c65e0a6f00d03d25 Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 16:42:34 +0100 Subject: [PATCH 34/61] [F][C][HVContainer] add VHContainer --- .../Containers/VHContainer/VHContainer.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 frontend/src/components/Containers/VHContainer/VHContainer.js diff --git a/frontend/src/components/Containers/VHContainer/VHContainer.js b/frontend/src/components/Containers/VHContainer/VHContainer.js new file mode 100644 index 0000000..12a17af --- /dev/null +++ b/frontend/src/components/Containers/VHContainer/VHContainer.js @@ -0,0 +1,25 @@ +import React from 'react' +import Grid from '@material-ui/core/Grid' +import { makeStyles } from '@material-ui/core/styles' + +const useStyles = makeStyles(() => ({ + container: { + height: '100%', + }, +})) + +/** + * A Grid that centers it's child vertically then horizontally + * */ +const VHContainer = ({ children, style, dataTestId }) => { + const classes = useStyles() + return ( + + + {children} + + + ) +} + +export default VHContainer From f577d496c53ef05bc5cedd020c4e35bf5be6330a Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 16:43:38 +0100 Subject: [PATCH 35/61] [F][C][NewQuestionForm] Redesign NewQuestionForm, add general question info --- .../src/__tests__/NewQuestionForm.test.js | 2 +- .../NewQuestionForm/NewQuestionForm.js | 345 ++++++++++-------- 2 files changed, 197 insertions(+), 150 deletions(-) diff --git a/frontend/src/__tests__/NewQuestionForm.test.js b/frontend/src/__tests__/NewQuestionForm.test.js index 7d5d734..108fc14 100644 --- a/frontend/src/__tests__/NewQuestionForm.test.js +++ b/frontend/src/__tests__/NewQuestionForm.test.js @@ -63,7 +63,7 @@ describe('NewQuestionForm tests', () => { tags: ['question', 'test', 'tag'], title: 'question test title', }, - null) // null here is for config object, check services/questions addQuestion + { withCredentials: true }) }) test('renders NewQuestionForm and validates input', async () => { diff --git a/frontend/src/components/NewQuestionForm/NewQuestionForm.js b/frontend/src/components/NewQuestionForm/NewQuestionForm.js index 95c5892..4aedc61 100644 --- a/frontend/src/components/NewQuestionForm/NewQuestionForm.js +++ b/frontend/src/components/NewQuestionForm/NewQuestionForm.js @@ -6,28 +6,32 @@ import { makeStyles, withStyles } from '@material-ui/core/styles' import Paper from '@material-ui/core/Paper' import { useHistory } from 'react-router-dom' import Typography from '@material-ui/core/Typography' -import { ThemeProvider } from '@material-ui/styles' -import { createMuiTheme } from '@material-ui/core' -import { blue, lightBlue, pink } from '@material-ui/core/colors' +import { lightBlue, pink } from '@material-ui/core/colors' +import useMediaQuery from '@material-ui/core/useMediaQuery' import UserContext from '../UserContext/UserContext' import Notification from '../Notification/Notification' import questionService from '../../services/questions' import validator from '../../services/validator' import QuestionInstructions from './QuestionInstructions' import QuestionInstructionSmall from './QuestionInstructionSmall' +import VHContainer from '../Containers/VHContainer/VHContainer' + +const initialState = { + questionTitle: '', + questionContent: '', + questionTags: '', + titleHelperText: '', + contentHelperText: '', + tagsHelperText: '', +} const useStyles = makeStyles((theme) => ({ - root: { - overflow: 'hidden', - backgroundColor: theme.palette.background.paper, - paddingBottom: 64, - }, + paper: { - minWidth: 340, - width: '40%', - [theme.breakpoints.down('sm')]: { + [theme.breakpoints.down('md')]: { width: '80%', marginRight: 0, + marginBottom: 32, }, padding: 16, display: 'flex', @@ -52,12 +56,6 @@ const useStyles = makeStyles((theme) => ({ }, })) -const theme = createMuiTheme({ - palette: { - primary: blue, - }, -}) - const SubmitButton = withStyles({ root: { border: '1px solid', @@ -84,19 +82,12 @@ const ClearButton = withStyles({ }, })(Button) -const NewQuestionForm = () => { +const TextFields = ({ state, setState }) => { const classes = useStyles() - - const [questionTitle, setQuestionTitle] = useState('') - const [questionContent, setQuestionContent] = useState('') - const [questionTags, setQuestionTags] = useState('') - const [titleHelperText, setTitleHelperText] = useState('') - const [contentHelperText, setContentHelperText] = useState('') - const [tagsHelperText, setTagsHelperText] = useState('') - const [errorMessage, setErrorMessage] = useState('') - - const [user] = useContext(UserContext) - const history = useHistory() + const { + questionTitle, questionContent, questionTags, + contentHelperText, titleHelperText, tagsHelperText, + } = state /** * Updates questionTitle to user input, validates the title @@ -106,11 +97,17 @@ const NewQuestionForm = () => { * @param event, react onChange event used to get the value of the textfield * */ const titleOnChange = (event) => { - setQuestionTitle(event.target.value) - setTitleHelperText('') - + event.persist() + setState((previousState) => ({ + ...previousState, + questionTitle: event.target.value, + titleHelperText: '', + })) if (!validator.questionFormValidator({ title: questionTitle })) { - setTitleHelperText('title must be 6 characters long at least and 64 at most') + setState((previousState) => ({ + ...previousState, + titleHelperText: 'title must be 6 characters long at least and 64 at most', + })) } } @@ -122,11 +119,18 @@ const NewQuestionForm = () => { * @param event, react onChange event used to get the value of the textfield * */ const contentOnChange = (event) => { - setQuestionContent(event.target.value) - setContentHelperText('') + event.persist() + setState((previousState) => ({ + ...previousState, + questionContent: event.target.value, + contentHelperText: '', + })) if (!validator.questionFormValidator({ content: questionContent })) { - setContentHelperText('content must be at least 8 characters long') + setState((previousState) => ({ + ...previousState, + contentHelperText: 'content must be at least 8 characters long', + })) } } @@ -139,14 +143,95 @@ const NewQuestionForm = () => { * */ const tagsOnChange = (event) => { const tags = event.target.value - setQuestionTags(tags) - setTagsHelperText('') + setState((previousState) => ({ + ...previousState, + questionTags: tags, + tagsHelperText: '', + })) if (!validator.questionFormValidator({ tags })) { - setTagsHelperText('tags must be words, separated by space, like in "hello world"') + setState((previousState) => ({ + ...previousState, + tagsHelperText: 'tags must be words, separated by space, like in "hello world"', + })) } } + return ( + + + Title + + Be specific and imagine you’re asking a question to another person + + 0} + helperText={titleHelperText} + id="title" + margin="dense" + placeholder="Ex: how do i undo git commit without losing changes?" + fullWidth + variant="outlined" + value={questionTitle} + onChange={titleOnChange} + inputProps={{ + 'data-testid': 'title-input', + }} + /> + + + Body + + Include all the information someone would need to answer your question + + 0} + helperText={contentHelperText} + id="content" + placeholder="Content" + multiline + rows={3} + rowsMax={8} + fullWidth + variant="outlined" + value={questionContent} + onChange={contentOnChange} + inputProps={{ + 'data-testid': 'content-input', + }} + /> + + + Tags + + Add tags to describe what your question is about (tags are separated by space) + + 0} + helperText={tagsHelperText} + id="tags" + placeholder="Ex: Java Spring_boot" + margin="dense" + fullWidth + variant="outlined" + value={questionTags} + onChange={tagsOnChange} + inputProps={{ + 'data-testid': 'tags-input', + }} + /> + + + ) +} + +const Buttons = ({ state, setState, setErrorMessage }) => { + const classes = useStyles() + const history = useHistory() + const { + questionTitle, questionContent, questionTags, tagsHelperText, + } = state + /** * Adds a new Question to the database * @@ -174,6 +259,7 @@ const NewQuestionForm = () => { if (!valid || tagsHelperText) { setErrorMessage('All fields are required, if a field is red, fix it') + setTimeout(() => setErrorMessage(''), 5000) } else { const newQuestion = await questionService.addQuestion(question) @@ -189,12 +275,7 @@ const NewQuestionForm = () => { * helper function that clears all the textfields * */ const clearAll = () => { - setQuestionContent('') - setQuestionTitle('') - setQuestionTags('') - setTitleHelperText('') - setContentHelperText('') - setTagsHelperText('') + setState(initialState) } /** @@ -204,125 +285,91 @@ const NewQuestionForm = () => { clearAll() } + return ( + + + clear + + + submit + + + ) +} +const NewQuestionForm = () => { + const classes = useStyles() + const [user] = useContext(UserContext) + const [errorMessage, setErrorMessage] = useState('') + const isMobile = useMediaQuery('(max-width:600px)') + const [state, setState] = useState(initialState) + if (!user) { return ( ) } + if (isMobile) { + return ( + + + + + + + + + + + ) + } + return ( -
- - + - + /> + - - - - Title - - Be specific and imagine you’re asking a question to another person - - 0} - helperText={titleHelperText} - id="title" - placeholder="Ex: how do i undo git commit without losing changes?" - multiline - fullWidth - variant="outlined" - value={questionTitle} - onChange={titleOnChange} - inputProps={{ - 'data-testid': 'title-input', - }} - /> - - - Body - - Include all the information someone would need to answer your question - - 0} - helperText={contentHelperText} - id="content" - placeholder="Content" - multiline - rows={3} - rowsMax={8} - fullWidth - variant="outlined" - value={questionContent} - onChange={contentOnChange} - inputProps={{ - 'data-testid': 'content-input', - }} - /> - - - Tags - - Add tags to describe what your question is about (tags are separated by space) - - 0} - helperText={tagsHelperText} - id="tags" - placeholder="Ex: Java Spring_boot" - multiline - fullWidth - variant="outlined" - value={questionTags} - onChange={tagsOnChange} - inputProps={{ - 'data-testid': 'tags-input', - }} - /> - - - - - clear - - - submit - - - + + + + -
+ ) } From 6c24ac0263d10a47838371b9985e5d112ebd8b59 Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 16:59:41 +0100 Subject: [PATCH 36/61] [F][C][SignContainer] add container for SignIn/SignUp forms --- .../Containers/SignContainer/SignContainer.js | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 frontend/src/components/Containers/SignContainer/SignContainer.js diff --git a/frontend/src/components/Containers/SignContainer/SignContainer.js b/frontend/src/components/Containers/SignContainer/SignContainer.js new file mode 100644 index 0000000..99256f3 --- /dev/null +++ b/frontend/src/components/Containers/SignContainer/SignContainer.js @@ -0,0 +1,113 @@ +import Grid from '@material-ui/core/Grid' +import Paper from '@material-ui/core/Paper' +import Typography from '@material-ui/core/Typography' +import { ThemeProvider } from '@material-ui/styles' +import React from 'react' +import { makeStyles } from '@material-ui/core/styles' +import { blue, lightBlue } from '@material-ui/core/colors' +import { createMuiTheme } from '@material-ui/core' +import Notification from '../../Notification/Notification' +import VHContainer from '../VHContainer/VHContainer' + +const useStyles = makeStyles((theme) => ({ + paper: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + padding: 32, + width: 400, + [theme.breakpoints.down('md')]: { + width: 300, + }, + [theme.breakpoints.down('sm')]: { + width: '74%', + marginTop: 16, + marginBottom: 16, + }, + }, + imageContainer: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + backgroundColor: lightBlue[800], + borderLeft: 4, + borderTopLeftRadius: 8, + borderBottomLeftRadius: 8, + [theme.breakpoints.down('md')]: { + width: 400, + }, + [theme.breakpoints.down('sm')]: { + display: 'none', + }, + }, + image: { + width: '80%', + margin: '0 auto', + [theme.breakpoints.down('md')]: { + width: '70%', + }, + [theme.breakpoints.down('sm')]: { + width: '40%', + }, + }, + smallScreenImage: { + [theme.breakpoints.up('sm')]: { + display: 'none', + }, + [theme.breakpoints.down('sm')]: { + display: 'flex', + }, + }, +})) + +const theme = createMuiTheme({ + palette: { + primary: blue, + }, +}) + +const SignContainer = ({ + errorMessage, children, image, title, +}) => { + const classes = useStyles() + return ( + + + + + {image} + + + + {image} + + + {title} + + + { children } + + + + + ) +} + +export default SignContainer From 612a45229454cf33cda07afd43dbc1e5f143468f Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 17:00:55 +0100 Subject: [PATCH 37/61] [F][C][SignInForm] redesign SignInForm --- .../src/components/SignInForm/SignInForm.js | 219 +++++++++--------- 1 file changed, 113 insertions(+), 106 deletions(-) diff --git a/frontend/src/components/SignInForm/SignInForm.js b/frontend/src/components/SignInForm/SignInForm.js index 8f53861..d38bf1b 100644 --- a/frontend/src/components/SignInForm/SignInForm.js +++ b/frontend/src/components/SignInForm/SignInForm.js @@ -1,31 +1,21 @@ -import React, { useState } from 'react' -import { useHistory, Link } from 'react-router-dom' -import Avatar from '@material-ui/core/Avatar' +import React, { useContext, useState } from 'react' +import { useHistory } from 'react-router-dom' import Button from '@material-ui/core/Button' -import CssBaseline from '@material-ui/core/CssBaseline' import TextField from '@material-ui/core/TextField' import FormControlLabel from '@material-ui/core/FormControlLabel' import Checkbox from '@material-ui/core/Checkbox' import Grid from '@material-ui/core/Grid' -import LockOutlinedIcon from '@material-ui/icons/LockOutlined' -import Typography from '@material-ui/core/Typography' -import { makeStyles } from '@material-ui/core/styles' -import Container from '@material-ui/core/Container' +import { makeStyles, withStyles } from '@material-ui/core/styles' +import { lightBlue } from '@material-ui/core/colors' import userService from '../../services/users' -import Notification from '../Notification/Notification' import questionService from '../../services/questions' +import SignContainer from '../Containers/SignContainer/SignContainer' +import loginImg from '../../resources/images/login.png' +import QLink from '../QLink/QLink' +import UserContext from '../UserContext/UserContext' +import Notification from '../Notification/Notification' const useStyles = makeStyles((theme) => ({ - paper: { - marginTop: theme.spacing(8), - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - }, - avatar: { - margin: theme.spacing(1), - backgroundColor: theme.palette.secondary.main, - }, form: { width: '100%', // Fix IE 11 issue. marginTop: theme.spacing(1), @@ -33,124 +23,141 @@ const useStyles = makeStyles((theme) => ({ submit: { margin: theme.spacing(3, 0, 2), }, + link: { + textDecoration: 'none', + outline: 'none', + '&:visited': { + color: 'inherit', + }, + }, })) -const SignIn = ({ setUser }) => { +const SignInButton = withStyles({ + root: { + backgroundColor: lightBlue[700], + border: '1px solid', + boxShadow: 'none', + '&:hover': { + backgroundColor: lightBlue[800], + boxShadow: 'none', + }, + }, +})(Button) + +const BlueCheckbox = withStyles({ + root: { + color: lightBlue[800], + '&$checked': { + color: lightBlue[600], + }, + }, + checked: {}, +})((props) => ) + +const SignIn = () => { const classes = useStyles() const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [rememberUser, setRememberUser] = useState(false) const [errorMessage, setErrorMessage] = useState('') + const [user, setUser] = useContext(UserContext) const history = useHistory() + if (user && user.id) { + setTimeout(() => history.push('/'), 5000) + return ( + + ) + } + const formHandler = async (event) => { event.preventDefault() const user = await userService.login({ username, password, + rememberMe: rememberUser, }) if (!user || user.error) { setErrorMessage('error, incorrect username or password') setTimeout(() => setErrorMessage(''), 5000) } else { setUser(user) - questionService.setToken(user.token) - userService.setToken(user.token) if (rememberUser) { - window.localStorage.setItem('qa_userLoggedIn', JSON.stringify(user)) + window.localStorage.setItem('qa_userRememberMe', JSON.stringify(user)) } + window.localStorage.setItem('qa_userLoggedIn', JSON.stringify(user)) history.push('/') } } return ( -
- -
- +
+ setUsername(event.target.value)} + inputProps={{ + 'data-testid': 'username-input', + }} + /> + setPassword(event.target.value)} + inputProps={{ + 'data-testid': 'password-input', }} + /> + } + label="Remember me" + onChange={() => setRememberUser(!rememberUser)} + /> + - -
- - - - - Sign in - - - setUsername(event.target.value)} - inputProps={{ - 'data-testid': 'username-input', - }} - /> - setPassword(event.target.value)} - inputProps={{ - 'data-testid': 'password-input', - }} - /> - } - label="Remember me" - onChange={() => setRememberUser(!rememberUser)} - /> - - - - - Forgot password? - - - - - Don't have an account? Sign Up - - - - -
-
-
-
+ Sign In + + + + + Forgot password? + + + + + Don't have an account? Sign Up + + + + + ) } From 10a5fcdb0d42bbe1296147ed4e349c3e2abbb99a Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 17:01:14 +0100 Subject: [PATCH 38/61] [F][C][SignupForm] redesign SignupForm --- .../src/components/SignupForm/SignupForm.js | 294 ++++++++---------- 1 file changed, 135 insertions(+), 159 deletions(-) diff --git a/frontend/src/components/SignupForm/SignupForm.js b/frontend/src/components/SignupForm/SignupForm.js index 59368ad..4587838 100644 --- a/frontend/src/components/SignupForm/SignupForm.js +++ b/frontend/src/components/SignupForm/SignupForm.js @@ -1,30 +1,20 @@ -import React, { useState } from 'react' -import Avatar from '@material-ui/core/Avatar' +import React, { useContext, useState } from 'react' import Button from '@material-ui/core/Button' -import CssBaseline from '@material-ui/core/CssBaseline' import TextField from '@material-ui/core/TextField' import Grid from '@material-ui/core/Grid' -import LockOutlinedIcon from '@material-ui/icons/LockOutlined' -import Typography from '@material-ui/core/Typography' -import { makeStyles } from '@material-ui/core/styles' -import Container from '@material-ui/core/Container' -import { useHistory, Link } from 'react-router-dom' -import Notification from '../Notification/Notification' +import { makeStyles, withStyles } from '@material-ui/core/styles' +import { useHistory } from 'react-router-dom' +import { lightBlue } from '@material-ui/core/colors' import userService from '../../services/users' import validator from '../../services/validator' +import SignContainer from '../Containers/SignContainer/SignContainer' +import loginImg from '../../resources/images/login.png' +import QLink from '../QLink/QLink' +import UserContext from '../UserContext/UserContext' +import Notification from '../Notification/Notification' const useStyles = makeStyles((theme) => ({ - paper: { - marginTop: theme.spacing(8), - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - }, - avatar: { - margin: theme.spacing(1), - backgroundColor: theme.palette.secondary.main, - }, form: { width: '100%', // Fix IE 11 issue. marginTop: theme.spacing(3), @@ -34,6 +24,18 @@ const useStyles = makeStyles((theme) => ({ }, })) +const SignUpButton = withStyles({ + root: { + backgroundColor: lightBlue[700], + border: '1px solid', + boxShadow: 'none', + '&:hover': { + backgroundColor: lightBlue[800], + boxShadow: 'none', + }, + }, +})(Button) + const SignupForm = () => { const classes = useStyles() @@ -49,8 +51,19 @@ const SignupForm = () => { const [dateOfBirthHelperText, setDateOfBirthHelperText] = useState('') const [errorMessage, setErrorMessage] = useState('') + const [user] = useContext(UserContext) const history = useHistory() + if (user) { + setTimeout(() => history.push('/'), 5000) + return ( + + ) + } const fullNameOnChange = (event) => { const fullName = event.target.value @@ -133,154 +146,117 @@ const SignupForm = () => { } return ( -
- - - -
- - - - - - - Sign up - - -
- - - - - 0} - helperText={fullNameHelperText} - autoComplete="fname" - name="fullName" - variant="outlined" - required - fullWidth - id="fullName" - label="Full Name" - autoFocus - onChange={fullNameOnChange} - inputProps={{ - 'data-testid': 'fullname-input', - }} - /> - - - - 0} - helperText={usernameHelperText} - onChange={userNameOnChange} - variant="outlined" - required - fullWidth - id="username" - label="Username" - name="username" - autoComplete="username" - inputProps={{ - 'data-testid': 'username-input', - }} - /> - + + + 0} + margin="dense" + helperText={fullNameHelperText} + autoComplete="fname" + name="fullName" + variant="outlined" + required + fullWidth + id="fullName" + label="Full Name" + autoFocus + onChange={fullNameOnChange} + inputProps={{ + 'data-testid': 'fullname-input', + }} + /> - - 0} - helperText={emailHelperText} - onChange={emailOnChange} - variant="outlined" - required - fullWidth - id="email" - label="Email Address" - name="email" - autoComplete="email" - inputProps={{ - 'data-testid': 'email-input', - }} - /> - + 0} + margin="dense" + helperText={usernameHelperText} + onChange={userNameOnChange} + variant="outlined" + required + fullWidth + id="username" + label="Username" + name="username" + autoComplete="username" + inputProps={{ + 'data-testid': 'username-input', + }} + /> - - 0} - helperText={passwordHelperText} - onChange={passwordOnChange} - variant="outlined" - required - fullWidth - name="password" - label="Password" - type="password" - id="password" - autoComplete="current-password" - inputProps={{ - 'data-testid': 'password-input', - }} - /> - + 0} + margin="dense" + helperText={emailHelperText} + onChange={emailOnChange} + variant="outlined" + required + fullWidth + id="email" + label="Email Address" + name="email" + autoComplete="email" + inputProps={{ + 'data-testid': 'email-input', + }} + /> - - 0} - helperText={dateOfBirthHelperText} - onChange={dateOfBirthOnChange} - variant="outlined" - id="dateOfBirth" - label="Birthday" - type="date" - InputLabelProps={{ - shrink: true, - }} - inputProps={{ - 'data-testid': 'dateOfBirth-input', - }} - /> - + 0} + margin="dense" + helperText={passwordHelperText} + onChange={passwordOnChange} + variant="outlined" + required + fullWidth + name="password" + label="Password" + type="password" + id="password" + autoComplete="current-password" + inputProps={{ + 'data-testid': 'password-input', + }} + /> - + 0} + margin="dense" + helperText={dateOfBirthHelperText} + onChange={dateOfBirthOnChange} + variant="outlined" + id="dateOfBirth" + label="Birthday" + type="date" + InputLabelProps={{ + shrink: true, + }} + inputProps={{ + 'data-testid': 'dateOfBirth-input', + }} + /> - + + Sign Up + - - - - Already have an account? Sign in - - - + + + + Already have an account? Sign in + + + - -
-
-
+ + ) } export default SignupForm From cff32443afe4e22b9fd747e1f2087a433c3db5a3 Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 17:39:06 +0100 Subject: [PATCH 39/61] [F][C][NoPage] add 404 page --- frontend/src/components/NoPage/NoPage.js | 64 ++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 frontend/src/components/NoPage/NoPage.js diff --git a/frontend/src/components/NoPage/NoPage.js b/frontend/src/components/NoPage/NoPage.js new file mode 100644 index 0000000..b3f811e --- /dev/null +++ b/frontend/src/components/NoPage/NoPage.js @@ -0,0 +1,64 @@ +import React from 'react' +import Paper from '@material-ui/core/Paper' +import Typography from '@material-ui/core/Typography' +import { makeStyles } from '@material-ui/core/styles' +import noPage from '../../resources/images/404.png' +import VHContainer from '../Containers/VHContainer/VHContainer' + +const useStyles = makeStyles((theme) => ({ + container: { + backgroundColor: 'red', + height: '100%', + }, + innerContainer: { + height: '50%', + }, + paper: { + [theme.breakpoints.down('sm')]: { + width: '90%', + }, + [theme.breakpoints.up('sm')]: { + width: 500, + }, + [theme.breakpoints.up('md')]: { + width: 600, + }, + paddingBottom: 2, + paddingTop: 64, + }, + image: { + width: '60%', + }, + +})) + +const NoPage = () => { + const classes = useStyles() + + return ( + + + + {noPage} + + Page doesn't exist + + + + + + ) +} + +export default NoPage From df4a540562d269644aba6132c34db5ae76b4cf4b Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 17:47:50 +0100 Subject: [PATCH 40/61] [F][C][Questions] add margin --- frontend/src/components/Questions/Questions.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/Questions/Questions.js b/frontend/src/components/Questions/Questions.js index 4933389..9621c5d 100644 --- a/frontend/src/components/Questions/Questions.js +++ b/frontend/src/components/Questions/Questions.js @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react' import { makeStyles } from '@material-ui/core/styles' import List from '@material-ui/core/List' -import grey from '@material-ui/core/colors/grey' import Notification from '../Notification/Notification' import questionService from '../../services/questions' import QPaper from '../QPaper/QPaper' @@ -10,8 +9,8 @@ import NoQuestions from '../NoQuestions/NoQuestions' const useStyles = makeStyles(() => ({ container: { - height: '100%', - backgroundColor: grey[100], + marginTop: 32, + marginBottom: 16, }, })) @@ -90,5 +89,4 @@ const Questions = ({ user }) => { ) } - export default Questions From b4bf31711928d8d2b817a29ba462c80b3a905949 Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 15 Oct 2020 17:48:13 +0100 Subject: [PATCH 41/61] [F][C][QuestionContainer] add margin --- frontend/src/components/Question/QuestionContainer.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Question/QuestionContainer.js b/frontend/src/components/Question/QuestionContainer.js index 3ee126b..817521c 100644 --- a/frontend/src/components/Question/QuestionContainer.js +++ b/frontend/src/components/Question/QuestionContainer.js @@ -5,7 +5,15 @@ import Notification from '../Notification/Notification' const QuestionContainer = ({ state, children }) => { const { errorMessage } = state return ( - + Date: Tue, 27 Oct 2020 22:26:21 +0100 Subject: [PATCH 42/61] [F][C][UserMenu] update logout to remove user from sessionStorage --- frontend/src/components/Header/UserMenu.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/components/Header/UserMenu.js b/frontend/src/components/Header/UserMenu.js index 5ffe98e..5384089 100644 --- a/frontend/src/components/Header/UserMenu.js +++ b/frontend/src/components/Header/UserMenu.js @@ -26,6 +26,7 @@ const UserMenu = ({ state, dispatch }) => { const handleLogout = () => { setUser(null) window.localStorage.removeItem('qa_userLoggedIn') + window.sessionStorage.removeItem('qa_user') } const isMenuOpen = Boolean(anchorEl) From e113aa4d372b64d7346e04c8b8716032dde87832 Mon Sep 17 00:00:00 2001 From: Fibii Date: Tue, 27 Oct 2020 22:28:21 +0100 Subject: [PATCH 43/61] [F][C][QLink] add QLink, Link wrapper --- frontend/src/components/QLink/QLink.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 frontend/src/components/QLink/QLink.js diff --git a/frontend/src/components/QLink/QLink.js b/frontend/src/components/QLink/QLink.js new file mode 100644 index 0000000..fdd11e0 --- /dev/null +++ b/frontend/src/components/QLink/QLink.js @@ -0,0 +1,25 @@ +import Typography from '@material-ui/core/Typography' +import React from 'react' +import { Link } from 'react-router-dom' +import { makeStyles } from '@material-ui/core/styles' + +const useStyles = makeStyles(() => ({ + link: { + textDecoration: 'none', + outline: 'none', + '&:visited': { + color: 'inherit', + }, + }, +})) + +const QLink = ({ to, children, testId }) => { + const classes = useStyles() + return ( + + { children } + + ) +} + +export default QLink From 9e6c813545fb75aaffe0ba737b8c36c694193b7e Mon Sep 17 00:00:00 2001 From: Fibii Date: Tue, 27 Oct 2020 22:31:02 +0100 Subject: [PATCH 44/61] [F][C][MainApp] add 404 route, update height css --- frontend/src/app.css | 10 +++++++++- frontend/src/components/MainApp/MainApp.js | 11 +++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/frontend/src/app.css b/frontend/src/app.css index 945031f..1422387 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -1,8 +1,16 @@ +html { + min-height: 100%; + background: #f4f6ff; +} + +body { + min-height: 100vh; +} + html, body { margin: 0; padding: 0; height: 100%; - min-height: 100% } #root { diff --git a/frontend/src/components/MainApp/MainApp.js b/frontend/src/components/MainApp/MainApp.js index 29ff2f9..f4101f3 100644 --- a/frontend/src/components/MainApp/MainApp.js +++ b/frontend/src/components/MainApp/MainApp.js @@ -1,8 +1,7 @@ import React, { useEffect, useState } from 'react' import { - Route, Switch, useHistory, + Route, Switch, } from 'react-router-dom' -import grey from '@material-ui/core/colors/grey' import { makeStyles } from '@material-ui/core/styles' import Grid from '@material-ui/core/Grid' import UserContext from '../UserContext/UserContext' @@ -19,15 +18,15 @@ import { setErrorMessage } from '../../actions/questionActions' import Profile from '../Profile/Profile' import Footer from '../Footer/Footer' import LoadingScreen from '../LoadingScreen/LoadingScreen' +import NoPage from '../NoPage/NoPage' const useStyles = makeStyles(() => ({ container: { - backgroundColor: grey[100], minHeight: '100%', + height: '100%', }, content: { flex: '1 0 auto', - marginTop: 32, }, footer: { flexShrink: 0, @@ -37,7 +36,6 @@ const useStyles = makeStyles(() => ({ const MainApp = () => { const [user, setUser] = useState(null) const [isLoading, setIsLoading] = useState(true) - const history = useHistory() const classes = useStyles() useEffect(() => { @@ -61,7 +59,7 @@ const MainApp = () => { } return ( - +
@@ -83,6 +81,7 @@ const MainApp = () => { } /> } /> } /> + From 52a467c89ff668692da50a820587bdff08fac76d Mon Sep 17 00:00:00 2001 From: Fibii Date: Tue, 27 Oct 2020 22:45:02 +0100 Subject: [PATCH 45/61] [F][C][Drawer] remove Drawer, SideBar is used instead --- frontend/src/components/Header/Drawer.js | 118 ----------------------- 1 file changed, 118 deletions(-) delete mode 100644 frontend/src/components/Header/Drawer.js diff --git a/frontend/src/components/Header/Drawer.js b/frontend/src/components/Header/Drawer.js deleted file mode 100644 index a23dfea..0000000 --- a/frontend/src/components/Header/Drawer.js +++ /dev/null @@ -1,118 +0,0 @@ -import Typography from '@material-ui/core/Typography' -import IconButton from '@material-ui/core/IconButton' -import ChevronLeftIcon from '@material-ui/icons/ChevronLeft' -import ChevronRightIcon from '@material-ui/icons/ChevronRight' -import Divider from '@material-ui/core/Divider' -import List from '@material-ui/core/List' -import { Link } from 'react-router-dom' -import ListItem from '@material-ui/core/ListItem' -import HomeIcon from '@material-ui/icons/Home' -import ListItemText from '@material-ui/core/ListItemText' -import AddBoxIcon from '@material-ui/icons/AddBox' -import ExitToAppIcon from '@material-ui/icons/ExitToApp' -import React from 'react' -import { makeStyles, useTheme } from '@material-ui/core/styles' -import { grey, lightBlue } from '@material-ui/core/colors' - -const drawerWidth = 240 - -const useStyles = makeStyles((theme) => ({ - grow: { - flexGrow: 1, - }, - menuButton: { - marginRight: theme.spacing(2), - }, - title: { - display: 'none', - [theme.breakpoints.up('sm')]: { - display: 'block', - }, - }, - sectionDesktop: { - display: 'none', - [theme.breakpoints.up('md')]: { - display: 'flex', - }, - }, - sectionMobile: { - display: 'flex', - [theme.breakpoints.up('md')]: { - display: 'none', - }, - }, - - drawer: { - width: drawerWidth, - flexShrink: 0, - }, - drawerPaper: { - width: drawerWidth, - backgroundColor: grey[100], - }, - drawerHeader: { - display: 'flex', - alignItems: 'center', - padding: theme.spacing(0, 1), - ...theme.mixins.toolbar, - justifyContent: 'center', - color: lightBlue[600], - }, - link: { - textDecoration: 'none', - color: 'inherit', - outline: 'none', - }, - toolbar: { - background: lightBlue[600], - }, - icons: { - color: lightBlue[800], - marginRight: 16, - }, -})) - -const Drawer = ({ open, handleLogout, handleDrawerClose }) => { - const classes = useStyles() - const theme = useTheme() - - return ( - -
- Quest - - {theme.direction === 'ltr' ? : } - -
- - - - - - - - - - - - - - - - - - - -
- ) -} - -export default Drawer From a6028df1d38e67eea8a0c9efd837b6832d1c8e96 Mon Sep 17 00:00:00 2001 From: Fibii Date: Tue, 27 Oct 2020 22:52:46 +0100 Subject: [PATCH 46/61] [F][C][UserMenu] use Typography instead of Link in MenuItems --- frontend/src/components/Header/UserMenu.js | 30 ++++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/Header/UserMenu.js b/frontend/src/components/Header/UserMenu.js index 5384089..e8c886f 100644 --- a/frontend/src/components/Header/UserMenu.js +++ b/frontend/src/components/Header/UserMenu.js @@ -3,16 +3,12 @@ import IconButton from '@material-ui/core/IconButton' import AccountCircle from '@material-ui/icons/AccountCircle' import Menu from '@material-ui/core/Menu' import MenuItem from '@material-ui/core/MenuItem' -import { Link } from 'react-router-dom' +import { useHistory } from 'react-router-dom' import { makeStyles } from '@material-ui/core/styles' +import Typography from '@material-ui/core/Typography' import UserContext from '../UserContext/UserContext' const useStyles = makeStyles(() => ({ - link: { - textDecoration: 'none', - color: 'inherit', - outline: 'none', - }, userMenu: { display: 'flex', }, @@ -22,6 +18,7 @@ const UserMenu = ({ state, dispatch }) => { const classes = useStyles() const [user, setUser] = useContext(UserContext) const { anchorEl } = state + const history = useHistory() const handleLogout = () => { setUser(null) @@ -43,6 +40,11 @@ const UserMenu = ({ state, dispatch }) => { handleMenuClose() } + const handleProfileMenu = () => { + history.push(`/user/${user.id}`) + handleMenuClose() + } + const menuId = 'primary-search-account-menu' return (
@@ -72,16 +74,16 @@ const UserMenu = ({ state, dispatch }) => { open={isMenuOpen} onClose={handleMenuClose} > - - + + Profile - + + + + + Logout + - Logout
) From 8376ba2f46e9c0b29db8e624b49067060e01fdd0 Mon Sep 17 00:00:00 2001 From: Fibii Date: Tue, 27 Oct 2020 23:00:43 +0100 Subject: [PATCH 47/61] [F][C][SideBar] add paper to menu items --- frontend/src/components/Header/Sidebar.js | 37 +++++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/Header/Sidebar.js b/frontend/src/components/Header/Sidebar.js index 7e7e341..e9b3516 100644 --- a/frontend/src/components/Header/Sidebar.js +++ b/frontend/src/components/Header/Sidebar.js @@ -14,9 +14,9 @@ import AddBoxIcon from '@material-ui/icons/AddBox' import ExitToAppIcon from '@material-ui/icons/ExitToApp' import React, { useContext } from 'react' import { grey, lightBlue } from '@material-ui/core/colors' +import Paper from '@material-ui/core/Paper' import UserContext from '../UserContext/UserContext' - const drawerWidth = 240 const useStyles = makeStyles((theme) => ({ @@ -45,6 +45,11 @@ const useStyles = makeStyles((theme) => ({ color: lightBlue[800], marginRight: 16, }, + itemPaper: { + marginTop: 4, + marginLeft: 4, + marginRight: 4, + }, })) @@ -83,21 +88,27 @@ const Sidebar = ({ state, dispatch }) => { - - - - + + + + + + - - - - + + + + + + - handleLogout()} data-testid="logoutDrawer-button"> - - - + handleLogout()} className={classes.itemPaper}> + + + + + From 7d1030fc68ad7bcf32a84ea583f9468e4ea7cc45 Mon Sep 17 00:00:00 2001 From: Fibii Date: Tue, 27 Oct 2020 23:01:40 +0100 Subject: [PATCH 48/61] [F][C][SideBar] add 'My Profile' menu --- frontend/src/components/Header/Sidebar.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Header/Sidebar.js b/frontend/src/components/Header/Sidebar.js index e9b3516..9feb0ef 100644 --- a/frontend/src/components/Header/Sidebar.js +++ b/frontend/src/components/Header/Sidebar.js @@ -9,6 +9,7 @@ import List from '@material-ui/core/List' import { Link } from 'react-router-dom' import ListItem from '@material-ui/core/ListItem' import HomeIcon from '@material-ui/icons/Home' +import AccountBoxIcon from '@material-ui/icons/AccountBox' import ListItemText from '@material-ui/core/ListItemText' import AddBoxIcon from '@material-ui/icons/AddBox' import ExitToAppIcon from '@material-ui/icons/ExitToApp' @@ -54,7 +55,7 @@ const useStyles = makeStyles((theme) => ({ })) const Sidebar = ({ state, dispatch }) => { - const [, setUser] = useContext(UserContext) + const [user, setUser] = useContext(UserContext) const { drawerIsOpen } = state const classes = useStyles() const theme = useTheme() @@ -103,6 +104,14 @@ const Sidebar = ({ state, dispatch }) => { + + + + + + + + handleLogout()} className={classes.itemPaper}> From 7568669c68bcb625dacd1c8cca6bdd3e7ac56ac2 Mon Sep 17 00:00:00 2001 From: Fibii Date: Thu, 29 Oct 2020 15:33:24 +0100 Subject: [PATCH 49/61] [F][C][AddCommentForm] fix clear comment button not working --- frontend/src/components/Question/AddCommentForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Question/AddCommentForm.js b/frontend/src/components/Question/AddCommentForm.js index 4dfb4e9..feddc94 100644 --- a/frontend/src/components/Question/AddCommentForm.js +++ b/frontend/src/components/Question/AddCommentForm.js @@ -77,7 +77,7 @@ const AddCommentForm = ({ state, dispatch }) => { > From 841c4d136c65d0384bf39c54259283c7585d8051 Mon Sep 17 00:00:00 2001 From: Fibii Date: Fri, 30 Oct 2020 04:26:50 +0100 Subject: [PATCH 50/61] [F][C][SignInForm] fix redirect to / after 5 seconds after a user logged in when they view a question --- frontend/src/components/SignInForm/SignInForm.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/components/SignInForm/SignInForm.js b/frontend/src/components/SignInForm/SignInForm.js index d38bf1b..9626252 100644 --- a/frontend/src/components/SignInForm/SignInForm.js +++ b/frontend/src/components/SignInForm/SignInForm.js @@ -8,7 +8,6 @@ import Grid from '@material-ui/core/Grid' import { makeStyles, withStyles } from '@material-ui/core/styles' import { lightBlue } from '@material-ui/core/colors' import userService from '../../services/users' -import questionService from '../../services/questions' import SignContainer from '../Containers/SignContainer/SignContainer' import loginImg from '../../resources/images/login.png' import QLink from '../QLink/QLink' @@ -65,7 +64,7 @@ const SignIn = () => { const history = useHistory() - if (user && user.id) { + if (user && user.id && history.action === 'POP') { setTimeout(() => history.push('/'), 5000) return ( Date: Fri, 30 Oct 2020 04:27:28 +0100 Subject: [PATCH 51/61] [F][C][SignInForm] add marginTop to Notification --- frontend/src/components/SignInForm/SignInForm.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/components/SignInForm/SignInForm.js b/frontend/src/components/SignInForm/SignInForm.js index 9626252..8fef2d9 100644 --- a/frontend/src/components/SignInForm/SignInForm.js +++ b/frontend/src/components/SignInForm/SignInForm.js @@ -71,6 +71,7 @@ const SignIn = () => { title="Already logged in" message="You're already logged in, you'll be redirected to the homepage in 5 seconds" severity="info" + style={{ marginTop: 32 }} /> ) } From b1c9d072d41e8794276f9336eb1f57ad3eae76da Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 15:39:30 +0100 Subject: [PATCH 52/61] [F][S][users] update error message for login/createUser --- frontend/src/components/SignInForm/SignInForm.js | 2 +- frontend/src/components/SignupForm/SignupForm.js | 3 ++- frontend/src/services/users.js | 10 ++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/SignInForm/SignInForm.js b/frontend/src/components/SignInForm/SignInForm.js index 8fef2d9..a26749f 100644 --- a/frontend/src/components/SignInForm/SignInForm.js +++ b/frontend/src/components/SignInForm/SignInForm.js @@ -84,7 +84,7 @@ const SignIn = () => { rememberMe: rememberUser, }) if (!user || user.error) { - setErrorMessage('error, incorrect username or password') + setErrorMessage(user.error) setTimeout(() => setErrorMessage(''), 5000) } else { setUser(user) diff --git a/frontend/src/components/SignupForm/SignupForm.js b/frontend/src/components/SignupForm/SignupForm.js index 4587838..c4229cd 100644 --- a/frontend/src/components/SignupForm/SignupForm.js +++ b/frontend/src/components/SignupForm/SignupForm.js @@ -138,7 +138,8 @@ const SignupForm = () => { } else { const newUser = await userService.createUser(user) if (!newUser || newUser.error) { - setErrorMessage('error: couldn\'t connect to the server') + setErrorMessage(newUser.error) + setTimeout(() => setErrorMessage(''), 5000) } else { history.push('/login') } diff --git a/frontend/src/services/users.js b/frontend/src/services/users.js index f44b12c..936292c 100644 --- a/frontend/src/services/users.js +++ b/frontend/src/services/users.js @@ -11,9 +11,12 @@ const login = async (credentials) => { const response = await axios.post(`${baseUrl}/login/`, credentials, config) return response.data } catch (error) { - console.log(error) + console.log(error.response) + if (error.response.status === 401 || error.response.status === 404) { + return { error: 'invalid username or password' } + } + return { error: "Couldn't connect to the server, try again later or contact the owner" } } - return false } const createUser = async (user) => { @@ -21,9 +24,8 @@ const createUser = async (user) => { const response = await axios.post(`${baseUrl}/users`, user, config) return response.data } catch (error) { - console.log(error) + return { error: "Couldn't connect to the server, try again later or contact the owner" } } - return false } const getUser = async (userId) => { From 45c0876ffdfff137181bb5a38a0a719dea5b86eb Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 15:57:20 +0100 Subject: [PATCH 53/61] [F][C][SignInForm] add client validation for username and password --- frontend/src/components/SignInForm/SignInForm.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/components/SignInForm/SignInForm.js b/frontend/src/components/SignInForm/SignInForm.js index a26749f..0a749d2 100644 --- a/frontend/src/components/SignInForm/SignInForm.js +++ b/frontend/src/components/SignInForm/SignInForm.js @@ -78,6 +78,11 @@ const SignIn = () => { const formHandler = async (event) => { event.preventDefault() + if (username.length < 3 || password.length < 3) { + setErrorMessage('username and password must have a minimum length of 3') + setTimeout(() => setErrorMessage(''), 5000) + return + } const user = await userService.login({ username, password, From 8c6e76c4fe5d8c0fd69baf7ee4e76cd09563fb22 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 15:59:17 +0100 Subject: [PATCH 54/61] [F][C][QuestLogo] fix Quest logo hiding on small screens --- frontend/src/components/Header/QuestLogo.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/Header/QuestLogo.js b/frontend/src/components/Header/QuestLogo.js index cacbaed..80e16b5 100644 --- a/frontend/src/components/Header/QuestLogo.js +++ b/frontend/src/components/Header/QuestLogo.js @@ -3,17 +3,14 @@ import Typography from '@material-ui/core/Typography' import React from 'react' import { makeStyles } from '@material-ui/core/styles' -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(() => ({ link: { textDecoration: 'none', color: 'inherit', outline: 'none', }, title: { - display: 'none', - [theme.breakpoints.up('sm')]: { - display: 'block', - }, + display: 'block', }, })) From 26e1bb6b21ffef4ed989b141618ae5eb77f60e6e Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 16:14:29 +0100 Subject: [PATCH 55/61] [F][C][Containers] add style objects as props --- .../components/Containers/HVContainer/HVContainer.js | 10 +++++++--- .../components/Containers/VHContainer/VHContainer.js | 11 ++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/Containers/HVContainer/HVContainer.js b/frontend/src/components/Containers/HVContainer/HVContainer.js index a25de6d..48079d2 100644 --- a/frontend/src/components/Containers/HVContainer/HVContainer.js +++ b/frontend/src/components/Containers/HVContainer/HVContainer.js @@ -10,12 +10,16 @@ const useStyles = makeStyles(() => ({ /** * A Grid that centers it's child horizontally then vertically + * + * @param children: react components + * @param outerStyle: css style of the first Grid + * @param innerStyle: css style of the second Grid * */ -const HVContainer = ({ children, style, dataTestId }) => { +const HVContainer = ({ children, outerStyle, innerStyle }) => { const classes = useStyles() return ( - - + + {children} diff --git a/frontend/src/components/Containers/VHContainer/VHContainer.js b/frontend/src/components/Containers/VHContainer/VHContainer.js index 12a17af..f5fc711 100644 --- a/frontend/src/components/Containers/VHContainer/VHContainer.js +++ b/frontend/src/components/Containers/VHContainer/VHContainer.js @@ -10,12 +10,17 @@ const useStyles = makeStyles(() => ({ /** * A Grid that centers it's child vertically then horizontally + * + * @param children: react components + * @param outerStyle: css style of the first Grid + * @param innerStyle: css style of the second Grid * */ -const VHContainer = ({ children, style, dataTestId }) => { + +const VHContainer = ({ children, outerStyle, innerStyle }) => { const classes = useStyles() return ( - - + + {children} From 7895c02e4f9f9447c093763ee9b4e36d98151cf6 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 16:17:13 +0100 Subject: [PATCH 56/61] [F][C][NewQuestionForm] add styling for mobile container --- frontend/src/app.css | 7 +++++++ frontend/src/components/NewQuestionForm/NewQuestionForm.js | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/frontend/src/app.css b/frontend/src/app.css index 1422387..6044678 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=Alegreya+Sans:wght@300&family=Volkhov&display=swap'); + html { min-height: 100%; background: #f4f6ff; @@ -16,3 +18,8 @@ html, body { #root { height: 100%; } + + +.landing-page-font { + font-family: 'Libre Baskerville', serif; +} diff --git a/frontend/src/components/NewQuestionForm/NewQuestionForm.js b/frontend/src/components/NewQuestionForm/NewQuestionForm.js index 4aedc61..4361a9d 100644 --- a/frontend/src/components/NewQuestionForm/NewQuestionForm.js +++ b/frontend/src/components/NewQuestionForm/NewQuestionForm.js @@ -324,7 +324,7 @@ const NewQuestionForm = () => { if (isMobile) { return ( - + { } return ( - + Date: Sat, 7 Nov 2020 16:24:15 +0100 Subject: [PATCH 57/61] [F][C][Welcome] redesign Welcome --- frontend/src/components/Welcome/Welcome.js | 230 ++++++++++++++------ frontend/src/resources/images/questions.png | Bin 0 -> 89211 bytes 2 files changed, 162 insertions(+), 68 deletions(-) create mode 100644 frontend/src/resources/images/questions.png diff --git a/frontend/src/components/Welcome/Welcome.js b/frontend/src/components/Welcome/Welcome.js index 31e143d..2bfc525 100644 --- a/frontend/src/components/Welcome/Welcome.js +++ b/frontend/src/components/Welcome/Welcome.js @@ -2,92 +2,186 @@ import React from 'react' import { useHistory } from 'react-router-dom' import Typography from '@material-ui/core/Typography' -import Button from '@material-ui/core/Button' import Grid from '@material-ui/core/Grid' -import { makeStyles } from '@material-ui/core/styles' -import Container from '@material-ui/core/Container' -import grey from '@material-ui/core/colors/grey' +import { makeStyles, withStyles } from '@material-ui/core/styles' +import { lightBlue } from '@material-ui/core/colors' +import Button from '@material-ui/core/Button' +import useMediaQuery from '@material-ui/core/useMediaQuery' +import questions from '../../resources/images/questions.png' +import VHContainer from '../Containers/VHContainer/VHContainer' +import HVContainer from '../Containers/HVContainer/HVContainer' const useStyles = makeStyles((theme) => ({ - icon: { - marginRight: theme.spacing(2), - }, - heroContent: { - backgroundColor: theme.palette.background.paper, - padding: theme.spacing(8, 0, 6), + typographyContainer: { + width: '50%', + display: 'flex', + alignItems: 'center', + [theme.breakpoints.down('md')]: { + width: '60%', + }, + [theme.breakpoints.down('sm')]: { + alignItems: 'flex-end', + }, }, - heroButtons: { - marginTop: theme.spacing(4), + firstHeader: { + fontFamily: 'Volkhov', + fontSize: '42px', + [theme.breakpoints.down('lg')]: { + fontSize: '32px', + }, + [theme.breakpoints.down('md')]: { + fontSize: '28px', + }, }, - buttons: { - backgroundColor: grey[600], + secondHeader: { + fontFamily: 'Volkhov', + fontSize: '48px', + [theme.breakpoints.down('lg')]: { + fontSize: '38px', + }, + [theme.breakpoints.down('md')]: { + fontSize: '34px', + }, }, - cardGrid: { - paddingTop: theme.spacing(8), - paddingBottom: theme.spacing(8), + body: { + fontFamily: 'Alegreya Sans', + fontSize: '32px', + [theme.breakpoints.down('lg')]: { + fontSize: '22px', + }, + [theme.breakpoints.down('md')]: { + fontSize: '18px', + }, }, - card: { - height: '100%', + imageContainer: { + width: '60%', display: 'flex', - flexDirection: 'column', + alignItems: 'flex-end', + [theme.breakpoints.down('md')]: { + alignItems: 'center', + }, + [theme.breakpoints.down('sm')]: { + marginTop: 8, + width: '100%', + }, }, - cardMedia: { - paddingTop: '56.25%', // 16:9 + buttonsContainer: { + marginTop: 12, + [theme.breakpoints.down('md')]: { + justifyContent: 'flex-end', + }, }, - cardContent: { - flexGrow: 1, +})) + +const SignInButton = withStyles((theme) => ({ + root: { + backgroundColor: '#ffffff', + border: '1px solid', + boxShadow: 'none', + marginRight: 12, + width: 140, + height: 50, + fontSize: '14px', + '&:hover': { + backgroundColor: '#ebebeb', + boxShadow: 'none', + }, + [theme.breakpoints.down('md')]: { + width: 100, + }, + [theme.breakpoints.down('sm')]: { + width: 80, + height: 40, + fontSize: '12px', + }, }, - footer: { - backgroundColor: theme.palette.background.paper, - padding: theme.spacing(6), +}))(Button) + +const SignUpButton = withStyles((theme) => ({ + root: { + backgroundColor: '#f9c138', + border: '1px solid', + boxShadow: 'none', + width: 140, + height: 50, + fontSize: '14px', + '&:hover': { + backgroundColor: '#d69f37', + boxShadow: 'none', + }, + [theme.breakpoints.down('md')]: { + width: 100, + }, + [theme.breakpoints.down('sm')]: { + width: 80, + height: 40, + fontSize: '12px', + }, }, -})) +}))(Button) -const Welcome = () => { - const classes = useStyles() +const DesktopView = () => { const history = useHistory() + const classes = useStyles() return ( -
- - - Welcome to QA - - - Question Answer webapp, made using react for the frontend and expressjs for the backend, - alongside mongodb as a database choice, or we can just say made using mern stack :) - - - * you must be logged in to see how the app works, either * - -
- - - + ( + + + + + Ask Question, Get + Answers + + Quest is a question/answer webapp where users ask questions, + and other users answer those questions + + + history.push('/login')}>Sign In + history.push('/register')}>Sign Up + - - + + + Quest logo + + + + ) + ) +} +const Welcome = () => { + const history = useHistory() + const classes = useStyles() + const isMobile = useMediaQuery('(max-width:700px)') + + if (isMobile) { + return ( + + + + Ask Question, Get + Answers + + Quest is a question/answer webapp where users ask questions, + and other users answer those questions + + + Quest logo + + + history.push('/login')}>Sign In + history.push('/register')}>Sign Up -
-
-
+
+ + ) + } + + return ( + + + ) } diff --git a/frontend/src/resources/images/questions.png b/frontend/src/resources/images/questions.png new file mode 100644 index 0000000000000000000000000000000000000000..862d1c0ff196af5aca9595b0dc48860a7bc46406 GIT binary patch literal 89211 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 bFnS5nshyiytw=w<`oF4*=96+ItFZqEk9l>k literal 0 HcmV?d00001 From 011093f5d35f438506bdf6792979816f6cfa7532 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 16:24:38 +0100 Subject: [PATCH 58/61] [F][R] add 404 image --- frontend/src/resources/images/404.png | Bin 0 -> 35648 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 frontend/src/resources/images/404.png diff --git a/frontend/src/resources/images/404.png b/frontend/src/resources/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..9d032f024f7d91033ad1961a1a466adb5673ddea GIT binary patch literal 35648 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 literal 0 HcmV?d00001 From 9ceffb34754f04b97ca96c81c88f17a890edd811 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 16:34:14 +0100 Subject: [PATCH 59/61] [F][R] update title in index.html --- frontend/public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/index.html b/frontend/public/index.html index aa069f2..437bd86 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -24,7 +24,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + Quest From bc27da7473e8e2b6a531f373fdefaf21adfb6353 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 16:52:58 +0100 Subject: [PATCH 60/61] [B][C][login] more login validations --- backend/controllers/login.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/controllers/login.js b/backend/controllers/login.js index a5ca16a..30dbc04 100644 --- a/backend/controllers/login.js +++ b/backend/controllers/login.js @@ -24,10 +24,17 @@ router.post('/', async (request, response, next) => { const { username } = request.body const { password } = request.body const { rememberMe } = request.body + + if (!username || !password) { + return response.status(401).json({ + error: 'both username and password are required', + }) + } + const user = await User.findOne({ username }) - if (!user || !password) { - return response.status(404).json({ + if (!user) { + return response.status(401).json({ error: "user doesn't exist", }) } From d3b2da9d765974f2ff1e580e017fff7ab10993f9 Mon Sep 17 00:00:00 2001 From: Fibii Date: Sat, 7 Nov 2020 17:26:35 +0100 Subject: [PATCH 61/61] [B] add route to use react build, add script to start in PROD --- backend/app.js | 10 +++++++--- backend/package.json | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/app.js b/backend/app.js index bd9047d..954e3cd 100644 --- a/backend/app.js +++ b/backend/app.js @@ -8,7 +8,6 @@ const cors = require('cors') const cookieParser = require('cookie-parser') const middleware = require('./utils/middleware') -const indexRouter = require('./controllers/index') const usersRouter = require('./controllers/users') const questionRouter = require('./controllers/questions') const loginRouter = require('./controllers/login') @@ -62,13 +61,18 @@ app.use(cors({ app.use(express.json()) app.use(middleware.tokenExtractor) app.use(express.urlencoded({ extended: false })) -app.use(express.static(path.join(__dirname, 'public'))) +app.use(express.static(path.join(__dirname, '../frontend/build'))) -app.use('/', indexRouter) app.use('/api/users', usersRouter) app.use('/api/questions', questionRouter) app.use('/api/login', loginRouter) +if (process.env.NODE_ENV === 'PROD') { + app.get('*', (request, response) => { + response.sendFile(path.resolve(__dirname, '../frontend', 'build', 'index.html')) + }) +} + app.use(middleware.errorLogger) app.use(middleware.unknownEndpoint) app.use(middleware.errorHandler) diff --git a/backend/package.json b/backend/package.json index 44b9b5f..06c2afb 100644 --- a/backend/package.json +++ b/backend/package.json @@ -3,7 +3,8 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "NODE_ENV=ENV node index.js", + "start": "NODE_ENV=PROD node index.js", + "start-prod": "NODE_ENV=PROD node index.js", "test": "jest --runInBand --detectOpenHandles --forceExit" }, "dependencies": {