├── .gitignore ├── README.md ├── client ├── .eslintrc.cjs ├── .gitignore ├── index.html ├── package.json ├── public │ └── vite.svg ├── src │ ├── App.css │ ├── App.jsx │ ├── assets │ │ └── react.svg │ ├── components │ │ ├── header │ │ │ ├── Header.jsx │ │ │ ├── header.css │ │ │ ├── header.css.map │ │ │ └── header.scss │ │ ├── registration │ │ │ ├── Signin.jsx │ │ │ ├── Signup.jsx │ │ │ ├── registration.css │ │ │ ├── registration.css.map │ │ │ └── registration.scss │ │ ├── sidebar │ │ │ ├── Sidebar.css │ │ │ ├── Sidebar.css.map │ │ │ ├── Sidebar.jsx │ │ │ └── Sidebar.scss │ │ └── taskmanager │ │ │ ├── AddTask.jsx │ │ │ ├── EditTask.jsx │ │ │ ├── ListCard.jsx │ │ │ ├── TaskList.jsx │ │ │ ├── addtask.scss │ │ │ ├── listcard.scss │ │ │ └── tasklist.scss │ ├── history.js │ ├── images │ │ └── background.webp │ ├── index.css │ ├── main.jsx │ ├── pages │ │ ├── dashboard │ │ │ ├── Dashboard.jsx │ │ │ └── dashboard.scss │ │ ├── home │ │ │ ├── Home.jsx │ │ │ ├── home.css │ │ │ ├── home.css.map │ │ │ └── home.scss │ │ └── taskmanagement │ │ │ ├── TaskManager.jsx │ │ │ └── taskmanager.scss │ ├── redux │ │ ├── authSlice.js │ │ ├── store.js │ │ └── taskSlice.js │ ├── styles │ │ ├── abstract │ │ │ └── _mixins.scss │ │ ├── base │ │ │ ├── _reset.scss │ │ │ ├── _typography.scss │ │ │ └── _variables.scss │ │ ├── components │ │ │ └── _button.scss │ │ ├── main.css │ │ ├── main.css.map │ │ └── main.scss │ └── utils │ │ ├── PrivateRoutes.js │ │ ├── PublicRoutes.js │ │ └── RequireAuth.jsx ├── vite.config.js └── yarn.lock ├── database ├── db.js ├── model │ ├── task.model.js │ └── user.model.js ├── package.json └── yarn.lock ├── package.json ├── server ├── controllers │ ├── authController.js │ └── taskController.js ├── package.json ├── routes │ ├── authRoutes.js │ └── taskRoutes.js ├── server.js └── yarn.lock └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | ot 2 | node_modules 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # task-manager 2 | 3 | ### to run app 4 | #### go to each individial folder and run yarn or yarn install 5 | #### go back to root folder and run yarn start 6 | 7 | -------------------------------------------------------------------------------- /client/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { browser: true, es2020: true }, 3 | extends: [ 4 | 'eslint:recommended', 5 | 'plugin:react/recommended', 6 | 'plugin:react/jsx-runtime', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 10 | settings: { react: { version: '18.2' } }, 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': 'warn', 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Task Manager 8 | 9 | 10 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint src --ext js,jsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@reduxjs/toolkit": "^1.9.5", 14 | "axios": "^1.4.0", 15 | "express-jwt": "^8.4.1", 16 | "history": "^5.3.0", 17 | "react": "^18.2.0", 18 | "react-dom": "^18.2.0", 19 | "react-icons": "^4.10.1", 20 | "react-redux": "^8.1.1", 21 | "react-router-dom": "^6.14.1", 22 | "react-toastify": "^8.1.0", 23 | "sass": "^1.63.6" 24 | }, 25 | "devDependencies": { 26 | "@types/react": "^18.0.37", 27 | "@types/react-dom": "^18.0.11", 28 | "@vitejs/plugin-react": "^4.0.0", 29 | "eslint": "^8.38.0", 30 | "eslint-plugin-react": "^7.32.2", 31 | "eslint-plugin-react-hooks": "^4.6.0", 32 | "eslint-plugin-react-refresh": "^0.3.4", 33 | "vite": "^4.3.9" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /client/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GunalBondre/task-manager/38357a78dae4f2b53286af946fd9e309b358ae6a/client/src/App.css -------------------------------------------------------------------------------- /client/src/App.jsx: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import Header from './components/header/Header'; 3 | import Signin from './components/registration/Signin'; 4 | import Signup from './components/registration/Signup'; 5 | import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; 6 | 7 | import './styles/main.scss'; 8 | import Home from './pages/home/Home'; 9 | import TaskManager from './pages/taskmanagement/TaskManager'; 10 | import Dashboard from './pages/dashboard/Dashboard'; 11 | import RequireAuth from './utils/RequireAuth'; 12 | import { useSelector } from 'react-redux'; 13 | 14 | function App() { 15 | const { auth } = useSelector((state) => ({ ...state })); 16 | return ( 17 |
18 | 19 |
20 | 21 | } /> 22 | : } 25 | /> 26 | : } 29 | /> 30 | 34 | 35 | 36 | } 37 | /> 38 | 42 | 43 | 44 | } 45 | /> 46 | 47 | 48 |
49 | ); 50 | } 51 | 52 | export default App; 53 | -------------------------------------------------------------------------------- /client/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/components/header/Header.jsx: -------------------------------------------------------------------------------- 1 | import './header.scss'; 2 | import '../../styles/components/_button.scss'; 3 | import { useSelector, useDispatch } from 'react-redux'; 4 | import { Link } from 'react-router-dom'; 5 | import { logoutSuccess } from '../../redux/authSlice'; 6 | import history from '../../history'; 7 | 8 | const Header = () => { 9 | const dispatch = useDispatch(); 10 | const { auth } = useSelector((state) => ({ ...state })); 11 | 12 | const handleClick = (e) => { 13 | e.preventDefault(); 14 | dispatch(logoutSuccess()); 15 | localStorage.removeItem('auth'); 16 | history.push('/signin'); 17 | window.location.reload(); 18 | }; 19 | return ( 20 |
21 | 42 |
43 | ); 44 | }; 45 | 46 | export default Header; 47 | -------------------------------------------------------------------------------- /client/src/components/header/header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | justify-content: space-between; 4 | background-color: red; 5 | align-items: center; 6 | height: 60px; 7 | padding: 0 20px; 8 | } 9 | .header__logo h5 { 10 | color: white; 11 | font-weight: 300; 12 | } 13 | .header .button { 14 | background-color: white; 15 | }/*# sourceMappingURL=header.css.map */ -------------------------------------------------------------------------------- /client/src/components/header/header.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["header.scss","header.css"],"names":[],"mappings":"AAAA;EACI,aAAA;EACA,8BAAA;EACA,qBAAA;EACA,mBAAA;EACA,YAAA;EACA,eAAA;ACCJ;ADEQ;EACI,YAAA;EACA,gBAAA;ACAZ;ADII;EACI,uBAAA;ACFR","file":"header.css"} -------------------------------------------------------------------------------- /client/src/components/header/header.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | justify-content: space-between; 4 | background-color: red; 5 | align-items: center; 6 | height: 60px; 7 | padding: 0 20px; 8 | 9 | &__logo { 10 | h5 { 11 | color: white; 12 | font-weight: 300; 13 | } 14 | } 15 | 16 | .button { 17 | background-color: white; 18 | 19 | } 20 | 21 | 22 | } -------------------------------------------------------------------------------- /client/src/components/registration/Signin.jsx: -------------------------------------------------------------------------------- 1 | import './registration.scss'; 2 | import '../../styles/components/_button.scss'; 3 | import { useState } from 'react'; 4 | import { useDispatch } from 'react-redux'; 5 | import { signin } from '../../redux/authSlice'; 6 | 7 | const Signin = () => { 8 | const dispatch = useDispatch(); 9 | 10 | const [state, setState] = useState({ 11 | email: '', 12 | password: '', 13 | }); 14 | 15 | const handleChange = (e) => { 16 | setState({ 17 | ...state, 18 | [e.target.name]: e.target.value, 19 | }); 20 | }; 21 | 22 | const handleSubmit = (e) => { 23 | e.preventDefault(); 24 | dispatch( 25 | signin({ 26 | email: state.email, 27 | password: state.password, 28 | }) 29 | ); 30 | }; 31 | 32 | return ( 33 |
34 |
35 |
36 |

Sign In

37 |
38 | 46 |
47 |
48 | 56 |
57 |
58 | 59 |
60 |
61 |
62 |
63 | ); 64 | }; 65 | 66 | export default Signin; 67 | -------------------------------------------------------------------------------- /client/src/components/registration/Signup.jsx: -------------------------------------------------------------------------------- 1 | import './registration.scss'; 2 | import '../../styles/components/_button.scss'; 3 | import { useState } from 'react'; 4 | import { useDispatch } from 'react-redux'; 5 | import { register } from '../../redux/authSlice'; 6 | 7 | const Signup = () => { 8 | const dispatch = useDispatch(); 9 | const [state, setState] = useState({ 10 | email: '', 11 | password: '', 12 | username: '', 13 | }); 14 | 15 | const handleSubmit = (e) => { 16 | e.preventDefault(); 17 | 18 | dispatch( 19 | register({ 20 | username: state.username, 21 | password: state.password, 22 | email: state.email, 23 | }) 24 | ); 25 | }; 26 | const handleChange = (e) => { 27 | setState({ 28 | ...state, 29 | [e.target.name]: e.target.value, 30 | }); 31 | }; 32 | 33 | console.log(state.email, state.password, state.username); 34 | return ( 35 |
36 |
37 |
38 |

Sign up

39 | 40 |
41 | 48 |
49 |
50 | 58 |
59 |
60 | 68 |
69 |
70 | 71 |
72 |
73 |
74 |
75 | ); 76 | }; 77 | 78 | export default Signup; 79 | -------------------------------------------------------------------------------- /client/src/components/registration/registration.css: -------------------------------------------------------------------------------- 1 | .signup-form { 2 | width: 100vw; 3 | height: 100vh; 4 | display: flex; 5 | flex-direction: row; 6 | justify-content: center; 7 | align-items: center; 8 | } 9 | .signup-form__wrapper { 10 | width: 50%; 11 | height: 400px; 12 | } 13 | .signup-form__wrapper .form { 14 | width: 100%; 15 | height: 100%; 16 | padding: 10px; 17 | display: flex; 18 | flex-direction: column; 19 | justify-content: center; 20 | align-items: center; 21 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 22 | border-radius: 10px; 23 | } 24 | .signup-form__wrapper .form .form-group { 25 | margin-bottom: 1rem; 26 | width: 50%; 27 | text-align: center; 28 | } 29 | .signup-form__wrapper .form .form-group input { 30 | width: 100%; 31 | padding: 1rem; 32 | outline: none; 33 | }/*# sourceMappingURL=registration.css.map */ -------------------------------------------------------------------------------- /client/src/components/registration/registration.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["registration.scss","../../styles/abstract/_mixins.scss","registration.css"],"names":[],"mappings":"AAEA;EACI,YAAA;EACA,aAAA;ECIA,aDHqB;ECIrB,mBDJ2B;ECK3B,uBDLgC;ECMhC,mBDNwC;AEE5C;AFAI;EACI,UAAA;EACA,aAAA;AEER;AFAQ;EACI,WAAA;EACA,YAAA;EACA,aAAA;ECNR,aDO6B;ECN7B,sBDMmC;ECLnC,uBDK2C;ECJ3C,mBDImD;EAC3C,4EAAA;EACA,mBAAA;AEKZ;AFHY;EACI,mBAAA;EACA,UAAA;EACA,kBAAA;AEKhB;AFHgB;EACI,WAAA;EACA,aAAA;EACA,aAAA;AEKpB","file":"registration.css"} -------------------------------------------------------------------------------- /client/src/components/registration/registration.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/abstract/mixins'; 2 | 3 | .signup-form { 4 | width: 100vw; 5 | height: 100vh; 6 | @include flex-center(flex, row, center, center); 7 | 8 | &__wrapper { 9 | width: 50%; 10 | height: 400px; 11 | 12 | .form { 13 | width: 100%; 14 | height: 100%; 15 | padding: 10px; 16 | @include flex-center(flex, column, center, center); 17 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 18 | border-radius: 10px; 19 | 20 | .form-group { 21 | margin-bottom: 1rem; 22 | width: 50%; 23 | text-align: center; 24 | 25 | input { 26 | width: 100%; 27 | padding: 1rem; 28 | outline: none; 29 | } 30 | 31 | } 32 | } 33 | 34 | } 35 | } -------------------------------------------------------------------------------- /client/src/components/sidebar/Sidebar.css: -------------------------------------------------------------------------------- 1 | .sidebar { 2 | background-color: teal; 3 | color: white; 4 | height: 100vh; 5 | padding: 1rem; 6 | max-width: 15vw; 7 | } 8 | .sidebar .list-item { 9 | margin: 1rem 0; 10 | }/*# sourceMappingURL=Sidebar.css.map */ -------------------------------------------------------------------------------- /client/src/components/sidebar/Sidebar.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["Sidebar.scss","Sidebar.css"],"names":[],"mappings":"AAAA;EACI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,aAAA;EACA,eAAA;ACCJ;ADCI;EACI,cAAA;ACCR","file":"Sidebar.css"} -------------------------------------------------------------------------------- /client/src/components/sidebar/Sidebar.jsx: -------------------------------------------------------------------------------- 1 | import './Sidebar.scss'; 2 | import { useSelector } from 'react-redux'; 3 | import { Link } from 'react-router-dom'; 4 | 5 | const Sidebar = () => { 6 | const { auth } = useSelector((state) => ({ ...state })); 7 | const { currentUser } = auth; 8 | 9 | return ( 10 |
11 | 22 |
23 | ); 24 | }; 25 | 26 | export default Sidebar; 27 | -------------------------------------------------------------------------------- /client/src/components/sidebar/Sidebar.scss: -------------------------------------------------------------------------------- 1 | .sidebar { 2 | background-color: teal; 3 | color: white; 4 | height: 100vh; 5 | padding: 1rem; 6 | max-width: 15vw; 7 | 8 | .list-item { 9 | margin: 1rem 0; 10 | } 11 | } -------------------------------------------------------------------------------- /client/src/components/taskmanager/AddTask.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import './addtask.scss'; 3 | import { addTask } from '../../redux/taskSlice'; 4 | import { useDispatch, useSelector } from 'react-redux'; 5 | 6 | const AddTask = () => { 7 | const dispatch = useDispatch(); 8 | const { auth } = useSelector((state) => ({ ...state })); 9 | const { currentUser } = auth; 10 | const [state, setState] = useState({ 11 | task: '', 12 | }); 13 | 14 | const handleChange = (e) => { 15 | setState({ 16 | ...state, 17 | [e.target.name]: e.target.value, 18 | }); 19 | }; 20 | 21 | const handleSubmit = (e) => { 22 | e.preventDefault(); 23 | dispatch(addTask(state.task, currentUser.id)); 24 | setState({ 25 | task: '', 26 | }); 27 | }; 28 | 29 | return ( 30 |
31 |
32 |
33 | 40 | 41 |
42 |
43 |
44 | ); 45 | }; 46 | 47 | export default AddTask; 48 | -------------------------------------------------------------------------------- /client/src/components/taskmanager/EditTask.jsx: -------------------------------------------------------------------------------- 1 | const EditTask = () => { 2 | return
EditTask
; 3 | }; 4 | 5 | export default EditTask; 6 | -------------------------------------------------------------------------------- /client/src/components/taskmanager/ListCard.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react/prop-types */ 2 | import './listcard.scss'; 3 | import { BiChevronLeft, BiChevronRight, BiTrash } from 'react-icons/bi'; 4 | import { arrowClick, deleteItem } from '../../redux/taskSlice'; 5 | import { useDispatch } from 'react-redux'; 6 | 7 | const ListCard = (items) => { 8 | const { item } = items; 9 | 10 | const dispatch = useDispatch(); 11 | 12 | const ArrowClick = (string) => { 13 | dispatch(arrowClick(item, string)); 14 | }; 15 | const handleDelete = () => { 16 | dispatch(deleteItem(item._id)); 17 | }; 18 | 19 | return ( 20 |
21 | 49 |
50 | ); 51 | }; 52 | 53 | export default ListCard; 54 | -------------------------------------------------------------------------------- /client/src/components/taskmanager/TaskList.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useDispatch, useSelector } from 'react-redux'; 3 | import { getAllTasks } from '../../redux/taskSlice'; 4 | import ListCard from './ListCard'; 5 | import './tasklist.scss'; 6 | 7 | const TaskList = () => { 8 | const auth = useSelector((state) => state.auth); 9 | const tasks = useSelector((state) => state.task); 10 | 11 | const { currentUser } = auth; 12 | const { AllTasks } = tasks; 13 | 14 | const dispatch = useDispatch(); 15 | 16 | useEffect(() => { 17 | dispatch(getAllTasks(currentUser.token, currentUser.id)); 18 | }, [dispatch, currentUser.token, currentUser.id]); 19 | 20 | return ( 21 |
22 | 36 | {Object.values(AllTasks).map((item) => { 37 | return ; 38 | })} 39 |
40 | ); 41 | }; 42 | 43 | export default TaskList; 44 | -------------------------------------------------------------------------------- /client/src/components/taskmanager/addtask.scss: -------------------------------------------------------------------------------- 1 | .addtask { 2 | width: 100%; 3 | 4 | form { 5 | width: 70%; 6 | margin: 3rem; 7 | display: flex; 8 | 9 | } 10 | 11 | input { 12 | padding: 5px; 13 | width: 30rem; 14 | border: none; 15 | outline: none; 16 | background-color: whitesmoke; 17 | border-radius: 5px; 18 | 19 | } 20 | } -------------------------------------------------------------------------------- /client/src/components/taskmanager/listcard.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 6 | margin: 1rem auto; 7 | width: 90%; 8 | 9 | li { 10 | padding: 1rem; 11 | flex: 1; 12 | 13 | button { 14 | margin: 5px; 15 | } 16 | } 17 | 18 | p { 19 | font-size: 14px; 20 | } 21 | } 22 | 23 | .completed { 24 | background-color: green; 25 | color: white; 26 | } -------------------------------------------------------------------------------- /client/src/components/taskmanager/tasklist.scss: -------------------------------------------------------------------------------- 1 | .list-header { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | margin: 0 auto; 6 | width: 90%; 7 | background-color: red; 8 | padding: 1rem; 9 | color: white; 10 | 11 | li { 12 | flex: 1; 13 | } 14 | 15 | h5 { 16 | font-size: 14px; 17 | } 18 | } -------------------------------------------------------------------------------- /client/src/history.js: -------------------------------------------------------------------------------- 1 | import { createBrowserHistory } from 'history'; 2 | export default createBrowserHistory({ forceRefresh: true }); 3 | -------------------------------------------------------------------------------- /client/src/images/background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GunalBondre/task-manager/38357a78dae4f2b53286af946fd9e309b358ae6a/client/src/images/background.webp -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | body { 8 | font-family: 'Roboto', sans-serif; 9 | font-size: 62.5%; 10 | } 11 | a { 12 | text-decoration: none; 13 | color: inherit; 14 | font-size: 1rem; 15 | } 16 | 17 | li { 18 | list-style: none; 19 | } 20 | -------------------------------------------------------------------------------- /client/src/main.jsx: -------------------------------------------------------------------------------- 1 | import ReactDOM from 'react-dom/client'; 2 | import App from './App.jsx'; 3 | import './index.css'; 4 | 5 | import { store } from './redux/store'; 6 | import { Provider } from 'react-redux'; 7 | 8 | ReactDOM.createRoot(document.getElementById('root')).render( 9 | 10 | 11 | 12 | ); 13 | -------------------------------------------------------------------------------- /client/src/pages/dashboard/Dashboard.jsx: -------------------------------------------------------------------------------- 1 | import Sidebar from '../../components/sidebar/Sidebar'; 2 | import { Link } from 'react-router-dom'; 3 | import { useSelector, useDispatch } from 'react-redux'; 4 | import './dashboard.scss'; 5 | import { useEffect } from 'react'; 6 | import { getAllTasks } from '../../redux/taskSlice'; 7 | const Dashboard = () => { 8 | const tasklist = useSelector((state) => state.task); 9 | const { AllTasks } = tasklist; 10 | const user = useSelector((state) => state.auth); 11 | const { currentUser } = user; 12 | 13 | let pendingTask = []; 14 | let completedTask = []; 15 | for (let i = 0; i < AllTasks.length; i++) { 16 | if (AllTasks[i].status === 'todo') { 17 | pendingTask.push(AllTasks[i]); 18 | } else if (AllTasks[i].status === 'done') { 19 | completedTask.push(AllTasks[i]); 20 | } 21 | } 22 | 23 | const dispatch = useDispatch(); 24 | useEffect(() => { 25 | dispatch(getAllTasks(currentUser.token, currentUser.id)); 26 | }, [dispatch, currentUser.token, currentUser.id]); 27 | 28 | return ( 29 |
30 |
31 |
32 | 33 |
34 |
35 |
36 |

Task Status Dashboard

37 |
38 |
Todo - {pendingTask.length}
39 |
Complete - {completedTask.length}
40 |
41 |
42 | 43 | Create Task 44 | 45 |
46 |
47 |
48 |
49 |
50 | ); 51 | }; 52 | 53 | export default Dashboard; 54 | -------------------------------------------------------------------------------- /client/src/pages/dashboard/dashboard.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/abstract/mixins'; 2 | 3 | .dashboard { 4 | width: 100%; 5 | height: 100vh; 6 | display: flex; 7 | 8 | &__left { 9 | width: 15%; 10 | } 11 | 12 | &__right { 13 | width: 85%; 14 | margin-top: 2rem; 15 | } 16 | 17 | .box { 18 | width: 150px; 19 | height: 100px; 20 | border-radius: 10px; 21 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 22 | @include flex-center(flex, row, center, center); 23 | margin: 3rem 0; 24 | } 25 | 26 | .taskcount { 27 | display: flex; 28 | width: 100%; 29 | justify-content: space-evenly; 30 | } 31 | 32 | &__rightContent { 33 | width: 100%; 34 | text-align: center; 35 | 36 | } 37 | 38 | .button { 39 | background-color: red; 40 | color: white; 41 | width: 20rem; 42 | 43 | } 44 | } -------------------------------------------------------------------------------- /client/src/pages/home/Home.jsx: -------------------------------------------------------------------------------- 1 | import './home.scss'; 2 | 3 | import { useSelector } from 'react-redux'; 4 | import { Link } from 'react-router-dom'; 5 | const Home = () => { 6 | const { auth } = useSelector((state) => ({ ...state })); 7 | const { currentUser } = auth; 8 | return ( 9 |
10 |
11 |

Organize it all

12 |

With TaskManager

13 | 14 | {currentUser && currentUser.token ? ( 15 | 16 | Get Started 17 | 18 | ) : ( 19 | 20 | Get Started 21 | 22 | )} 23 |
24 |
25 | ); 26 | }; 27 | 28 | export default Home; 29 | -------------------------------------------------------------------------------- /client/src/pages/home/home.css: -------------------------------------------------------------------------------- 1 | .home { 2 | width: 100%; 3 | height: 100vh; 4 | background: url("../../images/background.webp") no-repeat; 5 | background-size: cover; 6 | display: flex; 7 | flex-direction: row; 8 | justify-content: center; 9 | align-items: center; 10 | } 11 | .home__container { 12 | width: 50%; 13 | text-align: center; 14 | } 15 | .home__container h2 { 16 | font-size: 42px; 17 | } 18 | .home__container .button { 19 | background-color: red; 20 | color: white; 21 | margin-top: 1rem; 22 | font-size: 1.2rem; 23 | display: inline-block; 24 | }/*# sourceMappingURL=home.css.map */ -------------------------------------------------------------------------------- /client/src/pages/home/home.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["home.scss","../../styles/abstract/_mixins.scss","home.css"],"names":[],"mappings":"AAEA;EACI,WAAA;EACA,aAAA;EACA,yDAAA;EACA,sBAAA;ECEA,aAAA;EACA,mBDD2B;ECE3B,uBDFgC;ECGhC,mBDHwC;AEC5C;AFCI;EACI,UAAA;EACA,kBAAA;AECR;AFCQ;EACI,eAAA;AECZ;AFEQ;EACI,qBAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;EACA,qBAAA;AEAZ","file":"home.css"} -------------------------------------------------------------------------------- /client/src/pages/home/home.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/abstract/mixins'; 2 | 3 | .home { 4 | width: 100%; 5 | height: 100vh; 6 | background: url('../../images/background.webp') no-repeat; 7 | background-size: cover; 8 | 9 | @include flex-center(flex, row, center, center); 10 | 11 | &__container { 12 | width: 50%; 13 | text-align: center; 14 | 15 | h2 { 16 | font-size: 42px; 17 | } 18 | 19 | .button { 20 | background-color: red; 21 | color: white; 22 | margin-top: 1rem; 23 | font-size: 1.2rem; 24 | display: inline-block; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /client/src/pages/taskmanagement/TaskManager.jsx: -------------------------------------------------------------------------------- 1 | import Sidebar from '../../components/sidebar/Sidebar'; 2 | import AddTask from '../../components/taskmanager/AddTask'; 3 | import TaskList from '../../components/taskmanager/TaskList'; 4 | import './taskmanager.scss'; 5 | 6 | const TaskManager = () => { 7 | return ( 8 |
9 |
10 |
11 | 12 |
13 |
14 |
15 | 16 |
17 |
18 | 19 |
20 |
21 |
22 |
23 | ); 24 | }; 25 | 26 | export default TaskManager; 27 | -------------------------------------------------------------------------------- /client/src/pages/taskmanagement/taskmanager.scss: -------------------------------------------------------------------------------- 1 | .taskmanager { 2 | width: 100%; 3 | display: flex; 4 | 5 | &__left { 6 | width: 15%; 7 | } 8 | 9 | &__right { 10 | width: 85%; 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /client/src/redux/authSlice.js: -------------------------------------------------------------------------------- 1 | import { createSlice } from '@reduxjs/toolkit'; 2 | import axios from 'axios'; 3 | import history from '../history'; 4 | import { toast } from 'react-toastify'; 5 | 6 | const initialUser = localStorage.getItem('auth') 7 | ? JSON.parse(localStorage.getItem('auth')) 8 | : null; 9 | 10 | const initialState = { 11 | isLoading: false, 12 | currentUser: initialUser, 13 | error: null, 14 | }; 15 | export const authSlice = createSlice({ 16 | name: 'auth', 17 | initialState: initialState, 18 | reducers: { 19 | loginSuccess: (state, action) => { 20 | state.currentUser = action.payload; 21 | state.isLoading = false; 22 | }, 23 | loginFailure: (state, action) => { 24 | state.error = action.payload; 25 | }, 26 | registerSuccess: (state, action) => { 27 | state.currentUser = action.payload; 28 | state.isLoading = false; 29 | }, 30 | registerFailure: (state, action) => { 31 | state.error = action.payload; 32 | }, 33 | logoutSuccess: (state) => { 34 | state.currentUser = null; 35 | }, 36 | }, 37 | }); 38 | 39 | export const { 40 | loginFailure, 41 | loginSuccess, 42 | registerFailure, 43 | registerSuccess, 44 | logoutSuccess, 45 | } = authSlice.actions; 46 | 47 | export default authSlice.reducer; 48 | 49 | export const register = (user) => async (dispatch) => { 50 | try { 51 | const config = { 52 | headers: { 53 | 'content-type': 'application/json', 54 | }, 55 | }; 56 | 57 | const response = await axios.post( 58 | 'http://localhost:4000/auth/register', 59 | user, 60 | config 61 | ); 62 | 63 | if (response) { 64 | dispatch(registerSuccess(response.data)); 65 | toast.success('register successfull'); 66 | history.push('/signin'); 67 | window.location.reload(); 68 | } else { 69 | dispatch(registerFailure()); 70 | toast.error('registration failed'); 71 | } 72 | } catch (error) { 73 | console.log(error); 74 | dispatch(registerFailure()); 75 | } 76 | }; 77 | 78 | export const signin = (user) => async (dispatch) => { 79 | console.log(user); 80 | try { 81 | const userData = { 82 | email: user.email, 83 | password: user.password, 84 | }; 85 | const response = await axios.post( 86 | 'http://localhost:4000/auth/signin', 87 | userData 88 | ); 89 | if (response) { 90 | localStorage.setItem('auth', JSON.stringify(response.data)); 91 | dispatch(loginSuccess(response.data)); 92 | 93 | history.push('/dashboard'); 94 | toast.success('login successfull'); 95 | 96 | window.location.reload(); 97 | } else { 98 | dispatch(loginFailure()); 99 | toast.error('login failed'); 100 | } 101 | } catch (error) { 102 | dispatch(loginFailure()); 103 | } 104 | }; 105 | -------------------------------------------------------------------------------- /client/src/redux/store.js: -------------------------------------------------------------------------------- 1 | import { configureStore } from '@reduxjs/toolkit'; 2 | 3 | import authReducer from './authSlice'; 4 | import taskReducer from './taskSlice'; 5 | 6 | export const store = configureStore({ 7 | reducer: { auth: authReducer, task: taskReducer }, 8 | }); 9 | -------------------------------------------------------------------------------- /client/src/redux/taskSlice.js: -------------------------------------------------------------------------------- 1 | import { createSlice } from '@reduxjs/toolkit'; 2 | import axios from 'axios'; 3 | import { toast } from 'react-toastify'; 4 | 5 | const initalTask = localStorage.getItem('task') 6 | ? JSON.parse(localStorage.getItem('task')) 7 | : null; 8 | 9 | const initialState = { 10 | TaskData: initalTask, 11 | AllTasks: {}, 12 | }; 13 | export const taskSlice = createSlice({ 14 | name: 'Task', 15 | initialState, 16 | 17 | reducers: { 18 | taskAddedSuccessfully: (state, action) => { 19 | state.TaskData = action.payload; 20 | }, 21 | taskAddFailure: (state) => { 22 | return state; 23 | }, 24 | getAllTaskSuccess: (state, action) => { 25 | state.AllTasks = action.payload; 26 | }, 27 | getAllTaskFailure: (state) => { 28 | return state; 29 | }, 30 | 31 | editTaskSuccess: (state, action) => { 32 | state.TaskData = action.payload; 33 | }, 34 | 35 | deleteSuccess: (state, action) => { 36 | state.TaskData = action.payload; 37 | }, 38 | deletefail: (state) => { 39 | return state; 40 | }, 41 | }, 42 | }); 43 | 44 | export const { 45 | taskAddFailure, 46 | taskAddedSuccessfully, 47 | getAllTaskFailure, 48 | getAllTaskSuccess, 49 | deleteSuccess, 50 | deletefail, 51 | editTaskSuccess, 52 | } = taskSlice.actions; 53 | 54 | export default taskSlice.reducer; 55 | 56 | export const addTask = (task, id) => async (dispatch) => { 57 | const taskData = { 58 | task, 59 | id, 60 | }; 61 | const response = await axios.post('http://localhost:4000/task/add', taskData); 62 | if (response) { 63 | localStorage.setItem('task', JSON.stringify(response.data)); 64 | 65 | dispatch(taskAddedSuccessfully(response.data)); 66 | toast.success('task added successfully'); 67 | window.location.reload(); 68 | } else { 69 | dispatch(taskAddFailure()); 70 | } 71 | }; 72 | 73 | export const getAllTasks = (token, id) => async (dispatch) => { 74 | const config = { 75 | headers: { 76 | Authorization: `Bearer ${token}`, 77 | }, 78 | params: { 79 | id, 80 | }, 81 | }; 82 | 83 | try { 84 | const response = await axios.get( 85 | 'http://localhost:4000/task/tasks', 86 | config 87 | ); 88 | 89 | if (response) { 90 | dispatch(getAllTaskSuccess(response.data)); 91 | } 92 | } catch (error) { 93 | if (error.response.status === 400) { 94 | dispatch(getAllTaskFailure()); 95 | } 96 | } 97 | }; 98 | 99 | export const arrowClick = (item, string) => async () => { 100 | let taskData = { 101 | id: item._id, 102 | status: item.status, 103 | string, 104 | }; 105 | 106 | try { 107 | let response = await axios.put( 108 | `http://localhost:4000/task/${taskData.id}`, 109 | taskData 110 | ); 111 | 112 | if (response) { 113 | window.location.reload(); 114 | } 115 | } catch (error) { 116 | console.log(error); 117 | } 118 | }; 119 | 120 | export const deleteItem = (id) => async (dispatch) => { 121 | let res = await axios.delete(`http://localhost:4000/task/${id}`); 122 | 123 | if (res) { 124 | dispatch(deleteSuccess()); 125 | toast.success('task deleted successfully'); 126 | 127 | window.location.reload(); 128 | } else { 129 | dispatch(deletefail()); 130 | } 131 | }; 132 | -------------------------------------------------------------------------------- /client/src/styles/abstract/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Heading styles 2 | @mixin heading-style($font-size, $font-weight, $line-height) { 3 | font-size: $font-size; 4 | font-weight: $font-weight; 5 | line-height: $line-height; 6 | } 7 | 8 | @mixin flex-center($display, $direction, $justify, $align) { 9 | display: $display; 10 | flex-direction: $direction; 11 | justify-content: $justify; 12 | align-items: $align; 13 | } -------------------------------------------------------------------------------- /client/src/styles/base/_reset.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GunalBondre/task-manager/38357a78dae4f2b53286af946fd9e309b358ae6a/client/src/styles/base/_reset.scss -------------------------------------------------------------------------------- /client/src/styles/base/_typography.scss: -------------------------------------------------------------------------------- 1 | @import './variables'; 2 | @import '../abstract/mixins'; 3 | 4 | 5 | 6 | h1 { 7 | @include heading-style($font-size-xxl, $font-weight-bold, $line-height-sm); 8 | } 9 | 10 | h2 { 11 | @include heading-style($font-size-xl, $font-weight-bold, $line-height-md); 12 | } 13 | 14 | h3 { 15 | @include heading-style($font-size-lg, $font-weight-bold, $line-height-md); 16 | } 17 | 18 | h4 { 19 | @include heading-style($font-size-md, $font-weight-medium, $line-height-lg); 20 | } 21 | 22 | h5 { 23 | @include heading-style($font-size-sm, $font-weight-medium, $line-height-lg); 24 | } 25 | 26 | h6 { 27 | @include heading-style($font-size-xs, $font-weight-medium, $line-height-lg); 28 | } 29 | 30 | // Paragraph style 31 | p { 32 | font-size: $font-size-md; 33 | font-weight: $font-weight-regular; 34 | line-height: $line-height-md; 35 | } -------------------------------------------------------------------------------- /client/src/styles/base/_variables.scss: -------------------------------------------------------------------------------- 1 | // Define font sizes in rems 2 | $font-size-xs: 1rem; // 10px 3 | $font-size-sm: 1.4rem; // 14px 4 | $font-size-md: 1.6rem; // 16px 5 | $font-size-lg: 1.8rem; // 18px 6 | $font-size-xl: 2.0rem; // 20px 7 | $font-size-xxl: 2.4rem; // 24px 8 | 9 | // Define font weights 10 | $font-weight-light: 300; 11 | $font-weight-regular: 400; 12 | $font-weight-medium: 500; 13 | $font-weight-bold: 700; 14 | 15 | // Define line heights 16 | $line-height-sm: 1.4; 17 | $line-height-md: 1.6; 18 | $line-height-lg: 1.8; -------------------------------------------------------------------------------- /client/src/styles/components/_button.scss: -------------------------------------------------------------------------------- 1 | .button { 2 | margin-left: 10px; 3 | padding: 10px; 4 | border: none; 5 | outline: none; 6 | border-radius: 5px; 7 | min-width: 150px; 8 | cursor: pointer; 9 | display: inline-block; 10 | text-align: center; 11 | } -------------------------------------------------------------------------------- /client/src/styles/main.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | font-size: 2.4rem; 3 | font-weight: 700; 4 | line-height: 1.4; 5 | } 6 | 7 | h2 { 8 | font-size: 2rem; 9 | font-weight: 700; 10 | line-height: 1.6; 11 | } 12 | 13 | h3 { 14 | font-size: 1.8rem; 15 | font-weight: 700; 16 | line-height: 1.6; 17 | } 18 | 19 | h4 { 20 | font-size: 1.6rem; 21 | font-weight: 500; 22 | line-height: 1.8; 23 | } 24 | 25 | h5 { 26 | font-size: 1.4rem; 27 | font-weight: 500; 28 | line-height: 1.8; 29 | } 30 | 31 | h6 { 32 | font-size: 1rem; 33 | font-weight: 500; 34 | line-height: 1.8; 35 | } 36 | 37 | p { 38 | font-size: 1.6rem; 39 | font-weight: 400; 40 | line-height: 1.6; 41 | }/*# sourceMappingURL=main.css.map */ -------------------------------------------------------------------------------- /client/src/styles/main.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["base/_typography.scss","abstract/_mixins.scss","base/_variables.scss","main.css"],"names":[],"mappings":"AAKA;ECHI,iBCIY;EDHZ,gBCSe;EDRf,gBCWa;ACXjB;;AHKA;ECPI,eCGW;EDFX,gBCSe;EDRf,gBCYa;ACNjB;;AHGA;ECXI,iBCEW;EDDX,gBCSe;EDRf,gBCYa;ACAjB;;AHCA;ECfI,iBCCW;EDAX,gBCQiB;EDPjB,gBCaa;ACKjB;;AHDA;ECnBI,iBAAA;EACA,gBCQiB;EDPjB,gBCaa;ACWjB;;AHHA;ECvBI,eCDW;EDEX,gBCQiB;EDPjB,gBCaa;ACiBjB;;AHJA;EACI,iBE5BW;EF6BX,gBEtBkB;EFuBlB,gBEjBa;ACwBjB","file":"main.css"} -------------------------------------------------------------------------------- /client/src/styles/main.scss: -------------------------------------------------------------------------------- 1 | @import './base/reset'; 2 | @import './base/variables'; 3 | @import './base/typography'; 4 | @import './abstract/mixins'; -------------------------------------------------------------------------------- /client/src/utils/PrivateRoutes.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GunalBondre/task-manager/38357a78dae4f2b53286af946fd9e309b358ae6a/client/src/utils/PrivateRoutes.js -------------------------------------------------------------------------------- /client/src/utils/PublicRoutes.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Navigate } from 'react-router-dom'; 3 | import { useSelector } from 'react-redux'; 4 | 5 | const PublicRoutes = ({ ...rest }) => { 6 | const { auth } = useSelector((state) => ({ ...state })); 7 | 8 | return !auth.currentUser ? : ; 9 | }; 10 | 11 | export default PublicRoutes; 12 | -------------------------------------------------------------------------------- /client/src/utils/RequireAuth.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react/prop-types */ 2 | import { Navigate, useLocation } from 'react-router-dom'; 3 | import { useSelector } from 'react-redux'; 4 | const RequireAuth = ({ children }) => { 5 | const isLoggedIn = useSelector((state) => state.auth); 6 | const location = useLocation(); 7 | 8 | if (!isLoggedIn.currentUser) { 9 | return ; 10 | } 11 | return children; 12 | }; 13 | 14 | export default RequireAuth; 15 | -------------------------------------------------------------------------------- /client/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /database/db.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const mongoURI = 'mongodb://127.0.0.1:27017/task-manager'; 4 | const options = { 5 | useNewUrlParser: true, 6 | useUnifiedTopology: true, 7 | }; 8 | 9 | mongoose 10 | .connect(mongoURI, options) 11 | .then(() => { 12 | console.log('Connected to MongoDB'); 13 | // Start your application or perform additional operations 14 | }) 15 | .catch((error) => { 16 | console.error('Error connecting to MongoDB:', error); 17 | }); 18 | -------------------------------------------------------------------------------- /database/model/task.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const taskSchema = mongoose.Schema( 4 | { 5 | task: { type: String }, 6 | status: { 7 | type: String, 8 | enum: ['backlog', 'todo', 'doing', 'done'], 9 | default: 'backlog', 10 | }, 11 | cretedBy: { 12 | type: mongoose.Schema.Types.ObjectId, 13 | ref: 'User', 14 | }, 15 | }, 16 | { timestamp: true } 17 | ); 18 | 19 | const Task = mongoose.model('Task', taskSchema); 20 | module.exports = Task; 21 | -------------------------------------------------------------------------------- /database/model/user.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const bcrypt = require('bcryptjs'); 3 | 4 | const userSchema = mongoose.Schema( 5 | { 6 | username: { type: String }, 7 | email: { type: String }, 8 | password: { type: String }, 9 | }, 10 | { timestamp: true } 11 | ); 12 | 13 | userSchema.pre('save', function (next) { 14 | let user = this; 15 | if (user.isModified('password')) { 16 | return bcrypt.hash(user.password, 12, function (err, hash) { 17 | if (err) { 18 | return next(err); 19 | } 20 | user.password = hash; 21 | return next(); 22 | }); 23 | } else { 24 | return next(); 25 | } 26 | }); 27 | 28 | userSchema.methods.comparePassword = function (password, next) { 29 | bcrypt.compare(password, this.password, function (err, match) { 30 | if (err) { 31 | return next(err, false); 32 | } 33 | 34 | return next(null, match); 35 | }); 36 | }; 37 | 38 | const User = mongoose.model('User', userSchema); 39 | module.exports = User; 40 | -------------------------------------------------------------------------------- /database/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "database", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "bcryptjs": "^2.4.3", 8 | "email-validator": "^2.0.4", 9 | "jsonwebtoken": "^9.0.1", 10 | "mongoose": "^7.3.1" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /database/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@*": 6 | version "20.3.3" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.3.tgz#329842940042d2b280897150e023e604d11657d6" 8 | integrity sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw== 9 | 10 | "@types/webidl-conversions@*": 11 | version "7.0.0" 12 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" 13 | integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== 14 | 15 | "@types/whatwg-url@^8.2.1": 16 | version "8.2.2" 17 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" 18 | integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== 19 | dependencies: 20 | "@types/node" "*" 21 | "@types/webidl-conversions" "*" 22 | 23 | bcryptjs@^2.4.3: 24 | version "2.4.3" 25 | resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" 26 | integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== 27 | 28 | bson@^5.3.0: 29 | version "5.3.0" 30 | resolved "https://registry.yarnpkg.com/bson/-/bson-5.3.0.tgz#37b006df4cd91ed125cb686467c1dd6d4606b514" 31 | integrity sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag== 32 | 33 | buffer-equal-constant-time@1.0.1: 34 | version "1.0.1" 35 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 36 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 37 | 38 | debug@4.x: 39 | version "4.3.4" 40 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 41 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 42 | dependencies: 43 | ms "2.1.2" 44 | 45 | ecdsa-sig-formatter@1.0.11: 46 | version "1.0.11" 47 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 48 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 49 | dependencies: 50 | safe-buffer "^5.0.1" 51 | 52 | email-validator@^2.0.4: 53 | version "2.0.4" 54 | resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" 55 | integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== 56 | 57 | ip@^2.0.0: 58 | version "2.0.0" 59 | resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" 60 | integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== 61 | 62 | jsonwebtoken@^9.0.1: 63 | version "9.0.1" 64 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#81d8c901c112c24e497a55daf6b2be1225b40145" 65 | integrity sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg== 66 | dependencies: 67 | jws "^3.2.2" 68 | lodash "^4.17.21" 69 | ms "^2.1.1" 70 | semver "^7.3.8" 71 | 72 | jwa@^1.4.1: 73 | version "1.4.1" 74 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 75 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 76 | dependencies: 77 | buffer-equal-constant-time "1.0.1" 78 | ecdsa-sig-formatter "1.0.11" 79 | safe-buffer "^5.0.1" 80 | 81 | jws@^3.2.2: 82 | version "3.2.2" 83 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 84 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 85 | dependencies: 86 | jwa "^1.4.1" 87 | safe-buffer "^5.0.1" 88 | 89 | kareem@2.5.1: 90 | version "2.5.1" 91 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" 92 | integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== 93 | 94 | lodash@^4.17.21: 95 | version "4.17.21" 96 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 97 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 98 | 99 | lru-cache@^6.0.0: 100 | version "6.0.0" 101 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 102 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 103 | dependencies: 104 | yallist "^4.0.0" 105 | 106 | memory-pager@^1.0.2: 107 | version "1.5.0" 108 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 109 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 110 | 111 | mongodb-connection-string-url@^2.6.0: 112 | version "2.6.0" 113 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" 114 | integrity sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== 115 | dependencies: 116 | "@types/whatwg-url" "^8.2.1" 117 | whatwg-url "^11.0.0" 118 | 119 | mongodb@5.6.0: 120 | version "5.6.0" 121 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-5.6.0.tgz#caff5278341bfc0f1ef6f394bb403d207de03d1e" 122 | integrity sha512-z8qVs9NfobHJm6uzK56XBZF8XwM9H294iRnB7wNjF0SnY93si5HPziIJn+qqvUR5QOff/4L0gCD6SShdR/GtVQ== 123 | dependencies: 124 | bson "^5.3.0" 125 | mongodb-connection-string-url "^2.6.0" 126 | socks "^2.7.1" 127 | optionalDependencies: 128 | saslprep "^1.0.3" 129 | 130 | mongoose@^7.3.1: 131 | version "7.3.1" 132 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-7.3.1.tgz#833bfc29a4f5cc7c4eacf4b1495d1ebe206ec409" 133 | integrity sha512-6289bmSIhvR8xMHsYe2/CuzN7wHK+2RHcK7idDdzniCPC5zix5JH0Hc4k3CmXlr/9zQ2250gUQiUWtvDB0vF1Q== 134 | dependencies: 135 | bson "^5.3.0" 136 | kareem "2.5.1" 137 | mongodb "5.6.0" 138 | mpath "0.9.0" 139 | mquery "5.0.0" 140 | ms "2.1.3" 141 | sift "16.0.1" 142 | 143 | mpath@0.9.0: 144 | version "0.9.0" 145 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" 146 | integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== 147 | 148 | mquery@5.0.0: 149 | version "5.0.0" 150 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" 151 | integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== 152 | dependencies: 153 | debug "4.x" 154 | 155 | ms@2.1.2: 156 | version "2.1.2" 157 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 158 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 159 | 160 | ms@2.1.3, ms@^2.1.1: 161 | version "2.1.3" 162 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 163 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 164 | 165 | punycode@^2.1.1: 166 | version "2.3.0" 167 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 168 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 169 | 170 | safe-buffer@^5.0.1: 171 | version "5.2.1" 172 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 173 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 174 | 175 | saslprep@^1.0.3: 176 | version "1.0.3" 177 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 178 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 179 | dependencies: 180 | sparse-bitfield "^3.0.3" 181 | 182 | semver@^7.3.8: 183 | version "7.5.4" 184 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 185 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 186 | dependencies: 187 | lru-cache "^6.0.0" 188 | 189 | sift@16.0.1: 190 | version "16.0.1" 191 | resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" 192 | integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== 193 | 194 | smart-buffer@^4.2.0: 195 | version "4.2.0" 196 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 197 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 198 | 199 | socks@^2.7.1: 200 | version "2.7.1" 201 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" 202 | integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== 203 | dependencies: 204 | ip "^2.0.0" 205 | smart-buffer "^4.2.0" 206 | 207 | sparse-bitfield@^3.0.3: 208 | version "3.0.3" 209 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 210 | integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== 211 | dependencies: 212 | memory-pager "^1.0.2" 213 | 214 | tr46@^3.0.0: 215 | version "3.0.0" 216 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 217 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 218 | dependencies: 219 | punycode "^2.1.1" 220 | 221 | webidl-conversions@^7.0.0: 222 | version "7.0.0" 223 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 224 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 225 | 226 | whatwg-url@^11.0.0: 227 | version "11.0.0" 228 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" 229 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== 230 | dependencies: 231 | tr46 "^3.0.0" 232 | webidl-conversions "^7.0.0" 233 | 234 | yallist@^4.0.0: 235 | version "4.0.0" 236 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 237 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 238 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "taskmanager", 3 | "version": "1.0.0", 4 | "main": "server.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "concurrently": "^8.2.0" 8 | }, 9 | "scripts": { 10 | "client": "yarn --cwd client dev", 11 | "server": " nodemon server/server.js", 12 | "dev": "concurrently \"yarn server\" \"yarn client\"" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /server/controllers/authController.js: -------------------------------------------------------------------------------- 1 | const User = require('../../database/model/user.model'); 2 | const jwt = require('jsonwebtoken'); 3 | const validator = require('email-validator'); 4 | 5 | const signin = async (req, res) => { 6 | let { email, password } = req.body; 7 | try { 8 | let user = await User.findOne({ email }); 9 | console.log(user, req.body); 10 | if (!user) { 11 | return res.status(400).send('email does not exist'); 12 | } 13 | 14 | user.comparePassword(password, (err, match) => { 15 | if (!match || err) return res.status(400).send('password does not match'); 16 | let token = jwt.sign({ _id: user._id }, 'kljclsadflkdsjfklsdjfklsdjf', { 17 | expiresIn: '24h', 18 | }); 19 | 20 | res.status(200).send({ 21 | token, 22 | username: user.username, 23 | email: user.email, 24 | id: user._id, 25 | createdAt: user.createdAt, 26 | updatedAt: user.updatedAt, 27 | }); 28 | }); 29 | } catch (error) { 30 | return res.status(400).send('login failed'); 31 | } 32 | }; 33 | 34 | const register = async (req, res) => { 35 | console.log(req.body, 'req'); 36 | const { username, password, email } = req.body; 37 | try { 38 | if (!username) return res.status(400).send('username is required'); 39 | 40 | if (!email) return res.status(400).send('email is required'); 41 | 42 | if (!validator.validate(email)) { 43 | return res.status(400).send('enter valid email id'); 44 | } 45 | if (!password || password.length < 6) { 46 | return res.status(400).send('enter valid password'); 47 | } 48 | 49 | const userExist = await User.findOne({ email }); 50 | if (userExist) { 51 | return res.status(400).send('email is taken'); 52 | } 53 | 54 | const user = await new User({ 55 | email, 56 | username, 57 | password, 58 | }); 59 | 60 | await user.save(); 61 | return res.status(200).send(user); 62 | } catch (error) { 63 | return res, statusbar(400).send('Error creating user'); 64 | } 65 | }; 66 | 67 | module.exports = { 68 | signin, 69 | register, 70 | }; 71 | -------------------------------------------------------------------------------- /server/controllers/taskController.js: -------------------------------------------------------------------------------- 1 | const User = require('../../database/model/user.model'); 2 | const Task = require('../../database/model/task.model'); 3 | 4 | const addTask = async (req, res) => { 5 | const { task, id } = req.body; 6 | 7 | try { 8 | if (!task) return res.status(400).send('please enter the task'); 9 | if (task.length < 10) res.status(400).send('add minimum 10 char'); 10 | const taskDetail = await new Task({ 11 | task, 12 | cretedBy: id, 13 | }); 14 | await taskDetail.save(); 15 | return res.status(200).send(taskDetail); 16 | } catch (error) { 17 | return res.status(400).send('task addition failed'); 18 | } 19 | }; 20 | 21 | const getAllTasks = async (req, res) => { 22 | const { id } = req.query; 23 | try { 24 | let tasklist = await Task.find({ cretedBy: id }); 25 | return res.status(200).send(tasklist); 26 | } catch (error) { 27 | return res.status(400).send(error); 28 | } 29 | }; 30 | 31 | const editTask = async (req, res) => {}; 32 | 33 | const statusChange = async (req, res) => { 34 | const { id, string } = req.body; 35 | 36 | try { 37 | let task = await Task.findById({ _id: id }); 38 | if (string === 'right') { 39 | if (task.status === 'backlog') { 40 | task.status = 'todo'; 41 | task.save(); 42 | return res.send(task); 43 | } else if (task.status === 'todo') { 44 | task.status = 'doing'; 45 | task.save(); 46 | return res.send(task); 47 | } else if (task.status === 'doing') { 48 | task.status = 'done'; 49 | task.save(); 50 | return res.send(task); 51 | } 52 | } else { 53 | if (task.status === 'done') { 54 | task.status = 'doing'; 55 | task.save(); 56 | return res.send(task); 57 | } else if (task.status === 'doing') { 58 | task.status = 'todo'; 59 | task.save(); 60 | return res.send(task); 61 | } else if (task.status === 'todo') { 62 | task.status = 'backlog'; 63 | task.save(); 64 | return res.send(task); 65 | } 66 | } 67 | } catch (error) {} 68 | }; 69 | 70 | const deleteTask = async (req, res) => { 71 | const { id } = req.params; 72 | try { 73 | let response = await Task.findByIdAndDelete(id); 74 | return res.status(200).send(response); 75 | } catch (error) { 76 | return res.status(400).send('deleteFailed'); 77 | } 78 | }; 79 | 80 | module.exports = { 81 | addTask, 82 | getAllTasks, 83 | editTask, 84 | statusChange, 85 | deleteTask, 86 | }; 87 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "cors": "^2.8.5", 8 | "email-validator": "^2.0.4", 9 | "express": "^4.18.2", 10 | "express-jwt": "^8.4.1", 11 | "history": "^5.3.0", 12 | "jsonwebtoken": "^9.0.1", 13 | "morgan": "^1.10.0", 14 | "nodemon": "^2.0.22" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /server/routes/authRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | const authController = require('../controllers/authController'); 5 | 6 | router.route('/signin').post(authController.signin); 7 | router.route('/register').post(authController.register); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /server/routes/taskRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | const taskController = require('../controllers/taskController'); 5 | router.route('/add').post(taskController.addTask); 6 | router.route('/tasks').get(taskController.getAllTasks); 7 | router.route('/edit/:id').put(taskController.editTask); 8 | 9 | router 10 | .route('/:id') 11 | .put(taskController.statusChange) 12 | .delete(taskController.deleteTask); 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | const cors = require('cors'); 2 | const express = require('express'); 3 | const app = express(); 4 | require('../database/db'); 5 | const authRoutes = require('./routes/authRoutes'); 6 | const taskRouter = require('./routes/taskRoutes'); 7 | const morgan = require('morgan'); 8 | 9 | app.use(cors()); 10 | app.use(morgan('dev')); 11 | app.use(express.json()); 12 | app.use('/auth', authRoutes); 13 | app.use('/task', taskRouter); 14 | 15 | // localhost:4000/auth/register 16 | 17 | const port = 4000; 18 | 19 | app.listen(port, () => { 20 | console.log(`server is running on port`, port); 21 | }); 22 | -------------------------------------------------------------------------------- /server/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.7.6": 6 | version "7.22.6" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" 8 | integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== 9 | dependencies: 10 | regenerator-runtime "^0.13.11" 11 | 12 | "@types/jsonwebtoken@^9": 13 | version "9.0.2" 14 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#9eeb56c76dd555039be2a3972218de5bd3b8d83e" 15 | integrity sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q== 16 | dependencies: 17 | "@types/node" "*" 18 | 19 | "@types/node@*": 20 | version "20.4.2" 21 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" 22 | integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== 23 | 24 | abbrev@1: 25 | version "1.1.1" 26 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 27 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 28 | 29 | accepts@~1.3.8: 30 | version "1.3.8" 31 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 32 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 33 | dependencies: 34 | mime-types "~2.1.34" 35 | negotiator "0.6.3" 36 | 37 | anymatch@~3.1.2: 38 | version "3.1.3" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 40 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 41 | dependencies: 42 | normalize-path "^3.0.0" 43 | picomatch "^2.0.4" 44 | 45 | array-flatten@1.1.1: 46 | version "1.1.1" 47 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 48 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 49 | 50 | balanced-match@^1.0.0: 51 | version "1.0.2" 52 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 53 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 54 | 55 | basic-auth@~2.0.1: 56 | version "2.0.1" 57 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 58 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 59 | dependencies: 60 | safe-buffer "5.1.2" 61 | 62 | binary-extensions@^2.0.0: 63 | version "2.2.0" 64 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 65 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 66 | 67 | body-parser@1.20.1: 68 | version "1.20.1" 69 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 70 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 71 | dependencies: 72 | bytes "3.1.2" 73 | content-type "~1.0.4" 74 | debug "2.6.9" 75 | depd "2.0.0" 76 | destroy "1.2.0" 77 | http-errors "2.0.0" 78 | iconv-lite "0.4.24" 79 | on-finished "2.4.1" 80 | qs "6.11.0" 81 | raw-body "2.5.1" 82 | type-is "~1.6.18" 83 | unpipe "1.0.0" 84 | 85 | brace-expansion@^1.1.7: 86 | version "1.1.11" 87 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 88 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 89 | dependencies: 90 | balanced-match "^1.0.0" 91 | concat-map "0.0.1" 92 | 93 | braces@~3.0.2: 94 | version "3.0.2" 95 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 96 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 97 | dependencies: 98 | fill-range "^7.0.1" 99 | 100 | buffer-equal-constant-time@1.0.1: 101 | version "1.0.1" 102 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 103 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 104 | 105 | bytes@3.1.2: 106 | version "3.1.2" 107 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 108 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 109 | 110 | call-bind@^1.0.0: 111 | version "1.0.2" 112 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 113 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 114 | dependencies: 115 | function-bind "^1.1.1" 116 | get-intrinsic "^1.0.2" 117 | 118 | chokidar@^3.5.2: 119 | version "3.5.3" 120 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 121 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 122 | dependencies: 123 | anymatch "~3.1.2" 124 | braces "~3.0.2" 125 | glob-parent "~5.1.2" 126 | is-binary-path "~2.1.0" 127 | is-glob "~4.0.1" 128 | normalize-path "~3.0.0" 129 | readdirp "~3.6.0" 130 | optionalDependencies: 131 | fsevents "~2.3.2" 132 | 133 | concat-map@0.0.1: 134 | version "0.0.1" 135 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 136 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 137 | 138 | content-disposition@0.5.4: 139 | version "0.5.4" 140 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 141 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 142 | dependencies: 143 | safe-buffer "5.2.1" 144 | 145 | content-type@~1.0.4: 146 | version "1.0.5" 147 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 148 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 149 | 150 | cookie-signature@1.0.6: 151 | version "1.0.6" 152 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 153 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 154 | 155 | cookie@0.5.0: 156 | version "0.5.0" 157 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 158 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 159 | 160 | cors@^2.8.5: 161 | version "2.8.5" 162 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 163 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 164 | dependencies: 165 | object-assign "^4" 166 | vary "^1" 167 | 168 | debug@2.6.9: 169 | version "2.6.9" 170 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 171 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 172 | dependencies: 173 | ms "2.0.0" 174 | 175 | debug@^3.2.7: 176 | version "3.2.7" 177 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 178 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 179 | dependencies: 180 | ms "^2.1.1" 181 | 182 | depd@2.0.0, depd@~2.0.0: 183 | version "2.0.0" 184 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 185 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 186 | 187 | destroy@1.2.0: 188 | version "1.2.0" 189 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 190 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 191 | 192 | ecdsa-sig-formatter@1.0.11: 193 | version "1.0.11" 194 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 195 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 196 | dependencies: 197 | safe-buffer "^5.0.1" 198 | 199 | ee-first@1.1.1: 200 | version "1.1.1" 201 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 202 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 203 | 204 | email-validator@^2.0.4: 205 | version "2.0.4" 206 | resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" 207 | integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== 208 | 209 | encodeurl@~1.0.2: 210 | version "1.0.2" 211 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 212 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 213 | 214 | escape-html@~1.0.3: 215 | version "1.0.3" 216 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 217 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 218 | 219 | etag@~1.8.1: 220 | version "1.8.1" 221 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 222 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 223 | 224 | express-jwt@^8.4.1: 225 | version "8.4.1" 226 | resolved "https://registry.yarnpkg.com/express-jwt/-/express-jwt-8.4.1.tgz#ba817c1ced7c6f1f7017fc2e6deac207011e8acb" 227 | integrity sha512-IZoZiDv2yZJAb3QrbaSATVtTCYT11OcqgFGoTN4iKVyN6NBkBkhtVIixww5fmakF0Upt5HfOxJuS6ZmJVeOtTQ== 228 | dependencies: 229 | "@types/jsonwebtoken" "^9" 230 | express-unless "^2.1.3" 231 | jsonwebtoken "^9.0.0" 232 | 233 | express-unless@^2.1.3: 234 | version "2.1.3" 235 | resolved "https://registry.yarnpkg.com/express-unless/-/express-unless-2.1.3.tgz#f951c6cca52a24da3de32d42cfd4db57bc0f9a2e" 236 | integrity sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ== 237 | 238 | express@^4.18.2: 239 | version "4.18.2" 240 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 241 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 242 | dependencies: 243 | accepts "~1.3.8" 244 | array-flatten "1.1.1" 245 | body-parser "1.20.1" 246 | content-disposition "0.5.4" 247 | content-type "~1.0.4" 248 | cookie "0.5.0" 249 | cookie-signature "1.0.6" 250 | debug "2.6.9" 251 | depd "2.0.0" 252 | encodeurl "~1.0.2" 253 | escape-html "~1.0.3" 254 | etag "~1.8.1" 255 | finalhandler "1.2.0" 256 | fresh "0.5.2" 257 | http-errors "2.0.0" 258 | merge-descriptors "1.0.1" 259 | methods "~1.1.2" 260 | on-finished "2.4.1" 261 | parseurl "~1.3.3" 262 | path-to-regexp "0.1.7" 263 | proxy-addr "~2.0.7" 264 | qs "6.11.0" 265 | range-parser "~1.2.1" 266 | safe-buffer "5.2.1" 267 | send "0.18.0" 268 | serve-static "1.15.0" 269 | setprototypeof "1.2.0" 270 | statuses "2.0.1" 271 | type-is "~1.6.18" 272 | utils-merge "1.0.1" 273 | vary "~1.1.2" 274 | 275 | fill-range@^7.0.1: 276 | version "7.0.1" 277 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 278 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 279 | dependencies: 280 | to-regex-range "^5.0.1" 281 | 282 | finalhandler@1.2.0: 283 | version "1.2.0" 284 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 285 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 286 | dependencies: 287 | debug "2.6.9" 288 | encodeurl "~1.0.2" 289 | escape-html "~1.0.3" 290 | on-finished "2.4.1" 291 | parseurl "~1.3.3" 292 | statuses "2.0.1" 293 | unpipe "~1.0.0" 294 | 295 | forwarded@0.2.0: 296 | version "0.2.0" 297 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 298 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 299 | 300 | fresh@0.5.2: 301 | version "0.5.2" 302 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 303 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 304 | 305 | fsevents@~2.3.2: 306 | version "2.3.2" 307 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 308 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 309 | 310 | function-bind@^1.1.1: 311 | version "1.1.1" 312 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 313 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 314 | 315 | get-intrinsic@^1.0.2: 316 | version "1.2.1" 317 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" 318 | integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== 319 | dependencies: 320 | function-bind "^1.1.1" 321 | has "^1.0.3" 322 | has-proto "^1.0.1" 323 | has-symbols "^1.0.3" 324 | 325 | glob-parent@~5.1.2: 326 | version "5.1.2" 327 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 328 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 329 | dependencies: 330 | is-glob "^4.0.1" 331 | 332 | has-flag@^3.0.0: 333 | version "3.0.0" 334 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 335 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 336 | 337 | has-proto@^1.0.1: 338 | version "1.0.1" 339 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" 340 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 341 | 342 | has-symbols@^1.0.3: 343 | version "1.0.3" 344 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 345 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 346 | 347 | has@^1.0.3: 348 | version "1.0.3" 349 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 350 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 351 | dependencies: 352 | function-bind "^1.1.1" 353 | 354 | history@^5.3.0: 355 | version "5.3.0" 356 | resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" 357 | integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== 358 | dependencies: 359 | "@babel/runtime" "^7.7.6" 360 | 361 | http-errors@2.0.0: 362 | version "2.0.0" 363 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 364 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 365 | dependencies: 366 | depd "2.0.0" 367 | inherits "2.0.4" 368 | setprototypeof "1.2.0" 369 | statuses "2.0.1" 370 | toidentifier "1.0.1" 371 | 372 | iconv-lite@0.4.24: 373 | version "0.4.24" 374 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 375 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 376 | dependencies: 377 | safer-buffer ">= 2.1.2 < 3" 378 | 379 | ignore-by-default@^1.0.1: 380 | version "1.0.1" 381 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 382 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 383 | 384 | inherits@2.0.4: 385 | version "2.0.4" 386 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 387 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 388 | 389 | ipaddr.js@1.9.1: 390 | version "1.9.1" 391 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 392 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 393 | 394 | is-binary-path@~2.1.0: 395 | version "2.1.0" 396 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 397 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 398 | dependencies: 399 | binary-extensions "^2.0.0" 400 | 401 | is-extglob@^2.1.1: 402 | version "2.1.1" 403 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 404 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 405 | 406 | is-glob@^4.0.1, is-glob@~4.0.1: 407 | version "4.0.3" 408 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 409 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 410 | dependencies: 411 | is-extglob "^2.1.1" 412 | 413 | is-number@^7.0.0: 414 | version "7.0.0" 415 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 416 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 417 | 418 | jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.1: 419 | version "9.0.1" 420 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#81d8c901c112c24e497a55daf6b2be1225b40145" 421 | integrity sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg== 422 | dependencies: 423 | jws "^3.2.2" 424 | lodash "^4.17.21" 425 | ms "^2.1.1" 426 | semver "^7.3.8" 427 | 428 | jwa@^1.4.1: 429 | version "1.4.1" 430 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 431 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 432 | dependencies: 433 | buffer-equal-constant-time "1.0.1" 434 | ecdsa-sig-formatter "1.0.11" 435 | safe-buffer "^5.0.1" 436 | 437 | jws@^3.2.2: 438 | version "3.2.2" 439 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 440 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 441 | dependencies: 442 | jwa "^1.4.1" 443 | safe-buffer "^5.0.1" 444 | 445 | lodash@^4.17.21: 446 | version "4.17.21" 447 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 448 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 449 | 450 | lru-cache@^6.0.0: 451 | version "6.0.0" 452 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 453 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 454 | dependencies: 455 | yallist "^4.0.0" 456 | 457 | media-typer@0.3.0: 458 | version "0.3.0" 459 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 460 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 461 | 462 | merge-descriptors@1.0.1: 463 | version "1.0.1" 464 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 465 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 466 | 467 | methods@~1.1.2: 468 | version "1.1.2" 469 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 470 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 471 | 472 | mime-db@1.52.0: 473 | version "1.52.0" 474 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 475 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 476 | 477 | mime-types@~2.1.24, mime-types@~2.1.34: 478 | version "2.1.35" 479 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 480 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 481 | dependencies: 482 | mime-db "1.52.0" 483 | 484 | mime@1.6.0: 485 | version "1.6.0" 486 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 487 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 488 | 489 | minimatch@^3.1.2: 490 | version "3.1.2" 491 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 492 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 493 | dependencies: 494 | brace-expansion "^1.1.7" 495 | 496 | morgan@^1.10.0: 497 | version "1.10.0" 498 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 499 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 500 | dependencies: 501 | basic-auth "~2.0.1" 502 | debug "2.6.9" 503 | depd "~2.0.0" 504 | on-finished "~2.3.0" 505 | on-headers "~1.0.2" 506 | 507 | ms@2.0.0: 508 | version "2.0.0" 509 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 510 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 511 | 512 | ms@2.1.3, ms@^2.1.1: 513 | version "2.1.3" 514 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 515 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 516 | 517 | negotiator@0.6.3: 518 | version "0.6.3" 519 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 520 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 521 | 522 | nodemon@^2.0.22: 523 | version "2.0.22" 524 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" 525 | integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== 526 | dependencies: 527 | chokidar "^3.5.2" 528 | debug "^3.2.7" 529 | ignore-by-default "^1.0.1" 530 | minimatch "^3.1.2" 531 | pstree.remy "^1.1.8" 532 | semver "^5.7.1" 533 | simple-update-notifier "^1.0.7" 534 | supports-color "^5.5.0" 535 | touch "^3.1.0" 536 | undefsafe "^2.0.5" 537 | 538 | nopt@~1.0.10: 539 | version "1.0.10" 540 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 541 | integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== 542 | dependencies: 543 | abbrev "1" 544 | 545 | normalize-path@^3.0.0, normalize-path@~3.0.0: 546 | version "3.0.0" 547 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 548 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 549 | 550 | object-assign@^4: 551 | version "4.1.1" 552 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 553 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 554 | 555 | object-inspect@^1.9.0: 556 | version "1.12.3" 557 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 558 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 559 | 560 | on-finished@2.4.1: 561 | version "2.4.1" 562 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 563 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 564 | dependencies: 565 | ee-first "1.1.1" 566 | 567 | on-finished@~2.3.0: 568 | version "2.3.0" 569 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 570 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 571 | dependencies: 572 | ee-first "1.1.1" 573 | 574 | on-headers@~1.0.2: 575 | version "1.0.2" 576 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 577 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 578 | 579 | parseurl@~1.3.3: 580 | version "1.3.3" 581 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 582 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 583 | 584 | path-to-regexp@0.1.7: 585 | version "0.1.7" 586 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 587 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 588 | 589 | picomatch@^2.0.4, picomatch@^2.2.1: 590 | version "2.3.1" 591 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 592 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 593 | 594 | proxy-addr@~2.0.7: 595 | version "2.0.7" 596 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 597 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 598 | dependencies: 599 | forwarded "0.2.0" 600 | ipaddr.js "1.9.1" 601 | 602 | pstree.remy@^1.1.8: 603 | version "1.1.8" 604 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 605 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 606 | 607 | qs@6.11.0: 608 | version "6.11.0" 609 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 610 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 611 | dependencies: 612 | side-channel "^1.0.4" 613 | 614 | range-parser@~1.2.1: 615 | version "1.2.1" 616 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 617 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 618 | 619 | raw-body@2.5.1: 620 | version "2.5.1" 621 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 622 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 623 | dependencies: 624 | bytes "3.1.2" 625 | http-errors "2.0.0" 626 | iconv-lite "0.4.24" 627 | unpipe "1.0.0" 628 | 629 | readdirp@~3.6.0: 630 | version "3.6.0" 631 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 632 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 633 | dependencies: 634 | picomatch "^2.2.1" 635 | 636 | regenerator-runtime@^0.13.11: 637 | version "0.13.11" 638 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" 639 | integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 640 | 641 | safe-buffer@5.1.2: 642 | version "5.1.2" 643 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 644 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 645 | 646 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 647 | version "5.2.1" 648 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 649 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 650 | 651 | "safer-buffer@>= 2.1.2 < 3": 652 | version "2.1.2" 653 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 654 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 655 | 656 | semver@^5.7.1: 657 | version "5.7.1" 658 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 659 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 660 | 661 | semver@^7.3.8: 662 | version "7.5.4" 663 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 664 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 665 | dependencies: 666 | lru-cache "^6.0.0" 667 | 668 | semver@~7.0.0: 669 | version "7.0.0" 670 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 671 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 672 | 673 | send@0.18.0: 674 | version "0.18.0" 675 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 676 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 677 | dependencies: 678 | debug "2.6.9" 679 | depd "2.0.0" 680 | destroy "1.2.0" 681 | encodeurl "~1.0.2" 682 | escape-html "~1.0.3" 683 | etag "~1.8.1" 684 | fresh "0.5.2" 685 | http-errors "2.0.0" 686 | mime "1.6.0" 687 | ms "2.1.3" 688 | on-finished "2.4.1" 689 | range-parser "~1.2.1" 690 | statuses "2.0.1" 691 | 692 | serve-static@1.15.0: 693 | version "1.15.0" 694 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 695 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 696 | dependencies: 697 | encodeurl "~1.0.2" 698 | escape-html "~1.0.3" 699 | parseurl "~1.3.3" 700 | send "0.18.0" 701 | 702 | setprototypeof@1.2.0: 703 | version "1.2.0" 704 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 705 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 706 | 707 | side-channel@^1.0.4: 708 | version "1.0.4" 709 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 710 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 711 | dependencies: 712 | call-bind "^1.0.0" 713 | get-intrinsic "^1.0.2" 714 | object-inspect "^1.9.0" 715 | 716 | simple-update-notifier@^1.0.7: 717 | version "1.1.0" 718 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" 719 | integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== 720 | dependencies: 721 | semver "~7.0.0" 722 | 723 | statuses@2.0.1: 724 | version "2.0.1" 725 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 726 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 727 | 728 | supports-color@^5.5.0: 729 | version "5.5.0" 730 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 731 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 732 | dependencies: 733 | has-flag "^3.0.0" 734 | 735 | to-regex-range@^5.0.1: 736 | version "5.0.1" 737 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 738 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 739 | dependencies: 740 | is-number "^7.0.0" 741 | 742 | toidentifier@1.0.1: 743 | version "1.0.1" 744 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 745 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 746 | 747 | touch@^3.1.0: 748 | version "3.1.0" 749 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 750 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 751 | dependencies: 752 | nopt "~1.0.10" 753 | 754 | type-is@~1.6.18: 755 | version "1.6.18" 756 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 757 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 758 | dependencies: 759 | media-typer "0.3.0" 760 | mime-types "~2.1.24" 761 | 762 | undefsafe@^2.0.5: 763 | version "2.0.5" 764 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 765 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 766 | 767 | unpipe@1.0.0, unpipe@~1.0.0: 768 | version "1.0.0" 769 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 770 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 771 | 772 | utils-merge@1.0.1: 773 | version "1.0.1" 774 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 775 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 776 | 777 | vary@^1, vary@~1.1.2: 778 | version "1.1.2" 779 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 780 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 781 | 782 | yallist@^4.0.0: 783 | version "4.0.0" 784 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 785 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 786 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.21.0": 6 | version "7.22.5" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" 8 | integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== 9 | dependencies: 10 | regenerator-runtime "^0.13.11" 11 | 12 | abbrev@1: 13 | version "1.1.1" 14 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 15 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 16 | 17 | ansi-regex@^5.0.1: 18 | version "5.0.1" 19 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 20 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 21 | 22 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 23 | version "4.3.0" 24 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 25 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 26 | dependencies: 27 | color-convert "^2.0.1" 28 | 29 | anymatch@~3.1.2: 30 | version "3.1.3" 31 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 32 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 33 | dependencies: 34 | normalize-path "^3.0.0" 35 | picomatch "^2.0.4" 36 | 37 | balanced-match@^1.0.0: 38 | version "1.0.2" 39 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 40 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 41 | 42 | binary-extensions@^2.0.0: 43 | version "2.2.0" 44 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 45 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 46 | 47 | brace-expansion@^1.1.7: 48 | version "1.1.11" 49 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 50 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 51 | dependencies: 52 | balanced-match "^1.0.0" 53 | concat-map "0.0.1" 54 | 55 | braces@~3.0.2: 56 | version "3.0.2" 57 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 58 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 59 | dependencies: 60 | fill-range "^7.0.1" 61 | 62 | chalk@^4.1.2: 63 | version "4.1.2" 64 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 65 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 66 | dependencies: 67 | ansi-styles "^4.1.0" 68 | supports-color "^7.1.0" 69 | 70 | chokidar@^3.5.2: 71 | version "3.5.3" 72 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 73 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 74 | dependencies: 75 | anymatch "~3.1.2" 76 | braces "~3.0.2" 77 | glob-parent "~5.1.2" 78 | is-binary-path "~2.1.0" 79 | is-glob "~4.0.1" 80 | normalize-path "~3.0.0" 81 | readdirp "~3.6.0" 82 | optionalDependencies: 83 | fsevents "~2.3.2" 84 | 85 | cliui@^8.0.1: 86 | version "8.0.1" 87 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 88 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 89 | dependencies: 90 | string-width "^4.2.0" 91 | strip-ansi "^6.0.1" 92 | wrap-ansi "^7.0.0" 93 | 94 | color-convert@^2.0.1: 95 | version "2.0.1" 96 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 97 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 98 | dependencies: 99 | color-name "~1.1.4" 100 | 101 | color-name@~1.1.4: 102 | version "1.1.4" 103 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 104 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 105 | 106 | concat-map@0.0.1: 107 | version "0.0.1" 108 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 109 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 110 | 111 | concurrently@^8.2.0: 112 | version "8.2.0" 113 | resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.0.tgz#cdc9f621a4d913366600355d68254df2c5e782f3" 114 | integrity sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA== 115 | dependencies: 116 | chalk "^4.1.2" 117 | date-fns "^2.30.0" 118 | lodash "^4.17.21" 119 | rxjs "^7.8.1" 120 | shell-quote "^1.8.1" 121 | spawn-command "0.0.2" 122 | supports-color "^8.1.1" 123 | tree-kill "^1.2.2" 124 | yargs "^17.7.2" 125 | 126 | date-fns@^2.30.0: 127 | version "2.30.0" 128 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" 129 | integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== 130 | dependencies: 131 | "@babel/runtime" "^7.21.0" 132 | 133 | debug@^3.2.7: 134 | version "3.2.7" 135 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 136 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 137 | dependencies: 138 | ms "^2.1.1" 139 | 140 | emoji-regex@^8.0.0: 141 | version "8.0.0" 142 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 143 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 144 | 145 | escalade@^3.1.1: 146 | version "3.1.1" 147 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 148 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 149 | 150 | fill-range@^7.0.1: 151 | version "7.0.1" 152 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 153 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 154 | dependencies: 155 | to-regex-range "^5.0.1" 156 | 157 | fsevents@~2.3.2: 158 | version "2.3.2" 159 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 160 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 161 | 162 | get-caller-file@^2.0.5: 163 | version "2.0.5" 164 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 165 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 166 | 167 | glob-parent@~5.1.2: 168 | version "5.1.2" 169 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 170 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 171 | dependencies: 172 | is-glob "^4.0.1" 173 | 174 | has-flag@^3.0.0: 175 | version "3.0.0" 176 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 177 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 178 | 179 | has-flag@^4.0.0: 180 | version "4.0.0" 181 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 182 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 183 | 184 | ignore-by-default@^1.0.1: 185 | version "1.0.1" 186 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 187 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 188 | 189 | is-binary-path@~2.1.0: 190 | version "2.1.0" 191 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 192 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 193 | dependencies: 194 | binary-extensions "^2.0.0" 195 | 196 | is-extglob@^2.1.1: 197 | version "2.1.1" 198 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 199 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 200 | 201 | is-fullwidth-code-point@^3.0.0: 202 | version "3.0.0" 203 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 204 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 205 | 206 | is-glob@^4.0.1, is-glob@~4.0.1: 207 | version "4.0.3" 208 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 209 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 210 | dependencies: 211 | is-extglob "^2.1.1" 212 | 213 | is-number@^7.0.0: 214 | version "7.0.0" 215 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 216 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 217 | 218 | lodash@^4.17.21: 219 | version "4.17.21" 220 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 221 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 222 | 223 | minimatch@^3.1.2: 224 | version "3.1.2" 225 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 226 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 227 | dependencies: 228 | brace-expansion "^1.1.7" 229 | 230 | ms@^2.1.1: 231 | version "2.1.3" 232 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 233 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 234 | 235 | nodemon@^2.0.22: 236 | version "2.0.22" 237 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" 238 | integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== 239 | dependencies: 240 | chokidar "^3.5.2" 241 | debug "^3.2.7" 242 | ignore-by-default "^1.0.1" 243 | minimatch "^3.1.2" 244 | pstree.remy "^1.1.8" 245 | semver "^5.7.1" 246 | simple-update-notifier "^1.0.7" 247 | supports-color "^5.5.0" 248 | touch "^3.1.0" 249 | undefsafe "^2.0.5" 250 | 251 | nopt@~1.0.10: 252 | version "1.0.10" 253 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 254 | integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== 255 | dependencies: 256 | abbrev "1" 257 | 258 | normalize-path@^3.0.0, normalize-path@~3.0.0: 259 | version "3.0.0" 260 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 261 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 262 | 263 | picomatch@^2.0.4, picomatch@^2.2.1: 264 | version "2.3.1" 265 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 266 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 267 | 268 | pstree.remy@^1.1.8: 269 | version "1.1.8" 270 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 271 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 272 | 273 | readdirp@~3.6.0: 274 | version "3.6.0" 275 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 276 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 277 | dependencies: 278 | picomatch "^2.2.1" 279 | 280 | regenerator-runtime@^0.13.11: 281 | version "0.13.11" 282 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" 283 | integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 284 | 285 | require-directory@^2.1.1: 286 | version "2.1.1" 287 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 288 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 289 | 290 | rxjs@^7.8.1: 291 | version "7.8.1" 292 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" 293 | integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== 294 | dependencies: 295 | tslib "^2.1.0" 296 | 297 | semver@^5.7.1: 298 | version "5.7.1" 299 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 300 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 301 | 302 | semver@~7.0.0: 303 | version "7.0.0" 304 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 305 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 306 | 307 | shell-quote@^1.8.1: 308 | version "1.8.1" 309 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" 310 | integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== 311 | 312 | simple-update-notifier@^1.0.7: 313 | version "1.1.0" 314 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" 315 | integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== 316 | dependencies: 317 | semver "~7.0.0" 318 | 319 | spawn-command@0.0.2: 320 | version "0.0.2" 321 | resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" 322 | integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== 323 | 324 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 325 | version "4.2.3" 326 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 327 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 328 | dependencies: 329 | emoji-regex "^8.0.0" 330 | is-fullwidth-code-point "^3.0.0" 331 | strip-ansi "^6.0.1" 332 | 333 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 334 | version "6.0.1" 335 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 336 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 337 | dependencies: 338 | ansi-regex "^5.0.1" 339 | 340 | supports-color@^5.5.0: 341 | version "5.5.0" 342 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 343 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 344 | dependencies: 345 | has-flag "^3.0.0" 346 | 347 | supports-color@^7.1.0: 348 | version "7.2.0" 349 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 350 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 351 | dependencies: 352 | has-flag "^4.0.0" 353 | 354 | supports-color@^8.1.1: 355 | version "8.1.1" 356 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 357 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 358 | dependencies: 359 | has-flag "^4.0.0" 360 | 361 | to-regex-range@^5.0.1: 362 | version "5.0.1" 363 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 364 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 365 | dependencies: 366 | is-number "^7.0.0" 367 | 368 | touch@^3.1.0: 369 | version "3.1.0" 370 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 371 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 372 | dependencies: 373 | nopt "~1.0.10" 374 | 375 | tree-kill@^1.2.2: 376 | version "1.2.2" 377 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 378 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 379 | 380 | tslib@^2.1.0: 381 | version "2.6.0" 382 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" 383 | integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== 384 | 385 | undefsafe@^2.0.5: 386 | version "2.0.5" 387 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 388 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 389 | 390 | wrap-ansi@^7.0.0: 391 | version "7.0.0" 392 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 393 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 394 | dependencies: 395 | ansi-styles "^4.0.0" 396 | string-width "^4.1.0" 397 | strip-ansi "^6.0.0" 398 | 399 | y18n@^5.0.5: 400 | version "5.0.8" 401 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 402 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 403 | 404 | yargs-parser@^21.1.1: 405 | version "21.1.1" 406 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 407 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 408 | 409 | yargs@^17.7.2: 410 | version "17.7.2" 411 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 412 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 413 | dependencies: 414 | cliui "^8.0.1" 415 | escalade "^3.1.1" 416 | get-caller-file "^2.0.5" 417 | require-directory "^2.1.1" 418 | string-width "^4.2.3" 419 | y18n "^5.0.5" 420 | yargs-parser "^21.1.1" 421 | --------------------------------------------------------------------------------