├── .env ├── .gitignore ├── app.ts ├── controllers └── usuarios.ts ├── db └── connection.ts ├── dist ├── app.js ├── app.js.map ├── controllers │ ├── usuarios.js │ └── usuarios.js.map ├── db │ ├── connection.js │ └── connection.js.map ├── models │ ├── server.js │ ├── server.js.map │ ├── usuario.js │ └── usuario.js.map └── routes │ ├── usuario.js │ └── usuario.js.map ├── models ├── server.ts └── usuario.ts ├── package-lock.json ├── package.json ├── public └── index.html ├── routes └── usuario.ts ├── tsconfig.json └── tslint.json /.env: -------------------------------------------------------------------------------- 1 | PORT=8000 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /app.ts: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import Server from './models/server'; 3 | 4 | // Configurar dot.env 5 | dotenv.config(); 6 | 7 | const server = new Server(); 8 | 9 | 10 | server.listen(); -------------------------------------------------------------------------------- /controllers/usuarios.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | import { json } from 'sequelize/types'; 3 | import Usuario from '../models/usuario'; 4 | 5 | 6 | export const getUsuarios = async( req: Request , res: Response ) => { 7 | 8 | const usuarios = await Usuario.findAll(); 9 | 10 | res.json({ usuarios }); 11 | } 12 | 13 | export const getUsuario = async( req: Request , res: Response ) => { 14 | 15 | const { id } = req.params; 16 | 17 | const usuario = await Usuario.findByPk( id ); 18 | 19 | if( usuario ) { 20 | res.json(usuario); 21 | } else { 22 | res.status(404).json({ 23 | msg: `No existe un usuario con el id ${ id }` 24 | }); 25 | } 26 | 27 | 28 | } 29 | 30 | export const postUsuario = async( req: Request , res: Response ) => { 31 | 32 | const { body } = req; 33 | 34 | try { 35 | 36 | const existeEmail = await Usuario.findOne({ 37 | where: { 38 | email: body.email 39 | } 40 | }); 41 | 42 | if (existeEmail) { 43 | return res.status(400).json({ 44 | msg: 'Ya existe un usuario con el email ' + body.email 45 | }); 46 | } 47 | 48 | 49 | const usuario = new Usuario(body); 50 | await usuario.save(); 51 | 52 | res.json( usuario ); 53 | 54 | 55 | } catch (error) { 56 | 57 | console.log(error); 58 | res.status(500).json({ 59 | msg: 'Hable con el administrador' 60 | }) 61 | } 62 | 63 | 64 | 65 | } 66 | 67 | export const putUsuario = async( req: Request , res: Response ) => { 68 | 69 | const { id } = req.params; 70 | const { body } = req; 71 | 72 | try { 73 | 74 | const usuario = await Usuario.findByPk( id ); 75 | if ( !usuario ) { 76 | return res.status(404).json({ 77 | msg: 'No existe un usuario con el id ' + id 78 | }); 79 | } 80 | 81 | await usuario.update( body ); 82 | 83 | res.json( usuario ); 84 | 85 | 86 | } catch (error) { 87 | 88 | console.log(error); 89 | res.status(500).json({ 90 | msg: 'Hable con el administrador' 91 | }) 92 | } 93 | } 94 | 95 | 96 | export const deleteUsuario = async( req: Request , res: Response ) => { 97 | 98 | const { id } = req.params; 99 | 100 | const usuario = await Usuario.findByPk( id ); 101 | if ( !usuario ) { 102 | return res.status(404).json({ 103 | msg: 'No existe un usuario con el id ' + id 104 | }); 105 | } 106 | 107 | await usuario.update({ estado: false }); 108 | 109 | // await usuario.destroy(); 110 | 111 | 112 | res.json(usuario); 113 | } 114 | 115 | -------------------------------------------------------------------------------- /db/connection.ts: -------------------------------------------------------------------------------- 1 | import { Sequelize } from 'sequelize'; 2 | 3 | 4 | const db = new Sequelize('node', 'demos', '123456', { 5 | host: 'localhost', 6 | dialect: 'mysql', 7 | // logging: false, 8 | }); 9 | 10 | export default db; 11 | -------------------------------------------------------------------------------- /dist/app.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const dotenv_1 = __importDefault(require("dotenv")); 7 | const server_1 = __importDefault(require("./models/server")); 8 | // Configurar dot.env 9 | dotenv_1.default.config(); 10 | const server = new server_1.default(); 11 | server.listen(); 12 | //# sourceMappingURL=app.js.map -------------------------------------------------------------------------------- /dist/app.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.js","sourceRoot":"","sources":["../app.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAC5B,6DAAqC;AAErC,qBAAqB;AACrB,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,MAAM,GAAG,IAAI,gBAAM,EAAE,CAAC;AAG5B,MAAM,CAAC,MAAM,EAAE,CAAC"} -------------------------------------------------------------------------------- /dist/controllers/usuarios.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __importDefault = (this && this.__importDefault) || function (mod) { 12 | return (mod && mod.__esModule) ? mod : { "default": mod }; 13 | }; 14 | Object.defineProperty(exports, "__esModule", { value: true }); 15 | exports.deleteUsuario = exports.putUsuario = exports.postUsuario = exports.getUsuario = exports.getUsuarios = void 0; 16 | const usuario_1 = __importDefault(require("../models/usuario")); 17 | const getUsuarios = (req, res) => __awaiter(void 0, void 0, void 0, function* () { 18 | const usuarios = yield usuario_1.default.findAll(); 19 | res.json({ usuarios }); 20 | }); 21 | exports.getUsuarios = getUsuarios; 22 | const getUsuario = (req, res) => __awaiter(void 0, void 0, void 0, function* () { 23 | const { id } = req.params; 24 | const usuario = yield usuario_1.default.findByPk(id); 25 | if (usuario) { 26 | res.json(usuario); 27 | } 28 | else { 29 | res.status(404).json({ 30 | msg: `No existe un usuario con el id ${id}` 31 | }); 32 | } 33 | }); 34 | exports.getUsuario = getUsuario; 35 | const postUsuario = (req, res) => __awaiter(void 0, void 0, void 0, function* () { 36 | const { body } = req; 37 | try { 38 | const existeEmail = yield usuario_1.default.findOne({ 39 | where: { 40 | email: body.email 41 | } 42 | }); 43 | if (existeEmail) { 44 | return res.status(400).json({ 45 | msg: 'Ya existe un usuario con el email ' + body.email 46 | }); 47 | } 48 | const usuario = new usuario_1.default(body); 49 | yield usuario.save(); 50 | res.json(usuario); 51 | } 52 | catch (error) { 53 | console.log(error); 54 | res.status(500).json({ 55 | msg: 'Hable con el administrador' 56 | }); 57 | } 58 | }); 59 | exports.postUsuario = postUsuario; 60 | const putUsuario = (req, res) => __awaiter(void 0, void 0, void 0, function* () { 61 | const { id } = req.params; 62 | const { body } = req; 63 | try { 64 | const usuario = yield usuario_1.default.findByPk(id); 65 | if (!usuario) { 66 | return res.status(404).json({ 67 | msg: 'No existe un usuario con el id ' + id 68 | }); 69 | } 70 | yield usuario.update(body); 71 | res.json(usuario); 72 | } 73 | catch (error) { 74 | console.log(error); 75 | res.status(500).json({ 76 | msg: 'Hable con el administrador' 77 | }); 78 | } 79 | }); 80 | exports.putUsuario = putUsuario; 81 | const deleteUsuario = (req, res) => __awaiter(void 0, void 0, void 0, function* () { 82 | const { id } = req.params; 83 | const usuario = yield usuario_1.default.findByPk(id); 84 | if (!usuario) { 85 | return res.status(404).json({ 86 | msg: 'No existe un usuario con el id ' + id 87 | }); 88 | } 89 | yield usuario.update({ estado: false }); 90 | // await usuario.destroy(); 91 | res.json(usuario); 92 | }); 93 | exports.deleteUsuario = deleteUsuario; 94 | //# sourceMappingURL=usuarios.js.map -------------------------------------------------------------------------------- /dist/controllers/usuarios.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"usuarios.js","sourceRoot":"","sources":["../../controllers/usuarios.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,gEAAwC;AAGjC,MAAM,WAAW,GAAG,CAAO,GAAY,EAAG,GAAa,EAAG,EAAE;IAE/D,MAAM,QAAQ,GAAG,MAAM,iBAAO,CAAC,OAAO,EAAE,CAAC;IAEzC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC3B,CAAC,CAAA,CAAA;AALY,QAAA,WAAW,eAKvB;AAEM,MAAM,UAAU,GAAG,CAAO,GAAY,EAAG,GAAa,EAAG,EAAE;IAE9D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,iBAAO,CAAC,QAAQ,CAAE,EAAE,CAAE,CAAC;IAE7C,IAAI,OAAO,EAAG;QACV,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACrB;SAAM;QACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,kCAAmC,EAAG,EAAE;SAChD,CAAC,CAAC;KACN;AAGL,CAAC,CAAA,CAAA;AAfY,QAAA,UAAU,cAetB;AAEM,MAAM,WAAW,GAAG,CAAO,GAAY,EAAG,GAAa,EAAG,EAAE;IAE/D,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAErB,IAAI;QAEA,MAAM,WAAW,GAAG,MAAM,iBAAO,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE;gBACH,KAAK,EAAE,IAAI,CAAC,KAAK;aACpB;SACJ,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE;YACb,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACxB,GAAG,EAAE,oCAAoC,GAAG,IAAI,CAAC,KAAK;aACzD,CAAC,CAAC;SACN;QAGD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,GAAG,CAAC,IAAI,CAAE,OAAO,CAAE,CAAC;KAGvB;IAAC,OAAO,KAAK,EAAE;QAEZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,4BAA4B;SACpC,CAAC,CAAA;KACL;AAIL,CAAC,CAAA,CAAA;AAnCY,QAAA,WAAW,eAmCvB;AAEM,MAAM,UAAU,GAAG,CAAO,GAAY,EAAG,GAAa,EAAG,EAAE;IAE9D,MAAM,EAAE,EAAE,EAAE,GAAK,GAAG,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAErB,IAAI;QAEA,MAAM,OAAO,GAAG,MAAM,iBAAO,CAAC,QAAQ,CAAE,EAAE,CAAE,CAAC;QAC7C,IAAK,CAAC,OAAO,EAAG;YACZ,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACxB,GAAG,EAAE,iCAAiC,GAAG,EAAE;aAC9C,CAAC,CAAC;SACN;QAED,MAAM,OAAO,CAAC,MAAM,CAAE,IAAI,CAAE,CAAC;QAE7B,GAAG,CAAC,IAAI,CAAE,OAAO,CAAE,CAAC;KAGvB;IAAC,OAAO,KAAK,EAAE;QAEZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,GAAG,EAAE,4BAA4B;SACpC,CAAC,CAAA;KACL;AACL,CAAC,CAAA,CAAA;AA1BY,QAAA,UAAU,cA0BtB;AAGM,MAAM,aAAa,GAAG,CAAO,GAAY,EAAG,GAAa,EAAG,EAAE;IAEjE,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,iBAAO,CAAC,QAAQ,CAAE,EAAE,CAAE,CAAC;IAC7C,IAAK,CAAC,OAAO,EAAG;QACZ,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,GAAG,EAAE,iCAAiC,GAAG,EAAE;SAC9C,CAAC,CAAC;KACN;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAExC,2BAA2B;IAG3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC,CAAA,CAAA;AAjBY,QAAA,aAAa,iBAiBzB"} -------------------------------------------------------------------------------- /dist/db/connection.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const sequelize_1 = require("sequelize"); 4 | const db = new sequelize_1.Sequelize('node', 'demos', '123456', { 5 | host: 'localhost', 6 | dialect: 'mysql', 7 | }); 8 | exports.default = db; 9 | //# sourceMappingURL=connection.js.map -------------------------------------------------------------------------------- /dist/db/connection.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../db/connection.ts"],"names":[],"mappings":";;AAAA,yCAAsC;AAGtC,MAAM,EAAE,GAAG,IAAI,qBAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;IAChD,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CAEnB,CAAC,CAAC;AAEH,kBAAe,EAAE,CAAC"} -------------------------------------------------------------------------------- /dist/models/server.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __importDefault = (this && this.__importDefault) || function (mod) { 12 | return (mod && mod.__esModule) ? mod : { "default": mod }; 13 | }; 14 | Object.defineProperty(exports, "__esModule", { value: true }); 15 | const express_1 = __importDefault(require("express")); 16 | const usuario_1 = __importDefault(require("../routes/usuario")); 17 | const cors_1 = __importDefault(require("cors")); 18 | const connection_1 = __importDefault(require("../db/connection")); 19 | class Server { 20 | constructor() { 21 | this.apiPaths = { 22 | usuarios: '/api/usuarios' 23 | }; 24 | this.app = express_1.default(); 25 | this.port = process.env.PORT || '8000'; 26 | // Métodos iniciales 27 | this.dbConnection(); 28 | this.middlewares(); 29 | this.routes(); 30 | } 31 | dbConnection() { 32 | return __awaiter(this, void 0, void 0, function* () { 33 | try { 34 | yield connection_1.default.authenticate(); 35 | console.log('Database online'); 36 | } 37 | catch (error) { 38 | throw new Error(error); 39 | } 40 | }); 41 | } 42 | middlewares() { 43 | // CORS 44 | this.app.use(cors_1.default()); 45 | // Lectura del body 46 | this.app.use(express_1.default.json()); 47 | // Carpeta pública 48 | this.app.use(express_1.default.static('public')); 49 | } 50 | routes() { 51 | this.app.use(this.apiPaths.usuarios, usuario_1.default); 52 | } 53 | listen() { 54 | this.app.listen(this.port, () => { 55 | console.log('Servidor corriendo en puerto ' + this.port); 56 | }); 57 | } 58 | } 59 | exports.default = Server; 60 | //# sourceMappingURL=server.js.map -------------------------------------------------------------------------------- /dist/models/server.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"server.js","sourceRoot":"","sources":["../../models/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,sDAA+C;AAC/C,gEAA2C;AAC3C,gDAAwB;AAExB,kEAAkC;AAGlC,MAAM,MAAM;IAQR;QAJQ,aAAQ,GAAG;YACf,QAAQ,EAAE,eAAe;SAC5B,CAAA;QAGG,IAAI,CAAC,GAAG,GAAI,iBAAO,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC;QAEvC,oBAAoB;QACpB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAEK,YAAY;;YAEd,IAAI;gBAEA,MAAM,oBAAE,CAAC,YAAY,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aAElC;YAAC,OAAO,KAAK,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAE,KAAK,CAAE,CAAC;aAC5B;QAEL,CAAC;KAAA;IAED,WAAW;QAEP,OAAO;QACP,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,cAAI,EAAE,CAAE,CAAC;QAEvB,mBAAmB;QACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,iBAAO,CAAC,IAAI,EAAE,CAAE,CAAC;QAE/B,kBAAkB;QAClB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,iBAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAE,CAAC;IAC7C,CAAC;IAGD,MAAM;QACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,iBAAU,CAAE,CAAA;IACtD,CAAC;IAGD,MAAM;QACF,IAAI,CAAC,GAAG,CAAC,MAAM,CAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,IAAI,CAAC,IAAI,CAAE,CAAC;QAC9D,CAAC,CAAC,CAAA;IACN,CAAC;CAEJ;AAED,kBAAe,MAAM,CAAC"} -------------------------------------------------------------------------------- /dist/models/usuario.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const sequelize_1 = require("sequelize"); 7 | const connection_1 = __importDefault(require("../db/connection")); 8 | const Usuario = connection_1.default.define('Usuario', { 9 | nombre: { 10 | type: sequelize_1.DataTypes.STRING 11 | }, 12 | email: { 13 | type: sequelize_1.DataTypes.STRING 14 | }, 15 | estado: { 16 | type: sequelize_1.DataTypes.BOOLEAN 17 | }, 18 | }); 19 | exports.default = Usuario; 20 | //# sourceMappingURL=usuario.js.map -------------------------------------------------------------------------------- /dist/models/usuario.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"usuario.js","sourceRoot":"","sources":["../../models/usuario.ts"],"names":[],"mappings":";;;;;AAAA,yCAAsC;AACtC,kEAAkC;AAElC,MAAM,OAAO,GAAG,oBAAE,CAAC,MAAM,CAAC,SAAS,EAAE;IACjC,MAAM,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACzB;IACD,KAAK,EAAE;QACH,IAAI,EAAE,qBAAS,CAAC,MAAM;KACzB;IACD,MAAM,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,OAAO;KAC1B;CACJ,CAAC,CAAC;AAGH,kBAAe,OAAO,CAAC"} -------------------------------------------------------------------------------- /dist/routes/usuario.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const express_1 = require("express"); 4 | const usuarios_1 = require("../controllers/usuarios"); 5 | const router = express_1.Router(); 6 | router.get('/', usuarios_1.getUsuarios); 7 | router.get('/:id', usuarios_1.getUsuario); 8 | router.post('/', usuarios_1.postUsuario); 9 | router.put('/:id', usuarios_1.putUsuario); 10 | router.delete('/:id', usuarios_1.deleteUsuario); 11 | exports.default = router; 12 | //# sourceMappingURL=usuario.js.map -------------------------------------------------------------------------------- /dist/routes/usuario.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"usuario.js","sourceRoot":"","sources":["../../routes/usuario.ts"],"names":[],"mappings":";;AAAA,qCAAiC;AACjC,sDAA0G;AAG1G,MAAM,MAAM,GAAG,gBAAM,EAAE,CAAC;AAGxB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAQ,sBAAW,CAAE,CAAC;AACpC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAK,qBAAU,CAAE,CAAC;AACnC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAO,sBAAW,CAAE,CAAC;AACpC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAK,qBAAU,CAAE,CAAC;AACnC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAa,CAAE,CAAC;AAItC,kBAAe,MAAM,CAAC"} -------------------------------------------------------------------------------- /models/server.ts: -------------------------------------------------------------------------------- 1 | import express, { Application } from 'express'; 2 | import userRoutes from '../routes/usuario'; 3 | import cors from 'cors'; 4 | 5 | import db from '../db/connection'; 6 | 7 | 8 | class Server { 9 | 10 | private app: Application; 11 | private port: string; 12 | private apiPaths = { 13 | usuarios: '/api/usuarios' 14 | } 15 | 16 | constructor() { 17 | this.app = express(); 18 | this.port = process.env.PORT || '8000'; 19 | 20 | // Métodos iniciales 21 | this.dbConnection(); 22 | this.middlewares(); 23 | this.routes(); 24 | } 25 | 26 | async dbConnection() { 27 | 28 | try { 29 | 30 | await db.authenticate(); 31 | console.log('Database online'); 32 | 33 | } catch (error) { 34 | throw new Error( error ); 35 | } 36 | 37 | } 38 | 39 | middlewares() { 40 | 41 | // CORS 42 | this.app.use( cors() ); 43 | 44 | // Lectura del body 45 | this.app.use( express.json() ); 46 | 47 | // Carpeta pública 48 | this.app.use( express.static('public') ); 49 | } 50 | 51 | 52 | routes() { 53 | this.app.use( this.apiPaths.usuarios, userRoutes ) 54 | } 55 | 56 | 57 | listen() { 58 | this.app.listen( this.port, () => { 59 | console.log('Servidor corriendo en puerto ' + this.port ); 60 | }) 61 | } 62 | 63 | } 64 | 65 | export default Server; -------------------------------------------------------------------------------- /models/usuario.ts: -------------------------------------------------------------------------------- 1 | import { DataTypes } from 'sequelize'; 2 | import db from '../db/connection'; 3 | 4 | const Usuario = db.define('Usuario', { 5 | nombre: { 6 | type: DataTypes.STRING 7 | }, 8 | email: { 9 | type: DataTypes.STRING 10 | }, 11 | estado: { 12 | type: DataTypes.BOOLEAN 13 | }, 14 | }); 15 | 16 | 17 | export default Usuario; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "11-ts-restserver", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.13", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", 10 | "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.12.13" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.12.11", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", 19 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.12.13", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", 25 | "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.12.11", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@types/body-parser": { 34 | "version": "1.19.0", 35 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 36 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 37 | "dev": true, 38 | "requires": { 39 | "@types/connect": "*", 40 | "@types/node": "*" 41 | } 42 | }, 43 | "@types/connect": { 44 | "version": "3.4.34", 45 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", 46 | "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", 47 | "dev": true, 48 | "requires": { 49 | "@types/node": "*" 50 | } 51 | }, 52 | "@types/cors": { 53 | "version": "2.8.10", 54 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", 55 | "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", 56 | "dev": true 57 | }, 58 | "@types/express": { 59 | "version": "4.17.11", 60 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", 61 | "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", 62 | "dev": true, 63 | "requires": { 64 | "@types/body-parser": "*", 65 | "@types/express-serve-static-core": "^4.17.18", 66 | "@types/qs": "*", 67 | "@types/serve-static": "*" 68 | } 69 | }, 70 | "@types/express-serve-static-core": { 71 | "version": "4.17.18", 72 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz", 73 | "integrity": "sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA==", 74 | "dev": true, 75 | "requires": { 76 | "@types/node": "*", 77 | "@types/qs": "*", 78 | "@types/range-parser": "*" 79 | } 80 | }, 81 | "@types/mime": { 82 | "version": "1.3.2", 83 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 84 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", 85 | "dev": true 86 | }, 87 | "@types/node": { 88 | "version": "14.14.28", 89 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", 90 | "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==" 91 | }, 92 | "@types/qs": { 93 | "version": "6.9.5", 94 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", 95 | "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", 96 | "dev": true 97 | }, 98 | "@types/range-parser": { 99 | "version": "1.2.3", 100 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 101 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 102 | "dev": true 103 | }, 104 | "@types/serve-static": { 105 | "version": "1.13.9", 106 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", 107 | "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", 108 | "dev": true, 109 | "requires": { 110 | "@types/mime": "^1", 111 | "@types/node": "*" 112 | } 113 | }, 114 | "accepts": { 115 | "version": "1.3.7", 116 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 117 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 118 | "requires": { 119 | "mime-types": "~2.1.24", 120 | "negotiator": "0.6.2" 121 | } 122 | }, 123 | "ansi-styles": { 124 | "version": "3.2.1", 125 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 126 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 127 | "dev": true, 128 | "requires": { 129 | "color-convert": "^1.9.0" 130 | } 131 | }, 132 | "any-promise": { 133 | "version": "1.3.0", 134 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 135 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 136 | }, 137 | "argparse": { 138 | "version": "1.0.10", 139 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 140 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 141 | "dev": true, 142 | "requires": { 143 | "sprintf-js": "~1.0.2" 144 | } 145 | }, 146 | "array-flatten": { 147 | "version": "1.1.1", 148 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 149 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 150 | }, 151 | "balanced-match": { 152 | "version": "1.0.0", 153 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 154 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 155 | "dev": true 156 | }, 157 | "body-parser": { 158 | "version": "1.19.0", 159 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 160 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 161 | "requires": { 162 | "bytes": "3.1.0", 163 | "content-type": "~1.0.4", 164 | "debug": "2.6.9", 165 | "depd": "~1.1.2", 166 | "http-errors": "1.7.2", 167 | "iconv-lite": "0.4.24", 168 | "on-finished": "~2.3.0", 169 | "qs": "6.7.0", 170 | "raw-body": "2.4.0", 171 | "type-is": "~1.6.17" 172 | } 173 | }, 174 | "brace-expansion": { 175 | "version": "1.1.11", 176 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 177 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 178 | "dev": true, 179 | "requires": { 180 | "balanced-match": "^1.0.0", 181 | "concat-map": "0.0.1" 182 | } 183 | }, 184 | "builtin-modules": { 185 | "version": "1.1.1", 186 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 187 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 188 | "dev": true 189 | }, 190 | "bytes": { 191 | "version": "3.1.0", 192 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 193 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 194 | }, 195 | "chalk": { 196 | "version": "2.4.2", 197 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 198 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 199 | "dev": true, 200 | "requires": { 201 | "ansi-styles": "^3.2.1", 202 | "escape-string-regexp": "^1.0.5", 203 | "supports-color": "^5.3.0" 204 | } 205 | }, 206 | "color-convert": { 207 | "version": "1.9.3", 208 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 209 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 210 | "dev": true, 211 | "requires": { 212 | "color-name": "1.1.3" 213 | } 214 | }, 215 | "color-name": { 216 | "version": "1.1.3", 217 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 218 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 219 | "dev": true 220 | }, 221 | "commander": { 222 | "version": "2.20.3", 223 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 224 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 225 | "dev": true 226 | }, 227 | "concat-map": { 228 | "version": "0.0.1", 229 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 230 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 231 | "dev": true 232 | }, 233 | "content-disposition": { 234 | "version": "0.5.3", 235 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 236 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 237 | "requires": { 238 | "safe-buffer": "5.1.2" 239 | } 240 | }, 241 | "content-type": { 242 | "version": "1.0.4", 243 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 244 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 245 | }, 246 | "cookie": { 247 | "version": "0.4.0", 248 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 249 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 250 | }, 251 | "cookie-signature": { 252 | "version": "1.0.6", 253 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 254 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 255 | }, 256 | "cors": { 257 | "version": "2.8.5", 258 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 259 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 260 | "requires": { 261 | "object-assign": "^4", 262 | "vary": "^1" 263 | } 264 | }, 265 | "debug": { 266 | "version": "2.6.9", 267 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 268 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 269 | "requires": { 270 | "ms": "2.0.0" 271 | } 272 | }, 273 | "denque": { 274 | "version": "1.5.0", 275 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", 276 | "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" 277 | }, 278 | "depd": { 279 | "version": "1.1.2", 280 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 281 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 282 | }, 283 | "destroy": { 284 | "version": "1.0.4", 285 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 286 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 287 | }, 288 | "diff": { 289 | "version": "4.0.2", 290 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 291 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 292 | "dev": true 293 | }, 294 | "dotenv": { 295 | "version": "8.2.0", 296 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 297 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 298 | }, 299 | "dottie": { 300 | "version": "2.0.2", 301 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", 302 | "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" 303 | }, 304 | "ee-first": { 305 | "version": "1.1.1", 306 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 307 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 308 | }, 309 | "encodeurl": { 310 | "version": "1.0.2", 311 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 312 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 313 | }, 314 | "escape-html": { 315 | "version": "1.0.3", 316 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 317 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 318 | }, 319 | "escape-string-regexp": { 320 | "version": "1.0.5", 321 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 322 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 323 | "dev": true 324 | }, 325 | "esprima": { 326 | "version": "4.0.1", 327 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 328 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 329 | "dev": true 330 | }, 331 | "etag": { 332 | "version": "1.8.1", 333 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 334 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 335 | }, 336 | "express": { 337 | "version": "4.17.1", 338 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 339 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 340 | "requires": { 341 | "accepts": "~1.3.7", 342 | "array-flatten": "1.1.1", 343 | "body-parser": "1.19.0", 344 | "content-disposition": "0.5.3", 345 | "content-type": "~1.0.4", 346 | "cookie": "0.4.0", 347 | "cookie-signature": "1.0.6", 348 | "debug": "2.6.9", 349 | "depd": "~1.1.2", 350 | "encodeurl": "~1.0.2", 351 | "escape-html": "~1.0.3", 352 | "etag": "~1.8.1", 353 | "finalhandler": "~1.1.2", 354 | "fresh": "0.5.2", 355 | "merge-descriptors": "1.0.1", 356 | "methods": "~1.1.2", 357 | "on-finished": "~2.3.0", 358 | "parseurl": "~1.3.3", 359 | "path-to-regexp": "0.1.7", 360 | "proxy-addr": "~2.0.5", 361 | "qs": "6.7.0", 362 | "range-parser": "~1.2.1", 363 | "safe-buffer": "5.1.2", 364 | "send": "0.17.1", 365 | "serve-static": "1.14.1", 366 | "setprototypeof": "1.1.1", 367 | "statuses": "~1.5.0", 368 | "type-is": "~1.6.18", 369 | "utils-merge": "1.0.1", 370 | "vary": "~1.1.2" 371 | } 372 | }, 373 | "finalhandler": { 374 | "version": "1.1.2", 375 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 376 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 377 | "requires": { 378 | "debug": "2.6.9", 379 | "encodeurl": "~1.0.2", 380 | "escape-html": "~1.0.3", 381 | "on-finished": "~2.3.0", 382 | "parseurl": "~1.3.3", 383 | "statuses": "~1.5.0", 384 | "unpipe": "~1.0.0" 385 | } 386 | }, 387 | "forwarded": { 388 | "version": "0.1.2", 389 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 390 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 391 | }, 392 | "fresh": { 393 | "version": "0.5.2", 394 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 395 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 396 | }, 397 | "fs.realpath": { 398 | "version": "1.0.0", 399 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 400 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 401 | "dev": true 402 | }, 403 | "function-bind": { 404 | "version": "1.1.1", 405 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 406 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 407 | "dev": true 408 | }, 409 | "generate-function": { 410 | "version": "2.3.1", 411 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 412 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 413 | "requires": { 414 | "is-property": "^1.0.2" 415 | } 416 | }, 417 | "glob": { 418 | "version": "7.1.6", 419 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 420 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 421 | "dev": true, 422 | "requires": { 423 | "fs.realpath": "^1.0.0", 424 | "inflight": "^1.0.4", 425 | "inherits": "2", 426 | "minimatch": "^3.0.4", 427 | "once": "^1.3.0", 428 | "path-is-absolute": "^1.0.0" 429 | } 430 | }, 431 | "has": { 432 | "version": "1.0.3", 433 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 434 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 435 | "dev": true, 436 | "requires": { 437 | "function-bind": "^1.1.1" 438 | } 439 | }, 440 | "has-flag": { 441 | "version": "3.0.0", 442 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 443 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 444 | "dev": true 445 | }, 446 | "http-errors": { 447 | "version": "1.7.2", 448 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 449 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 450 | "requires": { 451 | "depd": "~1.1.2", 452 | "inherits": "2.0.3", 453 | "setprototypeof": "1.1.1", 454 | "statuses": ">= 1.5.0 < 2", 455 | "toidentifier": "1.0.0" 456 | }, 457 | "dependencies": { 458 | "inherits": { 459 | "version": "2.0.3", 460 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 461 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 462 | } 463 | } 464 | }, 465 | "iconv-lite": { 466 | "version": "0.4.24", 467 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 468 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 469 | "requires": { 470 | "safer-buffer": ">= 2.1.2 < 3" 471 | } 472 | }, 473 | "inflection": { 474 | "version": "1.12.0", 475 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", 476 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" 477 | }, 478 | "inflight": { 479 | "version": "1.0.6", 480 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 481 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 482 | "dev": true, 483 | "requires": { 484 | "once": "^1.3.0", 485 | "wrappy": "1" 486 | } 487 | }, 488 | "inherits": { 489 | "version": "2.0.4", 490 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 491 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 492 | "dev": true 493 | }, 494 | "ipaddr.js": { 495 | "version": "1.9.1", 496 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 497 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 498 | }, 499 | "is-core-module": { 500 | "version": "2.2.0", 501 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 502 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 503 | "dev": true, 504 | "requires": { 505 | "has": "^1.0.3" 506 | } 507 | }, 508 | "is-property": { 509 | "version": "1.0.2", 510 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 511 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 512 | }, 513 | "js-tokens": { 514 | "version": "4.0.0", 515 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 516 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 517 | "dev": true 518 | }, 519 | "js-yaml": { 520 | "version": "3.14.1", 521 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 522 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 523 | "dev": true, 524 | "requires": { 525 | "argparse": "^1.0.7", 526 | "esprima": "^4.0.0" 527 | } 528 | }, 529 | "lodash": { 530 | "version": "4.17.20", 531 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 532 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 533 | }, 534 | "long": { 535 | "version": "4.0.0", 536 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 537 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 538 | }, 539 | "lru-cache": { 540 | "version": "6.0.0", 541 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 542 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 543 | "requires": { 544 | "yallist": "^4.0.0" 545 | } 546 | }, 547 | "media-typer": { 548 | "version": "0.3.0", 549 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 550 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 551 | }, 552 | "merge-descriptors": { 553 | "version": "1.0.1", 554 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 555 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 556 | }, 557 | "methods": { 558 | "version": "1.1.2", 559 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 560 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 561 | }, 562 | "mime": { 563 | "version": "1.6.0", 564 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 565 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 566 | }, 567 | "mime-db": { 568 | "version": "1.45.0", 569 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", 570 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" 571 | }, 572 | "mime-types": { 573 | "version": "2.1.28", 574 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", 575 | "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", 576 | "requires": { 577 | "mime-db": "1.45.0" 578 | } 579 | }, 580 | "minimatch": { 581 | "version": "3.0.4", 582 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 583 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 584 | "dev": true, 585 | "requires": { 586 | "brace-expansion": "^1.1.7" 587 | } 588 | }, 589 | "minimist": { 590 | "version": "1.2.5", 591 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 592 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 593 | "dev": true 594 | }, 595 | "mkdirp": { 596 | "version": "0.5.5", 597 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 598 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 599 | "dev": true, 600 | "requires": { 601 | "minimist": "^1.2.5" 602 | } 603 | }, 604 | "moment": { 605 | "version": "2.29.1", 606 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", 607 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" 608 | }, 609 | "moment-timezone": { 610 | "version": "0.5.33", 611 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", 612 | "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", 613 | "requires": { 614 | "moment": ">= 2.9.0" 615 | } 616 | }, 617 | "ms": { 618 | "version": "2.0.0", 619 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 620 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 621 | }, 622 | "mysql2": { 623 | "version": "2.2.5", 624 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", 625 | "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", 626 | "requires": { 627 | "denque": "^1.4.1", 628 | "generate-function": "^2.3.1", 629 | "iconv-lite": "^0.6.2", 630 | "long": "^4.0.0", 631 | "lru-cache": "^6.0.0", 632 | "named-placeholders": "^1.1.2", 633 | "seq-queue": "^0.0.5", 634 | "sqlstring": "^2.3.2" 635 | }, 636 | "dependencies": { 637 | "iconv-lite": { 638 | "version": "0.6.2", 639 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 640 | "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 641 | "requires": { 642 | "safer-buffer": ">= 2.1.2 < 3.0.0" 643 | } 644 | } 645 | } 646 | }, 647 | "named-placeholders": { 648 | "version": "1.1.2", 649 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", 650 | "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", 651 | "requires": { 652 | "lru-cache": "^4.1.3" 653 | }, 654 | "dependencies": { 655 | "lru-cache": { 656 | "version": "4.1.5", 657 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 658 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 659 | "requires": { 660 | "pseudomap": "^1.0.2", 661 | "yallist": "^2.1.2" 662 | } 663 | }, 664 | "yallist": { 665 | "version": "2.1.2", 666 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 667 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 668 | } 669 | } 670 | }, 671 | "negotiator": { 672 | "version": "0.6.2", 673 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 674 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 675 | }, 676 | "object-assign": { 677 | "version": "4.1.1", 678 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 679 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 680 | }, 681 | "on-finished": { 682 | "version": "2.3.0", 683 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 684 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 685 | "requires": { 686 | "ee-first": "1.1.1" 687 | } 688 | }, 689 | "once": { 690 | "version": "1.4.0", 691 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 692 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 693 | "dev": true, 694 | "requires": { 695 | "wrappy": "1" 696 | } 697 | }, 698 | "parseurl": { 699 | "version": "1.3.3", 700 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 701 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 702 | }, 703 | "path-is-absolute": { 704 | "version": "1.0.1", 705 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 706 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 707 | "dev": true 708 | }, 709 | "path-parse": { 710 | "version": "1.0.6", 711 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 712 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 713 | "dev": true 714 | }, 715 | "path-to-regexp": { 716 | "version": "0.1.7", 717 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 718 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 719 | }, 720 | "proxy-addr": { 721 | "version": "2.0.6", 722 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 723 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 724 | "requires": { 725 | "forwarded": "~0.1.2", 726 | "ipaddr.js": "1.9.1" 727 | } 728 | }, 729 | "pseudomap": { 730 | "version": "1.0.2", 731 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 732 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 733 | }, 734 | "qs": { 735 | "version": "6.7.0", 736 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 737 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 738 | }, 739 | "range-parser": { 740 | "version": "1.2.1", 741 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 742 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 743 | }, 744 | "raw-body": { 745 | "version": "2.4.0", 746 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 747 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 748 | "requires": { 749 | "bytes": "3.1.0", 750 | "http-errors": "1.7.2", 751 | "iconv-lite": "0.4.24", 752 | "unpipe": "1.0.0" 753 | } 754 | }, 755 | "resolve": { 756 | "version": "1.20.0", 757 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 758 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 759 | "dev": true, 760 | "requires": { 761 | "is-core-module": "^2.2.0", 762 | "path-parse": "^1.0.6" 763 | } 764 | }, 765 | "retry-as-promised": { 766 | "version": "3.2.0", 767 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", 768 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", 769 | "requires": { 770 | "any-promise": "^1.3.0" 771 | } 772 | }, 773 | "safe-buffer": { 774 | "version": "5.1.2", 775 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 776 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 777 | }, 778 | "safer-buffer": { 779 | "version": "2.1.2", 780 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 781 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 782 | }, 783 | "semver": { 784 | "version": "5.7.1", 785 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 786 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 787 | "dev": true 788 | }, 789 | "send": { 790 | "version": "0.17.1", 791 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 792 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 793 | "requires": { 794 | "debug": "2.6.9", 795 | "depd": "~1.1.2", 796 | "destroy": "~1.0.4", 797 | "encodeurl": "~1.0.2", 798 | "escape-html": "~1.0.3", 799 | "etag": "~1.8.1", 800 | "fresh": "0.5.2", 801 | "http-errors": "~1.7.2", 802 | "mime": "1.6.0", 803 | "ms": "2.1.1", 804 | "on-finished": "~2.3.0", 805 | "range-parser": "~1.2.1", 806 | "statuses": "~1.5.0" 807 | }, 808 | "dependencies": { 809 | "ms": { 810 | "version": "2.1.1", 811 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 812 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 813 | } 814 | } 815 | }, 816 | "seq-queue": { 817 | "version": "0.0.5", 818 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 819 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" 820 | }, 821 | "sequelize": { 822 | "version": "6.5.0", 823 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.5.0.tgz", 824 | "integrity": "sha512-owBt8fnzVy8E1OvyCyfCdVk7OOLyPVrBCMEf+CvRReC5oCyo+UqeXCtwaex9L6LM9ifZ1i3TG3sFeM5MgLK0CQ==", 825 | "requires": { 826 | "debug": "^4.1.1", 827 | "dottie": "^2.0.0", 828 | "inflection": "1.12.0", 829 | "lodash": "^4.17.20", 830 | "moment": "^2.26.0", 831 | "moment-timezone": "^0.5.31", 832 | "retry-as-promised": "^3.2.0", 833 | "semver": "^7.3.2", 834 | "sequelize-pool": "^6.0.0", 835 | "toposort-class": "^1.0.1", 836 | "uuid": "^8.1.0", 837 | "validator": "^10.11.0", 838 | "wkx": "^0.5.0" 839 | }, 840 | "dependencies": { 841 | "debug": { 842 | "version": "4.3.1", 843 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 844 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 845 | "requires": { 846 | "ms": "2.1.2" 847 | } 848 | }, 849 | "ms": { 850 | "version": "2.1.2", 851 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 852 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 853 | }, 854 | "semver": { 855 | "version": "7.3.4", 856 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 857 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 858 | "requires": { 859 | "lru-cache": "^6.0.0" 860 | } 861 | } 862 | } 863 | }, 864 | "sequelize-pool": { 865 | "version": "6.1.0", 866 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", 867 | "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" 868 | }, 869 | "serve-static": { 870 | "version": "1.14.1", 871 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 872 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 873 | "requires": { 874 | "encodeurl": "~1.0.2", 875 | "escape-html": "~1.0.3", 876 | "parseurl": "~1.3.3", 877 | "send": "0.17.1" 878 | } 879 | }, 880 | "setprototypeof": { 881 | "version": "1.1.1", 882 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 883 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 884 | }, 885 | "sprintf-js": { 886 | "version": "1.0.3", 887 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 888 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 889 | "dev": true 890 | }, 891 | "sqlstring": { 892 | "version": "2.3.2", 893 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", 894 | "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" 895 | }, 896 | "statuses": { 897 | "version": "1.5.0", 898 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 899 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 900 | }, 901 | "supports-color": { 902 | "version": "5.5.0", 903 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 904 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 905 | "dev": true, 906 | "requires": { 907 | "has-flag": "^3.0.0" 908 | } 909 | }, 910 | "toidentifier": { 911 | "version": "1.0.0", 912 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 913 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 914 | }, 915 | "toposort-class": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 918 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" 919 | }, 920 | "tslib": { 921 | "version": "1.14.1", 922 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 923 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 924 | "dev": true 925 | }, 926 | "tslint": { 927 | "version": "6.1.3", 928 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", 929 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", 930 | "dev": true, 931 | "requires": { 932 | "@babel/code-frame": "^7.0.0", 933 | "builtin-modules": "^1.1.1", 934 | "chalk": "^2.3.0", 935 | "commander": "^2.12.1", 936 | "diff": "^4.0.1", 937 | "glob": "^7.1.1", 938 | "js-yaml": "^3.13.1", 939 | "minimatch": "^3.0.4", 940 | "mkdirp": "^0.5.3", 941 | "resolve": "^1.3.2", 942 | "semver": "^5.3.0", 943 | "tslib": "^1.13.0", 944 | "tsutils": "^2.29.0" 945 | } 946 | }, 947 | "tsutils": { 948 | "version": "2.29.0", 949 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 950 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 951 | "dev": true, 952 | "requires": { 953 | "tslib": "^1.8.1" 954 | } 955 | }, 956 | "type-is": { 957 | "version": "1.6.18", 958 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 959 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 960 | "requires": { 961 | "media-typer": "0.3.0", 962 | "mime-types": "~2.1.24" 963 | } 964 | }, 965 | "typescript": { 966 | "version": "4.1.5", 967 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", 968 | "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", 969 | "dev": true 970 | }, 971 | "unpipe": { 972 | "version": "1.0.0", 973 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 974 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 975 | }, 976 | "utils-merge": { 977 | "version": "1.0.1", 978 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 979 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 980 | }, 981 | "uuid": { 982 | "version": "8.3.2", 983 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 984 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 985 | }, 986 | "validator": { 987 | "version": "10.11.0", 988 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", 989 | "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" 990 | }, 991 | "vary": { 992 | "version": "1.1.2", 993 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 994 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 995 | }, 996 | "wkx": { 997 | "version": "0.5.0", 998 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", 999 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", 1000 | "requires": { 1001 | "@types/node": "*" 1002 | } 1003 | }, 1004 | "wrappy": { 1005 | "version": "1.0.2", 1006 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1007 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1008 | "dev": true 1009 | }, 1010 | "yallist": { 1011 | "version": "4.0.0", 1012 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1013 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1014 | } 1015 | } 1016 | } 1017 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "11-ts-restserver", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/cors": "^2.8.10", 14 | "@types/express": "^4.17.11", 15 | "tslint": "^6.1.3", 16 | "typescript": "^4.1.5" 17 | }, 18 | "dependencies": { 19 | "cors": "^2.8.5", 20 | "dotenv": "^8.2.0", 21 | "express": "^4.17.1", 22 | "mysql2": "^2.2.5", 23 | "sequelize": "^6.5.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Acceso Denegado 8 | 9 | 10 |

Acceso denegado

11 | 12 | 13 | -------------------------------------------------------------------------------- /routes/usuario.ts: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import { getUsuario, getUsuarios, postUsuario, putUsuario, deleteUsuario } from '../controllers/usuarios'; 3 | 4 | 5 | const router = Router(); 6 | 7 | 8 | router.get('/', getUsuarios ); 9 | router.get('/:id', getUsuario ); 10 | router.post('/', postUsuario ); 11 | router.put('/:id', putUsuario ); 12 | router.delete('/:id', deleteUsuario ); 13 | 14 | 15 | 16 | export default router; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./dist", /* Redirect output structure to the directory. */ 18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true, /* Enable all strict type-checking options. */ 29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 43 | 44 | /* Module Resolution Options */ 45 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 49 | // "typeRoots": [], /* List of folders to include type definitions from. */ 50 | // "types": [], /* Type declaration files to be included in compilation. */ 51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 55 | 56 | /* Source Map Options */ 57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 61 | 62 | /* Experimental Options */ 63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 65 | 66 | /* Advanced Options */ 67 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 68 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "no-console": false 9 | }, 10 | "rulesDirectory": [] 11 | } --------------------------------------------------------------------------------