├── .gitignore ├── back ├── .gitignore ├── README.md ├── package.json ├── src │ ├── db │ │ └── connection.ts │ ├── middlewares │ │ └── auth-meddlewares.ts │ ├── model │ │ ├── Admin.ts │ │ ├── Task.ts │ │ └── User.ts │ ├── repositories │ │ ├── IAdminRepository.ts │ │ ├── ITasksRepository.ts │ │ ├── IUsersRapository.ts │ │ └── implements │ │ │ ├── AdminRepository.ts │ │ │ ├── TasksRepository.ts │ │ │ └── UsersRepository.ts │ ├── routes │ │ ├── admins.route.ts │ │ ├── tasks.route.ts │ │ └── users.route.ts │ ├── server.ts │ └── useCases │ │ ├── authenticate │ │ ├── AuthenticateAdminController.ts │ │ ├── AuthenticateAdminUseCase.ts │ │ ├── IAuthenticateAdmin.ts │ │ └── index.ts │ │ ├── createTask │ │ ├── CreateTaskController.ts │ │ ├── CreateTasksUseCase.ts │ │ ├── ICreateTasksDTO.ts │ │ └── index.ts │ │ ├── createUser │ │ ├── CreateUseeController.ts │ │ ├── CreateUsersUseCase.ts │ │ ├── ICreateUsers.ts │ │ └── index.ts │ │ ├── deleteTask │ │ ├── DeleteTaskController.ts │ │ ├── DeleteTaskUseCase.ts │ │ ├── IDeleteTask.ts │ │ └── index.ts │ │ ├── getAdmins │ │ ├── GetAdminsController.ts │ │ ├── GetAdminsUseCase.ts │ │ └── index.ts │ │ ├── getTasks │ │ ├── GetTasksController.ts │ │ ├── GetTasksUseCase.ts │ │ └── index.ts │ │ ├── getUsers │ │ ├── GetUsersController.ts │ │ ├── GetUsersUseCase.ts │ │ └── index.ts │ │ └── upDateTask │ │ ├── IUpDateStatusService.ts │ │ ├── UpDateStatusController.ts │ │ ├── UpDateStatusUseCase.ts │ │ └── index.ts ├── tsconfig.json └── yarn.lock └── front ├── .eslintrc.json ├── .gitignore ├── README.md ├── images ├── 95001318.png └── Capturar.PNG ├── next-env.d.ts ├── next.config.js ├── package.json ├── pages ├── _app.tsx ├── _document.tsx ├── addTasks │ ├── index.tsx │ └── style.ts ├── addUsers.tsx ├── admin │ ├── index.tsx │ └── style.ts ├── finishedTasks │ ├── index.tsx │ └── style.ts ├── index │ ├── index.tsx │ └── style.ts ├── login │ ├── index.tsx │ └── style.ts ├── peddingTasks │ ├── index.tsx │ └── style.ts └── usersList │ ├── index.tsx │ └── style.ts ├── public └── images │ ├── 10181.jpg │ ├── 1660132895236.jpg │ ├── 1660932536722.jpg │ ├── 269796429_907875379913390_4775710928716066908_n.jpg │ ├── 290194254_1251558849023955_252359117323357879_n.jpg │ ├── 4433.jpg │ ├── 4857949.jpg │ ├── 7952.jpg │ ├── baixados.jpg │ ├── beige-16875_1920.jpg │ ├── black-and-white-1297353_1280.png │ ├── eu e crianças.jpg │ ├── feedback.png │ ├── file.png │ ├── gear.png │ ├── goout.jpg │ ├── lcd.jpg │ ├── pexels-george-becker-126658.jpg │ ├── pexels-pixabay-414144.jpg │ ├── pexels-scott-webb-1029639.jpg │ ├── recycling-1341372_1920.png │ ├── setting.jpg │ ├── settings.png │ ├── unknown.png │ └── vecteezy_assortment-of-recycled-paper-notebooks_2297167 (2).jpg ├── src ├── components │ ├── addTasks │ │ ├── addTasks.tsx │ │ └── style.ts │ ├── addUsers │ │ ├── addUsers.tsx │ │ └── style.ts │ ├── admin │ │ ├── admin.tsx │ │ └── style.ts │ ├── aside │ │ ├── aside.tsx │ │ └── style.ts │ ├── finishedTasksList │ │ ├── style.ts │ │ └── taskList.tsx │ ├── header │ │ ├── header.tsx │ │ └── style.ts │ ├── loginAdmin │ │ ├── loginAdmin.tsx │ │ └── style.ts │ ├── mainContentainer │ │ └── MainContainer.tsx │ ├── miniCards │ │ ├── MiniCards.tsx │ │ └── style.ts │ ├── peddingTasksList │ │ ├── style.ts │ │ └── taskList.tsx │ ├── pickUser │ │ ├── pickUser.tsx │ │ └── style.ts │ ├── taskList │ │ ├── style.ts │ │ └── taskList.tsx │ └── usersList │ │ ├── style.ts │ │ └── usersList.tsx ├── context │ ├── authContext.tsx │ ├── tasksContext.tsx │ └── usersContext.ts └── services │ └── api.ts ├── styles └── Global.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /back/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /back/README.md: -------------------------------------------------------------------------------- 1 | # user-management-using-solid -------------------------------------------------------------------------------- /back/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "user-management", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "dev": "tsnd --transpile-only --respawn --ignore-watch node_modules src/server.ts" 8 | }, 9 | "dependencies": { 10 | "@types/bcryptjs": "^2.4.2", 11 | "@types/cors": "^2.8.12", 12 | "@types/jsonwebtoken": "^8.5.9", 13 | "@types/mysql": "^2.15.21", 14 | "bcryptjs": "^2.4.3", 15 | "cors": "^2.8.5", 16 | "express": "^4.18.1", 17 | "express-async-errors": "^3.1.1", 18 | "jsonwebtoken": "^8.5.1", 19 | "mysql": "^2.18.1" 20 | }, 21 | "devDependencies": { 22 | "@types/express": "^4.17.13", 23 | "ts-node-dev": "^2.0.0", 24 | "typescript": "^4.8.2" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /back/src/db/connection.ts: -------------------------------------------------------------------------------- 1 | import mysql from 'mysql'; 2 | 3 | const connection = mysql.createPool({ 4 | host: 'localhost', 5 | user: 'root', 6 | password: '', 7 | database: 'dlinenode' 8 | }); 9 | 10 | export {connection}; -------------------------------------------------------------------------------- /back/src/middlewares/auth-meddlewares.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction,Request,Response } from "express"; 2 | import { verify } from "jsonwebtoken"; 3 | 4 | export function adminAutenticated(request:Request,response: Response,next:NextFunction){ 5 | const authToken=request.headers.authorization; 6 | 7 | if(!authToken){ 8 | return response.status(404).json({ 9 | message:"unauthorized", 10 | }) 11 | } 12 | 13 | const [,token]=authToken.split(" "); 14 | 15 | try { 16 | verify(token, '08173a01-987e-4e64-bb0f-69ad176e7b1a'); 17 | return next(); 18 | } catch (err) { 19 | return response.status(401).json({message:'token unauthorized'}); 20 | } 21 | } -------------------------------------------------------------------------------- /back/src/model/Admin.ts: -------------------------------------------------------------------------------- 1 | import {randomUUID as uuidv4} from 'crypto'; 2 | 3 | class Admin{ 4 | id: string; 5 | name: string; 6 | email: string; 7 | password:string; 8 | 9 | constructor() { 10 | if (!this.id) { 11 | this.id = uuidv4(); 12 | } 13 | } 14 | } 15 | 16 | export { Admin }; -------------------------------------------------------------------------------- /back/src/model/Task.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID as uuidv4 } from 'crypto'; 2 | 3 | class Task{ 4 | name: string; 5 | description:string; 6 | status:string; 7 | idUser:string; 8 | id: string; 9 | 10 | constructor() { 11 | if (!this.id) { 12 | this.id = uuidv4(); 13 | } 14 | } 15 | } 16 | 17 | export { Task }; -------------------------------------------------------------------------------- /back/src/model/User.ts: -------------------------------------------------------------------------------- 1 | import { randomUUID as uuidv4 } from 'crypto'; 2 | import { Task } from './Task'; 3 | 4 | class User{ 5 | name:string; 6 | email:string; 7 | id?:string; 8 | idAdmin 9 | 10 | constructor(){ 11 | if(!this.id){ 12 | this.id=uuidv4(); 13 | } 14 | } 15 | } 16 | 17 | export {User}; -------------------------------------------------------------------------------- /back/src/repositories/IAdminRepository.ts: -------------------------------------------------------------------------------- 1 | import { Admin } from "../model/Admin"; 2 | 3 | interface IAdminRepository{ 4 | getAdmin():Admin[]; 5 | verifyIfExists(email:string):Admin | undefined; 6 | } 7 | 8 | export { IAdminRepository}; -------------------------------------------------------------------------------- /back/src/repositories/ITasksRepository.ts: -------------------------------------------------------------------------------- 1 | import { Task } from "../model/Task"; 2 | 3 | interface ICreateTaskDTO{ 4 | name:string; 5 | description:string; 6 | status:string; 7 | idUser:string; 8 | } 9 | 10 | interface ITasksRepository{ 11 | getAllTasks():Task[]; 12 | createTasks({name,description,status,idUser}:ICreateTaskDTO):void; 13 | upDateStatus(id:string,status:string):void; 14 | deleteTask(id:string):string; 15 | } 16 | export {ITasksRepository,ICreateTaskDTO}; -------------------------------------------------------------------------------- /back/src/repositories/IUsersRapository.ts: -------------------------------------------------------------------------------- 1 | import { User } from "../model/User"; 2 | 3 | interface ICreateUserDTO{ 4 | name:string; 5 | email:string; 6 | idAdmin:string; 7 | id:string; 8 | } 9 | 10 | interface IUsersRepository{ 11 | findByEmail(email:string):boolean; 12 | create({name,email,idAdmin}:User):void; 13 | list():User[]; 14 | } 15 | export {ICreateUserDTO,IUsersRepository}; -------------------------------------------------------------------------------- /back/src/repositories/implements/AdminRepository.ts: -------------------------------------------------------------------------------- 1 | import { connection } from "../../db/connection"; 2 | import { Admin } from "../../model/Admin"; 3 | import { IAdminRepository } from "../IAdminRepository"; 4 | 5 | class AdminRepository implements IAdminRepository{ 6 | 7 | private admins:Admin[]; 8 | private static INSTANCE: AdminRepository; 9 | 10 | constructor(){ 11 | this.getAdmins(); 12 | } 13 | 14 | public static getINSTANCE(): AdminRepository { 15 | if (!AdminRepository.INSTANCE) 16 | AdminRepository.INSTANCE = new AdminRepository(); 17 | 18 | return AdminRepository.INSTANCE; 19 | } 20 | 21 | getAdmin(): Admin[] { 22 | return this.admins; 23 | } 24 | 25 | verifyIfExists(email: string): Admin | undefined { 26 | 27 | const adminExists= this.admins.find((admin)=>admin.email===email); 28 | return adminExists; 29 | } 30 | 31 | private getAdmins(){ 32 | let SQL = 'SELECT * FROM admin'; 33 | 34 | connection.query(SQL,(err,result)=>{ 35 | this.admins= result; 36 | }); 37 | } 38 | } 39 | export {AdminRepository} -------------------------------------------------------------------------------- /back/src/repositories/implements/TasksRepository.ts: -------------------------------------------------------------------------------- 1 | import { connection } from "../../db/connection"; 2 | import { Task } from "../../model/Task"; 3 | import { ICreateTaskDTO, ITasksRepository } from "../ITasksRepository"; 4 | 5 | class TaskRepository implements ITasksRepository{ 6 | 7 | private tasks:Task[]; 8 | 9 | constructor(){ 10 | this.getTasks(); 11 | } 12 | 13 | getAllTasks(): Task[] { 14 | this.getTasks(); 15 | return this.tasks; 16 | } 17 | 18 | createTasks({ name, description, status, idUser }: ICreateTaskDTO): void { 19 | const task=new Task(); 20 | 21 | Object.assign(task,{ 22 | name, 23 | description, 24 | status, 25 | idUser 26 | }); 27 | 28 | let SQL = 'INSERT INTO tasks(id,name,description,status,idUsers) values(?,?,?,?,?)'; 29 | 30 | connection.query(SQL, [task.id,task.name, task.description, task.status,task.idUser], (err, result) => { 31 | this.getTasks(); 32 | }); 33 | } 34 | 35 | upDateStatus(id:string,status:string) { 36 | let SQL = 'UPDATE tasks set status=? WHERE id=?'; 37 | 38 | connection.query(SQL, [status,id], (err, result) => { 39 | this.getTasks(); 40 | }); 41 | } 42 | 43 | deleteTask(idUser: string):string{ 44 | let SQL="DELETE FROM tasks WHERE id=?"; 45 | 46 | connection.query(SQL,[idUser],(err,result)=>{ 47 | this.getTasks(); 48 | }); 49 | 50 | return 'deleted'; 51 | } 52 | 53 | private getTasks() { 54 | let SQL = "SELECT * FROM tasks"; 55 | 56 | connection.query(SQL, (err, result) => { 57 | this.tasks = result; 58 | }); 59 | } 60 | 61 | } 62 | export {TaskRepository}; -------------------------------------------------------------------------------- /back/src/repositories/implements/UsersRepository.ts: -------------------------------------------------------------------------------- 1 | import { connection } from "../../db/connection"; 2 | import { User } from "../../model/User"; 3 | import { IUsersRepository } from "../IUsersRapository"; 4 | 5 | class UsersRepository implements IUsersRepository{ 6 | 7 | private users:User[]; 8 | 9 | constructor(){ 10 | this.getUsers(); 11 | } 12 | 13 | findByEmail(email: string): boolean { 14 | 15 | const verifyIfExists=this.users?.some((user)=>user.email===email); 16 | return verifyIfExists; 17 | } 18 | 19 | create({ name, email, idAdmin }: User): void { 20 | const user=new User(); 21 | 22 | Object.assign(user,{ 23 | name, 24 | email, 25 | idAdmin 26 | }); 27 | 28 | let SQL='INSERT INTO users(id,name,email) values(?,?,?)'; 29 | 30 | connection.query(SQL,[user.id,user.name,user.email,/*user.idAdmin*/],(err,result)=>{ 31 | this.getUsers(); 32 | }); 33 | } 34 | 35 | list(): User[] { 36 | this.getUsers(); 37 | 38 | return this.users; 39 | } 40 | 41 | private getUsers(){ 42 | let SQL = "SELECT * FROM users"; 43 | 44 | connection.query(SQL, (err, result) => { 45 | this.users = result; 46 | }) 47 | } 48 | } 49 | export {UsersRepository}; -------------------------------------------------------------------------------- /back/src/routes/admins.route.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import { adminAutenticated } from "../middlewares/auth-meddlewares"; 3 | import { authenticateAdminController } from "../useCases/authenticate"; 4 | import { getAdminsController } from "../useCases/getAdmins"; 5 | 6 | const adminRoute=Router(); 7 | 8 | adminRoute.get('/',(request,response)=>{ 9 | getAdminsController.handle(request,response); 10 | }); 11 | 12 | adminRoute.post('/login',(request,response)=>{ 13 | authenticateAdminController.handle(request,response); 14 | }); 15 | 16 | 17 | 18 | export {adminRoute}; -------------------------------------------------------------------------------- /back/src/routes/tasks.route.ts: -------------------------------------------------------------------------------- 1 | import { Router, Request } from 'express'; 2 | import { createTaskController } from '../useCases/createTask'; 3 | import { deleteTaskController } from '../useCases/deleteTask'; 4 | import { getTasksController } from '../useCases/getTasks'; 5 | import { upDateStatusController } from '../useCases/upDateTask'; 6 | 7 | const tasksRoute=Router(); 8 | 9 | tasksRoute.post('/', (request, response) => { 10 | createTaskController.handle(request,response); 11 | }); 12 | 13 | tasksRoute.get('/',(request,response)=>{ 14 | getTasksController.handle(request,response); 15 | }); 16 | 17 | tasksRoute.put('/', (request, response)=>{ 18 | upDateStatusController.handle(request,response); 19 | }); 20 | 21 | tasksRoute.delete('/:id',(request,response)=>{ 22 | deleteTaskController.handle(request,response); 23 | }) 24 | 25 | export {tasksRoute}; -------------------------------------------------------------------------------- /back/src/routes/users.route.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import { createUserController } from "../useCases/createUser"; 3 | import { getUsersController } from "../useCases/getUsers"; 4 | 5 | const usersRoute=Router(); 6 | 7 | usersRoute.post('/',(request,response)=>{ 8 | createUserController.handle(request,response); 9 | }); 10 | 11 | usersRoute.get('/',(request,response)=>{ 12 | getUsersController.handle(request,response); 13 | }); 14 | 15 | export {usersRoute}; -------------------------------------------------------------------------------- /back/src/server.ts: -------------------------------------------------------------------------------- 1 | import express, { Request,Response,NextFunction } from 'express'; 2 | import { usersRoute } from './routes/users.route'; 3 | import cors from 'cors'; 4 | import { tasksRoute } from './routes/tasks.route'; 5 | import { adminRoute } from './routes/admins.route'; 6 | import 'express-async-errors'; 7 | 8 | const app=express(); 9 | app.use(cors()) 10 | app.use(express.json()); 11 | 12 | app.use('/users',usersRoute); 13 | app.use('/tasks',tasksRoute); 14 | app.use('/admins',adminRoute); 15 | 16 | app.use((error:Error,request:Request, response: Response,next:NextFunction)=> { 17 | return response.json({ 18 | status:'Error', 19 | message:error.message, 20 | }) 21 | }) 22 | 23 | app.listen(3333,()=>{ 24 | console.log(`servidor rodando em http://localhost:${3333}`); 25 | }) 26 | 27 | -------------------------------------------------------------------------------- /back/src/useCases/authenticate/AuthenticateAdminController.ts: -------------------------------------------------------------------------------- 1 | import {Response,Request} from 'express'; 2 | import { IAdminRepository } from '../../repositories/IAdminRepository'; 3 | import { AdminRepository } from '../../repositories/implements/AdminRepository'; 4 | import { AuthenticateAdminUseCase } from './AuthenticateAdminUseCase'; 5 | class AuthenticateAdminController{ 6 | constructor(private authenticateAdminUseCase:AuthenticateAdminUseCase){} 7 | 8 | async handle(request:Request,response: Response){ 9 | const {email,password}=request.body; 10 | 11 | const token=await this.authenticateAdminUseCase.execute({email,password}); 12 | response.json(token); 13 | } 14 | } 15 | export {AuthenticateAdminController}; -------------------------------------------------------------------------------- /back/src/useCases/authenticate/AuthenticateAdminUseCase.ts: -------------------------------------------------------------------------------- 1 | import { IAdminRepository } from "../../repositories/IAdminRepository"; 2 | import { IAuthenticateAdmin } from "./IAuthenticateAdmin"; 3 | import { sign } from 'jsonwebtoken'; 4 | 5 | class AuthenticateAdminUseCase{ 6 | 7 | constructor(private adminRepository:IAdminRepository){} 8 | 9 | async execute({email,password}:IAuthenticateAdmin){ 10 | const adminAlreadyExists=this.adminRepository.verifyIfExists(email); 11 | 12 | if (!adminAlreadyExists || adminAlreadyExists.password!==password) { 13 | throw new Error("user dont exist"); 14 | } 15 | 16 | const token = sign({},'08173a01-987e-4e64-bb0f-69ad176e7b1a',{ 17 | subject:adminAlreadyExists.id, 18 | expiresIn:"10s" 19 | }); 20 | 21 | return token; 22 | 23 | } 24 | } 25 | export {AuthenticateAdminUseCase}; -------------------------------------------------------------------------------- /back/src/useCases/authenticate/IAuthenticateAdmin.ts: -------------------------------------------------------------------------------- 1 | interface IAuthenticateAdmin{ 2 | email: string; 3 | password: string; 4 | } 5 | 6 | export {IAuthenticateAdmin}; -------------------------------------------------------------------------------- /back/src/useCases/authenticate/index.ts: -------------------------------------------------------------------------------- 1 | import { AdminRepository } from "../../repositories/implements/AdminRepository"; 2 | import { AuthenticateAdminController } from "./AuthenticateAdminController"; 3 | import { AuthenticateAdminUseCase } from "./AuthenticateAdminUseCase"; 4 | 5 | const adminRepository = AdminRepository.getINSTANCE(); 6 | const authenticateAdminUseCase = new AuthenticateAdminUseCase(adminRepository); 7 | const authenticateAdminController = new AuthenticateAdminController(authenticateAdminUseCase); 8 | 9 | export { authenticateAdminController }; -------------------------------------------------------------------------------- /back/src/useCases/createTask/CreateTaskController.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from "express"; 2 | import { CreateTaskUseCase } from "./CreateTasksUseCase"; 3 | 4 | class CreateTaskController { 5 | constructor(private createTaskUseCase: CreateTaskUseCase) { } 6 | 7 | async handle(request: Request, response: Response) { 8 | 9 | const { name,description,status,idUser } = request.body; 10 | try { 11 | this.createTaskUseCase.execute({ name, description, status,idUser}); 12 | } catch (err) { 13 | return response.status(400).json({ message: err.message || "unexpected error" }); 14 | } 15 | 16 | } 17 | } 18 | 19 | export { CreateTaskController }; -------------------------------------------------------------------------------- /back/src/useCases/createTask/CreateTasksUseCase.ts: -------------------------------------------------------------------------------- 1 | import { ITasksRepository } from "../../repositories/ITasksRepository"; 2 | import { ICreateTaskDTO } from "./ICreateTasksDTO"; 3 | 4 | class CreateTaskUseCase { 5 | constructor(private tasksRepository: ITasksRepository) { } 6 | 7 | async execute({ name,description,status,idUser }: ICreateTaskDTO) { 8 | 9 | this.tasksRepository.createTasks({ name, description,status,idUser}); 10 | } 11 | } 12 | export { CreateTaskUseCase }; -------------------------------------------------------------------------------- /back/src/useCases/createTask/ICreateTasksDTO.ts: -------------------------------------------------------------------------------- 1 | interface ICreateTaskDTO{ 2 | name:string; 3 | description:string; 4 | status:string; 5 | idUser:string; 6 | } 7 | 8 | export {ICreateTaskDTO}; -------------------------------------------------------------------------------- /back/src/useCases/createTask/index.ts: -------------------------------------------------------------------------------- 1 | import { TaskRepository } from "../../repositories/implements/TasksRepository"; 2 | import { CreateTaskController } from "./CreateTaskController"; 3 | import { CreateTaskUseCase } from "./CreateTasksUseCase"; 4 | 5 | const taskRepository = new TaskRepository(); 6 | const createTaskUseCase = new CreateTaskUseCase(taskRepository) 7 | const createTaskController = new CreateTaskController(createTaskUseCase) 8 | 9 | export { createTaskController }; -------------------------------------------------------------------------------- /back/src/useCases/createUser/CreateUseeController.ts: -------------------------------------------------------------------------------- 1 | import { Request,Response } from "express"; 2 | import { CreateUsersUseCase } from "./CreateUsersUseCase"; 3 | 4 | class CreateUsersController{ 5 | constructor(private createUserUseCase:CreateUsersUseCase){} 6 | 7 | async handle(request:Request,response: Response){ 8 | 9 | const {name,email,idAdmin}=request.body; 10 | try { 11 | this.createUserUseCase.execute({name,email,idAdmin}) 12 | } catch (err) { 13 | return response.status(400).json({ message: err.message || "unexpected error" }); 14 | } 15 | 16 | } 17 | } 18 | 19 | export {CreateUsersController}; -------------------------------------------------------------------------------- /back/src/useCases/createUser/CreateUsersUseCase.ts: -------------------------------------------------------------------------------- 1 | import { IUsersRepository } from "../../repositories/IUsersRapository"; 2 | import { IRequest } from "./ICreateUsers"; 3 | 4 | class CreateUsersUseCase{ 5 | constructor(private usersRepository:IUsersRepository){} 6 | 7 | async execute({name,email,idAdmin}:IRequest){ 8 | 9 | const userAlreadyExists=this.usersRepository.findByEmail(email); 10 | 11 | if (userAlreadyExists) { 12 | throw new Error("user already exists"); 13 | } 14 | 15 | this.usersRepository.create({name,email,idAdmin}); 16 | } 17 | } 18 | export {CreateUsersUseCase}; -------------------------------------------------------------------------------- /back/src/useCases/createUser/ICreateUsers.ts: -------------------------------------------------------------------------------- 1 | interface IRequest { 2 | name: string; 3 | email: string; 4 | idAdmin: string; 5 | } 6 | export {IRequest}; -------------------------------------------------------------------------------- /back/src/useCases/createUser/index.ts: -------------------------------------------------------------------------------- 1 | import { UsersRepository } from "../../repositories/implements/UsersRepository"; 2 | import { CreateUsersController } from "./createUseeController"; 3 | import { CreateUsersUseCase } from "./CreateUsersUseCase"; 4 | 5 | const userRepository=new UsersRepository(); 6 | const createUserUseCase=new CreateUsersUseCase(userRepository); 7 | const createUserController=new CreateUsersController(createUserUseCase); 8 | 9 | export {createUserController}; -------------------------------------------------------------------------------- /back/src/useCases/deleteTask/DeleteTaskController.ts: -------------------------------------------------------------------------------- 1 | import { Request,Response } from 'express'; 2 | import { DeleteTaskUseCase } from './DeleteTaskUseCase'; 3 | class DeleteTaskController{ 4 | constructor(private deleteTaskUseCase:DeleteTaskUseCase){} 5 | 6 | async handle(request:Request, response: Response){ 7 | 8 | const { id } = request.params; 9 | try { 10 | const deleteTask= await this.deleteTaskUseCase.execute({id}); 11 | return response.json(deleteTask); 12 | 13 | } catch (error) { 14 | return response.status(400).json({message:error.message || "unexpected error"}); 15 | } 16 | } 17 | } 18 | export {DeleteTaskController}; -------------------------------------------------------------------------------- /back/src/useCases/deleteTask/DeleteTaskUseCase.ts: -------------------------------------------------------------------------------- 1 | import { ITasksRepository } from "../../repositories/ITasksRepository"; 2 | import { IDeleteTask } from "./IDeleteTask"; 3 | 4 | class DeleteTaskUseCase{ 5 | constructor(private tasksRepository:ITasksRepository){} 6 | 7 | async execute({id}:IDeleteTask){ 8 | const deleteTask = await this.tasksRepository.deleteTask(id); 9 | 10 | return deleteTask; 11 | } 12 | } 13 | export {DeleteTaskUseCase}; -------------------------------------------------------------------------------- /back/src/useCases/deleteTask/IDeleteTask.ts: -------------------------------------------------------------------------------- 1 | interface IDeleteTask{ 2 | id:string; 3 | } 4 | export {IDeleteTask}; -------------------------------------------------------------------------------- /back/src/useCases/deleteTask/index.ts: -------------------------------------------------------------------------------- 1 | import { TaskRepository } from "../../repositories/implements/TasksRepository"; 2 | import { DeleteTaskController } from "./DeleteTaskController"; 3 | import { DeleteTaskUseCase } from "./DeleteTaskUseCase"; 4 | 5 | const taskRepository = new TaskRepository(); 6 | const deleteTaskUseCase = new DeleteTaskUseCase(taskRepository); 7 | const deleteTaskController = new DeleteTaskController(deleteTaskUseCase); 8 | 9 | export { deleteTaskController }; -------------------------------------------------------------------------------- /back/src/useCases/getAdmins/GetAdminsController.ts: -------------------------------------------------------------------------------- 1 | import { Response, Request } from "express"; 2 | import { GetAdminsUseCase } from "./GetAdminsUseCase"; 3 | 4 | class GetAdminsController { 5 | constructor(private getAdminsUseCase: GetAdminsUseCase) { } 6 | 7 | async handle(request: Request, response: Response) { 8 | 9 | try { 10 | const allAdmins = await this.getAdminsUseCase.execute(); 11 | 12 | return response.json(allAdmins); 13 | } catch (error) { 14 | return response.status(400).json({ message: error.message || "unexpected" }); 15 | } 16 | } 17 | } 18 | export { GetAdminsController } -------------------------------------------------------------------------------- /back/src/useCases/getAdmins/GetAdminsUseCase.ts: -------------------------------------------------------------------------------- 1 | import { AdminRepository } from "../../repositories/implements/AdminRepository"; 2 | 3 | class GetAdminsUseCase { 4 | constructor(private adminRepository: AdminRepository) { } 5 | 6 | async execute() { 7 | const allAdmins = await this.adminRepository.getAdmin(); 8 | 9 | return allAdmins; 10 | } 11 | } 12 | export { GetAdminsUseCase }; -------------------------------------------------------------------------------- /back/src/useCases/getAdmins/index.ts: -------------------------------------------------------------------------------- 1 | import { AdminRepository } from "../../repositories/implements/AdminRepository"; 2 | import { GetAdminsController } from "./GetAdminsController"; 3 | import { GetAdminsUseCase } from "./GetAdminsUseCase"; 4 | 5 | const adminRepository = new AdminRepository(); 6 | const getAdminsUseCase = new GetAdminsUseCase(adminRepository); 7 | const getAdminsController = new GetAdminsController(getAdminsUseCase); 8 | 9 | export { getAdminsController }; -------------------------------------------------------------------------------- /back/src/useCases/getTasks/GetTasksController.ts: -------------------------------------------------------------------------------- 1 | import { Response, Request } from "express"; 2 | import { GetTaskUseCase } from "./GetTasksUseCase"; 3 | 4 | class GetTasksController { 5 | constructor(private getUsersUseCase: GetTaskUseCase) { } 6 | 7 | async handle(request: Request, response: Response) { 8 | 9 | try { 10 | const allTasks = await this.getUsersUseCase.execute(); 11 | 12 | return response.json(allTasks); 13 | } catch (error) { 14 | return response.status(400).json({ message: error.message || "unexpected" }); 15 | } 16 | } 17 | } 18 | export { GetTasksController } -------------------------------------------------------------------------------- /back/src/useCases/getTasks/GetTasksUseCase.ts: -------------------------------------------------------------------------------- 1 | import { TaskRepository } from "../../repositories/implements/TasksRepository"; 2 | import { UsersRepository } from "../../repositories/implements/UsersRepository"; 3 | 4 | class GetTaskUseCase { 5 | constructor(private tasksRepository: TaskRepository) { } 6 | 7 | async execute() { 8 | const allTasks = await this.tasksRepository.getAllTasks(); 9 | 10 | return allTasks; 11 | } 12 | } 13 | export { GetTaskUseCase }; -------------------------------------------------------------------------------- /back/src/useCases/getTasks/index.ts: -------------------------------------------------------------------------------- 1 | import { TaskRepository } from "../../repositories/implements/TasksRepository"; 2 | import { GetUsersController } from "../getUsers/getUsersController"; 3 | import { GetTasksController } from "./GetTasksController"; 4 | import { GetTaskUseCase } from "./GetTasksUseCase"; 5 | 6 | const tasksRepository = new TaskRepository(); 7 | const getTasksUseCase = new GetTaskUseCase(tasksRepository); 8 | const getTasksController = new GetTasksController(getTasksUseCase); 9 | 10 | export { getTasksController }; -------------------------------------------------------------------------------- /back/src/useCases/getUsers/GetUsersController.ts: -------------------------------------------------------------------------------- 1 | import { Response,Request } from "express"; 2 | import { GetUsersUseCase } from "./GetUsersUseCase"; 3 | 4 | class GetUsersController{ 5 | constructor(private getUsersUseCase:GetUsersUseCase){} 6 | 7 | async handle(request:Request,response: Response){ 8 | 9 | try { 10 | const allUsers=await this.getUsersUseCase.execute(); 11 | 12 | return response.json(allUsers); 13 | } catch (error) { 14 | return response.status(400).json({message:error.message || "unexpected"}); 15 | } 16 | } 17 | } 18 | export {GetUsersController} -------------------------------------------------------------------------------- /back/src/useCases/getUsers/GetUsersUseCase.ts: -------------------------------------------------------------------------------- 1 | import { UsersRepository } from "../../repositories/implements/UsersRepository"; 2 | 3 | class GetUsersUseCase{ 4 | constructor(private usersRepository:UsersRepository){} 5 | 6 | async execute(){ 7 | const allUsers=await this.usersRepository.list(); 8 | 9 | return allUsers; 10 | } 11 | } 12 | export {GetUsersUseCase} -------------------------------------------------------------------------------- /back/src/useCases/getUsers/index.ts: -------------------------------------------------------------------------------- 1 | import { UsersRepository } from "../../repositories/implements/UsersRepository"; 2 | import { GetUsersController } from "./getUsersController"; 3 | import { GetUsersUseCase } from "./GetUsersUseCase"; 4 | 5 | const usersRepository=new UsersRepository(); 6 | const getUsersUseCase= new GetUsersUseCase(usersRepository); 7 | const getUsersController= new GetUsersController(getUsersUseCase); 8 | 9 | export {getUsersController}; -------------------------------------------------------------------------------- /back/src/useCases/upDateTask/IUpDateStatusService.ts: -------------------------------------------------------------------------------- 1 | interface IUpDateStatus{ 2 | id:string; 3 | status:string; 4 | } 5 | 6 | export {IUpDateStatus}; -------------------------------------------------------------------------------- /back/src/useCases/upDateTask/UpDateStatusController.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | import { UpDateStatusUseCase } from './UpDateStatusUseCase'; 3 | class UpDateStatusController{ 4 | constructor(private updateStatusUseCase:UpDateStatusUseCase){} 5 | 6 | async handle(request:Request,response: Response){ 7 | const {id,status}=request.body; 8 | 9 | try { 10 | this.updateStatusUseCase.execute({id,status}); 11 | } catch (err) { 12 | return response.status(400).json({ message: err.message || "unexpected"}); 13 | } 14 | } 15 | } 16 | export {UpDateStatusController} -------------------------------------------------------------------------------- /back/src/useCases/upDateTask/UpDateStatusUseCase.ts: -------------------------------------------------------------------------------- 1 | import { ITasksRepository } from "../../repositories/ITasksRepository"; 2 | import { TaskRepository } from "../../repositories/implements/TasksRepository"; 3 | import { IUpDateStatus } from "./IUpDateStatusService"; 4 | 5 | class UpDateStatusUseCase{ 6 | constructor(private taskRepository:ITasksRepository){} 7 | 8 | async execute({id,status}:IUpDateStatus){ 9 | this.taskRepository.upDateStatus(id,status); 10 | } 11 | } 12 | export {UpDateStatusUseCase}; -------------------------------------------------------------------------------- /back/src/useCases/upDateTask/index.ts: -------------------------------------------------------------------------------- 1 | import { TaskRepository } from "../../repositories/implements/TasksRepository"; 2 | import { UpDateStatusController } from "./UpDateStatusController"; 3 | import { UpDateStatusUseCase } from "./UpDateStatusUseCase"; 4 | 5 | const taskRepository= new TaskRepository(); 6 | const updateStatusUseCase=new UpDateStatusUseCase(taskRepository); 7 | const upDateStatusController= new UpDateStatusController(updateStatusUseCase); 8 | 9 | export {upDateStatusController}; -------------------------------------------------------------------------------- /back/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "commonjs", 5 | "skipLibCheck": true, 6 | "allowJs": true, 7 | "esModuleInterop": true 8 | }, 9 | "include": ["src/**/*.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /back/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@jridgewell/resolve-uri@^3.0.3": 13 | version "3.1.0" 14 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 15 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 16 | 17 | "@jridgewell/sourcemap-codec@^1.4.10": 18 | version "1.4.14" 19 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 20 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 21 | 22 | "@jridgewell/trace-mapping@0.3.9": 23 | version "0.3.9" 24 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 25 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 26 | dependencies: 27 | "@jridgewell/resolve-uri" "^3.0.3" 28 | "@jridgewell/sourcemap-codec" "^1.4.10" 29 | 30 | "@tsconfig/node10@^1.0.7": 31 | version "1.0.9" 32 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 33 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 34 | 35 | "@tsconfig/node12@^1.0.7": 36 | version "1.0.11" 37 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 38 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 39 | 40 | "@tsconfig/node14@^1.0.0": 41 | version "1.0.3" 42 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 43 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 44 | 45 | "@tsconfig/node16@^1.0.2": 46 | version "1.0.3" 47 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 48 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 49 | 50 | "@types/bcryptjs@^2.4.2": 51 | version "2.4.2" 52 | resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" 53 | integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== 54 | 55 | "@types/body-parser@*": 56 | version "1.19.2" 57 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 58 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 59 | dependencies: 60 | "@types/connect" "*" 61 | "@types/node" "*" 62 | 63 | "@types/connect@*": 64 | version "3.4.35" 65 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 66 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 67 | dependencies: 68 | "@types/node" "*" 69 | 70 | "@types/cors@^2.8.12": 71 | version "2.8.12" 72 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" 73 | integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== 74 | 75 | "@types/express-serve-static-core@^4.17.18": 76 | version "4.17.30" 77 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" 78 | integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== 79 | dependencies: 80 | "@types/node" "*" 81 | "@types/qs" "*" 82 | "@types/range-parser" "*" 83 | 84 | "@types/express@^4.17.13": 85 | version "4.17.13" 86 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" 87 | integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== 88 | dependencies: 89 | "@types/body-parser" "*" 90 | "@types/express-serve-static-core" "^4.17.18" 91 | "@types/qs" "*" 92 | "@types/serve-static" "*" 93 | 94 | "@types/jsonwebtoken@^8.5.9": 95 | version "8.5.9" 96 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586" 97 | integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== 98 | dependencies: 99 | "@types/node" "*" 100 | 101 | "@types/mime@*": 102 | version "3.0.1" 103 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" 104 | integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== 105 | 106 | "@types/mysql@^2.15.21": 107 | version "2.15.21" 108 | resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.21.tgz#7516cba7f9d077f980100c85fd500c8210bd5e45" 109 | integrity sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg== 110 | dependencies: 111 | "@types/node" "*" 112 | 113 | "@types/node@*": 114 | version "18.7.15" 115 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.15.tgz#20ae1ec80c57ee844b469f968a1cd511d4088b29" 116 | integrity sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ== 117 | 118 | "@types/qs@*": 119 | version "6.9.7" 120 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 121 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 122 | 123 | "@types/range-parser@*": 124 | version "1.2.4" 125 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 126 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 127 | 128 | "@types/serve-static@*": 129 | version "1.15.0" 130 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" 131 | integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== 132 | dependencies: 133 | "@types/mime" "*" 134 | "@types/node" "*" 135 | 136 | "@types/strip-bom@^3.0.0": 137 | version "3.0.0" 138 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 139 | integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== 140 | 141 | "@types/strip-json-comments@0.0.30": 142 | version "0.0.30" 143 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 144 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 145 | 146 | accepts@~1.3.8: 147 | version "1.3.8" 148 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 149 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 150 | dependencies: 151 | mime-types "~2.1.34" 152 | negotiator "0.6.3" 153 | 154 | acorn-walk@^8.1.1: 155 | version "8.2.0" 156 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 157 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 158 | 159 | acorn@^8.4.1: 160 | version "8.8.0" 161 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" 162 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 163 | 164 | anymatch@~3.1.2: 165 | version "3.1.2" 166 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 167 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 168 | dependencies: 169 | normalize-path "^3.0.0" 170 | picomatch "^2.0.4" 171 | 172 | arg@^4.1.0: 173 | version "4.1.3" 174 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 175 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 176 | 177 | array-flatten@1.1.1: 178 | version "1.1.1" 179 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 180 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 181 | 182 | balanced-match@^1.0.0: 183 | version "1.0.2" 184 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 185 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 186 | 187 | bcryptjs@^2.4.3: 188 | version "2.4.3" 189 | resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" 190 | integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== 191 | 192 | bignumber.js@9.0.0: 193 | version "9.0.0" 194 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" 195 | integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== 196 | 197 | binary-extensions@^2.0.0: 198 | version "2.2.0" 199 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 200 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 201 | 202 | body-parser@1.20.0: 203 | version "1.20.0" 204 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" 205 | integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== 206 | dependencies: 207 | bytes "3.1.2" 208 | content-type "~1.0.4" 209 | debug "2.6.9" 210 | depd "2.0.0" 211 | destroy "1.2.0" 212 | http-errors "2.0.0" 213 | iconv-lite "0.4.24" 214 | on-finished "2.4.1" 215 | qs "6.10.3" 216 | raw-body "2.5.1" 217 | type-is "~1.6.18" 218 | unpipe "1.0.0" 219 | 220 | brace-expansion@^1.1.7: 221 | version "1.1.11" 222 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 223 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 224 | dependencies: 225 | balanced-match "^1.0.0" 226 | concat-map "0.0.1" 227 | 228 | braces@~3.0.2: 229 | version "3.0.2" 230 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 231 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 232 | dependencies: 233 | fill-range "^7.0.1" 234 | 235 | buffer-equal-constant-time@1.0.1: 236 | version "1.0.1" 237 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 238 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 239 | 240 | buffer-from@^1.0.0: 241 | version "1.1.2" 242 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 243 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 244 | 245 | bytes@3.1.2: 246 | version "3.1.2" 247 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 248 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 249 | 250 | call-bind@^1.0.0: 251 | version "1.0.2" 252 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 253 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 254 | dependencies: 255 | function-bind "^1.1.1" 256 | get-intrinsic "^1.0.2" 257 | 258 | chokidar@^3.5.1: 259 | version "3.5.3" 260 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 261 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 262 | dependencies: 263 | anymatch "~3.1.2" 264 | braces "~3.0.2" 265 | glob-parent "~5.1.2" 266 | is-binary-path "~2.1.0" 267 | is-glob "~4.0.1" 268 | normalize-path "~3.0.0" 269 | readdirp "~3.6.0" 270 | optionalDependencies: 271 | fsevents "~2.3.2" 272 | 273 | concat-map@0.0.1: 274 | version "0.0.1" 275 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 276 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 277 | 278 | content-disposition@0.5.4: 279 | version "0.5.4" 280 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 281 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 282 | dependencies: 283 | safe-buffer "5.2.1" 284 | 285 | content-type@~1.0.4: 286 | version "1.0.4" 287 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 288 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 289 | 290 | cookie-signature@1.0.6: 291 | version "1.0.6" 292 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 293 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 294 | 295 | cookie@0.5.0: 296 | version "0.5.0" 297 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 298 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 299 | 300 | core-util-is@~1.0.0: 301 | version "1.0.3" 302 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 303 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 304 | 305 | cors@^2.8.5: 306 | version "2.8.5" 307 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 308 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 309 | dependencies: 310 | object-assign "^4" 311 | vary "^1" 312 | 313 | create-require@^1.1.0: 314 | version "1.1.1" 315 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 316 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 317 | 318 | debug@2.6.9: 319 | version "2.6.9" 320 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 321 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 322 | dependencies: 323 | ms "2.0.0" 324 | 325 | depd@2.0.0: 326 | version "2.0.0" 327 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 328 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 329 | 330 | destroy@1.2.0: 331 | version "1.2.0" 332 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 333 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 334 | 335 | diff@^4.0.1: 336 | version "4.0.2" 337 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 338 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 339 | 340 | dynamic-dedupe@^0.3.0: 341 | version "0.3.0" 342 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 343 | integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== 344 | dependencies: 345 | xtend "^4.0.0" 346 | 347 | ecdsa-sig-formatter@1.0.11: 348 | version "1.0.11" 349 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 350 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 351 | dependencies: 352 | safe-buffer "^5.0.1" 353 | 354 | ee-first@1.1.1: 355 | version "1.1.1" 356 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 357 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 358 | 359 | encodeurl@~1.0.2: 360 | version "1.0.2" 361 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 362 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 363 | 364 | escape-html@~1.0.3: 365 | version "1.0.3" 366 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 367 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 368 | 369 | etag@~1.8.1: 370 | version "1.8.1" 371 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 372 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 373 | 374 | express-async-errors@^3.1.1: 375 | version "3.1.1" 376 | resolved "https://registry.yarnpkg.com/express-async-errors/-/express-async-errors-3.1.1.tgz#6053236d61d21ddef4892d6bd1d736889fc9da41" 377 | integrity sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng== 378 | 379 | express@^4.18.1: 380 | version "4.18.1" 381 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" 382 | integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== 383 | dependencies: 384 | accepts "~1.3.8" 385 | array-flatten "1.1.1" 386 | body-parser "1.20.0" 387 | content-disposition "0.5.4" 388 | content-type "~1.0.4" 389 | cookie "0.5.0" 390 | cookie-signature "1.0.6" 391 | debug "2.6.9" 392 | depd "2.0.0" 393 | encodeurl "~1.0.2" 394 | escape-html "~1.0.3" 395 | etag "~1.8.1" 396 | finalhandler "1.2.0" 397 | fresh "0.5.2" 398 | http-errors "2.0.0" 399 | merge-descriptors "1.0.1" 400 | methods "~1.1.2" 401 | on-finished "2.4.1" 402 | parseurl "~1.3.3" 403 | path-to-regexp "0.1.7" 404 | proxy-addr "~2.0.7" 405 | qs "6.10.3" 406 | range-parser "~1.2.1" 407 | safe-buffer "5.2.1" 408 | send "0.18.0" 409 | serve-static "1.15.0" 410 | setprototypeof "1.2.0" 411 | statuses "2.0.1" 412 | type-is "~1.6.18" 413 | utils-merge "1.0.1" 414 | vary "~1.1.2" 415 | 416 | fill-range@^7.0.1: 417 | version "7.0.1" 418 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 419 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 420 | dependencies: 421 | to-regex-range "^5.0.1" 422 | 423 | finalhandler@1.2.0: 424 | version "1.2.0" 425 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 426 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 427 | dependencies: 428 | debug "2.6.9" 429 | encodeurl "~1.0.2" 430 | escape-html "~1.0.3" 431 | on-finished "2.4.1" 432 | parseurl "~1.3.3" 433 | statuses "2.0.1" 434 | unpipe "~1.0.0" 435 | 436 | forwarded@0.2.0: 437 | version "0.2.0" 438 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 439 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 440 | 441 | fresh@0.5.2: 442 | version "0.5.2" 443 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 444 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 445 | 446 | fs.realpath@^1.0.0: 447 | version "1.0.0" 448 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 449 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 450 | 451 | fsevents@~2.3.2: 452 | version "2.3.2" 453 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 454 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 455 | 456 | function-bind@^1.1.1: 457 | version "1.1.1" 458 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 459 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 460 | 461 | get-intrinsic@^1.0.2: 462 | version "1.1.2" 463 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" 464 | integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== 465 | dependencies: 466 | function-bind "^1.1.1" 467 | has "^1.0.3" 468 | has-symbols "^1.0.3" 469 | 470 | glob-parent@~5.1.2: 471 | version "5.1.2" 472 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 473 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 474 | dependencies: 475 | is-glob "^4.0.1" 476 | 477 | glob@^7.1.3: 478 | version "7.2.3" 479 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 480 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 481 | dependencies: 482 | fs.realpath "^1.0.0" 483 | inflight "^1.0.4" 484 | inherits "2" 485 | minimatch "^3.1.1" 486 | once "^1.3.0" 487 | path-is-absolute "^1.0.0" 488 | 489 | has-symbols@^1.0.3: 490 | version "1.0.3" 491 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 492 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 493 | 494 | has@^1.0.3: 495 | version "1.0.3" 496 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 497 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 498 | dependencies: 499 | function-bind "^1.1.1" 500 | 501 | http-errors@2.0.0: 502 | version "2.0.0" 503 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 504 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 505 | dependencies: 506 | depd "2.0.0" 507 | inherits "2.0.4" 508 | setprototypeof "1.2.0" 509 | statuses "2.0.1" 510 | toidentifier "1.0.1" 511 | 512 | iconv-lite@0.4.24: 513 | version "0.4.24" 514 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 515 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 516 | dependencies: 517 | safer-buffer ">= 2.1.2 < 3" 518 | 519 | inflight@^1.0.4: 520 | version "1.0.6" 521 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 522 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 523 | dependencies: 524 | once "^1.3.0" 525 | wrappy "1" 526 | 527 | inherits@2, inherits@2.0.4, inherits@~2.0.3: 528 | version "2.0.4" 529 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 530 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 531 | 532 | ipaddr.js@1.9.1: 533 | version "1.9.1" 534 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 535 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 536 | 537 | is-binary-path@~2.1.0: 538 | version "2.1.0" 539 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 540 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 541 | dependencies: 542 | binary-extensions "^2.0.0" 543 | 544 | is-core-module@^2.9.0: 545 | version "2.10.0" 546 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 547 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 548 | dependencies: 549 | has "^1.0.3" 550 | 551 | is-extglob@^2.1.1: 552 | version "2.1.1" 553 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 554 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 555 | 556 | is-glob@^4.0.1, is-glob@~4.0.1: 557 | version "4.0.3" 558 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 559 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 560 | dependencies: 561 | is-extglob "^2.1.1" 562 | 563 | is-number@^7.0.0: 564 | version "7.0.0" 565 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 566 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 567 | 568 | isarray@~1.0.0: 569 | version "1.0.0" 570 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 571 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 572 | 573 | jsonwebtoken@^8.5.1: 574 | version "8.5.1" 575 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 576 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 577 | dependencies: 578 | jws "^3.2.2" 579 | lodash.includes "^4.3.0" 580 | lodash.isboolean "^3.0.3" 581 | lodash.isinteger "^4.0.4" 582 | lodash.isnumber "^3.0.3" 583 | lodash.isplainobject "^4.0.6" 584 | lodash.isstring "^4.0.1" 585 | lodash.once "^4.0.0" 586 | ms "^2.1.1" 587 | semver "^5.6.0" 588 | 589 | jwa@^1.4.1: 590 | version "1.4.1" 591 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 592 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 593 | dependencies: 594 | buffer-equal-constant-time "1.0.1" 595 | ecdsa-sig-formatter "1.0.11" 596 | safe-buffer "^5.0.1" 597 | 598 | jws@^3.2.2: 599 | version "3.2.2" 600 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 601 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 602 | dependencies: 603 | jwa "^1.4.1" 604 | safe-buffer "^5.0.1" 605 | 606 | lodash.includes@^4.3.0: 607 | version "4.3.0" 608 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 609 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 610 | 611 | lodash.isboolean@^3.0.3: 612 | version "3.0.3" 613 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 614 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 615 | 616 | lodash.isinteger@^4.0.4: 617 | version "4.0.4" 618 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 619 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 620 | 621 | lodash.isnumber@^3.0.3: 622 | version "3.0.3" 623 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 624 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 625 | 626 | lodash.isplainobject@^4.0.6: 627 | version "4.0.6" 628 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 629 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 630 | 631 | lodash.isstring@^4.0.1: 632 | version "4.0.1" 633 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 634 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 635 | 636 | lodash.once@^4.0.0: 637 | version "4.1.1" 638 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 639 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 640 | 641 | make-error@^1.1.1: 642 | version "1.3.6" 643 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 644 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 645 | 646 | media-typer@0.3.0: 647 | version "0.3.0" 648 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 649 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 650 | 651 | merge-descriptors@1.0.1: 652 | version "1.0.1" 653 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 654 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 655 | 656 | methods@~1.1.2: 657 | version "1.1.2" 658 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 659 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 660 | 661 | mime-db@1.52.0: 662 | version "1.52.0" 663 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 664 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 665 | 666 | mime-types@~2.1.24, mime-types@~2.1.34: 667 | version "2.1.35" 668 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 669 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 670 | dependencies: 671 | mime-db "1.52.0" 672 | 673 | mime@1.6.0: 674 | version "1.6.0" 675 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 676 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 677 | 678 | minimatch@^3.1.1: 679 | version "3.1.2" 680 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 681 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 682 | dependencies: 683 | brace-expansion "^1.1.7" 684 | 685 | minimist@^1.2.6: 686 | version "1.2.6" 687 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 688 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 689 | 690 | mkdirp@^1.0.4: 691 | version "1.0.4" 692 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 693 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 694 | 695 | ms@2.0.0: 696 | version "2.0.0" 697 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 698 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 699 | 700 | ms@2.1.3, ms@^2.1.1: 701 | version "2.1.3" 702 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 703 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 704 | 705 | mysql@^2.18.1: 706 | version "2.18.1" 707 | resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" 708 | integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== 709 | dependencies: 710 | bignumber.js "9.0.0" 711 | readable-stream "2.3.7" 712 | safe-buffer "5.1.2" 713 | sqlstring "2.3.1" 714 | 715 | negotiator@0.6.3: 716 | version "0.6.3" 717 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 718 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 719 | 720 | normalize-path@^3.0.0, normalize-path@~3.0.0: 721 | version "3.0.0" 722 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 723 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 724 | 725 | object-assign@^4: 726 | version "4.1.1" 727 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 728 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 729 | 730 | object-inspect@^1.9.0: 731 | version "1.12.2" 732 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 733 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 734 | 735 | on-finished@2.4.1: 736 | version "2.4.1" 737 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 738 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 739 | dependencies: 740 | ee-first "1.1.1" 741 | 742 | once@^1.3.0: 743 | version "1.4.0" 744 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 745 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 746 | dependencies: 747 | wrappy "1" 748 | 749 | parseurl@~1.3.3: 750 | version "1.3.3" 751 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 752 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 753 | 754 | path-is-absolute@^1.0.0: 755 | version "1.0.1" 756 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 757 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 758 | 759 | path-parse@^1.0.7: 760 | version "1.0.7" 761 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 762 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 763 | 764 | path-to-regexp@0.1.7: 765 | version "0.1.7" 766 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 767 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 768 | 769 | picomatch@^2.0.4, picomatch@^2.2.1: 770 | version "2.3.1" 771 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 772 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 773 | 774 | process-nextick-args@~2.0.0: 775 | version "2.0.1" 776 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 777 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 778 | 779 | proxy-addr@~2.0.7: 780 | version "2.0.7" 781 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 782 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 783 | dependencies: 784 | forwarded "0.2.0" 785 | ipaddr.js "1.9.1" 786 | 787 | qs@6.10.3: 788 | version "6.10.3" 789 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" 790 | integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== 791 | dependencies: 792 | side-channel "^1.0.4" 793 | 794 | range-parser@~1.2.1: 795 | version "1.2.1" 796 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 797 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 798 | 799 | raw-body@2.5.1: 800 | version "2.5.1" 801 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 802 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 803 | dependencies: 804 | bytes "3.1.2" 805 | http-errors "2.0.0" 806 | iconv-lite "0.4.24" 807 | unpipe "1.0.0" 808 | 809 | readable-stream@2.3.7: 810 | version "2.3.7" 811 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 812 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 813 | dependencies: 814 | core-util-is "~1.0.0" 815 | inherits "~2.0.3" 816 | isarray "~1.0.0" 817 | process-nextick-args "~2.0.0" 818 | safe-buffer "~5.1.1" 819 | string_decoder "~1.1.1" 820 | util-deprecate "~1.0.1" 821 | 822 | readdirp@~3.6.0: 823 | version "3.6.0" 824 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 825 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 826 | dependencies: 827 | picomatch "^2.2.1" 828 | 829 | resolve@^1.0.0: 830 | version "1.22.1" 831 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 832 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 833 | dependencies: 834 | is-core-module "^2.9.0" 835 | path-parse "^1.0.7" 836 | supports-preserve-symlinks-flag "^1.0.0" 837 | 838 | rimraf@^2.6.1: 839 | version "2.7.1" 840 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 841 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 842 | dependencies: 843 | glob "^7.1.3" 844 | 845 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 846 | version "5.1.2" 847 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 848 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 849 | 850 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 851 | version "5.2.1" 852 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 853 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 854 | 855 | "safer-buffer@>= 2.1.2 < 3": 856 | version "2.1.2" 857 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 858 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 859 | 860 | semver@^5.6.0: 861 | version "5.7.1" 862 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 863 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 864 | 865 | send@0.18.0: 866 | version "0.18.0" 867 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 868 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 869 | dependencies: 870 | debug "2.6.9" 871 | depd "2.0.0" 872 | destroy "1.2.0" 873 | encodeurl "~1.0.2" 874 | escape-html "~1.0.3" 875 | etag "~1.8.1" 876 | fresh "0.5.2" 877 | http-errors "2.0.0" 878 | mime "1.6.0" 879 | ms "2.1.3" 880 | on-finished "2.4.1" 881 | range-parser "~1.2.1" 882 | statuses "2.0.1" 883 | 884 | serve-static@1.15.0: 885 | version "1.15.0" 886 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 887 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 888 | dependencies: 889 | encodeurl "~1.0.2" 890 | escape-html "~1.0.3" 891 | parseurl "~1.3.3" 892 | send "0.18.0" 893 | 894 | setprototypeof@1.2.0: 895 | version "1.2.0" 896 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 897 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 898 | 899 | side-channel@^1.0.4: 900 | version "1.0.4" 901 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 902 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 903 | dependencies: 904 | call-bind "^1.0.0" 905 | get-intrinsic "^1.0.2" 906 | object-inspect "^1.9.0" 907 | 908 | source-map-support@^0.5.12: 909 | version "0.5.21" 910 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 911 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 912 | dependencies: 913 | buffer-from "^1.0.0" 914 | source-map "^0.6.0" 915 | 916 | source-map@^0.6.0: 917 | version "0.6.1" 918 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 919 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 920 | 921 | sqlstring@2.3.1: 922 | version "2.3.1" 923 | resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" 924 | integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== 925 | 926 | statuses@2.0.1: 927 | version "2.0.1" 928 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 929 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 930 | 931 | string_decoder@~1.1.1: 932 | version "1.1.1" 933 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 934 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 935 | dependencies: 936 | safe-buffer "~5.1.0" 937 | 938 | strip-bom@^3.0.0: 939 | version "3.0.0" 940 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 941 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 942 | 943 | strip-json-comments@^2.0.0: 944 | version "2.0.1" 945 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 946 | integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 947 | 948 | supports-preserve-symlinks-flag@^1.0.0: 949 | version "1.0.0" 950 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 951 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 952 | 953 | to-regex-range@^5.0.1: 954 | version "5.0.1" 955 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 956 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 957 | dependencies: 958 | is-number "^7.0.0" 959 | 960 | toidentifier@1.0.1: 961 | version "1.0.1" 962 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 963 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 964 | 965 | tree-kill@^1.2.2: 966 | version "1.2.2" 967 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 968 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 969 | 970 | ts-node-dev@^2.0.0: 971 | version "2.0.0" 972 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-2.0.0.tgz#bdd53e17ab3b5d822ef519928dc6b4a7e0f13065" 973 | integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w== 974 | dependencies: 975 | chokidar "^3.5.1" 976 | dynamic-dedupe "^0.3.0" 977 | minimist "^1.2.6" 978 | mkdirp "^1.0.4" 979 | resolve "^1.0.0" 980 | rimraf "^2.6.1" 981 | source-map-support "^0.5.12" 982 | tree-kill "^1.2.2" 983 | ts-node "^10.4.0" 984 | tsconfig "^7.0.0" 985 | 986 | ts-node@^10.4.0: 987 | version "10.9.1" 988 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 989 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 990 | dependencies: 991 | "@cspotcode/source-map-support" "^0.8.0" 992 | "@tsconfig/node10" "^1.0.7" 993 | "@tsconfig/node12" "^1.0.7" 994 | "@tsconfig/node14" "^1.0.0" 995 | "@tsconfig/node16" "^1.0.2" 996 | acorn "^8.4.1" 997 | acorn-walk "^8.1.1" 998 | arg "^4.1.0" 999 | create-require "^1.1.0" 1000 | diff "^4.0.1" 1001 | make-error "^1.1.1" 1002 | v8-compile-cache-lib "^3.0.1" 1003 | yn "3.1.1" 1004 | 1005 | tsconfig@^7.0.0: 1006 | version "7.0.0" 1007 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 1008 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 1009 | dependencies: 1010 | "@types/strip-bom" "^3.0.0" 1011 | "@types/strip-json-comments" "0.0.30" 1012 | strip-bom "^3.0.0" 1013 | strip-json-comments "^2.0.0" 1014 | 1015 | type-is@~1.6.18: 1016 | version "1.6.18" 1017 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1018 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1019 | dependencies: 1020 | media-typer "0.3.0" 1021 | mime-types "~2.1.24" 1022 | 1023 | typescript@^4.8.2: 1024 | version "4.8.2" 1025 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790" 1026 | integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== 1027 | 1028 | unpipe@1.0.0, unpipe@~1.0.0: 1029 | version "1.0.0" 1030 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1031 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1032 | 1033 | util-deprecate@~1.0.1: 1034 | version "1.0.2" 1035 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1036 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1037 | 1038 | utils-merge@1.0.1: 1039 | version "1.0.1" 1040 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1041 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 1042 | 1043 | v8-compile-cache-lib@^3.0.1: 1044 | version "3.0.1" 1045 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1046 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1047 | 1048 | vary@^1, vary@~1.1.2: 1049 | version "1.1.2" 1050 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1051 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1052 | 1053 | wrappy@1: 1054 | version "1.0.2" 1055 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1056 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1057 | 1058 | xtend@^4.0.0: 1059 | version "4.0.2" 1060 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1061 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1062 | 1063 | yn@3.1.1: 1064 | version "3.1.1" 1065 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1066 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1067 | -------------------------------------------------------------------------------- /front/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /front/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | -------------------------------------------------------------------------------- /front/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | ``` 12 | 13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 14 | 15 | You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. 16 | 17 | [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. 18 | 19 | The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. 20 | 21 | ## Learn More 22 | 23 | To learn more about Next.js, take a look at the following resources: 24 | 25 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 26 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 27 | 28 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 29 | 30 | ## Deploy on Vercel 31 | 32 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 33 | 34 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 35 | -------------------------------------------------------------------------------- /front/images/95001318.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/images/95001318.png -------------------------------------------------------------------------------- /front/images/Capturar.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/images/Capturar.PNG -------------------------------------------------------------------------------- /front/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /front/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /front/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app0ty", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@types/styled-components": "^5.1.25", 13 | "axios": "^0.27.2", 14 | "miragejs": "^0.1.45", 15 | "next": "12.1.6", 16 | "next-link": "^2.0.0", 17 | "next-router": "^1.3.6", 18 | "react": "18.2.0", 19 | "react-dom": "18.2.0", 20 | "react-icons": "^4.4.0", 21 | "react-video-js-player": "^1.1.1", 22 | "styled-components": "^5.3.5" 23 | }, 24 | "devDependencies": { 25 | "@types/node": "18.0.0", 26 | "@types/react": "18.0.14", 27 | "@types/react-dom": "18.0.5", 28 | "babel-plugin-styled-components": "^2.0.7", 29 | "eslint": "8.18.0", 30 | "eslint-config-next": "12.1.6", 31 | "typescript": "4.7.4" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /front/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import type { AppProps } from 'next/app'; 2 | import { ContextType, useEffect, useState } from 'react'; 3 | import MainContainer from '../src/components/mainContentainer/MainContainer'; 4 | import { AuthProvider } from '../src/context/authContext'; 5 | import { TasksContext } from '../src/context/tasksContext'; 6 | import { UsersContext } from '../src/context/usersContext'; 7 | import { api } from '../src/services/api'; 8 | import { GlobalStyle } from '../styles/Global'; 9 | import {GetServerSideProps} from 'next'; 10 | 11 | interface usersProps { 12 | id: string; 13 | name: string; 14 | email: string; 15 | } 16 | 17 | interface tasksProps { 18 | name: string; 19 | description: string; 20 | status: string; 21 | idUser: number; 22 | id: string; 23 | } 24 | 25 | function MyApp({ Component, pageProps }: AppProps) { 26 | 27 | const [users, setUsers] = useState([]); 28 | const [tasks, setTasks] = useState([]); 29 | 30 | useEffect(() => { 31 | api.get('/users'). 32 | then((data) => setUsers(data.data)); 33 | 34 | api.get('/tasks'). 35 | then((data) => setTasks(data.data)); 36 | }, []); 37 | 38 | return ( 39 | <> 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | ) 51 | } 52 | export default MyApp; 53 | 54 | -------------------------------------------------------------------------------- /front/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import Document, { DocumentContext } from 'next/document' 2 | import { ServerStyleSheet } from 'styled-components' 3 | 4 | export default class MyDocument extends Document { 5 | static async getInitialProps(ctx: DocumentContext) { 6 | const sheet = new ServerStyleSheet() 7 | const originalRenderPage = ctx.renderPage 8 | 9 | try { 10 | ctx.renderPage = () => 11 | originalRenderPage({ 12 | enhanceApp: (App) => (props) => 13 | sheet.collectStyles(), 14 | }) 15 | 16 | const initialProps = await Document.getInitialProps(ctx) 17 | return { 18 | ...initialProps, 19 | styles: [initialProps.styles, sheet.getStyleElement()], 20 | } 21 | } finally { 22 | sheet.seal() 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /front/pages/addTasks/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head' 3 | import * as C from './style'; 4 | import Aside from '../../src/components/aside/aside' 5 | import Header from '../../src/components/header/header' 6 | 7 | import AddTask from '../../src/components/addTasks/addTasks'; 8 | 9 | const AddTasksPage: NextPage = () => { 10 | 11 | return ( 12 | <> 13 | 14 | 15 | mauriciadas 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | ) 25 | } 26 | 27 | export default AddTasksPage; 28 | 29 | -------------------------------------------------------------------------------- /front/pages/addTasks/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container = styled.div` 4 | display: flex; 5 | 6 | .header{ 7 | flex:1; 8 | } 9 | `; -------------------------------------------------------------------------------- /front/pages/addUsers.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head' 3 | import AddUsers from '../src/components/addUsers/addUsers' 4 | 5 | const AddUser: NextPage = () => { 6 | 7 | return ( 8 | <> 9 | 10 | 11 | ) 12 | } 13 | 14 | export default AddUser 15 | 16 | -------------------------------------------------------------------------------- /front/pages/admin/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head' 3 | import * as C from './style'; 4 | import Aside from '../../src/components/aside/aside' 5 | import Header from '../../src/components/header/header' 6 | import MiniCards from '../../src/components/miniCards/MiniCards'; 7 | import Admin from '../../src/components/admin/admin'; 8 | 9 | const AdminPage: NextPage = () => { 10 | 11 | return ( 12 | <> 13 | 14 | 15 | mauriciadas 16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | ) 29 | } 30 | 31 | export default AdminPage; -------------------------------------------------------------------------------- /front/pages/admin/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container = styled.div` 4 | display: flex; 5 | 6 | .header{ 7 | flex:1; 8 | } 9 | `; -------------------------------------------------------------------------------- /front/pages/finishedTasks/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head' 3 | import * as C from './style'; 4 | import Aside from '../../src/components/aside/aside' 5 | import Header from '../../src/components/header/header' 6 | import MiniCards from '../../src/components/miniCards/MiniCards'; 7 | import FinishedTaskList from '../../src/components/finishedTasksList/taskList'; 8 | 9 | const FinishedTasksPage: NextPage = () => { 10 | 11 | return ( 12 | <> 13 | 14 | 15 | mauriciadas 16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | ) 29 | } 30 | 31 | export default FinishedTasksPage; 32 | 33 | -------------------------------------------------------------------------------- /front/pages/finishedTasks/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container = styled.div` 4 | display: flex; 5 | 6 | .header{ 7 | flex:1; 8 | } 9 | `; -------------------------------------------------------------------------------- /front/pages/index/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head' 3 | import * as C from './style'; 4 | import Aside from '../../src/components/aside/aside' 5 | import Header from '../../src/components/header/header' 6 | import MiniCards from '../../src/components/miniCards/MiniCards'; 7 | import TaskList from '../../src/components/taskList/taskList'; 8 | import { TasksContext } from '../../src/context/tasksContext'; 9 | import { useEffect, useState } from 'react'; 10 | import { api } from '../../src/services/api'; 11 | 12 | 13 | 14 | const Home: NextPage = () => { 15 | 16 | return ( 17 | <> 18 | 19 | 20 | mauriciadas 21 | 22 | 23 | 24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 | 32 | 33 |
34 | 35 | ) 36 | } 37 | 38 | export default Home 39 | 40 | -------------------------------------------------------------------------------- /front/pages/index/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | display: flex; 5 | 6 | .header{ 7 | flex:1; 8 | } 9 | `; -------------------------------------------------------------------------------- /front/pages/login/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head'; 3 | import AddUsers from '../../src/components/addUsers/addUsers'; 4 | import LoginAdmin from '../../src/components/loginAdmin/loginAdmin'; 5 | 6 | const AddUser: NextPage = () => { 7 | 8 | return ( 9 | <> 10 | 11 | 12 | ) 13 | } 14 | 15 | export default AddUser -------------------------------------------------------------------------------- /front/pages/login/style.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/pages/login/style.ts -------------------------------------------------------------------------------- /front/pages/peddingTasks/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | import Head from 'next/head' 3 | import * as C from './style'; 4 | import Aside from '../../src/components/aside/aside' 5 | import Header from '../../src/components/header/header' 6 | import MiniCards from '../../src/components/miniCards/MiniCards'; 7 | import PeddingTaskList from '../../src/components/peddingTasksList/taskList'; 8 | 9 | const PeddingTasksPage: NextPage = () => { 10 | 11 | return ( 12 | <> 13 | 14 | 15 | mauriciadas 16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | ) 29 | } 30 | 31 | export default PeddingTasksPage; 32 | 33 | -------------------------------------------------------------------------------- /front/pages/peddingTasks/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container = styled.div` 4 | display: flex; 5 | 6 | .header{ 7 | flex:1; 8 | } 9 | `; -------------------------------------------------------------------------------- /front/pages/usersList/index.tsx: -------------------------------------------------------------------------------- 1 | import type { GetServerSideProps, NextPage } from 'next' 2 | import Head from 'next/head' 3 | import * as C from './style'; 4 | import Aside from '../../src/components/aside/aside' 5 | import Header from '../../src/components/header/header' 6 | import MiniCards from '../../src/components/miniCards/MiniCards'; 7 | import UsersList from '../../src/components/usersList/usersList'; 8 | 9 | const UsersListPage: NextPage = () => { 10 | 11 | return ( 12 | <> 13 | 14 | 15 | mauriciadas 16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 | ) 28 | } 29 | 30 | export default UsersListPage; 31 | 32 | 33 | 34 | export const getServerSideProps: GetServerSideProps = async () => { 35 | return { 36 | props: { 37 | name: 'mau', 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /front/pages/usersList/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container = styled.div` 4 | display: flex; 5 | 6 | .header{ 7 | flex:1; 8 | } 9 | `; -------------------------------------------------------------------------------- /front/public/images/10181.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/10181.jpg -------------------------------------------------------------------------------- /front/public/images/1660132895236.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/1660132895236.jpg -------------------------------------------------------------------------------- /front/public/images/1660932536722.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/1660932536722.jpg -------------------------------------------------------------------------------- /front/public/images/269796429_907875379913390_4775710928716066908_n.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/269796429_907875379913390_4775710928716066908_n.jpg -------------------------------------------------------------------------------- /front/public/images/290194254_1251558849023955_252359117323357879_n.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/290194254_1251558849023955_252359117323357879_n.jpg -------------------------------------------------------------------------------- /front/public/images/4433.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/4433.jpg -------------------------------------------------------------------------------- /front/public/images/4857949.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/4857949.jpg -------------------------------------------------------------------------------- /front/public/images/7952.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/7952.jpg -------------------------------------------------------------------------------- /front/public/images/baixados.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/baixados.jpg -------------------------------------------------------------------------------- /front/public/images/beige-16875_1920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/beige-16875_1920.jpg -------------------------------------------------------------------------------- /front/public/images/black-and-white-1297353_1280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/black-and-white-1297353_1280.png -------------------------------------------------------------------------------- /front/public/images/eu e crianças.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/eu e crianças.jpg -------------------------------------------------------------------------------- /front/public/images/feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/feedback.png -------------------------------------------------------------------------------- /front/public/images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/file.png -------------------------------------------------------------------------------- /front/public/images/gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/gear.png -------------------------------------------------------------------------------- /front/public/images/goout.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/goout.jpg -------------------------------------------------------------------------------- /front/public/images/lcd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/lcd.jpg -------------------------------------------------------------------------------- /front/public/images/pexels-george-becker-126658.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/pexels-george-becker-126658.jpg -------------------------------------------------------------------------------- /front/public/images/pexels-pixabay-414144.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/pexels-pixabay-414144.jpg -------------------------------------------------------------------------------- /front/public/images/pexels-scott-webb-1029639.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/pexels-scott-webb-1029639.jpg -------------------------------------------------------------------------------- /front/public/images/recycling-1341372_1920.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/recycling-1341372_1920.png -------------------------------------------------------------------------------- /front/public/images/setting.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/setting.jpg -------------------------------------------------------------------------------- /front/public/images/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/settings.png -------------------------------------------------------------------------------- /front/public/images/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/unknown.png -------------------------------------------------------------------------------- /front/public/images/vecteezy_assortment-of-recycled-paper-notebooks_2297167 (2).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mauriciocosta404/tasks-maneger-nextjs-typescript-nodejs-mysql/85331ba48f79d8185148d812610a29a75f6fa69a/front/public/images/vecteezy_assortment-of-recycled-paper-notebooks_2297167 (2).jpg -------------------------------------------------------------------------------- /front/src/components/addTasks/addTasks.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import React, { useState } from 'react'; 3 | import { useEffect } from 'react'; 4 | import { api } from '../../services/api'; 5 | import Link from 'next/link'; 6 | import PickUser from '../pickUser/pickUser'; 7 | 8 | const AddTask = () => { 9 | const [name, setName] = useState(''); 10 | const [description, setDescription] = useState(''); 11 | const [status, setStatus] = useState('unfinished'); 12 | const [showPickUser, setShowPickUser] = useState(false); 13 | 14 | return ( 15 | <> 16 | { 17 | showPickUser && 18 | () 19 | } 20 | 21 |
22 |

Adding Task

23 | setName(event.target.value)} 29 | /> 30 | 38 | 39 |
40 |
41 | 42 | ); 43 | } 44 | export default AddTask; -------------------------------------------------------------------------------- /front/src/components/addTasks/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const AppContainer = styled.div` 4 | background-color: #fff; 5 | position: absolute; 6 | top: 50%;left:50%; 7 | transform: translate(-50%,-50%); 8 | >div{ 9 | display: flex; 10 | flex-direction: column; 11 | padding: 1.5rem; 12 | input,textarea{ 13 | border: 1px solid #ccc; 14 | } 15 | } 16 | *{ 17 | margin: .4rem; 18 | padding:.5rem 1rem; 19 | } 20 | button{ 21 | background-color: #e41386; 22 | border: none; 23 | color: #fff; 24 | text-align: center; 25 | } 26 | `; -------------------------------------------------------------------------------- /front/src/components/addUsers/addUsers.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import React, { useState } from 'react'; 3 | import { api } from '../../services/api'; 4 | 5 | const AddUsers = () => { 6 | const [name,setName]=useState(''); 7 | const [email,setEmail]= useState(''); 8 | const [idAdmin,setIdAdmin]=useState(''); 9 | 10 | const hadleValues=()=>{ 11 | api.post('/users',{ 12 | name, 13 | email, 14 | idAdmin 15 | }); 16 | setName(''); 17 | setIdAdmin(''); 18 | setEmail(''); 19 | window.location.replace('/usersList'); 20 | } 21 | 22 | return ( 23 | 24 |
25 |

Adding User

26 | setName(event.target.value)} 32 | /> 33 | setEmail(event.target.value)} 39 | /> 40 | setIdAdmin(event.target.value)} 46 | /> 47 | 48 |
49 |
50 | ); 51 | } 52 | export default AddUsers; -------------------------------------------------------------------------------- /front/src/components/addUsers/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const AppContainer = styled.div` 4 | background-color: #fff; 5 | position: absolute; 6 | top: 50%;left:50%; 7 | transform: translate(-50%,-50%); 8 | >div{ 9 | display: flex; 10 | flex-direction: column; 11 | padding: 1.5rem; 12 | input{ 13 | border: 1px solid #ccc; 14 | } 15 | } 16 | *{ 17 | margin: .4rem; 18 | padding:.5rem 1rem; 19 | } 20 | button{ 21 | background-color: #e41386; 22 | border: none; 23 | color: #fff; 24 | text-align: center; 25 | } 26 | `; -------------------------------------------------------------------------------- /front/src/components/admin/admin.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import Image from 'next/image'; 3 | import avatar from '../../../images/capturar.png'; 4 | 5 | const Admin=()=>{ 6 | return( 7 | 8 |
9 |

Admin

10 |
11 |
12 | 13 | 14 |
15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 |
25 |
26 |
27 | 28 | 29 |
30 |
31 | 32 | 33 |
34 |
35 |
36 |
37 |
38 | 39 |
40 |
41 | ) 42 | } 43 | export default Admin; -------------------------------------------------------------------------------- /front/src/components/admin/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | background-color: #fff; 5 | max-width: 64rem; 6 | margin: auto; 7 | padding: 1rem; 8 | img{ 9 | border-radius: 50%; 10 | } 11 | .head{ 12 | padding: 1rem; 13 | border-bottom: 1px solid #ccc; 14 | margin-bottom: 1rem; 15 | } 16 | .content{ 17 | display: flex; 18 | justify-content: space-between; 19 | padding: 1rem; 20 | flex-wrap: wrap; 21 | text-align: center; 22 | >div{ 23 | .inptus-container{ 24 | margin-top: 2rem; 25 | display: flex; 26 | justify-content: space-between; 27 | flex-wrap: wrap; 28 | gap: 1rem; 29 | .input{ 30 | input{ 31 | width: 16rem; 32 | padding: .6rem; 33 | margin-left: 1rem; 34 | border: 1px solid #ccc; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | .btn{ 41 | display: flex; 42 | justify-content: center; 43 | button{ 44 | color: #fff; 45 | background-color: #e41386; 46 | border: none; 47 | text-align: center; 48 | width: 10rem; 49 | padding: .5rem 3rem; 50 | font-size: 1.3rem; 51 | 52 | } 53 | } 54 | `; -------------------------------------------------------------------------------- /front/src/components/aside/aside.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import Image from 'next/image'; 3 | import { FaIgloo,FaCartPlus, FaRegClipboard,FaLeaf,FaUsers,FaUserGraduate,FaClipboardList,FaClipboardCheck,FaPercentage, FaNewspaper, FaHeartbeat } from 'react-icons/fa'; 4 | import Link from 'next/link'; 5 | 6 | const Aside=()=>{ 7 | return( 8 | 9 |
10 |

11 |

Encode

12 | 13 |
14 |
15 |
16 | 17 | 18 | 19 | Dashboard 20 |
21 |
22 | 23 | 24 | 25 | All Users 26 |
27 |
28 | 29 | 30 | 31 | Admin 32 |
33 |
34 | 35 | 36 | 37 | All tasks 38 |
39 |
40 | 41 | 42 | 43 | Finished Tasks 44 |
45 |
46 | 47 | 48 | 49 | Pedding Tasks 50 |
51 |
52 | 53 | 54 | 55 | Add User 56 |
57 |
58 | 59 | 60 | 61 | Add Task 62 |
63 |
64 |
65 | ); 66 | } 67 | export default Aside; -------------------------------------------------------------------------------- /front/src/components/aside/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.aside` 4 | position: sticky; 5 | bottom: 0; 6 | top: 0; 7 | padding: 1rem 0rem 1rem 1rem; 8 | background-color:#e41386; 9 | height: 100vh; 10 | width: 20rem; 11 | color: #fff; 12 | .logoP{ 13 | padding: 1rem; 14 | display: flex; 15 | gap:1.5rem; 16 | align-items: center; 17 | h2{ 18 | font-family:'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; 19 | } 20 | h3{ 21 | font-size: 1.7rem; 22 | } 23 | } 24 | .menu{ 25 | margin-top: 3rem; 26 | } 27 | .menu >div{ 28 | padding: .9rem; 29 | border-radius: 5rem 0rem 0rem 5rem; 30 | display: flex; 31 | gap: 1rem; 32 | font-size: 1.2rem; 33 | margin: .6rem 0; 34 | cursor: pointer; 35 | 36 | a{ 37 | color: #fff; 38 | } 39 | } 40 | .menu >div:hover{ 41 | background-color: #fff; 42 | color: #e41386; 43 | a{ 44 | color: #e41386; 45 | } 46 | } 47 | .menu div:first-child{ 48 | background-color: #fff; 49 | color: #e41386; 50 | a{ 51 | color: #e41386; 52 | } 53 | } 54 | `; -------------------------------------------------------------------------------- /front/src/components/finishedTasksList/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | background-color: #fff; 5 | max-width: 64rem; 6 | margin: auto; 7 | padding: 1rem; 8 | .head{ 9 | padding: 1rem; 10 | border-bottom: 1px solid #ccc; 11 | margin-bottom: 1rem; 12 | display: flex; 13 | justify-content: space-between; 14 | button{ 15 | padding: .6rem 2rem; 16 | color: #fff; 17 | background-color: #e41386; 18 | border: none; 19 | } 20 | } 21 | table{ 22 | width: 100%; 23 | tr{ 24 | border-collapse: collapse; 25 | } 26 | td,tr{ 27 | padding: 1rem ; 28 | text-align: center; 29 | } 30 | td:last-child{ 31 | color:#77AA00; 32 | } 33 | } 34 | 35 | `; -------------------------------------------------------------------------------- /front/src/components/finishedTasksList/taskList.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState, useContext } from 'react'; 2 | import * as C from './style'; 3 | import {FaTimes,FaCheck} from 'react-icons/fa'; 4 | import { api } from '../../services/api'; 5 | import { TasksContext } from '../../context/tasksContext'; 6 | 7 | interface tasksProps { 8 | name: string; 9 | description: string; 10 | status: string; 11 | idUser: number; 12 | } 13 | 14 | const FinishedTaskList=()=>{ 15 | 16 | const [showAllTasks, setShowAllTasks] = useState(true); 17 | const [finishedTasks,setFinishedTasks]=useState([]); 18 | const {tasks,setTasks}:tasksProps[] | any=useContext(TasksContext); 19 | 20 | useEffect(() => { 21 | setFinishedTasks(tasks.filter((task: tasksProps) => task.status === 'finished')); 22 | } 23 | ,[tasks]); 24 | 25 | return( 26 | 27 |
28 |

Finished Tasks

29 | 30 |
31 | 32 | {showAllTasks &&( 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | { 44 | finishedTasks?.map(({name,description}:tasksProps,key:number)=>( 45 | 46 | 47 | 48 | 49 | 50 | 51 | )) 52 | } 53 | 54 | 55 |
NameDescriptionCodigoStatus
{name}{description}****
56 | )} 57 | 58 |
59 | ) 60 | } 61 | export default FinishedTaskList; -------------------------------------------------------------------------------- /front/src/components/header/header.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import {FaSearch,FaBars} from 'react-icons/fa'; 3 | import Image from 'next/image'; 4 | import avatar from '../../../images/Capturar.png'; 5 | 6 | const Header=()=>{ 7 | return( 8 | 9 |
Dashboard
10 |
11 |
12 |
13 | 14 |
15 |
16 | Jonh Doe 17 | Supper admin 18 |
19 |
20 |
21 | ); 22 | } 23 | export default Header; -------------------------------------------------------------------------------- /front/src/components/header/style.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Container=styled.nav` 4 | position: sticky; 5 | top: 0; 6 | display: flex; 7 | justify-content: space-between; 8 | align-items: center; 9 | padding: 2rem; 10 | background-color: #fff; 11 | box-shadow: var(--box-shadow); 12 | max-height: 5rem; 13 | .logo{ 14 | display: flex; 15 | gap: .5rem; 16 | align-items: center; 17 | font-size: 1.3rem; 18 | font-weight: 600; 19 | } 20 | .searchContainer{ 21 | display: flex; 22 | align-items: center; 23 | border-radius: 5rem; 24 | gap: 1rem; 25 | border: 1px solid #ccc; 26 | padding: .3rem 1rem; 27 | input{ 28 | border: none; 29 | padding: .3rem; 30 | } 31 | } 32 | .avatar{ 33 | display: flex; 34 | gap: .5rem; 35 | .image img{ 36 | border-radius: 50%; 37 | } 38 | .content{ 39 | display: flex; 40 | flex-direction: column; 41 | span{ 42 | font-weight: 600; 43 | } 44 | small{ 45 | color: #999; 46 | } 47 | } 48 | } 49 | @media screen and (max-width:800px){ 50 | 51 | .searchContainer{ 52 | display: none; 53 | } 54 | 55 | } 56 | `; -------------------------------------------------------------------------------- /front/src/components/loginAdmin/loginAdmin.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import React, { useState } from 'react'; 3 | import { useEffect } from 'react'; 4 | import { api } from '../../services/api'; 5 | import Link from 'next/link'; 6 | 7 | interface adminsProps{ 8 | id: string; 9 | name:string; 10 | email:string; 11 | password:string; 12 | } 13 | 14 | const LoginAdmin = () => { 15 | const [email,setEmail]= useState(''); 16 | const [password,setPassword]=useState(''); 17 | const [admins,setAdmins]= useState ([]); 18 | const [admin, setAdmin] = useState(); 19 | const [message, setMessage] = useState(''); 20 | 21 | useEffect(()=>{ 22 | api.get('/admins'). 23 | then((data)=>setAdmins(data.data)); 24 | },[]); 25 | 26 | const hadleValues=()=>{ 27 | setAdmin(admins.find((admin)=>admin.email && admin.password===password)); 28 | 29 | if(!admin){ 30 | setMessage('email or password invalid') 31 | setInterval(() => { 32 | setMessage(''); 33 | },3000); 34 | }else{ 35 | window.location.replace(`/index/${admin.id}`); 36 | } 37 | 38 | setPassword(''); 39 | setEmail(''); 40 | } 41 | 42 | return ( 43 | 44 |
45 |

Login

46 | 47 |

{message}

48 | 49 | setEmail(event.target.value)} 55 | /> 56 | setPassword(event.target.value)} 62 | /> 63 | 64 |
65 |
66 | ); 67 | } 68 | export default LoginAdmin; -------------------------------------------------------------------------------- /front/src/components/loginAdmin/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const AppContainer = styled.div` 4 | background-color: #fff; 5 | position: absolute; 6 | top: 50%;left:50%; 7 | transform: translate(-50%,-50%); 8 | >div{ 9 | display: flex; 10 | flex-direction: column; 11 | padding: 1.5rem; 12 | input{ 13 | border: 1px solid #ccc; 14 | } 15 | } 16 | *{ 17 | margin: .4rem; 18 | padding:.5rem 1rem; 19 | } 20 | button{ 21 | background-color: #e41386; 22 | border: none; 23 | color: #fff; 24 | text-align: center; 25 | } 26 | `; -------------------------------------------------------------------------------- /front/src/components/mainContentainer/MainContainer.tsx: -------------------------------------------------------------------------------- 1 | import { PropsWithChildren, ReactNode } from "react"; 2 | 3 | const MainContainer=({children}:PropsWithChildren)=>{ 4 | return( 5 |
6 | {children} 7 | 8 |
9 | ) 10 | } 11 | export default MainContainer; -------------------------------------------------------------------------------- /front/src/components/miniCards/MiniCards.tsx: -------------------------------------------------------------------------------- 1 | import { FaUsers,FaClipboardList,FaRegClipboard,FaClipboardCheck } from 'react-icons/fa'; 2 | import * as C from './style'; 3 | import { api } from '../../services/api'; 4 | import { useEffect, useState,useContext } from 'react'; 5 | import { TasksContext } from '../../context/tasksContext'; 6 | import { UsersContext } from '../../context/usersContext'; 7 | 8 | interface tasksProps { 9 | name: string; 10 | description: string; 11 | status: string; 12 | idUser: number; 13 | } 14 | interface usersProps { 15 | id: string; 16 | name: string; 17 | email: string; 18 | } 19 | 20 | const MiniCards=()=>{ 21 | const {tasks}:tasksProps[] | any =useContext(TasksContext); 22 | const {users}:usersProps[] | any =useContext(UsersContext); 23 | const [countUsers,setCountUsers]=useState(0); 24 | const [countTasks,setCountTasks]=useState(0); 25 | const [peddingCountTasks, setPeddingCountTasks] = useState(); 26 | const [finishedCountTasks, setFinishedCountTasks] = useState(); 27 | 28 | useEffect(()=>{ 29 | setCountUsers(users.length) 30 | setCountTasks(tasks.length), 31 | setPeddingCountTasks(tasks.filter((task: tasksProps) => task.status === 'unfinished')); 32 | setFinishedCountTasks(tasks.filter((task: tasksProps) => task.status === 'finished')); 33 | 34 | },[users,tasks]); 35 | 36 | return( 37 | 38 | 39 |
40 |

{countUsers}

41 | All users 42 |
43 |
44 | 45 |
46 |
47 | 48 |
49 |

{countTasks}

50 | All Tasks 51 |
52 |
53 | 54 |
55 |
56 | 57 |
58 |

{peddingCountTasks?.length ?? 0}

59 | Pedding tasks 60 |
61 |
62 | 63 |
64 |
65 | 66 |
67 |

{finishedCountTasks?.length ?? 0}

68 | Finished Tasks 69 |
70 |
71 | 72 |
73 |
74 |
75 | ); 76 | } 77 | 78 | export default MiniCards; -------------------------------------------------------------------------------- /front/src/components/miniCards/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | padding: 3rem; 5 | display: grid; 6 | grid-template-columns: repeat(auto-fit,minmax(8rem,1fr)); 7 | gap: 2rem; 8 | >div:not(:last-child){ 9 | background-color:#fff ; 10 | .icon{ 11 | font-size: 2rem; 12 | color:#e41386; 13 | } 14 | } 15 | >div:last-child{ 16 | background-color:#e41386 ; 17 | color: #fff; 18 | } 19 | .icon{ 20 | font-size: 2rem; 21 | color:#fff; 22 | } 23 | `; 24 | 25 | export const MiniCard = styled.div` 26 | padding: 2rem ; 27 | display: flex; 28 | justify-content: center; 29 | align-items: center; 30 | gap:3rem; 31 | h2{ 32 | font-size: 1.9rem; 33 | } 34 | `; -------------------------------------------------------------------------------- /front/src/components/peddingTasksList/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | background-color: #fff; 5 | max-width: 64rem; 6 | margin: auto; 7 | padding: 1rem; 8 | .head{ 9 | padding: 1rem; 10 | border-bottom: 1px solid #ccc; 11 | margin-bottom: 1rem; 12 | display: flex; 13 | justify-content: space-between; 14 | button{ 15 | padding: .6rem 2rem; 16 | color: #fff; 17 | background-color: #e41386; 18 | border: none; 19 | } 20 | } 21 | table{ 22 | width: 100%; 23 | tr{ 24 | border-collapse: collapse; 25 | } 26 | td,tr{ 27 | padding: 1rem ; 28 | text-align: center; 29 | } 30 | td:last-child{ 31 | color:#CC0000; 32 | } 33 | } 34 | 35 | `; -------------------------------------------------------------------------------- /front/src/components/peddingTasksList/taskList.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState, useContext } from 'react'; 2 | import * as C from './style'; 3 | import {FaTimes,FaCheck} from 'react-icons/fa'; 4 | import { api } from '../../services/api'; 5 | import { TasksContext } from '../../context/tasksContext'; 6 | 7 | interface tasksProps { 8 | name: string; 9 | description: string; 10 | status: string; 11 | idUser: number; 12 | } 13 | 14 | const PeddingTaskList=()=>{ 15 | const [showAllTasks, setShowAllTasks] = useState(true); 16 | const [peddingTasks, setPeddingTasks] = useState(); 17 | const {tasks, setTasks}:tasksProps[] | any=useContext(TasksContext); 18 | 19 | useEffect(() => { 20 | setPeddingTasks(tasks.filter(({status}: tasksProps) => status !== 'finished')); 21 | } 22 | ,[]); 23 | return( 24 | 25 | 26 |
27 |

Pedding Tasks

28 | 29 |
30 | 31 | {showAllTasks &&( 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | { 44 | peddingTasks?.map(({name,description,status}:tasksProps,key:number)=>( 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | )) 53 | } 54 | 55 | 56 |
NameDescriptionCodigoStatus
{name}{description}****
57 | )} 58 | 59 |
60 | ) 61 | } 62 | export default PeddingTaskList; -------------------------------------------------------------------------------- /front/src/components/pickUser/pickUser.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import { api } from '../../services/api'; 3 | import { useState, useEffect, useContext } from 'react'; 4 | import { UsersContext } from '../../context/usersContext'; 5 | 6 | interface userProps { 7 | name: string; 8 | email: string; 9 | password: string; 10 | id:number; 11 | } 12 | 13 | interface PickUserProps{ 14 | setShowPickUser(showPickUser:boolean):void; 15 | name: string; 16 | description:string; 17 | status:string; 18 | } 19 | 20 | const PickUser=({name,description,status,setShowPickUser}:PickUserProps)=>{ 21 | 22 | const {users,setUsers}:userProps[] | any=useContext(UsersContext); 23 | 24 | const handle=(idUser:number)=>{ 25 | api.post('/Tasks', { 26 | name, 27 | description, 28 | status, 29 | idUser 30 | }); 31 | 32 | setShowPickUser(false); 33 | window.location.replace('/index'); 34 | } 35 | 36 | return( 37 | 38 | 39 | { 40 | users.map(({name,email,id}:userProps,key:number)=>( 41 |
handle(id)}> 42 |
43 | {name.charAt(0)} 44 |
45 |
46 |

47 | {name} 48 |

49 | {email} 50 |
51 |
52 | )) 53 | } 54 |
55 |
56 | ) 57 | } 58 | export default PickUser; -------------------------------------------------------------------------------- /front/src/components/pickUser/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | position: absolute; 5 | left: 0;right: 0;bottom:0;top:0; 6 | //background-color: rgba(255, 255, 255, 0.856); 7 | z-index: 10; 8 | `; 9 | export const UsersContainer = styled.div` 10 | position: relative; 11 | background-color:#fff; 12 | top: 60%; 13 | left:60% ; 14 | transform:translate(-50%,-50%) ; 15 | max-width:40rem; 16 | max-height: 30rem; 17 | overflow-y: scroll; 18 | z-index: 100; 19 | >div{ 20 | display: flex; 21 | padding: .3rem; 22 | gap: 1.7rem; 23 | cursor: pointer; 24 | } 25 | >div:hover{ 26 | background-color: #ddd; 27 | } 28 | .initial{ 29 | width:3rem; 30 | height: 3rem; 31 | background-color: #ccc; 32 | border-radius: 50%; 33 | display: flex; 34 | align-items: center; 35 | justify-content:center; 36 | } 37 | `; 38 | -------------------------------------------------------------------------------- /front/src/components/taskList/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | background-color: #fff; 5 | max-width: 64rem; 6 | margin: auto; 7 | padding: 1rem; 8 | .head{ 9 | padding: 1rem; 10 | border-bottom: 1px solid #ccc; 11 | margin-bottom: 1rem; 12 | display: flex; 13 | justify-content: space-between; 14 | button{ 15 | padding: .6rem 2rem; 16 | color: #fff; 17 | background-color: #e41386; 18 | border: none; 19 | } 20 | } 21 | table{ 22 | width: 100%; 23 | tr{ 24 | border-collapse: collapse; 25 | } 26 | td,tr{ 27 | padding: 1rem ; 28 | text-align: center; 29 | } 30 | td:last-child{ 31 | cursor: pointer; 32 | } 33 | 34 | } 35 | 36 | `; -------------------------------------------------------------------------------- /front/src/components/taskList/taskList.tsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect, useContext } from 'react'; 2 | import * as C from './style'; 3 | import {FaCheck, FaTimes, FaTrash} from 'react-icons/fa'; 4 | import { api } from '../../services/api'; 5 | import Link from 'next/link'; 6 | import { TasksContext } from '../../context/tasksContext'; 7 | 8 | interface statusProps{ 9 | status:'unfinished'|'finished'; 10 | } 11 | interface tasksProps{ 12 | name:string; 13 | description:string; 14 | status:string; 15 | idUser:number; 16 | id:string; 17 | } 18 | 19 | const TaskList=()=>{ 20 | 21 | const {tasks,setTasks}:tasksProps[] | any=useContext(TasksContext); 22 | const [showAllTasks, setShowAllTasks] = useState(true); 23 | const [id, setId] = useState(''); 24 | 25 | const hadleValues=(id:string,taskStatus:string)=>{ 26 | setId(id); 27 | 28 | let status=taskStatus==='finished'?'unfinished':'finished'; 29 | 30 | setTasks(tasks?.map((task:tasksProps) => 31 | task.id === id 32 | ? { 33 | ...task, 34 | status 35 | } 36 | : task 37 | )); 38 | 39 | api.put('/tasks',{ 40 | id, 41 | status 42 | }); 43 | } 44 | 45 | const deleteTask=(id:string)=>{ 46 | api.delete('/tasks/'+id); 47 | setTasks(tasks?.filter((task:tasksProps)=>task.id!==id)); 48 | } 49 | 50 | return( 51 | 52 |
53 |

All Tasks

54 | 55 |
56 | 57 | {showAllTasks &&( 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | { 69 | tasks?.map(({name,description,id,status}:tasksProps,key:number)=>( 70 | 71 | 72 | 73 | 78 | 79 | 80 | )) 81 | } 82 | 83 | 84 |
NameDescriptionStatusAction
{name}{description}hadleValues(id,status)} 75 | > 76 | {status === 'finished' ? () : ()} 77 | deleteTask(id)}>
85 | )} 86 | 87 |
88 | ) 89 | } 90 | export default TaskList; -------------------------------------------------------------------------------- /front/src/components/usersList/style.ts: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Container=styled.div` 4 | background-color: #fff; 5 | max-width: 64rem; 6 | margin: auto; 7 | padding: 1rem; 8 | .head{ 9 | padding: 1rem; 10 | border-bottom: 1px solid #ccc; 11 | margin-bottom: 1rem; 12 | display: flex; 13 | justify-content: space-between; 14 | button{ 15 | padding: .6rem 2rem; 16 | color: #fff; 17 | background-color: #e41386; 18 | border: none; 19 | } 20 | } 21 | table{ 22 | width: 100%; 23 | tr{ 24 | border-collapse: collapse; 25 | } 26 | td,tr{ 27 | padding: 1rem ; 28 | text-align: center; 29 | 30 | } 31 | } 32 | 33 | `; -------------------------------------------------------------------------------- /front/src/components/usersList/usersList.tsx: -------------------------------------------------------------------------------- 1 | import * as C from './style'; 2 | import { useEffect, useState, useContext } from 'react'; 3 | import {api} from '../../services/api'; 4 | import { TasksContext } from '../../context/tasksContext'; 5 | import { UsersContext } from '../../context/usersContext'; 6 | 7 | interface userProps{ 8 | name:string; 9 | email:string; 10 | idAdmin:string; 11 | } 12 | 13 | const UsersList=()=>{ 14 | 15 | const {users}:userProps[] | any=useContext(UsersContext); 16 | 17 | const [showAllUsers,setShowAllUsers]=useState(true); 18 | 19 | return( 20 | 21 |
22 | 23 |

All User

24 | 25 |
26 | {showAllUsers && ( 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {users.map(({name,email}:userProps,key:number)=>( 37 | 38 | 39 | 40 | 41 | 42 | ))} 43 | 44 | 45 | 46 |
NameEmailPassword
{name}{email}**********
47 | )} 48 |
49 | ) 50 | } 51 | export default UsersList; -------------------------------------------------------------------------------- /front/src/context/authContext.tsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, PropsWithChildren } from 'react'; 2 | 3 | interface signProps{ 4 | email: string; 5 | password:string; 6 | } 7 | 8 | interface AuthContextProps{ 9 | isAutenticated:boolean; 10 | } 11 | 12 | const AuthContext = createContext({} as AuthContextProps); 13 | 14 | export function AuthProvider({ children }:PropsWithChildren ){ 15 | 16 | const isAutenticated=false; 17 | 18 | async function signIn({email,password}:signProps){ 19 | 20 | } 21 | 22 | return ( 23 | 24 | { children } 25 | 26 | ) 27 | } -------------------------------------------------------------------------------- /front/src/context/tasksContext.tsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, PropsWithChildren, useState } from 'react'; 2 | import TaskList from '../components/taskList/taskList'; 3 | import { useEffect } from 'react'; 4 | import { api } from '../services/api'; 5 | 6 | interface TasksProps { 7 | name: string; 8 | description: string; 9 | status: string; 10 | idUser: string; 11 | id: string; 12 | } 13 | 14 | export const TasksContext = createContext({} as TasksProps[]); -------------------------------------------------------------------------------- /front/src/context/usersContext.ts: -------------------------------------------------------------------------------- 1 | import React, { createContext, PropsWithChildren, useState } from 'react'; 2 | import TaskList from '../components/taskList/taskList'; 3 | import { useEffect } from 'react'; 4 | import { api } from '../services/api'; 5 | 6 | interface UsersProps { 7 | idUser: number; 8 | name: string; 9 | email: string; 10 | } 11 | 12 | export const UsersContext = createContext({} as UsersProps[]); 13 | -------------------------------------------------------------------------------- /front/src/services/api.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | export const api=axios.create({ 4 | baseURL:'http://localhost:3333', 5 | }); 6 | 7 | -------------------------------------------------------------------------------- /front/styles/Global.ts: -------------------------------------------------------------------------------- 1 | import { createGlobalStyle } from "styled-components"; 2 | 3 | export const GlobalStyle=createGlobalStyle` 4 | :root{ 5 | --black:#192a56; 6 | --light-color:#666; 7 | --box-shadow:0 0.5rem 1.5rem rgba(0,0,0,0.1); 8 | --body-color:#efefef; 9 | } 10 | 11 | *{ 12 | margin: 0; padding:0; 13 | box-sizing: border-box; 14 | text-decoration: none; 15 | transition: all .2s linear; 16 | outline: none; 17 | font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; 18 | } 19 | body{ 20 | background-color: var(--body-color); 21 | } 22 | html{ 23 | font-size: 93.5%; 24 | overflow-x: hidden; 25 | scroll-padding-top: 5.5rem; 26 | scroll-behavior: smooth; 27 | } 28 | button{ 29 | cursor: pointer; 30 | } 31 | 32 | 33 | @media screen and (max-width:800px){ 34 | 35 | html{ 36 | font-size: 83%; 37 | } 38 | aside{ 39 | max-width: 5rem; 40 | a{ 41 | display: none; 42 | } 43 | } 44 | 45 | } 46 | `; -------------------------------------------------------------------------------- /front/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | --------------------------------------------------------------------------------