From 0b00fdfb4b76ae941e4335b8d8cc04f16abeee39 Mon Sep 17 00:00:00 2001 From: alexHoggett Date: Tue, 7 Feb 2023 13:55:34 +0000 Subject: [PATCH 01/29] adding comments --- frontend/src/components/auth/LoginForm.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/components/auth/LoginForm.js b/frontend/src/components/auth/LoginForm.js index 69ce0a192..cd65c9df5 100644 --- a/frontend/src/components/auth/LoginForm.js +++ b/frontend/src/components/auth/LoginForm.js @@ -16,9 +16,11 @@ const LogInForm = ({ navigate }) => { }) if(response.status !== 201) { + // if the user is not already signed in, render the login form console.log("yay") navigate('/login') } else { + // otherwise, redirect to the posts page console.log("oop") let data = await response.json() window.localStorage.setItem("token", data.token) From 6b74edcaceb7dc07eba7bfef248572c1eb9dc0e7 Mon Sep 17 00:00:00 2001 From: alexHoggett Date: Wed, 8 Feb 2023 13:40:47 +0000 Subject: [PATCH 02/29] added navbar folder --- api/controllers/tokens.js | 3 +++ api/controllers/users.js | 2 ++ frontend/src/components/auth/LoginForm.js | 3 ++- frontend/src/components/feed/Feed.js | 6 ++++-- frontend/src/components/post/Post.js | 1 + 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/api/controllers/tokens.js b/api/controllers/tokens.js index cc983053a..46ac5bd4e 100644 --- a/api/controllers/tokens.js +++ b/api/controllers/tokens.js @@ -9,12 +9,15 @@ const SessionsController = { User.findOne({ email: email }).then(async (user) => { if (!user) { + // if the user doesn't exist in the db console.log("auth error: user not found") res.status(401).json({ message: "auth error" }); } else if (user.password !== password) { + // if the passwords don't match console.log("auth error: passwords do not match") res.status(401).json({ message: "auth error" }); } else { + // successful login, generate a new token and assign it to that user_id const token = await TokenGenerator.jsonwebtoken(user.id) res.status(201).json({ token: token, message: "OK" }); } diff --git a/api/controllers/users.js b/api/controllers/users.js index 8f195d29e..f5bae25ef 100644 --- a/api/controllers/users.js +++ b/api/controllers/users.js @@ -5,8 +5,10 @@ const UsersController = { const user = new User(req.body); user.save((err) => { if (err) { + // if account already exists res.status(400).json({message: 'Bad request'}) } else { + // account does not already exist res.status(201).json({ message: 'OK' }); } }); diff --git a/frontend/src/components/auth/LoginForm.js b/frontend/src/components/auth/LoginForm.js index cd65c9df5..52d399d27 100644 --- a/frontend/src/components/auth/LoginForm.js +++ b/frontend/src/components/auth/LoginForm.js @@ -23,11 +23,12 @@ const LogInForm = ({ navigate }) => { // otherwise, redirect to the posts page console.log("oop") let data = await response.json() - window.localStorage.setItem("token", data.token) + window.localStorage.setItem("token", data.token) // not sure what the window obeject is? navigate('/posts'); } } + // React controlled components, update state when input values change const handleEmailChange = (event) => { setEmail(event.target.value) } diff --git a/frontend/src/components/feed/Feed.js b/frontend/src/components/feed/Feed.js index fc89c68fc..8b969ba3a 100644 --- a/frontend/src/components/feed/Feed.js +++ b/frontend/src/components/feed/Feed.js @@ -26,8 +26,10 @@ const Feed = ({ navigate }) => { window.localStorage.removeItem("token") navigate('/login') } - + if(token) { + console.log(window.localStorage.getItem("token")); + return( <>

Posts

@@ -42,7 +44,7 @@ const Feed = ({ navigate }) => { ) } else { - navigate('/signin') + navigate('/login') } } diff --git a/frontend/src/components/post/Post.js b/frontend/src/components/post/Post.js index 87a77c109..25b46b734 100644 --- a/frontend/src/components/post/Post.js +++ b/frontend/src/components/post/Post.js @@ -1,6 +1,7 @@ import React from 'react'; const Post = ({post}) => { + console.log('posts page') return(
{ post.message }
) From 1dccb0823ce0350c984745a824e7c1d5683a41dc Mon Sep 17 00:00:00 2001 From: alexHoggett Date: Wed, 8 Feb 2023 13:42:21 +0000 Subject: [PATCH 03/29] added navbar.js --- frontend/src/components/navbar/navbar.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 frontend/src/components/navbar/navbar.js diff --git a/frontend/src/components/navbar/navbar.js b/frontend/src/components/navbar/navbar.js new file mode 100644 index 000000000..7d13c432e --- /dev/null +++ b/frontend/src/components/navbar/navbar.js @@ -0,0 +1 @@ +ho \ No newline at end of file From bda298db65f2ff409fc5c20fe40ab01da3af781c Mon Sep 17 00:00:00 2001 From: MichalSmyk Date: Wed, 8 Feb 2023 15:50:58 +0000 Subject: [PATCH 04/29] implemented add post ticket with post form component --- api/routes/posts.js | 1 + frontend/src/components/feed/Feed.css | 22 + frontend/src/components/feed/Feed.js | 10 +- frontend/src/components/post/Post.css | 9 + frontend/src/components/post/Post.js | 9 +- frontend/src/components/post/PostForm.js | 53 ++ package-lock.json | 1023 ++++++++++++++++++++++ package.json | 5 + 8 files changed, 1128 insertions(+), 4 deletions(-) create mode 100644 frontend/src/components/post/PostForm.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/api/routes/posts.js b/api/routes/posts.js index 3f9be8e0d..ca3bd20ce 100644 --- a/api/routes/posts.js +++ b/api/routes/posts.js @@ -6,4 +6,5 @@ const PostsController = require("../controllers/posts"); router.get("/", PostsController.Index); router.post("/", PostsController.Create); + module.exports = router; diff --git a/frontend/src/components/feed/Feed.css b/frontend/src/components/feed/Feed.css index e69de29bb..25e45eb5b 100644 --- a/frontend/src/components/feed/Feed.css +++ b/frontend/src/components/feed/Feed.css @@ -0,0 +1,22 @@ +.btn{ + width: 100px; + font-size: 16px; + line-height: 30px; + padding: 3px 8px; + border-radius: 30%; +} + +.btn:hover { + font-size: 17px;; +} + +.h2{ + width: 100px; + font-size: 44px; + line-height: 30px; + padding: 3px 8px; + border-radius: 25%; + border-color: aqua; + color: blue; + background-color: aqua; +} \ No newline at end of file diff --git a/frontend/src/components/feed/Feed.js b/frontend/src/components/feed/Feed.js index fc89c68fc..c28c67813 100644 --- a/frontend/src/components/feed/Feed.js +++ b/frontend/src/components/feed/Feed.js @@ -1,9 +1,13 @@ import React, { useEffect, useState } from 'react'; import Post from '../post/Post' +import './Feed.css'; + +import PostForm from '../post/PostForm'; const Feed = ({ navigate }) => { const [posts, setPosts] = useState([]); const [token, setToken] = useState(window.localStorage.getItem("token")); + const [form, setForm] = useState(false); useEffect(() => { if(token) { @@ -30,8 +34,10 @@ const Feed = ({ navigate }) => { if(token) { return( <> -

Posts

- + {form && } +
diff --git a/frontend/src/components/post/Post.css b/frontend/src/components/post/Post.css index e69de29bb..6afbe04a1 100644 --- a/frontend/src/components/post/Post.css +++ b/frontend/src/components/post/Post.css @@ -0,0 +1,9 @@ +.post { + width: 30%; + height: 30%; + margin-top: 15px; + border-radius: 15px; + background-color: rgb(204, 206, 236); + box-shadow: 0px 5px 7px -7px rgba(0, 0, 0, 0.75); + text-align: center; +} \ No newline at end of file diff --git a/frontend/src/components/post/Post.js b/frontend/src/components/post/Post.js index 87a77c109..d5fc1a3b1 100644 --- a/frontend/src/components/post/Post.js +++ b/frontend/src/components/post/Post.js @@ -1,9 +1,14 @@ import React from 'react'; +import './Post.css'; const Post = ({post}) => { + + return( -
{ post.message }
+
+
{ post.message }
+
) } - export default Post; + diff --git a/frontend/src/components/post/PostForm.js b/frontend/src/components/post/PostForm.js new file mode 100644 index 000000000..c998cbd90 --- /dev/null +++ b/frontend/src/components/post/PostForm.js @@ -0,0 +1,53 @@ +import React, { useState } from 'react'; + +const PostForm = ({post}) => { + console.log(window.localStorage) + const[newPost, setNewPost] = useState("") + + const handleSubmit = async (event) => { + // event.preventDefault(); + const token = window.localStorage.getItem("token") + let response = await fetch( '/posts', { + method: 'post', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ message: newPost }) + }) + + if(response.status !== 201) { + console.log("post was not created"); + + } else { + console.log("post was created") + let data = await response.json() + window.localStorage.setItem("token", data.token); + + } + } + + const handlePostChange = (event) => { + setNewPost(event.target.value) + } + + return( + + +
+
+ + +
+
+ ) + } + +export default PostForm; + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..186840f78 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1023 @@ +{ + "name": "acebook-mern-fire", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "eslint": "^8.33.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "dependencies": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..f262e01ce --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "eslint": "^8.33.0" + } +} From e74409ccda8d02eb49e6b8098c90185985584ca1 Mon Sep 17 00:00:00 2001 From: josh-p-git Date: Wed, 8 Feb 2023 16:03:38 +0000 Subject: [PATCH 05/29] navbar login logout function --- frontend/src/components/app/App.js | 11 ++++-- frontend/src/components/feed/Feed.js | 12 +++---- frontend/src/components/navbar/Navbar.css | 32 +++++++++++++++++ frontend/src/components/navbar/Navbar.cy.js | 0 frontend/src/components/navbar/navbar.js | 39 ++++++++++++++++++++- frontend/src/components/post/Post.js | 4 ++- frontend/src/index.js | 5 +++ 7 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 frontend/src/components/navbar/Navbar.css create mode 100644 frontend/src/components/navbar/Navbar.cy.js diff --git a/frontend/src/components/app/App.js b/frontend/src/components/app/App.js index 760c05a4a..db0751063 100644 --- a/frontend/src/components/app/App.js +++ b/frontend/src/components/app/App.js @@ -1,8 +1,10 @@ import './App.css'; -import LoginForm from '../auth/LoginForm' -import SignUpForm from '../user/SignUpForm' +import LoginForm from '../auth/LoginForm'; +import SignUpForm from '../user/SignUpForm'; import React, { useState } from 'react'; -import Feed from '../feed/Feed' +import Feed from '../feed/Feed'; +import Navbar from '../navbar/Navbar'; + import { useNavigate, Routes, @@ -11,11 +13,14 @@ import { const App = () => { return ( + <> + }/> }/> }/> + ); } diff --git a/frontend/src/components/feed/Feed.js b/frontend/src/components/feed/Feed.js index 8b969ba3a..3c30f0c72 100644 --- a/frontend/src/components/feed/Feed.js +++ b/frontend/src/components/feed/Feed.js @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import Post from '../post/Post' +import Post from '../post/Post'; const Feed = ({ navigate }) => { const [posts, setPosts] = useState([]); @@ -26,14 +26,12 @@ const Feed = ({ navigate }) => { window.localStorage.removeItem("token") navigate('/login') } - + if(token) { - console.log(window.localStorage.getItem("token")); - return( - <> + <>

Posts

-
@@ -44,7 +42,7 @@ const Feed = ({ navigate }) => { ) } else { - navigate('/login') + navigate('/signin') } } diff --git a/frontend/src/components/navbar/Navbar.css b/frontend/src/components/navbar/Navbar.css new file mode 100644 index 000000000..447395247 --- /dev/null +++ b/frontend/src/components/navbar/Navbar.css @@ -0,0 +1,32 @@ +/* .nav{ + background-color: red; + color: green; +} */ + +.nav-container{ + display: flex; + flex-direction: row; + background-color: #1778f2; + color: white; +} + +.nav-list{ + padding: 10px; + margin: 10px; + display: flex; + flex-direction: row; + list-style: none; +} + +.logo{ + margin-right: auto; + padding: 10px; +} + +.nav-item{ + +} + +.nav-item:not(:last-child){ + margin-right: 20px; +} \ No newline at end of file diff --git a/frontend/src/components/navbar/Navbar.cy.js b/frontend/src/components/navbar/Navbar.cy.js new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/components/navbar/navbar.js b/frontend/src/components/navbar/navbar.js index 7d13c432e..4905e1f5d 100644 --- a/frontend/src/components/navbar/navbar.js +++ b/frontend/src/components/navbar/navbar.js @@ -1 +1,38 @@ -ho \ No newline at end of file +import React from 'react'; +import './Navbar.css'; + + +const Navbar = ({ navigate, signedIn }) => { + const logout = () => { + window.localStorage.removeItem("token"); + navigate('/login'); + }; + + return ( + + ) +} + + + +export default Navbar; \ No newline at end of file diff --git a/frontend/src/components/post/Post.js b/frontend/src/components/post/Post.js index 25b46b734..877905c60 100644 --- a/frontend/src/components/post/Post.js +++ b/frontend/src/components/post/Post.js @@ -3,7 +3,9 @@ import React from 'react'; const Post = ({post}) => { console.log('posts page') return( -
{ post.message }
+
+
{ post.message }
+
) } diff --git a/frontend/src/index.js b/frontend/src/index.js index e37d8a008..5289cc680 100644 --- a/frontend/src/index.js +++ b/frontend/src/index.js @@ -14,6 +14,11 @@ root.render( ); +// stop the page from refreshing, whilst displaying the correct data +if (module.hot) { + module.hot.accept(); +} + // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals From c66a4597f4e736b5132845c80b262aed7ce5ef8d Mon Sep 17 00:00:00 2001 From: Adam Hoar <42139484+amh4@users.noreply.github.com> Date: Wed, 8 Feb 2023 16:19:46 +0000 Subject: [PATCH 06/29] Test passed for new user fields in model --- api/spec/models/user.spec.js | 43 +++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/api/spec/models/user.spec.js b/api/spec/models/user.spec.js index ed1c93ef5..42e246049 100644 --- a/api/spec/models/user.spec.js +++ b/api/spec/models/user.spec.js @@ -14,6 +14,7 @@ describe("User model", () => { const user = new User({ email: "someone@example.com", password: "password", + }); expect(user.email).toEqual("someone@example.com"); }); @@ -34,24 +35,30 @@ describe("User model", () => { }); }); - it("can save a user", (done) => { - const user = new User({ - email: "someone@example.com", - password: "password", - }); - - user.save((err) => { - expect(err).toBeNull(); + it('can save a user with an array of numbers', (done) => { + const user = new User({ + email: "someone@example.com", + password: "password", + firstName: "Rachel", + surname: "Newby", + friendsList: [1, 2, 3] + }); - User.find((err, users) => { + user.save((err) => { expect(err).toBeNull(); - - expect(users[0]).toMatchObject({ - email: "someone@example.com", - password: "password", - }); - done(); - }); + + User.find((err, users) => { + expect(err).toBeNull(); + + expect(users[0].toJSON()).toMatchObject({ + email: "someone@example.com", + password: "password", + firstName: "Rachel", + surname: "Newby", + friendsList: [1, 2, 3] + }); + done(); + }) }); - }); -}); + }) +}); \ No newline at end of file From 868f5bf495896fe014b6d6b6c46c85c4ab2d3d5d Mon Sep 17 00:00:00 2001 From: luiz santos Date: Thu, 9 Feb 2023 10:21:28 +0000 Subject: [PATCH 07/29] added comments to the postForm component --- frontend/src/components/post/PostForm.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/post/PostForm.js b/frontend/src/components/post/PostForm.js index c998cbd90..07299271b 100644 --- a/frontend/src/components/post/PostForm.js +++ b/frontend/src/components/post/PostForm.js @@ -27,20 +27,20 @@ const PostForm = ({post}) => { } } - const handlePostChange = (event) => { + const handlePostInputChange = (event) => { + //updates the current content inside the input html tag setNewPost(event.target.value) } return( -
-
+
From df8ce635de14b071077f503eabb7d4bf2bf256d5 Mon Sep 17 00:00:00 2001 From: MichalSmyk Date: Thu, 9 Feb 2023 10:25:13 +0000 Subject: [PATCH 08/29] more coments added to the code --- frontend/src/components/post/PostForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/post/PostForm.js b/frontend/src/components/post/PostForm.js index 07299271b..3afd3647b 100644 --- a/frontend/src/components/post/PostForm.js +++ b/frontend/src/components/post/PostForm.js @@ -6,12 +6,12 @@ const PostForm = ({post}) => { const handleSubmit = async (event) => { // event.preventDefault(); - const token = window.localStorage.getItem("token") + const token = window.localStorage.getItem("token") //every event that will be handled by LOGGED IN user has to have this bit, its about JWT let response = await fetch( '/posts', { method: 'post', headers: { 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` + 'Authorization': `Bearer ${token}` // This is the token header }, body: JSON.stringify({ message: newPost }) }) From e47b4fb4e53188a7320dd7ca3bffc5a8a06abd55 Mon Sep 17 00:00:00 2001 From: alexHoggett Date: Thu, 9 Feb 2023 10:44:51 +0000 Subject: [PATCH 09/29] completed navbar component --- .DS_Store | Bin 6148 -> 6148 bytes frontend/public/logo-blue.png | Bin 0 -> 32813 bytes frontend/src/components/feed/Feed.js | 2 +- frontend/src/components/navbar/Navbar.css | 32 ++++++++++++++++------ frontend/src/components/navbar/navbar.js | 2 +- 5 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 frontend/public/logo-blue.png diff --git a/.DS_Store b/.DS_Store index e7f3f5eec34bc7cc95f9f70fbcc64a02f71dd730..4f5c149b02b715c25cab538d4e9857e81a374f79 100644 GIT binary patch delta 255 zcmZoMXfc@J&nUDpU^g?P&}JSM8OHjg^5TM|octsP28P{91v#0;B?bo97@3$^SlQS) z*g3d4VuLgC%Y#c2OG=BK5{sfiypa6-oFo`KF)1uFwLD%x#5q5&Br!8DwFs;sGbI(M zBqlsFFD1X+DZex?r5LO?7$U*J$-x;fAYJWIZD?U(prc@DXlhccqfl*VXaMAynj6&C za&m|&>strKXXoVR<@W;J2Lz0a5SoD(O2eqW$qB3?lQme|CnvKC@{|P^<>ln(rGs>A OUc;KexS5^fFFyc2okjNm delta 36 scmZoMXfc@J&nU1lU^g?Pz-As68OF)XZ0(y@vBfe@Z1}yIo#QV*0L(oL#{d8T diff --git a/frontend/public/logo-blue.png b/frontend/public/logo-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..64e1c354800da67bc422a1a0941844eb6c77b636 GIT binary patch literal 32813 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

{h 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 { ) } else { - navigate('/signin') + navigate('/login') } } diff --git a/frontend/src/components/navbar/Navbar.css b/frontend/src/components/navbar/Navbar.css index 447395247..a03d4c5e7 100644 --- a/frontend/src/components/navbar/Navbar.css +++ b/frontend/src/components/navbar/Navbar.css @@ -1,8 +1,3 @@ -/* .nav{ - background-color: red; - color: green; -} */ - .nav-container{ display: flex; flex-direction: row; @@ -14,19 +9,40 @@ padding: 10px; margin: 10px; display: flex; + align-items: center; flex-direction: row; list-style: none; + /* transition: all 0.3s; */ } .logo{ margin-right: auto; - padding: 10px; +} + +.logo-img{ + height: 70px; +} + +a{ + color: white; + font-size: 20px; + text-decoration: none; + cursor: pointer; + transition: all 0.3s; } .nav-item{ - + transition: all 0.3s; +} + +a:hover{ + /* color: red; */ +} + +.nav-item:hover{ + transform: scale(1.1); } .nav-item:not(:last-child){ - margin-right: 20px; + margin-right: 40px; } \ No newline at end of file diff --git a/frontend/src/components/navbar/navbar.js b/frontend/src/components/navbar/navbar.js index 4905e1f5d..05620a18b 100644 --- a/frontend/src/components/navbar/navbar.js +++ b/frontend/src/components/navbar/navbar.js @@ -10,7 +10,7 @@ const Navbar = ({ navigate, signedIn }) => { return (