├── src ├── routes │ ├── auth.routes.js │ ├── user.routes.js │ ├── role.routes.js │ ├── order.routes.js │ ├── client.routes.js │ ├── product.routes.js │ └── category.routes.js ├── index.js ├── config │ ├── config.js │ └── database.js ├── models │ ├── Role.js │ ├── Category.js │ ├── Client.js │ ├── Order.js │ ├── User.js │ └── Product.js ├── middlewares │ ├── cors.js │ └── authentication.js ├── app.js └── controllers │ ├── auth │ └── auth.controller.js │ ├── role.controller.js │ ├── client.controller.js │ ├── category.controller.js │ ├── product.controller.js │ ├── user.controller.js │ └── order.controller.js ├── package.json ├── .gitignore ├── README.md └── yarn.lock /src/routes/auth.routes.js: -------------------------------------------------------------------------------- 1 | const router = require('express').Router() 2 | 3 | const authCTRL = require('../controllers/auth/auth.controller') 4 | 5 | router.post('/login', authCTRL.login) 6 | 7 | module.exports=router 8 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const config = require('./config/config') 2 | require('./config/database') 3 | 4 | const app = require('./app') 5 | 6 | app.listen(config.PORT, ()=>{ 7 | console.log(`Server running in port: ${config.PORT}`) 8 | }) 9 | 10 | -------------------------------------------------------------------------------- /src/config/config.js: -------------------------------------------------------------------------------- 1 | module.exports={ 2 | PORT: process.env.PORT || 3000, 3 | MONGODB: process.env.MONGODB || 'mongodb://127.0.0.1:27017/restapinodedb', 4 | SECRET_KEY: process.env.SECRET_KEY || 'GEW.w3VFb5sH$9OTIDfSwFqIJmOujgQOJMofpjJqCWc9JVrzZiHEy1z8pGEu84d' 5 | } -------------------------------------------------------------------------------- /src/config/database.js: -------------------------------------------------------------------------------- 1 | const config = require('./config') 2 | const mongoose = require('mongoose') 3 | 4 | mongoose.connect(config.MONGODB, { 5 | useNewUrlParser: true, 6 | useUnifiedTopology: true, 7 | useCreateIndex: true 8 | }, (err)=>{ 9 | if (err) { 10 | console.log(err) 11 | } 12 | console.log('DB is connect!') 13 | }) -------------------------------------------------------------------------------- /src/models/Role.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | 3 | const Schema = mongoose.Schema 4 | 5 | const RoleSchema = new Schema({ 6 | name: { 7 | type: String, 8 | required: true, 9 | unique: true 10 | }, 11 | status: { 12 | type: Boolean, 13 | default: true 14 | }, 15 | created_at: { 16 | type: Date, 17 | default: Date.now 18 | } 19 | }) 20 | 21 | module.exports=mongoose.model('Role', RoleSchema) -------------------------------------------------------------------------------- /src/middlewares/cors.js: -------------------------------------------------------------------------------- 1 | const Cors = (req, res, next) => { 2 | res.header("Access-Control-Allow-Origin", "*"); 3 | res.header( 4 | "Access-Control-Allow-Headers", 5 | "Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method" 6 | ); 7 | res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 8 | next(); 9 | }; 10 | 11 | module.exports = { 12 | Cors, 13 | }; 14 | -------------------------------------------------------------------------------- /src/routes/user.routes.js: -------------------------------------------------------------------------------- 1 | const router = require('express').Router() 2 | 3 | const userCTRL = require('../controllers/user.controller') 4 | 5 | const { isAuth } = require('../middlewares/authentication') 6 | 7 | router.get('/', userCTRL.getUsers) 8 | router.get('/:userId', userCTRL.getUser) 9 | router.post('/', isAuth, userCTRL.createUser) 10 | router.put('/:userId', isAuth, userCTRL.updateUser) 11 | router.delete('/:userId', isAuth, userCTRL.deleteUser) 12 | 13 | module.exports=router 14 | 15 | -------------------------------------------------------------------------------- /src/routes/role.routes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const roleCTRL = require("../controllers/role.controller"); 4 | 5 | const { isAuth } = require("../middlewares/authentication"); 6 | 7 | router.get("/", roleCTRL.getRoles); 8 | router.get("/:roleId", roleCTRL.getRole); 9 | router.post("/", isAuth, roleCTRL.createRole); 10 | router.put("/:roleId", isAuth, roleCTRL.updateRole); 11 | router.delete("/:roleId", isAuth, roleCTRL.deleteRole); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/routes/order.routes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const orderCTRL = require("../controllers/order.controller"); 4 | 5 | const { isAuth } = require("../middlewares/authentication"); 6 | 7 | router.get("/", orderCTRL.getOrders); 8 | router.get("/:orderId", orderCTRL.getOrder); 9 | router.post("/", isAuth, orderCTRL.createOrder); 10 | //router.put("/:orderId", isAuth, orderCTRL.updateOrder); 11 | router.delete("/:orderId", isAuth, orderCTRL.deleteOrder); 12 | 13 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/client.routes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const clientCTRL = require("../controllers/client.controller"); 4 | 5 | const { isAuth } = require("../middlewares/authentication"); 6 | 7 | router.get("/", clientCTRL.getClients); 8 | router.get("/:clientId", clientCTRL.getClient); 9 | router.post("/", isAuth, clientCTRL.createClient); 10 | router.put("/:clientId", isAuth, clientCTRL.updateClient); 11 | router.delete("/:clientId", isAuth, clientCTRL.deleteClient); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/middlewares/authentication.js: -------------------------------------------------------------------------------- 1 | const config = require("../config/config"); 2 | const jwt = require("jsonwebtoken"); 3 | 4 | const isAuth = (req, res, next) => { 5 | let token = req.get("Authorization"); 6 | 7 | jwt.verify(token, config.SECRET_KEY, (err, user) => { 8 | if (err) { 9 | return res.status(500).json({ 10 | ok: false, 11 | msg: "Token invalid!", 12 | }); 13 | } 14 | 15 | req.user = user.data; 16 | 17 | next(); 18 | }); 19 | }; 20 | 21 | module.exports = { 22 | isAuth, 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/product.routes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const productCTRL = require("../controllers/product.controller"); 4 | 5 | const { isAuth } = require("../middlewares/authentication"); 6 | 7 | router.get("/", productCTRL.getProducts); 8 | router.get("/:productId", productCTRL.getProduct); 9 | router.post("/", isAuth, productCTRL.createProduct); 10 | router.put("/:productId", isAuth, productCTRL.updateProduct); 11 | router.delete("/:productId", isAuth, productCTRL.deleteProduct); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/models/Category.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Schema = mongoose.Schema; 4 | 5 | const CategorySchema = new Schema({ 6 | name: { 7 | type: String, 8 | required: true, 9 | unique: true, 10 | }, 11 | description: { 12 | type: String, 13 | required: false, 14 | }, 15 | status: { 16 | type: Boolean, 17 | default: true, 18 | }, 19 | created_at: { 20 | type: Date, 21 | default: Date.now, 22 | }, 23 | }); 24 | 25 | module.exports = mongoose.model("Category", CategorySchema); 26 | -------------------------------------------------------------------------------- /src/routes/category.routes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | 3 | const categoryCTRL = require("../controllers/category.controller"); 4 | 5 | const { isAuth } = require("../middlewares/authentication"); 6 | 7 | router.get("/", categoryCTRL.getCategories); 8 | router.get("/:categoryId", categoryCTRL.getCategory); 9 | router.post("/", isAuth, categoryCTRL.createCategory); 10 | router.put("/:categoryId", isAuth, categoryCTRL.updateCategory); 11 | router.delete("/:categoryId", isAuth, categoryCTRL.deleteCategory); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/models/Client.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Schema = mongoose.Schema; 4 | 5 | const ClientSchema = new Schema({ 6 | displayName: { 7 | type: String, 8 | required: true, 9 | }, 10 | address: { 11 | type: String, 12 | required: false, 13 | }, 14 | phone: { 15 | type: String, 16 | required: true, 17 | }, 18 | email: { 19 | type: String, 20 | required: true, 21 | unique: true, 22 | }, 23 | status: { 24 | type: Boolean, 25 | default: true, 26 | }, 27 | created_at: { 28 | type: Date, 29 | default: Date.now, 30 | }, 31 | }); 32 | 33 | module.exports = mongoose.model("Client", ClientSchema); 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rest-api-node", 3 | "version": "1.0.0", 4 | "description": "Software of Development with Nodejs,Express and MongoDB", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "nodemon src/index.js", 8 | "start": "node src/index.js" 9 | }, 10 | "keywords": [ 11 | "Nodejs", 12 | "Express", 13 | "JWT", 14 | "MongoDB" 15 | ], 16 | "author": "Daniel Alejo Alvarez", 17 | "license": "MIT", 18 | "dependencies": { 19 | "bcrypt": "^5.0.0", 20 | "express": "^4.17.1", 21 | "jsonwebtoken": "^8.5.1", 22 | "mongoose": "^5.10.9", 23 | "morgan": "^1.10.0" 24 | }, 25 | "devDependencies": { 26 | "nodemon": "^2.0.4" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/models/Order.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Schema = mongoose.Schema; 4 | 5 | const OrderSchema = new Schema({ 6 | client: { 7 | type: Schema.Types.ObjectId, 8 | ref: "Client", 9 | }, 10 | orderItems: [ 11 | { 12 | product: { 13 | type: Schema.Types.ObjectId, 14 | ref: "Product", 15 | }, 16 | qty: Number, 17 | }, 18 | ], 19 | serial: { 20 | type: String, 21 | required: true 22 | }, 23 | total: { 24 | type: Number, 25 | required: true, 26 | }, 27 | created_at: { 28 | type: Date, 29 | default: Date.now, 30 | }, 31 | }); 32 | 33 | module.exports = mongoose.model("Order", OrderSchema); 34 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const morgan = require('morgan') 3 | const app = express() 4 | const { Cors } = require('./middlewares/cors') 5 | 6 | app.use(Cors); 7 | 8 | app.use(express.json()) 9 | app.use(express.urlencoded({extended: false})) 10 | app.use(morgan('dev')) 11 | 12 | app.use('/api/v1/orders', require('./routes/order.routes')) 13 | app.use('/api/v1/clients', require('./routes/client.routes')) 14 | app.use('/api/v1/products', require('./routes/product.routes')) 15 | app.use('/api/v1/categories', require('./routes/category.routes')) 16 | app.use('/api/v1/users', require('./routes/user.routes')) 17 | app.use('/api/v1/roles', require('./routes/role.routes')) 18 | app.use('/api/v1/auth', require('./routes/auth.routes')) 19 | 20 | app.get('/', (req,res)=>{ 21 | res.json({msg: 'Welcome to my API'}) 22 | }) 23 | 24 | module.exports=app -------------------------------------------------------------------------------- /src/models/User.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Schema = mongoose.Schema; 4 | 5 | const UserSchema = new Schema({ 6 | displayName: { 7 | type: String, 8 | required: true, 9 | }, 10 | email: { 11 | type: String, 12 | required: true, 13 | unique: true, 14 | }, 15 | username: { 16 | type: String, 17 | required: true, 18 | unique: true, 19 | }, 20 | password: { 21 | type: String, 22 | required: true, 23 | }, 24 | avatar: { 25 | type: String, 26 | maxlength: 512, 27 | }, 28 | role: { 29 | type: Schema.Types.ObjectId, 30 | ref: 'Role', 31 | }, 32 | status: { 33 | type: Boolean, 34 | default: true, 35 | }, 36 | created_at: { 37 | type: Date, 38 | default: Date.now, 39 | }, 40 | }); 41 | 42 | module.exports = mongoose.model("User", UserSchema); 43 | -------------------------------------------------------------------------------- /src/models/Product.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Schema = mongoose.Schema; 4 | 5 | const ProductSchema = new Schema({ 6 | code: { 7 | type: String, 8 | unique: true, 9 | required: true, 10 | }, 11 | name: { 12 | type: String, 13 | required: true, 14 | }, 15 | excerpt: { 16 | type: String, 17 | required: true, 18 | }, 19 | description: { 20 | type: String, 21 | required: false, 22 | }, 23 | category: { 24 | type: Schema.Types.ObjectId, 25 | ref: "Category", 26 | }, 27 | price: Number, 28 | stock: Number, 29 | image: { 30 | type: String, 31 | maxlength: 512, 32 | }, 33 | status: { 34 | type: Boolean, 35 | default: true, 36 | }, 37 | created_at: { 38 | type: Date, 39 | default: Date.now, 40 | }, 41 | }); 42 | 43 | module.exports = mongoose.model("Product", ProductSchema); 44 | -------------------------------------------------------------------------------- /src/controllers/auth/auth.controller.js: -------------------------------------------------------------------------------- 1 | const config = require("../../config/config"); 2 | const User = require("../../models/User"); 3 | 4 | const CTRL = {}; 5 | 6 | const bcrypt = require("bcrypt"); 7 | const jwt = require("jsonwebtoken"); 8 | 9 | CTRL.login = (req, res) => { 10 | User.findOne({ username: req.body.username }, (err, user) => { 11 | if (err) { 12 | return res.status(500).json({ 13 | ok: false, 14 | err, 15 | }); 16 | } 17 | 18 | if (!user) { 19 | return res.status(404).json({ 20 | ok: false, 21 | msg: "Username/Password invalid!", 22 | }); 23 | } 24 | 25 | if (!bcrypt.compareSync(req.body.password, user.password)) { 26 | return res.status(404).json({ 27 | ok: false, 28 | msg: "Username/Password invalid!", 29 | }); 30 | } 31 | 32 | let token = jwt.sign({ data: user }, config.SECRET_KEY, { 33 | expiresIn: "2h", 34 | }); 35 | 36 | return res.status(201).json({ 37 | ok: true, 38 | user, 39 | token, 40 | }); 41 | }); 42 | }; 43 | 44 | module.exports = CTRL; 45 | -------------------------------------------------------------------------------- /src/controllers/role.controller.js: -------------------------------------------------------------------------------- 1 | const Role = require("../models/Role"); 2 | 3 | const CTRL = {}; 4 | 5 | CTRL.getRoles = (req, res) => { 6 | Role.find({}).exec((err, roles) => { 7 | if (err) { 8 | return res.status(500).json({ 9 | ok: false, 10 | err 11 | }) 12 | } 13 | res.json({ 14 | ok: true, 15 | roles, 16 | }); 17 | }); 18 | }; 19 | 20 | CTRL.getRole = (req, res) => { 21 | const { roleId } = req.params; 22 | Role.findById(roleId).exec((err, role) => { 23 | if (err) { 24 | return res.status(500).json({ 25 | ok: false, 26 | err 27 | }) 28 | } 29 | res.json({ 30 | ok: true, 31 | role, 32 | }); 33 | }); 34 | }; 35 | 36 | CTRL.createRole = (req, res) => { 37 | const newRole = new Role({ 38 | name: req.body.name, 39 | status: req.body.status 40 | }); 41 | 42 | newRole.save((err, role) => { 43 | if (err) { 44 | return res.status(500).json({ 45 | ok: false, 46 | err, 47 | }); 48 | } 49 | 50 | return res.status(201).json({ 51 | ok: true, 52 | role, 53 | }); 54 | }); 55 | }; 56 | 57 | CTRL.updateRole = (req, res) => { 58 | const { roleId } = req.params 59 | 60 | Role.findByIdAndUpdate( 61 | roleId, 62 | req.body, 63 | { new: true }, 64 | (err, role) => { 65 | if (err) { 66 | return res.status(500).json({ 67 | ok: false, 68 | err, 69 | }); 70 | } 71 | 72 | return res.status(201).json({ 73 | ok: true, 74 | role, 75 | }); 76 | } 77 | ); 78 | }; 79 | 80 | CTRL.deleteRole = (req, res) => { 81 | const { roleId } = req.params; 82 | Role.findByIdAndRemove(roleId, (err, role) => { 83 | if (err) { 84 | return res.status(500).json({ 85 | ok: false, 86 | err, 87 | }); 88 | } 89 | 90 | return res.status(201).json({ 91 | ok: true, 92 | role, 93 | }); 94 | }); 95 | }; 96 | 97 | module.exports = CTRL; 98 | -------------------------------------------------------------------------------- /src/controllers/client.controller.js: -------------------------------------------------------------------------------- 1 | const Client = require("../models/Client"); 2 | 3 | const CTRL = {}; 4 | 5 | CTRL.getClients = (req, res) => { 6 | Client.find({}).exec((err, clients) => { 7 | if (err) { 8 | return res.status(500).json({ 9 | ok: false, 10 | err 11 | }) 12 | } 13 | res.json({ 14 | ok: true, 15 | clients, 16 | }); 17 | }); 18 | }; 19 | 20 | CTRL.getClient = (req, res) => { 21 | const { clientId } = req.params; 22 | Client.findById(clientId).exec((err, client) => { 23 | if (err) { 24 | return res.status(500).json({ 25 | ok: false, 26 | err 27 | }) 28 | } 29 | res.json({ 30 | ok: true, 31 | client, 32 | }); 33 | }); 34 | }; 35 | 36 | CTRL.createClient = (req, res) => { 37 | const newClient = new Client({ 38 | displayName: req.body.displayName, 39 | address: req.body.address, 40 | phone: req.body.phone, 41 | email: req.body.email, 42 | status: req.body.status 43 | }); 44 | 45 | newClient.save((err, client) => { 46 | if (err) { 47 | return res.status(500).json({ 48 | ok: false, 49 | err, 50 | }); 51 | } 52 | 53 | return res.status(201).json({ 54 | ok: true, 55 | client, 56 | }); 57 | }); 58 | }; 59 | 60 | CTRL.updateClient = (req, res) => { 61 | const { clientId } = req.params; 62 | 63 | Client.findByIdAndUpdate( 64 | clientId, 65 | req.body, 66 | { new: true }, 67 | (err, client) => { 68 | if (err) { 69 | return res.status(500).json({ 70 | ok: false, 71 | err, 72 | }); 73 | } 74 | 75 | return res.status(201).json({ 76 | ok: true, 77 | client, 78 | }); 79 | } 80 | ); 81 | }; 82 | 83 | CTRL.deleteClient = (req, res) => { 84 | const { clientId } = req.params; 85 | Client.findByIdAndRemove(clientId, (err, client) => { 86 | if (err) { 87 | return res.status(500).json({ 88 | ok: false, 89 | err, 90 | }); 91 | } 92 | 93 | return res.status(201).json({ 94 | ok: true, 95 | client, 96 | }); 97 | }); 98 | }; 99 | 100 | module.exports = CTRL; 101 | -------------------------------------------------------------------------------- /src/controllers/category.controller.js: -------------------------------------------------------------------------------- 1 | const Category = require("../models/Category"); 2 | 3 | const CTRL = {}; 4 | 5 | CTRL.getCategories = (req, res) => { 6 | Category.find({}).exec((err, categories) => { 7 | if (err) { 8 | return res.status(500).json({ 9 | ok: false, 10 | err 11 | }) 12 | } 13 | res.json({ 14 | ok: true, 15 | categories, 16 | }); 17 | }); 18 | }; 19 | 20 | CTRL.getCategory = (req, res) => { 21 | const { categoryId } = req.params; 22 | Category.findById(categoryId).exec((err, category) => { 23 | if (err) { 24 | return res.status(500).json({ 25 | ok: false, 26 | err 27 | }) 28 | } 29 | res.json({ 30 | ok: true, 31 | category, 32 | }); 33 | }); 34 | }; 35 | 36 | CTRL.createCategory = (req, res) => { 37 | const newCategory = new Category({ 38 | name: req.body.name, 39 | description: req.body.description, 40 | status: req.body.status 41 | }) 42 | 43 | console.log(newCategory); 44 | newCategory.save((err, category) => { 45 | if (err) { 46 | return res.status(500).json({ 47 | ok: false, 48 | err, 49 | }); 50 | } 51 | 52 | return res.status(201).json({ 53 | ok: true, 54 | category, 55 | }); 56 | }); 57 | }; 58 | 59 | CTRL.updateCategory = (req, res) => { 60 | const { categoryId } = req.params; 61 | 62 | Category.findByIdAndUpdate( 63 | categoryId, 64 | req.body, 65 | { new: true }, 66 | (err, category) => { 67 | if (err) { 68 | return res.status(500).json({ 69 | ok: false, 70 | err, 71 | }); 72 | } 73 | 74 | return res.status(201).json({ 75 | ok: true, 76 | category, 77 | }); 78 | } 79 | ); 80 | }; 81 | 82 | CTRL.deleteCategory = (req, res) => { 83 | const { categoryId } = req.params; 84 | 85 | Category.findByIdAndRemove(categoryId, (err, category) => { 86 | if (err) { 87 | return res.status(500).json({ 88 | ok: false, 89 | err, 90 | }); 91 | } 92 | 93 | return res.status(201).json({ 94 | ok: true, 95 | category, 96 | }); 97 | }); 98 | }; 99 | 100 | module.exports = CTRL; 101 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Snowpack dependency directory (https://snowpack.dev/) 45 | web_modules/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | .parcel-cache 78 | 79 | # Next.js build output 80 | .next 81 | out 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and not Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | 108 | # Stores VSCode versions used for testing VSCode extensions 109 | .vscode-test 110 | 111 | # yarn v2 112 | .yarn/cache 113 | .yarn/unplugged 114 | .yarn/build-state.yml 115 | .yarn/install-state.gz 116 | .pnp.* 117 | -------------------------------------------------------------------------------- /src/controllers/product.controller.js: -------------------------------------------------------------------------------- 1 | const Product = require("../models/Product"); 2 | 3 | const CTRL = {}; 4 | 5 | CTRL.getProducts = (req, res) => { 6 | Product.find({}) 7 | .populate("category") 8 | .exec((err, products) => { 9 | if (err) { 10 | return res.status(500).json({ 11 | ok: false, 12 | err 13 | }) 14 | } 15 | res.json({ 16 | ok: true, 17 | products, 18 | }); 19 | }); 20 | }; 21 | 22 | CTRL.getProduct = (req, res) => { 23 | const { productId } = req.params; 24 | Product.findById(productId) 25 | .populate("category") 26 | .exec((err, product) => { 27 | if (err) { 28 | return res.status(500).json({ 29 | ok: false, 30 | err 31 | }) 32 | } 33 | res.json({ 34 | ok: true, 35 | product, 36 | }); 37 | }); 38 | }; 39 | 40 | CTRL.createProduct = (req, res) => { 41 | const newProduct = new Product({ 42 | code: req.body.code, 43 | name: req.body.name, 44 | excerpt: req.body.excerpt, 45 | description: req.body.description, 46 | price: req.body.price, 47 | stock: req.body.stock, 48 | image: req.body.image, 49 | category: req.body.category, 50 | status: req.body.status 51 | }); 52 | 53 | newProduct.save((err, product) => { 54 | if (err) { 55 | return res.status(500).json({ 56 | ok: false, 57 | err, 58 | }); 59 | } 60 | 61 | return res.status(201).json({ 62 | ok: true, 63 | product, 64 | }); 65 | }); 66 | }; 67 | 68 | CTRL.updateProduct = (req, res) => { 69 | const { productId } = req.params; 70 | 71 | Product.findByIdAndUpdate( 72 | productId, 73 | req.body, 74 | { new: true }, 75 | (err, product) => { 76 | if (err) { 77 | return res.status(500).json({ 78 | ok: false, 79 | err, 80 | }); 81 | } 82 | 83 | return res.status(201).json({ 84 | ok: true, 85 | product, 86 | }); 87 | } 88 | ); 89 | }; 90 | 91 | CTRL.deleteProduct = (req, res) => { 92 | const { productId } = req.params; 93 | Product.findByIdAndRemove(productId, (err, product) => { 94 | if (err) { 95 | return res.status(500).json({ 96 | ok: false, 97 | err, 98 | }); 99 | } 100 | 101 | return res.status(201).json({ 102 | ok: true, 103 | product, 104 | }); 105 | }); 106 | }; 107 | 108 | module.exports = CTRL; 109 | -------------------------------------------------------------------------------- /src/controllers/user.controller.js: -------------------------------------------------------------------------------- 1 | const User = require("../models/User"); 2 | const bcrypt = require("bcrypt"); 3 | 4 | const CTRL = {}; 5 | 6 | CTRL.getUsers = (req, res) => { 7 | User.find({}) 8 | .populate('role').exec((err, users) => { 9 | if (err) { 10 | return res.status(500).json({ 11 | ok: false, 12 | err 13 | }) 14 | } 15 | res.json({ 16 | ok: true, 17 | users, 18 | }); 19 | }); 20 | }; 21 | 22 | CTRL.getUser = (req, res) => { 23 | const { userId } = req.params; 24 | User.findById(userId) 25 | .populate('role').exec((err, user) => { 26 | if (err) { 27 | return res.status(500).json({ 28 | ok: false, 29 | err 30 | }) 31 | } 32 | res.json({ 33 | ok: true, 34 | user, 35 | }); 36 | }); 37 | }; 38 | 39 | CTRL.createUser = (req, res) => { 40 | const newUser = new User({ 41 | displayName: req.body.displayName, 42 | email: req.body.email, 43 | username: req.body.username, 44 | password: bcrypt.hashSync(req.body.password, 10), 45 | avatar: req.body.avatar, 46 | role: req.body.role, 47 | status: req.body.status 48 | }); 49 | 50 | console.log(newUser); 51 | newUser.save((err, user) => { 52 | if (err) { 53 | return res.status(500).json({ 54 | ok: false, 55 | err, 56 | }); 57 | } 58 | 59 | return res.status(201).json({ 60 | ok: true, 61 | user, 62 | }); 63 | }); 64 | }; 65 | 66 | CTRL.updateUser = (req, res) => { 67 | const { userId } = req.params; 68 | 69 | const updUser = { 70 | displayName: req.body.displayName, 71 | email: req.body.email, 72 | username: req.body.username, 73 | password: bcrypt.hashSync(req.body.password, 10), 74 | avatar: req.body.avatar, 75 | role: req.body.role, 76 | status: req.body.status 77 | } 78 | 79 | User.findByIdAndUpdate(userId, updUser, { new: true }, (err, user) => { 80 | if (err) { 81 | return res.status(500).json({ 82 | ok: false, 83 | err, 84 | }); 85 | } 86 | 87 | return res.status(201).json({ 88 | ok: true, 89 | user, 90 | }); 91 | }); 92 | }; 93 | 94 | CTRL.deleteUser = (req, res) => { 95 | const { userId } = req.params; 96 | User.findByIdAndRemove(userId, (err, user) => { 97 | if (err) { 98 | return res.status(500).json({ 99 | ok: false, 100 | err, 101 | }); 102 | } 103 | 104 | return res.status(201).json({ 105 | ok: true, 106 | user, 107 | }); 108 | }); 109 | }; 110 | 111 | module.exports = CTRL; 112 | -------------------------------------------------------------------------------- /src/controllers/order.controller.js: -------------------------------------------------------------------------------- 1 | const Order = require("../models/Order"); 2 | const Product = require("../models/Product"); 3 | 4 | const CTRL = {}; 5 | 6 | CTRL.getOrders = (req, res) => { 7 | Order.find({}) 8 | .populate("client") 9 | .populate("orderItems.product") 10 | .exec((err, orders) => { 11 | if (err) { 12 | return res.status(500).json({ 13 | ok: false, 14 | err 15 | }) 16 | } 17 | res.json({ 18 | ok: true, 19 | orders, 20 | }); 21 | }); 22 | }; 23 | 24 | CTRL.getOrder = (req, res) => { 25 | const { orderId } = req.params; 26 | Order.findById(orderId).exec((err, order) => { 27 | if (err) { 28 | return res.status(500).json({ 29 | ok: false, 30 | err 31 | }) 32 | } 33 | res.json({ 34 | ok: true, 35 | order, 36 | }); 37 | }); 38 | }; 39 | 40 | CTRL.createOrder = (req, res) => { 41 | validateStock(req.body.orderItems, (cartItems) => { 42 | if (cartItems == false) { 43 | return res.status(500).json({ 44 | ok: false, 45 | msg: "The product is not available at the moment.", 46 | }); 47 | } 48 | 49 | const newOrder = new Order({ 50 | client: req.body.client, 51 | serial: req.body.serial, 52 | total: req.body.total, 53 | orderItems: cartItems, 54 | }); 55 | 56 | newOrder.save((err, order) => { 57 | if (err) { 58 | return res.status(500).json({ 59 | ok: false, 60 | err, 61 | }); 62 | } 63 | 64 | return res.status(201).json({ 65 | ok: true, 66 | order, 67 | }); 68 | }); 69 | }); 70 | }; 71 | 72 | 73 | 74 | CTRL.deleteOrder = (req, res) => { 75 | const { orderId } = req.params; 76 | Order.findByIdAndRemove(orderId, (err, order) => { 77 | if (err) { 78 | return res.status(500).json({ 79 | ok: false, 80 | err, 81 | }); 82 | } 83 | 84 | return res.status(201).json({ 85 | ok: true, 86 | order, 87 | }); 88 | }); 89 | }; 90 | 91 | const validateStock = (products, cb) => { 92 | const products_id = []; 93 | 94 | const cartItems = []; 95 | 96 | products.forEach((elem) => { 97 | products_id.push(elem.product_id); 98 | }); 99 | 100 | Product.find({}) 101 | .where("_id") 102 | .in(products_id) 103 | .exec(async (err, data) => { 104 | for (const e of data) { 105 | let newQty = products.find((p) => p.product_id == e._id).qty; 106 | 107 | if (newQty <= e.stock) { 108 | const modify = await Product.findByIdAndUpdate(e._id, { 109 | stock: e.stock - newQty, 110 | }); 111 | 112 | if (modify != false) { 113 | cartItems.push({ 114 | product: e._id, 115 | qty: newQty, 116 | }); 117 | } 118 | 119 | //console.log(cartItems) 120 | } 121 | } 122 | 123 | cb(cartItems.length == 0 ? false : cartItems); 124 | }); 125 | }; 126 | 127 | module.exports = CTRL; 128 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ECOMMERCE REST API WITH NODE V1.0 2 | 3 | ## Description 4 | 5 | This repository is a Software of Application with NodeJS, Express, Mongoose, JWT, MongoDB, etc. 6 | 7 | ## Installation 8 | 9 | Using Node 12.19, NPM 6.14 preferably. 10 | 11 | ## Database 12 | 13 | Using MongoDB 14 | 15 | ## Apps 16 | 17 | Client Rest: Postman, Insomnia, Talend API Tester, etc 18 | 19 | ## Plugins 20 | 21 | You can use the libs Express, JWT, Bcrypt, Morgan, Cors, etc 22 | 23 | 24 | ## Usage 25 | 26 | ```html 27 | $ git clone https://github.com/DanielArturoAlejoAlvarez/ecommerce-rest-api-node[NAME APP] 28 | 29 | $ yarn install 30 | 31 | $ npm run dev [development] 32 | 33 | $ npm start [production] 34 | 35 | ``` 36 | 37 | Follow the following steps and you're good to go! Important: 38 | 39 | ![alt text](https://miro.medium.com/max/1202/1*tx_GMMffHZeBDr1RDnStlg.gif) 40 | 41 | ## Coding 42 | 43 | ### Config 44 | ```js 45 | ... 46 | const config = require('./config') 47 | const mongoose = require('mongoose') 48 | 49 | mongoose.connect(config.MONGODB, { 50 | useNewUrlParser: true, 51 | useUnifiedTopology: true, 52 | useCreateIndex: true 53 | }, (err)=>{ 54 | if (err) { 55 | console.log(err) 56 | } 57 | console.log('DB is connect!') 58 | }) 59 | ... 60 | ``` 61 | 62 | ### Routes 63 | ```js 64 | ... 65 | const router = require('express').Router() 66 | 67 | const authCTRL = require('../controllers/auth/auth.controller') 68 | 69 | router.post('/login', authCTRL.login) 70 | 71 | module.exports=router 72 | ... 73 | ``` 74 | 75 | ### Middlewares 76 | ```js 77 | ... 78 | const config = require("../config/config"); 79 | const jwt = require("jsonwebtoken"); 80 | 81 | const isAuth = (req, res, next) => { 82 | let token = req.get("Authorization"); 83 | 84 | jwt.verify(token, config.SECRET_KEY, (err, user) => { 85 | if (err) { 86 | return res.status(500).json({ 87 | ok: false, 88 | msg: "Token invalid!", 89 | }); 90 | } 91 | 92 | req.user = user.data; 93 | 94 | next(); 95 | }); 96 | }; 97 | 98 | module.exports = { 99 | isAuth, 100 | }; 101 | ... 102 | ``` 103 | 104 | ### Controllers 105 | ```js 106 | ... 107 | const config = require("../../config/config"); 108 | const User = require("../../models/User"); 109 | 110 | const CTRL = {}; 111 | 112 | const bcrypt = require("bcrypt"); 113 | const jwt = require("jsonwebtoken"); 114 | 115 | CTRL.login = (req, res) => { 116 | User.findOne({ username: req.body.username }, (err, user) => { 117 | if (err) { 118 | return res.status(500).json({ 119 | ok: false, 120 | err, 121 | }); 122 | } 123 | 124 | if (!user) { 125 | return res.status(404).json({ 126 | ok: false, 127 | msg: "Username/Password invalid!", 128 | }); 129 | } 130 | 131 | if (!bcrypt.compareSync(req.body.password, user.password)) { 132 | return res.status(404).json({ 133 | ok: false, 134 | msg: "Username/Password invalid!", 135 | }); 136 | } 137 | 138 | let token = jwt.sign({ data: user }, config.SECRET_KEY, { 139 | expiresIn: "2h", 140 | }); 141 | 142 | return res.status(201).json({ 143 | ok: true, 144 | user, 145 | token, 146 | }); 147 | }); 148 | }; 149 | 150 | module.exports = CTRL; 151 | 152 | ... 153 | ``` 154 | 155 | ### Models 156 | ```js 157 | ... 158 | const mongoose = require("mongoose"); 159 | 160 | const Schema = mongoose.Schema; 161 | 162 | const UserSchema = new Schema({ 163 | displayName: { 164 | type: String, 165 | required: true, 166 | }, 167 | email: { 168 | type: String, 169 | required: true, 170 | unique: true, 171 | }, 172 | username: { 173 | type: String, 174 | required: true, 175 | unique: true, 176 | }, 177 | password: { 178 | type: String, 179 | required: true, 180 | }, 181 | avatar: { 182 | type: String, 183 | maxlength: 512, 184 | }, 185 | role: { 186 | type: Schema.Types.ObjectId, 187 | ref: 'Role', 188 | }, 189 | status: { 190 | type: Boolean, 191 | default: true, 192 | }, 193 | created_at: { 194 | type: Date, 195 | default: Date.now, 196 | }, 197 | }); 198 | 199 | module.exports = mongoose.model("User", UserSchema); 200 | ... 201 | ``` 202 | 203 | 204 | 205 | 206 | 207 | ## Contributing 208 | 209 | Bug reports and pull requests are welcome on GitHub at https://github.com/DanielArturoAlejoAlvarez/ecommerce-rest-api-node. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. 210 | 211 | ## License 212 | 213 | The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). 214 | 215 | ``` 216 | 217 | ``` -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^0.14.0": 6 | version "0.14.0" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 8 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 9 | 10 | "@szmarczak/http-timer@^1.1.2": 11 | version "1.1.2" 12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 13 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 14 | dependencies: 15 | defer-to-connect "^1.0.1" 16 | 17 | abbrev@1: 18 | version "1.1.1" 19 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 20 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 21 | 22 | accepts@~1.3.7: 23 | version "1.3.7" 24 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 25 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 26 | dependencies: 27 | mime-types "~2.1.24" 28 | negotiator "0.6.2" 29 | 30 | ansi-align@^3.0.0: 31 | version "3.0.0" 32 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" 33 | integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== 34 | dependencies: 35 | string-width "^3.0.0" 36 | 37 | ansi-regex@^2.0.0: 38 | version "2.1.1" 39 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 40 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 41 | 42 | ansi-regex@^3.0.0: 43 | version "3.0.0" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 45 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 46 | 47 | ansi-regex@^4.1.0: 48 | version "4.1.0" 49 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 50 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 51 | 52 | ansi-regex@^5.0.0: 53 | version "5.0.0" 54 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 55 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 56 | 57 | ansi-styles@^4.1.0: 58 | version "4.3.0" 59 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 60 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 61 | dependencies: 62 | color-convert "^2.0.1" 63 | 64 | anymatch@~3.1.1: 65 | version "3.1.1" 66 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 67 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 68 | dependencies: 69 | normalize-path "^3.0.0" 70 | picomatch "^2.0.4" 71 | 72 | aproba@^1.0.3: 73 | version "1.2.0" 74 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 75 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 76 | 77 | are-we-there-yet@~1.1.2: 78 | version "1.1.5" 79 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 80 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 81 | dependencies: 82 | delegates "^1.0.0" 83 | readable-stream "^2.0.6" 84 | 85 | array-flatten@1.1.1: 86 | version "1.1.1" 87 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 88 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 89 | 90 | balanced-match@^1.0.0: 91 | version "1.0.0" 92 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 93 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 94 | 95 | basic-auth@~2.0.1: 96 | version "2.0.1" 97 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 98 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 99 | dependencies: 100 | safe-buffer "5.1.2" 101 | 102 | bcrypt@^5.0.0: 103 | version "5.0.0" 104 | resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.0.tgz#051407c7cd5ffbfb773d541ca3760ea0754e37e2" 105 | integrity sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg== 106 | dependencies: 107 | node-addon-api "^3.0.0" 108 | node-pre-gyp "0.15.0" 109 | 110 | binary-extensions@^2.0.0: 111 | version "2.1.0" 112 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 113 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 114 | 115 | bl@^2.2.1: 116 | version "2.2.1" 117 | resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" 118 | integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== 119 | dependencies: 120 | readable-stream "^2.3.5" 121 | safe-buffer "^5.1.1" 122 | 123 | bluebird@3.5.1: 124 | version "3.5.1" 125 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 126 | integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== 127 | 128 | body-parser@1.19.0: 129 | version "1.19.0" 130 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 131 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 132 | dependencies: 133 | bytes "3.1.0" 134 | content-type "~1.0.4" 135 | debug "2.6.9" 136 | depd "~1.1.2" 137 | http-errors "1.7.2" 138 | iconv-lite "0.4.24" 139 | on-finished "~2.3.0" 140 | qs "6.7.0" 141 | raw-body "2.4.0" 142 | type-is "~1.6.17" 143 | 144 | boxen@^4.2.0: 145 | version "4.2.0" 146 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" 147 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== 148 | dependencies: 149 | ansi-align "^3.0.0" 150 | camelcase "^5.3.1" 151 | chalk "^3.0.0" 152 | cli-boxes "^2.2.0" 153 | string-width "^4.1.0" 154 | term-size "^2.1.0" 155 | type-fest "^0.8.1" 156 | widest-line "^3.1.0" 157 | 158 | brace-expansion@^1.1.7: 159 | version "1.1.11" 160 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 161 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 162 | dependencies: 163 | balanced-match "^1.0.0" 164 | concat-map "0.0.1" 165 | 166 | braces@~3.0.2: 167 | version "3.0.2" 168 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 169 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 170 | dependencies: 171 | fill-range "^7.0.1" 172 | 173 | bson@^1.1.4: 174 | version "1.1.5" 175 | resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.5.tgz#2aaae98fcdf6750c0848b0cba1ddec3c73060a34" 176 | integrity sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg== 177 | 178 | buffer-equal-constant-time@1.0.1: 179 | version "1.0.1" 180 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 181 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 182 | 183 | bytes@3.1.0: 184 | version "3.1.0" 185 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 186 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 187 | 188 | cacheable-request@^6.0.0: 189 | version "6.1.0" 190 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 191 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 192 | dependencies: 193 | clone-response "^1.0.2" 194 | get-stream "^5.1.0" 195 | http-cache-semantics "^4.0.0" 196 | keyv "^3.0.0" 197 | lowercase-keys "^2.0.0" 198 | normalize-url "^4.1.0" 199 | responselike "^1.0.2" 200 | 201 | camelcase@^5.3.1: 202 | version "5.3.1" 203 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 204 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 205 | 206 | chalk@^3.0.0: 207 | version "3.0.0" 208 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 209 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 210 | dependencies: 211 | ansi-styles "^4.1.0" 212 | supports-color "^7.1.0" 213 | 214 | chokidar@^3.2.2: 215 | version "3.4.2" 216 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" 217 | integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== 218 | dependencies: 219 | anymatch "~3.1.1" 220 | braces "~3.0.2" 221 | glob-parent "~5.1.0" 222 | is-binary-path "~2.1.0" 223 | is-glob "~4.0.1" 224 | normalize-path "~3.0.0" 225 | readdirp "~3.4.0" 226 | optionalDependencies: 227 | fsevents "~2.1.2" 228 | 229 | chownr@^1.1.1: 230 | version "1.1.4" 231 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 232 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 233 | 234 | ci-info@^2.0.0: 235 | version "2.0.0" 236 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 237 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 238 | 239 | cli-boxes@^2.2.0: 240 | version "2.2.1" 241 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 242 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 243 | 244 | clone-response@^1.0.2: 245 | version "1.0.2" 246 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 247 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 248 | dependencies: 249 | mimic-response "^1.0.0" 250 | 251 | code-point-at@^1.0.0: 252 | version "1.1.0" 253 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 254 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 255 | 256 | color-convert@^2.0.1: 257 | version "2.0.1" 258 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 259 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 260 | dependencies: 261 | color-name "~1.1.4" 262 | 263 | color-name@~1.1.4: 264 | version "1.1.4" 265 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 266 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 267 | 268 | concat-map@0.0.1: 269 | version "0.0.1" 270 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 271 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 272 | 273 | configstore@^5.0.1: 274 | version "5.0.1" 275 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 276 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 277 | dependencies: 278 | dot-prop "^5.2.0" 279 | graceful-fs "^4.1.2" 280 | make-dir "^3.0.0" 281 | unique-string "^2.0.0" 282 | write-file-atomic "^3.0.0" 283 | xdg-basedir "^4.0.0" 284 | 285 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 286 | version "1.1.0" 287 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 288 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 289 | 290 | content-disposition@0.5.3: 291 | version "0.5.3" 292 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 293 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 294 | dependencies: 295 | safe-buffer "5.1.2" 296 | 297 | content-type@~1.0.4: 298 | version "1.0.4" 299 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 300 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 301 | 302 | cookie-signature@1.0.6: 303 | version "1.0.6" 304 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 305 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 306 | 307 | cookie@0.4.0: 308 | version "0.4.0" 309 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 310 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 311 | 312 | core-util-is@~1.0.0: 313 | version "1.0.2" 314 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 315 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 316 | 317 | crypto-random-string@^2.0.0: 318 | version "2.0.0" 319 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 320 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 321 | 322 | debug@2.6.9, debug@^2.2.0: 323 | version "2.6.9" 324 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 325 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 326 | dependencies: 327 | ms "2.0.0" 328 | 329 | debug@3.1.0: 330 | version "3.1.0" 331 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 332 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 333 | dependencies: 334 | ms "2.0.0" 335 | 336 | debug@^3.2.6: 337 | version "3.2.6" 338 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 339 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 340 | dependencies: 341 | ms "^2.1.1" 342 | 343 | decompress-response@^3.3.0: 344 | version "3.3.0" 345 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 346 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 347 | dependencies: 348 | mimic-response "^1.0.0" 349 | 350 | deep-extend@^0.6.0: 351 | version "0.6.0" 352 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 353 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 354 | 355 | defer-to-connect@^1.0.1: 356 | version "1.1.3" 357 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 358 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 359 | 360 | delegates@^1.0.0: 361 | version "1.0.0" 362 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 363 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 364 | 365 | denque@^1.4.1: 366 | version "1.4.1" 367 | resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" 368 | integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== 369 | 370 | depd@~1.1.2: 371 | version "1.1.2" 372 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 373 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 374 | 375 | depd@~2.0.0: 376 | version "2.0.0" 377 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 378 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 379 | 380 | destroy@~1.0.4: 381 | version "1.0.4" 382 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 383 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 384 | 385 | detect-libc@^1.0.2: 386 | version "1.0.3" 387 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 388 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 389 | 390 | dot-prop@^5.2.0: 391 | version "5.3.0" 392 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 393 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 394 | dependencies: 395 | is-obj "^2.0.0" 396 | 397 | duplexer3@^0.1.4: 398 | version "0.1.4" 399 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 400 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 401 | 402 | ecdsa-sig-formatter@1.0.11: 403 | version "1.0.11" 404 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 405 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 406 | dependencies: 407 | safe-buffer "^5.0.1" 408 | 409 | ee-first@1.1.1: 410 | version "1.1.1" 411 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 412 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 413 | 414 | emoji-regex@^7.0.1: 415 | version "7.0.3" 416 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 417 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 418 | 419 | emoji-regex@^8.0.0: 420 | version "8.0.0" 421 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 422 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 423 | 424 | encodeurl@~1.0.2: 425 | version "1.0.2" 426 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 427 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 428 | 429 | end-of-stream@^1.1.0: 430 | version "1.4.4" 431 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 432 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 433 | dependencies: 434 | once "^1.4.0" 435 | 436 | escape-goat@^2.0.0: 437 | version "2.1.1" 438 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 439 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 440 | 441 | escape-html@~1.0.3: 442 | version "1.0.3" 443 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 444 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 445 | 446 | etag@~1.8.1: 447 | version "1.8.1" 448 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 449 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 450 | 451 | express@^4.17.1: 452 | version "4.17.1" 453 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 454 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 455 | dependencies: 456 | accepts "~1.3.7" 457 | array-flatten "1.1.1" 458 | body-parser "1.19.0" 459 | content-disposition "0.5.3" 460 | content-type "~1.0.4" 461 | cookie "0.4.0" 462 | cookie-signature "1.0.6" 463 | debug "2.6.9" 464 | depd "~1.1.2" 465 | encodeurl "~1.0.2" 466 | escape-html "~1.0.3" 467 | etag "~1.8.1" 468 | finalhandler "~1.1.2" 469 | fresh "0.5.2" 470 | merge-descriptors "1.0.1" 471 | methods "~1.1.2" 472 | on-finished "~2.3.0" 473 | parseurl "~1.3.3" 474 | path-to-regexp "0.1.7" 475 | proxy-addr "~2.0.5" 476 | qs "6.7.0" 477 | range-parser "~1.2.1" 478 | safe-buffer "5.1.2" 479 | send "0.17.1" 480 | serve-static "1.14.1" 481 | setprototypeof "1.1.1" 482 | statuses "~1.5.0" 483 | type-is "~1.6.18" 484 | utils-merge "1.0.1" 485 | vary "~1.1.2" 486 | 487 | fill-range@^7.0.1: 488 | version "7.0.1" 489 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 490 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 491 | dependencies: 492 | to-regex-range "^5.0.1" 493 | 494 | finalhandler@~1.1.2: 495 | version "1.1.2" 496 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 497 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 498 | dependencies: 499 | debug "2.6.9" 500 | encodeurl "~1.0.2" 501 | escape-html "~1.0.3" 502 | on-finished "~2.3.0" 503 | parseurl "~1.3.3" 504 | statuses "~1.5.0" 505 | unpipe "~1.0.0" 506 | 507 | forwarded@~0.1.2: 508 | version "0.1.2" 509 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 510 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 511 | 512 | fresh@0.5.2: 513 | version "0.5.2" 514 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 515 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 516 | 517 | fs-minipass@^1.2.5: 518 | version "1.2.7" 519 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 520 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 521 | dependencies: 522 | minipass "^2.6.0" 523 | 524 | fs.realpath@^1.0.0: 525 | version "1.0.0" 526 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 527 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 528 | 529 | fsevents@~2.1.2: 530 | version "2.1.3" 531 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 532 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 533 | 534 | gauge@~2.7.3: 535 | version "2.7.4" 536 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 537 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 538 | dependencies: 539 | aproba "^1.0.3" 540 | console-control-strings "^1.0.0" 541 | has-unicode "^2.0.0" 542 | object-assign "^4.1.0" 543 | signal-exit "^3.0.0" 544 | string-width "^1.0.1" 545 | strip-ansi "^3.0.1" 546 | wide-align "^1.1.0" 547 | 548 | get-stream@^4.1.0: 549 | version "4.1.0" 550 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 551 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 552 | dependencies: 553 | pump "^3.0.0" 554 | 555 | get-stream@^5.1.0: 556 | version "5.2.0" 557 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 558 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 559 | dependencies: 560 | pump "^3.0.0" 561 | 562 | glob-parent@~5.1.0: 563 | version "5.1.1" 564 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 565 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 566 | dependencies: 567 | is-glob "^4.0.1" 568 | 569 | glob@^7.1.3: 570 | version "7.1.6" 571 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 572 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 573 | dependencies: 574 | fs.realpath "^1.0.0" 575 | inflight "^1.0.4" 576 | inherits "2" 577 | minimatch "^3.0.4" 578 | once "^1.3.0" 579 | path-is-absolute "^1.0.0" 580 | 581 | global-dirs@^2.0.1: 582 | version "2.0.1" 583 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" 584 | integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== 585 | dependencies: 586 | ini "^1.3.5" 587 | 588 | got@^9.6.0: 589 | version "9.6.0" 590 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 591 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 592 | dependencies: 593 | "@sindresorhus/is" "^0.14.0" 594 | "@szmarczak/http-timer" "^1.1.2" 595 | cacheable-request "^6.0.0" 596 | decompress-response "^3.3.0" 597 | duplexer3 "^0.1.4" 598 | get-stream "^4.1.0" 599 | lowercase-keys "^1.0.1" 600 | mimic-response "^1.0.1" 601 | p-cancelable "^1.0.0" 602 | to-readable-stream "^1.0.0" 603 | url-parse-lax "^3.0.0" 604 | 605 | graceful-fs@^4.1.2: 606 | version "4.2.4" 607 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 608 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 609 | 610 | has-flag@^3.0.0: 611 | version "3.0.0" 612 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 613 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 614 | 615 | has-flag@^4.0.0: 616 | version "4.0.0" 617 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 618 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 619 | 620 | has-unicode@^2.0.0: 621 | version "2.0.1" 622 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 623 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 624 | 625 | has-yarn@^2.1.0: 626 | version "2.1.0" 627 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 628 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 629 | 630 | http-cache-semantics@^4.0.0: 631 | version "4.1.0" 632 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 633 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 634 | 635 | http-errors@1.7.2: 636 | version "1.7.2" 637 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 638 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 639 | dependencies: 640 | depd "~1.1.2" 641 | inherits "2.0.3" 642 | setprototypeof "1.1.1" 643 | statuses ">= 1.5.0 < 2" 644 | toidentifier "1.0.0" 645 | 646 | http-errors@~1.7.2: 647 | version "1.7.3" 648 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 649 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 650 | dependencies: 651 | depd "~1.1.2" 652 | inherits "2.0.4" 653 | setprototypeof "1.1.1" 654 | statuses ">= 1.5.0 < 2" 655 | toidentifier "1.0.0" 656 | 657 | iconv-lite@0.4.24, iconv-lite@^0.4.4: 658 | version "0.4.24" 659 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 660 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 661 | dependencies: 662 | safer-buffer ">= 2.1.2 < 3" 663 | 664 | ignore-by-default@^1.0.1: 665 | version "1.0.1" 666 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 667 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 668 | 669 | ignore-walk@^3.0.1: 670 | version "3.0.3" 671 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" 672 | integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== 673 | dependencies: 674 | minimatch "^3.0.4" 675 | 676 | import-lazy@^2.1.0: 677 | version "2.1.0" 678 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 679 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 680 | 681 | imurmurhash@^0.1.4: 682 | version "0.1.4" 683 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 684 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 685 | 686 | inflight@^1.0.4: 687 | version "1.0.6" 688 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 689 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 690 | dependencies: 691 | once "^1.3.0" 692 | wrappy "1" 693 | 694 | inherits@2, inherits@2.0.4, inherits@~2.0.3: 695 | version "2.0.4" 696 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 697 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 698 | 699 | inherits@2.0.3: 700 | version "2.0.3" 701 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 702 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 703 | 704 | ini@^1.3.5, ini@~1.3.0: 705 | version "1.3.5" 706 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 707 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 708 | 709 | ipaddr.js@1.9.1: 710 | version "1.9.1" 711 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 712 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 713 | 714 | is-binary-path@~2.1.0: 715 | version "2.1.0" 716 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 717 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 718 | dependencies: 719 | binary-extensions "^2.0.0" 720 | 721 | is-ci@^2.0.0: 722 | version "2.0.0" 723 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 724 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 725 | dependencies: 726 | ci-info "^2.0.0" 727 | 728 | is-extglob@^2.1.1: 729 | version "2.1.1" 730 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 731 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 732 | 733 | is-fullwidth-code-point@^1.0.0: 734 | version "1.0.0" 735 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 736 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 737 | dependencies: 738 | number-is-nan "^1.0.0" 739 | 740 | is-fullwidth-code-point@^2.0.0: 741 | version "2.0.0" 742 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 743 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 744 | 745 | is-fullwidth-code-point@^3.0.0: 746 | version "3.0.0" 747 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 748 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 749 | 750 | is-glob@^4.0.1, is-glob@~4.0.1: 751 | version "4.0.1" 752 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 753 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 754 | dependencies: 755 | is-extglob "^2.1.1" 756 | 757 | is-installed-globally@^0.3.1: 758 | version "0.3.2" 759 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" 760 | integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== 761 | dependencies: 762 | global-dirs "^2.0.1" 763 | is-path-inside "^3.0.1" 764 | 765 | is-npm@^4.0.0: 766 | version "4.0.0" 767 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" 768 | integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== 769 | 770 | is-number@^7.0.0: 771 | version "7.0.0" 772 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 773 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 774 | 775 | is-obj@^2.0.0: 776 | version "2.0.0" 777 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 778 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 779 | 780 | is-path-inside@^3.0.1: 781 | version "3.0.2" 782 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" 783 | integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== 784 | 785 | is-typedarray@^1.0.0: 786 | version "1.0.0" 787 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 788 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 789 | 790 | is-yarn-global@^0.3.0: 791 | version "0.3.0" 792 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 793 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 794 | 795 | isarray@~1.0.0: 796 | version "1.0.0" 797 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 798 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 799 | 800 | json-buffer@3.0.0: 801 | version "3.0.0" 802 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 803 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 804 | 805 | jsonwebtoken@^8.5.1: 806 | version "8.5.1" 807 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 808 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 809 | dependencies: 810 | jws "^3.2.2" 811 | lodash.includes "^4.3.0" 812 | lodash.isboolean "^3.0.3" 813 | lodash.isinteger "^4.0.4" 814 | lodash.isnumber "^3.0.3" 815 | lodash.isplainobject "^4.0.6" 816 | lodash.isstring "^4.0.1" 817 | lodash.once "^4.0.0" 818 | ms "^2.1.1" 819 | semver "^5.6.0" 820 | 821 | jwa@^1.4.1: 822 | version "1.4.1" 823 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 824 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 825 | dependencies: 826 | buffer-equal-constant-time "1.0.1" 827 | ecdsa-sig-formatter "1.0.11" 828 | safe-buffer "^5.0.1" 829 | 830 | jws@^3.2.2: 831 | version "3.2.2" 832 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 833 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 834 | dependencies: 835 | jwa "^1.4.1" 836 | safe-buffer "^5.0.1" 837 | 838 | kareem@2.3.1: 839 | version "2.3.1" 840 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87" 841 | integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw== 842 | 843 | keyv@^3.0.0: 844 | version "3.1.0" 845 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 846 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 847 | dependencies: 848 | json-buffer "3.0.0" 849 | 850 | latest-version@^5.0.0: 851 | version "5.1.0" 852 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 853 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 854 | dependencies: 855 | package-json "^6.3.0" 856 | 857 | lodash.includes@^4.3.0: 858 | version "4.3.0" 859 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 860 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 861 | 862 | lodash.isboolean@^3.0.3: 863 | version "3.0.3" 864 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 865 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 866 | 867 | lodash.isinteger@^4.0.4: 868 | version "4.0.4" 869 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 870 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 871 | 872 | lodash.isnumber@^3.0.3: 873 | version "3.0.3" 874 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 875 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 876 | 877 | lodash.isplainobject@^4.0.6: 878 | version "4.0.6" 879 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 880 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 881 | 882 | lodash.isstring@^4.0.1: 883 | version "4.0.1" 884 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 885 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 886 | 887 | lodash.once@^4.0.0: 888 | version "4.1.1" 889 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 890 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 891 | 892 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 893 | version "1.0.1" 894 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 895 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 896 | 897 | lowercase-keys@^2.0.0: 898 | version "2.0.0" 899 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 900 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 901 | 902 | make-dir@^3.0.0: 903 | version "3.1.0" 904 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 905 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 906 | dependencies: 907 | semver "^6.0.0" 908 | 909 | media-typer@0.3.0: 910 | version "0.3.0" 911 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 912 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 913 | 914 | memory-pager@^1.0.2: 915 | version "1.5.0" 916 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 917 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 918 | 919 | merge-descriptors@1.0.1: 920 | version "1.0.1" 921 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 922 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 923 | 924 | methods@~1.1.2: 925 | version "1.1.2" 926 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 927 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 928 | 929 | mime-db@1.44.0: 930 | version "1.44.0" 931 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 932 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 933 | 934 | mime-types@~2.1.24: 935 | version "2.1.27" 936 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 937 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 938 | dependencies: 939 | mime-db "1.44.0" 940 | 941 | mime@1.6.0: 942 | version "1.6.0" 943 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 944 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 945 | 946 | mimic-response@^1.0.0, mimic-response@^1.0.1: 947 | version "1.0.1" 948 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 949 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 950 | 951 | minimatch@^3.0.4: 952 | version "3.0.4" 953 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 954 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 955 | dependencies: 956 | brace-expansion "^1.1.7" 957 | 958 | minimist@^1.2.0, minimist@^1.2.5: 959 | version "1.2.5" 960 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 961 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 962 | 963 | minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: 964 | version "2.9.0" 965 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 966 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 967 | dependencies: 968 | safe-buffer "^5.1.2" 969 | yallist "^3.0.0" 970 | 971 | minizlib@^1.2.1: 972 | version "1.3.3" 973 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 974 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 975 | dependencies: 976 | minipass "^2.9.0" 977 | 978 | mkdirp@^0.5.0, mkdirp@^0.5.3: 979 | version "0.5.5" 980 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 981 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 982 | dependencies: 983 | minimist "^1.2.5" 984 | 985 | mongodb@3.6.2: 986 | version "3.6.2" 987 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.2.tgz#1154a4ac107bf1375112d83a29c5cf97704e96b6" 988 | integrity sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA== 989 | dependencies: 990 | bl "^2.2.1" 991 | bson "^1.1.4" 992 | denque "^1.4.1" 993 | require_optional "^1.0.1" 994 | safe-buffer "^5.1.2" 995 | optionalDependencies: 996 | saslprep "^1.0.0" 997 | 998 | mongoose-legacy-pluralize@1.0.2: 999 | version "1.0.2" 1000 | resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" 1001 | integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== 1002 | 1003 | mongoose@^5.10.9: 1004 | version "5.10.9" 1005 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.10.9.tgz#23b74debc86d2055cee4fe77f962a9c8a286cdad" 1006 | integrity sha512-7dkr1d6Uyk87hELzoc6B7Zo7kkPTx8rKummk51Y0je2V2Ttsw0KFPwTp1G8JIbBta7Wpw8j15PJi0d33Ode2nw== 1007 | dependencies: 1008 | bson "^1.1.4" 1009 | kareem "2.3.1" 1010 | mongodb "3.6.2" 1011 | mongoose-legacy-pluralize "1.0.2" 1012 | mpath "0.7.0" 1013 | mquery "3.2.2" 1014 | ms "2.1.2" 1015 | regexp-clone "1.0.0" 1016 | safe-buffer "5.2.1" 1017 | sift "7.0.1" 1018 | sliced "1.0.1" 1019 | 1020 | morgan@^1.10.0: 1021 | version "1.10.0" 1022 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 1023 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 1024 | dependencies: 1025 | basic-auth "~2.0.1" 1026 | debug "2.6.9" 1027 | depd "~2.0.0" 1028 | on-finished "~2.3.0" 1029 | on-headers "~1.0.2" 1030 | 1031 | mpath@0.7.0: 1032 | version "0.7.0" 1033 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.7.0.tgz#20e8102e276b71709d6e07e9f8d4d0f641afbfb8" 1034 | integrity sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg== 1035 | 1036 | mquery@3.2.2: 1037 | version "3.2.2" 1038 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7" 1039 | integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q== 1040 | dependencies: 1041 | bluebird "3.5.1" 1042 | debug "3.1.0" 1043 | regexp-clone "^1.0.0" 1044 | safe-buffer "5.1.2" 1045 | sliced "1.0.1" 1046 | 1047 | ms@2.0.0: 1048 | version "2.0.0" 1049 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1050 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1051 | 1052 | ms@2.1.1: 1053 | version "2.1.1" 1054 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1055 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1056 | 1057 | ms@2.1.2, ms@^2.1.1: 1058 | version "2.1.2" 1059 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1060 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1061 | 1062 | needle@^2.5.0: 1063 | version "2.5.2" 1064 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" 1065 | integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== 1066 | dependencies: 1067 | debug "^3.2.6" 1068 | iconv-lite "^0.4.4" 1069 | sax "^1.2.4" 1070 | 1071 | negotiator@0.6.2: 1072 | version "0.6.2" 1073 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1074 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1075 | 1076 | node-addon-api@^3.0.0: 1077 | version "3.0.2" 1078 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681" 1079 | integrity sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg== 1080 | 1081 | node-pre-gyp@0.15.0: 1082 | version "0.15.0" 1083 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz#c2fc383276b74c7ffa842925241553e8b40f1087" 1084 | integrity sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA== 1085 | dependencies: 1086 | detect-libc "^1.0.2" 1087 | mkdirp "^0.5.3" 1088 | needle "^2.5.0" 1089 | nopt "^4.0.1" 1090 | npm-packlist "^1.1.6" 1091 | npmlog "^4.0.2" 1092 | rc "^1.2.7" 1093 | rimraf "^2.6.1" 1094 | semver "^5.3.0" 1095 | tar "^4.4.2" 1096 | 1097 | nodemon@^2.0.4: 1098 | version "2.0.4" 1099 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416" 1100 | integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ== 1101 | dependencies: 1102 | chokidar "^3.2.2" 1103 | debug "^3.2.6" 1104 | ignore-by-default "^1.0.1" 1105 | minimatch "^3.0.4" 1106 | pstree.remy "^1.1.7" 1107 | semver "^5.7.1" 1108 | supports-color "^5.5.0" 1109 | touch "^3.1.0" 1110 | undefsafe "^2.0.2" 1111 | update-notifier "^4.0.0" 1112 | 1113 | nopt@^4.0.1: 1114 | version "4.0.3" 1115 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" 1116 | integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== 1117 | dependencies: 1118 | abbrev "1" 1119 | osenv "^0.1.4" 1120 | 1121 | nopt@~1.0.10: 1122 | version "1.0.10" 1123 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1124 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1125 | dependencies: 1126 | abbrev "1" 1127 | 1128 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1129 | version "3.0.0" 1130 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1131 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1132 | 1133 | normalize-url@^4.1.0: 1134 | version "4.5.0" 1135 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" 1136 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== 1137 | 1138 | npm-bundled@^1.0.1: 1139 | version "1.1.1" 1140 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" 1141 | integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== 1142 | dependencies: 1143 | npm-normalize-package-bin "^1.0.1" 1144 | 1145 | npm-normalize-package-bin@^1.0.1: 1146 | version "1.0.1" 1147 | resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" 1148 | integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== 1149 | 1150 | npm-packlist@^1.1.6: 1151 | version "1.4.8" 1152 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" 1153 | integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== 1154 | dependencies: 1155 | ignore-walk "^3.0.1" 1156 | npm-bundled "^1.0.1" 1157 | npm-normalize-package-bin "^1.0.1" 1158 | 1159 | npmlog@^4.0.2: 1160 | version "4.1.2" 1161 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1162 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1163 | dependencies: 1164 | are-we-there-yet "~1.1.2" 1165 | console-control-strings "~1.1.0" 1166 | gauge "~2.7.3" 1167 | set-blocking "~2.0.0" 1168 | 1169 | number-is-nan@^1.0.0: 1170 | version "1.0.1" 1171 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1172 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1173 | 1174 | object-assign@^4.1.0: 1175 | version "4.1.1" 1176 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1177 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1178 | 1179 | on-finished@~2.3.0: 1180 | version "2.3.0" 1181 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1182 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1183 | dependencies: 1184 | ee-first "1.1.1" 1185 | 1186 | on-headers@~1.0.2: 1187 | version "1.0.2" 1188 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1189 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 1190 | 1191 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1192 | version "1.4.0" 1193 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1194 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1195 | dependencies: 1196 | wrappy "1" 1197 | 1198 | os-homedir@^1.0.0: 1199 | version "1.0.2" 1200 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1201 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1202 | 1203 | os-tmpdir@^1.0.0: 1204 | version "1.0.2" 1205 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1206 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1207 | 1208 | osenv@^0.1.4: 1209 | version "0.1.5" 1210 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1211 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1212 | dependencies: 1213 | os-homedir "^1.0.0" 1214 | os-tmpdir "^1.0.0" 1215 | 1216 | p-cancelable@^1.0.0: 1217 | version "1.1.0" 1218 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1219 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1220 | 1221 | package-json@^6.3.0: 1222 | version "6.5.0" 1223 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1224 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1225 | dependencies: 1226 | got "^9.6.0" 1227 | registry-auth-token "^4.0.0" 1228 | registry-url "^5.0.0" 1229 | semver "^6.2.0" 1230 | 1231 | parseurl@~1.3.3: 1232 | version "1.3.3" 1233 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1234 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1235 | 1236 | path-is-absolute@^1.0.0: 1237 | version "1.0.1" 1238 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1239 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1240 | 1241 | path-to-regexp@0.1.7: 1242 | version "0.1.7" 1243 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1244 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1245 | 1246 | picomatch@^2.0.4, picomatch@^2.2.1: 1247 | version "2.2.2" 1248 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1249 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1250 | 1251 | prepend-http@^2.0.0: 1252 | version "2.0.0" 1253 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1254 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1255 | 1256 | process-nextick-args@~2.0.0: 1257 | version "2.0.1" 1258 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1259 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1260 | 1261 | proxy-addr@~2.0.5: 1262 | version "2.0.6" 1263 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1264 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1265 | dependencies: 1266 | forwarded "~0.1.2" 1267 | ipaddr.js "1.9.1" 1268 | 1269 | pstree.remy@^1.1.7: 1270 | version "1.1.8" 1271 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 1272 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 1273 | 1274 | pump@^3.0.0: 1275 | version "3.0.0" 1276 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1277 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1278 | dependencies: 1279 | end-of-stream "^1.1.0" 1280 | once "^1.3.1" 1281 | 1282 | pupa@^2.0.1: 1283 | version "2.0.1" 1284 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" 1285 | integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== 1286 | dependencies: 1287 | escape-goat "^2.0.0" 1288 | 1289 | qs@6.7.0: 1290 | version "6.7.0" 1291 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1292 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1293 | 1294 | range-parser@~1.2.1: 1295 | version "1.2.1" 1296 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1297 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1298 | 1299 | raw-body@2.4.0: 1300 | version "2.4.0" 1301 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1302 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1303 | dependencies: 1304 | bytes "3.1.0" 1305 | http-errors "1.7.2" 1306 | iconv-lite "0.4.24" 1307 | unpipe "1.0.0" 1308 | 1309 | rc@^1.2.7, rc@^1.2.8: 1310 | version "1.2.8" 1311 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1312 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1313 | dependencies: 1314 | deep-extend "^0.6.0" 1315 | ini "~1.3.0" 1316 | minimist "^1.2.0" 1317 | strip-json-comments "~2.0.1" 1318 | 1319 | readable-stream@^2.0.6, readable-stream@^2.3.5: 1320 | version "2.3.7" 1321 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1322 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1323 | dependencies: 1324 | core-util-is "~1.0.0" 1325 | inherits "~2.0.3" 1326 | isarray "~1.0.0" 1327 | process-nextick-args "~2.0.0" 1328 | safe-buffer "~5.1.1" 1329 | string_decoder "~1.1.1" 1330 | util-deprecate "~1.0.1" 1331 | 1332 | readdirp@~3.4.0: 1333 | version "3.4.0" 1334 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" 1335 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 1336 | dependencies: 1337 | picomatch "^2.2.1" 1338 | 1339 | regexp-clone@1.0.0, regexp-clone@^1.0.0: 1340 | version "1.0.0" 1341 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" 1342 | integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== 1343 | 1344 | registry-auth-token@^4.0.0: 1345 | version "4.2.0" 1346 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" 1347 | integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== 1348 | dependencies: 1349 | rc "^1.2.8" 1350 | 1351 | registry-url@^5.0.0: 1352 | version "5.1.0" 1353 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1354 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1355 | dependencies: 1356 | rc "^1.2.8" 1357 | 1358 | require_optional@^1.0.1: 1359 | version "1.0.1" 1360 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" 1361 | integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== 1362 | dependencies: 1363 | resolve-from "^2.0.0" 1364 | semver "^5.1.0" 1365 | 1366 | resolve-from@^2.0.0: 1367 | version "2.0.0" 1368 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1369 | integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= 1370 | 1371 | responselike@^1.0.2: 1372 | version "1.0.2" 1373 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1374 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1375 | dependencies: 1376 | lowercase-keys "^1.0.0" 1377 | 1378 | rimraf@^2.6.1: 1379 | version "2.7.1" 1380 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1381 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1382 | dependencies: 1383 | glob "^7.1.3" 1384 | 1385 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1386 | version "5.1.2" 1387 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1388 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1389 | 1390 | safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2: 1391 | version "5.2.1" 1392 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1393 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1394 | 1395 | "safer-buffer@>= 2.1.2 < 3": 1396 | version "2.1.2" 1397 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1398 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1399 | 1400 | saslprep@^1.0.0: 1401 | version "1.0.3" 1402 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 1403 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 1404 | dependencies: 1405 | sparse-bitfield "^3.0.3" 1406 | 1407 | sax@^1.2.4: 1408 | version "1.2.4" 1409 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1410 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1411 | 1412 | semver-diff@^3.1.1: 1413 | version "3.1.1" 1414 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1415 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1416 | dependencies: 1417 | semver "^6.3.0" 1418 | 1419 | semver@^5.1.0, semver@^5.3.0, semver@^5.6.0, semver@^5.7.1: 1420 | version "5.7.1" 1421 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1422 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1423 | 1424 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1425 | version "6.3.0" 1426 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1427 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1428 | 1429 | send@0.17.1: 1430 | version "0.17.1" 1431 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1432 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1433 | dependencies: 1434 | debug "2.6.9" 1435 | depd "~1.1.2" 1436 | destroy "~1.0.4" 1437 | encodeurl "~1.0.2" 1438 | escape-html "~1.0.3" 1439 | etag "~1.8.1" 1440 | fresh "0.5.2" 1441 | http-errors "~1.7.2" 1442 | mime "1.6.0" 1443 | ms "2.1.1" 1444 | on-finished "~2.3.0" 1445 | range-parser "~1.2.1" 1446 | statuses "~1.5.0" 1447 | 1448 | serve-static@1.14.1: 1449 | version "1.14.1" 1450 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1451 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1452 | dependencies: 1453 | encodeurl "~1.0.2" 1454 | escape-html "~1.0.3" 1455 | parseurl "~1.3.3" 1456 | send "0.17.1" 1457 | 1458 | set-blocking@~2.0.0: 1459 | version "2.0.0" 1460 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1461 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1462 | 1463 | setprototypeof@1.1.1: 1464 | version "1.1.1" 1465 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1466 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1467 | 1468 | sift@7.0.1: 1469 | version "7.0.1" 1470 | resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" 1471 | integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g== 1472 | 1473 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1474 | version "3.0.3" 1475 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1476 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1477 | 1478 | sliced@1.0.1: 1479 | version "1.0.1" 1480 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 1481 | integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= 1482 | 1483 | sparse-bitfield@^3.0.3: 1484 | version "3.0.3" 1485 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 1486 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 1487 | dependencies: 1488 | memory-pager "^1.0.2" 1489 | 1490 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1491 | version "1.5.0" 1492 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1493 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1494 | 1495 | string-width@^1.0.1: 1496 | version "1.0.2" 1497 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1498 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1499 | dependencies: 1500 | code-point-at "^1.0.0" 1501 | is-fullwidth-code-point "^1.0.0" 1502 | strip-ansi "^3.0.0" 1503 | 1504 | "string-width@^1.0.2 || 2": 1505 | version "2.1.1" 1506 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1507 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1508 | dependencies: 1509 | is-fullwidth-code-point "^2.0.0" 1510 | strip-ansi "^4.0.0" 1511 | 1512 | string-width@^3.0.0: 1513 | version "3.1.0" 1514 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1515 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1516 | dependencies: 1517 | emoji-regex "^7.0.1" 1518 | is-fullwidth-code-point "^2.0.0" 1519 | strip-ansi "^5.1.0" 1520 | 1521 | string-width@^4.0.0, string-width@^4.1.0: 1522 | version "4.2.0" 1523 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1524 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1525 | dependencies: 1526 | emoji-regex "^8.0.0" 1527 | is-fullwidth-code-point "^3.0.0" 1528 | strip-ansi "^6.0.0" 1529 | 1530 | string_decoder@~1.1.1: 1531 | version "1.1.1" 1532 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1533 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1534 | dependencies: 1535 | safe-buffer "~5.1.0" 1536 | 1537 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1538 | version "3.0.1" 1539 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1540 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1541 | dependencies: 1542 | ansi-regex "^2.0.0" 1543 | 1544 | strip-ansi@^4.0.0: 1545 | version "4.0.0" 1546 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1547 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1548 | dependencies: 1549 | ansi-regex "^3.0.0" 1550 | 1551 | strip-ansi@^5.1.0: 1552 | version "5.2.0" 1553 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1554 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1555 | dependencies: 1556 | ansi-regex "^4.1.0" 1557 | 1558 | strip-ansi@^6.0.0: 1559 | version "6.0.0" 1560 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1561 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1562 | dependencies: 1563 | ansi-regex "^5.0.0" 1564 | 1565 | strip-json-comments@~2.0.1: 1566 | version "2.0.1" 1567 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1568 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1569 | 1570 | supports-color@^5.5.0: 1571 | version "5.5.0" 1572 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1573 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1574 | dependencies: 1575 | has-flag "^3.0.0" 1576 | 1577 | supports-color@^7.1.0: 1578 | version "7.2.0" 1579 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1580 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1581 | dependencies: 1582 | has-flag "^4.0.0" 1583 | 1584 | tar@^4.4.2: 1585 | version "4.4.13" 1586 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" 1587 | integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== 1588 | dependencies: 1589 | chownr "^1.1.1" 1590 | fs-minipass "^1.2.5" 1591 | minipass "^2.8.6" 1592 | minizlib "^1.2.1" 1593 | mkdirp "^0.5.0" 1594 | safe-buffer "^5.1.2" 1595 | yallist "^3.0.3" 1596 | 1597 | term-size@^2.1.0: 1598 | version "2.2.0" 1599 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" 1600 | integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== 1601 | 1602 | to-readable-stream@^1.0.0: 1603 | version "1.0.0" 1604 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 1605 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 1606 | 1607 | to-regex-range@^5.0.1: 1608 | version "5.0.1" 1609 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1610 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1611 | dependencies: 1612 | is-number "^7.0.0" 1613 | 1614 | toidentifier@1.0.0: 1615 | version "1.0.0" 1616 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1617 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1618 | 1619 | touch@^3.1.0: 1620 | version "3.1.0" 1621 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1622 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1623 | dependencies: 1624 | nopt "~1.0.10" 1625 | 1626 | type-fest@^0.8.1: 1627 | version "0.8.1" 1628 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1629 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1630 | 1631 | type-is@~1.6.17, type-is@~1.6.18: 1632 | version "1.6.18" 1633 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1634 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1635 | dependencies: 1636 | media-typer "0.3.0" 1637 | mime-types "~2.1.24" 1638 | 1639 | typedarray-to-buffer@^3.1.5: 1640 | version "3.1.5" 1641 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1642 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1643 | dependencies: 1644 | is-typedarray "^1.0.0" 1645 | 1646 | undefsafe@^2.0.2: 1647 | version "2.0.3" 1648 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" 1649 | integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== 1650 | dependencies: 1651 | debug "^2.2.0" 1652 | 1653 | unique-string@^2.0.0: 1654 | version "2.0.0" 1655 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1656 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1657 | dependencies: 1658 | crypto-random-string "^2.0.0" 1659 | 1660 | unpipe@1.0.0, unpipe@~1.0.0: 1661 | version "1.0.0" 1662 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1663 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1664 | 1665 | update-notifier@^4.0.0: 1666 | version "4.1.3" 1667 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" 1668 | integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== 1669 | dependencies: 1670 | boxen "^4.2.0" 1671 | chalk "^3.0.0" 1672 | configstore "^5.0.1" 1673 | has-yarn "^2.1.0" 1674 | import-lazy "^2.1.0" 1675 | is-ci "^2.0.0" 1676 | is-installed-globally "^0.3.1" 1677 | is-npm "^4.0.0" 1678 | is-yarn-global "^0.3.0" 1679 | latest-version "^5.0.0" 1680 | pupa "^2.0.1" 1681 | semver-diff "^3.1.1" 1682 | xdg-basedir "^4.0.0" 1683 | 1684 | url-parse-lax@^3.0.0: 1685 | version "3.0.0" 1686 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1687 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1688 | dependencies: 1689 | prepend-http "^2.0.0" 1690 | 1691 | util-deprecate@~1.0.1: 1692 | version "1.0.2" 1693 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1694 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1695 | 1696 | utils-merge@1.0.1: 1697 | version "1.0.1" 1698 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1699 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1700 | 1701 | vary@~1.1.2: 1702 | version "1.1.2" 1703 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1704 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1705 | 1706 | wide-align@^1.1.0: 1707 | version "1.1.3" 1708 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1709 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1710 | dependencies: 1711 | string-width "^1.0.2 || 2" 1712 | 1713 | widest-line@^3.1.0: 1714 | version "3.1.0" 1715 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1716 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1717 | dependencies: 1718 | string-width "^4.0.0" 1719 | 1720 | wrappy@1: 1721 | version "1.0.2" 1722 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1723 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1724 | 1725 | write-file-atomic@^3.0.0: 1726 | version "3.0.3" 1727 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1728 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1729 | dependencies: 1730 | imurmurhash "^0.1.4" 1731 | is-typedarray "^1.0.0" 1732 | signal-exit "^3.0.2" 1733 | typedarray-to-buffer "^3.1.5" 1734 | 1735 | xdg-basedir@^4.0.0: 1736 | version "4.0.0" 1737 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1738 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1739 | 1740 | yallist@^3.0.0, yallist@^3.0.3: 1741 | version "3.1.1" 1742 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1743 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1744 | --------------------------------------------------------------------------------