├── README.md ├── .gitignore ├── node-find-recipe-step ├── test │ ├── mocha.opts │ └── index.spec.js ├── config.json ├── routes │ ├── index.js │ └── recipes.js ├── app.js ├── package.json ├── bin │ └── www ├── unit.xml ├── README.md ├── recipes.json └── package-lock.json └── node-pagination-middleware ├── test ├── mocha.opts ├── mock.js └── index.spec.js ├── config.json ├── routes ├── index.js └── recipes.js ├── middleware.js ├── app.js ├── recipes.json ├── package.json ├── unit.xml ├── bin └── www └── README.md /README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | **/yarn.lock 3 | **/package-lock.json -------------------------------------------------------------------------------- /node-find-recipe-step/test/mocha.opts: -------------------------------------------------------------------------------- 1 | --reporter mocha-multi-reporters 2 | --reporter-options configFile=config.json -------------------------------------------------------------------------------- /node-pagination-middleware/test/mocha.opts: -------------------------------------------------------------------------------- 1 | --reporter mocha-multi-reporters 2 | --reporter-options configFile=config.json -------------------------------------------------------------------------------- /node-find-recipe-step/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "reporterEnabled": "spec, mocha-junit-reporter", 3 | "mochaJunitReporterReporterOptions": { 4 | "mochaFile": "unit.xml" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /node-pagination-middleware/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "reporterEnabled": "spec, mocha-junit-reporter", 3 | "mochaJunitReporterReporterOptions": { 4 | "mochaFile": "unit.xml" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /node-find-recipe-step/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | res.send('

HTML Data

'); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /node-pagination-middleware/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | res.send('

HTML Data

'); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /node-pagination-middleware/middleware.js: -------------------------------------------------------------------------------- 1 | module.exports = (req, res, next) => { 2 | const { page = 1, limit = 3, q = '' } = req.query; 3 | req.context = { 4 | page: +page, 5 | limit: +limit, 6 | skip: (page - 1) * limit, 7 | searchTerm: q, 8 | search: new RegExp(q, "gi") 9 | }; 10 | next(); 11 | }; 12 | -------------------------------------------------------------------------------- /node-find-recipe-step/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var cookieParser = require('cookie-parser'); 4 | var logger = require('morgan'); 5 | 6 | var indexRouter = require('./routes/index'); 7 | var recipeRouter = require('./routes/recipes'); 8 | 9 | var app = express(); 10 | 11 | // view engine setup 12 | app.set('view engine', 'jade'); 13 | 14 | app.use(logger('dev')); 15 | app.use(express.json()); 16 | app.use(express.urlencoded({ extended: false })); 17 | app.use(cookieParser()); 18 | app.use(express.static(path.join(__dirname, 'public'))); 19 | 20 | app.use('/', indexRouter); 21 | 22 | 23 | module.exports = app; 24 | -------------------------------------------------------------------------------- /node-pagination-middleware/test/mock.js: -------------------------------------------------------------------------------- 1 | const {assign} = require('lodash'); 2 | 3 | /** 4 | * 5 | * @param options 6 | * @param options.baseUrl 7 | * @param options.hostName 8 | * @param options.url 9 | * @param options.originalUrl 10 | * @param options.path 11 | * @param options.ip 12 | * @constructor 13 | */ 14 | function MockRequest(options) { 15 | assign(this, options); 16 | } 17 | 18 | 19 | function MockResponse() { 20 | this.headers = {}; 21 | } 22 | 23 | MockResponse.prototype.setHeader = (name, value) => { 24 | if(!this.headers) this.headers = {}; 25 | this.headers[name.toLowerCase()] = value; 26 | }; 27 | 28 | 29 | module.exports = { 30 | Request: MockRequest, 31 | Response: MockResponse 32 | } 33 | -------------------------------------------------------------------------------- /node-pagination-middleware/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var cookieParser = require('cookie-parser'); 4 | var logger = require('morgan'); 5 | var middleware = require('./middleware'); 6 | 7 | var indexRouter = require('./routes/index'); 8 | var recipesRouter = require('./routes/recipes'); 9 | 10 | var app = express(); 11 | 12 | // view engine setup 13 | app.set('view engine', 'jade'); 14 | 15 | app.use(logger('dev')); 16 | app.use(express.json()); 17 | app.use(express.urlencoded({ extended: false })); 18 | app.use(cookieParser()); 19 | app.use(express.static(path.join(__dirname, 'public'))); 20 | 21 | app.use('/', indexRouter); 22 | 23 | app.use('/recipes', recipesRouter); 24 | 25 | 26 | module.exports = app; 27 | -------------------------------------------------------------------------------- /node-pagination-middleware/recipes.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id" : 1, 4 | "name": "Crock Pot Roast" 5 | }, 6 | { 7 | "id" : 2, 8 | "name": "Roasted Asparagus" 9 | }, 10 | { 11 | "id" : 3, 12 | "name": "Curried Lentils and Rice" 13 | }, 14 | { 15 | "id" : 4, 16 | "name": "Big Night Pizza" 17 | }, 18 | { 19 | "id" : 5, 20 | "name": "Cranberry and Apple Stuffed Acorn Squash Recipe" 21 | }, 22 | { 23 | "id" : 6, 24 | "name": "Mic's Yorkshire Puds" 25 | }, 26 | { 27 | "id" : 7, 28 | "name": "Old-Fashioned Oatmeal Cookies" 29 | }, 30 | { 31 | "id" : 8, 32 | "name": "Blueberry Oatmeal Squares" 33 | }, 34 | { 35 | "id" : 9, 36 | "name": "Curried chicken salad" 37 | } 38 | ] 39 | -------------------------------------------------------------------------------- /node-find-recipe-step/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-routes", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node bin/www", 7 | "prestart": "npm install", 8 | "pretest": "npm install", 9 | "test": "cross-env PORT=8001 ./node_modules/.bin/mocha test" 10 | }, 11 | "dependencies": { 12 | "bluebird": "^3.7.2", 13 | "chai": "^4.2.0", 14 | "chai-http": "^4.3.0", 15 | "cookie-parser": "~1.4.4", 16 | "debug": "~2.6.9", 17 | "express": "~4.16.1", 18 | "jade": "~1.11.0", 19 | "mocha": "^7.1.0", 20 | "mocha-junit-reporter": "^1.23.3", 21 | "mocha-multi-reporters": "^1.1.7", 22 | "morgan": "~1.9.1" 23 | }, 24 | "devDependencies": { 25 | "cross-env": "^7.0.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /node-pagination-middleware/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-pagination-middleware", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node bin/www", 7 | "prestart": "npm install", 8 | "pretest": "npm install", 9 | "test": "cross-env PORT=8001 ./node_modules/.bin/mocha test" 10 | }, 11 | "dependencies": { 12 | "bluebird": "^3.7.2", 13 | "chai": "^4.2.0", 14 | "chai-http": "^4.3.0", 15 | "cookie-parser": "~1.4.4", 16 | "debug": "~2.6.9", 17 | "express": "~4.16.1", 18 | "jade": "~1.11.0", 19 | "mocha": "^7.1.0", 20 | "mocha-junit-reporter": "^1.23.3", 21 | "mocha-multi-reporters": "^1.1.7", 22 | "morgan": "~1.9.1", 23 | "shortid": "^2.2.15", 24 | "sinon": "^9.0.0" 25 | }, 26 | "devDependencies": { 27 | "cross-env": "^7.0.2", 28 | "lodash": "^4.17.15" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /node-pagination-middleware/routes/recipes.js: -------------------------------------------------------------------------------- 1 | var recipes = require('../recipes.json'); 2 | var router = require('express').Router(); 3 | 4 | 5 | router.get('/', async (req, res) => { 6 | const {context} = req; 7 | const page = context && context.page || req.query.page 8 | const limit = context && context.limit || req.query.limit 9 | const skip = context && context.skip || req.query.skip || ((page-1) * limit) 10 | const search = context && context.searchTerm || req.query.q; 11 | let results = []; 12 | if (search) { 13 | results = recipes.filter(({name}) => name.match(search)) 14 | } else { 15 | results = recipes 16 | } 17 | results = await results.slice(skip, (skip + limit)) 18 | res.json({ 19 | page: Number(page), 20 | limit: Number(limit), 21 | skip: Number(skip), 22 | search: search, 23 | data: results || [] 24 | }); 25 | }); 26 | 27 | module.exports = router; 28 | 29 | -------------------------------------------------------------------------------- /node-find-recipe-step/routes/recipes.js: -------------------------------------------------------------------------------- 1 | var recipes = require('../recipes.json'); 2 | var router = require('express').Router(); 3 | var recipes = require('../recipes.json'); 4 | 5 | router.get('/step/:id', (req, res) => { 6 | const { id } = req.params; 7 | 8 | if ((id && isNaN(id)) || !id) { 9 | return res.status(400).send("NOT_FOUND"); 10 | } 11 | // find recipe step 12 | const recipe = recipes[+id - 1]; 13 | 14 | if (!recipe) { 15 | return res.status(400).send("NOT_FOUND"); 16 | } 17 | 18 | let { elapsedTime = '' } = req.query; 19 | if (!elapsedTime) { 20 | elapsedTime = 0; 21 | } 22 | elapsedTime = +elapsedTime; 23 | 24 | let stop = false; 25 | const stepIndex = recipe.timers.reduce((prev, currentTime, index) => { 26 | if (!stop) { 27 | if (currentTime >= elapsedTime) { 28 | stop = true; 29 | } 30 | return index; 31 | } 32 | 33 | return prev; 34 | }, 0); 35 | 36 | res.json({ 37 | index: stepIndex 38 | }); 39 | }); 40 | 41 | module.exports = router; 42 | -------------------------------------------------------------------------------- /node-find-recipe-step/test/index.spec.js: -------------------------------------------------------------------------------- 1 | const chai = require('chai'); 2 | const chaiHttp = require('chai-http'); 3 | const server = require('../app'); 4 | const recipes = require('../recipes.json'); 5 | const should = chai.should(); 6 | 7 | chai.use(chaiHttp); 8 | 9 | describe('express_recipes_routes', () => { 10 | 11 | it('Should return 400 for /recipes/step/:id if id is not valid', (done) => { 12 | chai.request(server) 13 | .get('/recipes/step/asdasd') 14 | .then(response => { 15 | response.status.should.eql(400); 16 | response.text.should.eql('NOT_FOUND'); 17 | done(); 18 | }) 19 | }); 20 | 21 | 22 | it('Should respond with 0 if elapsed time is 0', (done) => { 23 | chai.request(server) 24 | .get('/recipes/step/5?elapsedTime=0') 25 | .then(response => { 26 | response.status.should.eql(200); 27 | response.body.should.eql({index : 0}); 28 | done(); 29 | }) 30 | }); 31 | 32 | it('Should respond back with the correct step - 1', (done) => { 33 | chai.request(server) 34 | .get('/recipes/step/4?elapsedTime=11') 35 | .then(response => { 36 | response.status.should.eql(200); 37 | response.body.should.eql({index : 0}); 38 | done(); 39 | }) 40 | }) 41 | 42 | it('Should respond back with the correct step - 2', (done) => { 43 | chai.request(server) 44 | .get('/recipes/step/2?elapsedTime=9') 45 | .then(response => { 46 | response.status.should.eql(200); 47 | response.body.should.eql({index : 6}); 48 | done(); 49 | }) 50 | }) 51 | 52 | 53 | }); 54 | -------------------------------------------------------------------------------- /node-pagination-middleware/unit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /node-find-recipe-step/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('express-basics:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '8000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /node-pagination-middleware/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('express-basics:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '8000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /node-find-recipe-step/unit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /node-pagination-middleware/README.md: -------------------------------------------------------------------------------- 1 | # Express: Pagination Middleware 2 | 3 | You have been given the task to write an Express middleware that has to standardize the query, search, and projection parameters for all the endpoints. 4 | 5 | The middleware should parse the query parameter from the URL and create an object containing the following properties: 6 | 7 | - `page:` The page of the resource to fetch. Defaults to 1. [NUMBER] 8 | - `limit:` The number of items to return in a response. Defaults to 3. [NUMBER] 9 | - `skip:` The actual number of items that have to skip while fetching the data. Its value is ((page - 1) * limit). [NUMBER] 10 | - `searchTerm:` The search term to be used in the data-store query. The term is extracted from the q query parameter. [STRING] 11 | - `search:` A Regex expression that can be evaluated to match the names of the items in the recipes. The search should be global and case insensitive ("gi"). [RegexP] 12 | 13 | 14 | The generated object should then be added to the context property in the Express request object, and the control should be forwarded using the next function. 15 | 16 | ### Routes 17 | - `/recipes?page&limit&q` - The route to fetch all the recipes from the data-store. Optional query parameters `page`, `limit`, and `q` help in controlling the number and position of recipes sent back as a response by the server. 18 | 19 | ### Examples 20 | - `/recipes - a GET request to get all recipes` 21 | ```json 22 | { 23 | "page":1, 24 | "limit":3, 25 | "skip":0, 26 | "data":[ 27 | { 28 | "id":1, 29 | "name":"Roast" 30 | }, 31 | { 32 | "id":2, 33 | "name":"Asparagus" 34 | }, 35 | { 36 | "id":3, 37 | "name":"Rice" 38 | } 39 | ] 40 | } 41 | ``` 42 | 43 | - `/recipes?page=1&limit=2` 44 | ```json 45 | { 46 | "page":1, 47 | "limit":2, 48 | "skip":0, 49 | "data":[ 50 | { 51 | "id":1, 52 | "name":"Roast" 53 | }, 54 | { 55 | "id":2, 56 | "name":"Asparagus" 57 | } 58 | ] 59 | } 60 | ``` 61 | 62 | - `/recipes?page=2&limit=3` 63 | ```json 64 | { 65 | "page":2, 66 | "limit":3, 67 | "skip":3, 68 | "data":[ 69 | { 70 | "id":4, 71 | "name":"Pizza" 72 | }, 73 | { 74 | "id":5, 75 | "name":"Recipe" 76 | }, 77 | { 78 | "id":6, 79 | "name":"Puds" 80 | } 81 | ] 82 | } 83 | ``` 84 | 85 | - `/recipes?page=1&limit=3&q=cr` 86 | ```json 87 | { 88 | "page":1, 89 | "limit":3, 90 | "skip":0, 91 | "search":"cr", 92 | "data":[ 93 | { 94 | "id":1, 95 | "name":"Crock" 96 | }, 97 | { 98 | "id":5, 99 | "name":"Cranberry" 100 | } 101 | ] 102 | } 103 | ``` 104 | 105 | ### Project Specifications 106 | 107 | **Read-Only Paths** 108 | - test 109 | - bin 110 | 111 | **Commands** 112 | - run: `npm start` 113 | - install: `npm install` 114 | - test: `npm test` 115 | -------------------------------------------------------------------------------- /node-find-recipe-step/README.md: -------------------------------------------------------------------------------- 1 | # Express: Find Recipe Step 2 | 3 | The request to the route `/recipes/step/:id?elapsedTime` returns the index of the current step of the recipe based on the elapsed time in the format `{"index: currentIndex}`. 4 | 5 | If the ID passed in the URL is missing or is not a valid number, the server should respond with the status code 400 and the string message `NOT_FOUND` in the body of the response. If the elapsedTime query parameter is not present in the URL, it should default to 0. 6 | 7 | 8 | _Note: Elapsed time should be interpreted as a Number, and the unit of measurement is the same as the unit of measurement for the timers (i.e., minutes)._ 9 | 10 | Each Recipe object has a list of steps, stored in the steps property, and the corresponding timers, stored in the timers property. The steps and timers are two different arrays, but they are interpreted in combination with each other. The time required to finish step 1 (index 0) of the steps array is stored in the 0th index of the timer array. 11 | 12 | ```json 13 | { 14 | "id": 2, 15 | "name": "Roasted Asparagus", 16 | "steps": [ 17 | "Preheat oven to 425°F.", 18 | "Cut off the woody bottom part of the asparagus spears and discard.", 19 | "With a vegetable peeler, peel off the skin on the bottom 2-3 inches of the spears (this keeps the asparagus from being all and if you eat asparagus you know what I mean by that).", 20 | "Place asparagus on foil-lined baking sheet and drizzle with olive oil.", 21 | "Sprinkle with salt.", 22 | "With your hands, roll the asparagus around until they are evenly coated with oil and salt.", 23 | "Roast for 10-15 minutes, depending on the thickness of your stalks and how tender you like them.", 24 | "They should be tender when pierced with the tip of a knife.", 25 | "The tips of the spears will get very brown but watch them to prevent burning.", 26 | "They are great plain, but sometimes I serve them with a light vinaigrette if we need something acidic to balance out our meal." 27 | ], 28 | "timers": [ 29 | 0, 30 | 0, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 10, 36 | 0, 37 | 0, 38 | 0 39 | ] 40 | }, 41 | ``` 42 | 43 | ### Routes 44 | - `/recipes/step/:id?elapsedTime` - The id parameter should be used to filter the results based on the ID of the object provided. If the ID is not valid or is not a valid number, the server should send a status code 400 with `NOT_FOUND` in the body of the response. 45 | 46 | ### Examples 47 | - `/recipes/step/4?elapsedTime=11` 48 | ```text 49 | Outptut - {index: 0} 50 | ``` 51 | 52 | #### Explanation 53 | The ID of the recipe in the URL is 4. The recipe with ID 4 has the following properties: 54 | ```json 55 | { 56 | "id": 4, 57 | "name": "Big Night Pizza", 58 | "steps": [ 59 | "Add hot water to yeast in a large bowl and let sit for 15 minutes.", 60 | "Mix in oil, sugar, salt, and flour and let sit for 1 hour.", 61 | ... 62 | ], 63 | "timers": [ 64 | 15, 65 | 60, 66 | ... 67 | ] 68 | } 69 | ``` 70 | 71 | 72 | The elapsed time sent as query param is 11. This roughly translates to, "Which step will be active for this recipe when 11 minutes have passed after starting the recipe?" 73 | 74 | The step at index 0 has a timer property of 15. So after 11 minutes, step 1 will be the current step, and its index is 0, which is the final output. 75 | 76 | - `/recipes/step/wqw` 77 | ```text 78 | Status Code - 400 79 | Body - NOT_FOUND 80 | ``` 81 | 82 | ### Project Specifications 83 | 84 | **Read-Only Paths** 85 | - test 86 | - bin 87 | - recipes.json 88 | 89 | **Commands** 90 | - run: `npm start` 91 | - install: `npm install` 92 | - test: `npm test` 93 | -------------------------------------------------------------------------------- /node-pagination-middleware/test/index.spec.js: -------------------------------------------------------------------------------- 1 | const chai = require('chai'); 2 | const chaiHttp = require('chai-http'); 3 | const server = require('../app'); 4 | const should = chai.should(); 5 | const sinon = require('sinon'); 6 | const middleware = require('../middleware'); 7 | const {Request, Response} = require('./mock'); 8 | 9 | chai.use(chaiHttp); 10 | 11 | describe('express_pagination_middleware', () => { 12 | let req, res, next; 13 | beforeEach(() => { 14 | req = new Request({ 15 | url: '/recipes', 16 | query: {} 17 | }); 18 | res = new Response(); 19 | next = sinon.stub() 20 | }); 21 | 22 | it('Should have the context object in the request', () => { 23 | middleware(req, res, next); 24 | req.should.have.property('context'); 25 | }); 26 | 27 | it('Should have property id, timestamp, path in trace object', () => { 28 | middleware(req, res, next); 29 | req.context.should.have.property('page'); 30 | req.context.should.have.property('limit'); 31 | req.context.should.have.property('skip'); 32 | req.context.should.have.property('search'); 33 | req.context.should.have.property('searchTerm'); 34 | }); 35 | 36 | it('Should have the default page, limit and skip property values', () => { 37 | middleware(req, res, next); 38 | req.context.page.should.equal(1); 39 | req.context.skip.should.equal(0); 40 | req.context.limit.should.equal(3); 41 | }); 42 | 43 | it('Should set the correct skip value based on page and limit', () => { 44 | req.query.page = 6; 45 | req.query.limit = 25; 46 | middleware(req, res, next); 47 | req.context.page.should.equal(6); 48 | req.context.skip.should.equal(125); 49 | req.context.limit.should.equal(25); 50 | }); 51 | 52 | 53 | it('Should have a valid search property in context object', () => { 54 | const term = [...Array(10)].map(_ => (Math.random() * 36 | 0).toString(36)).join``; 55 | req.query.q = term; 56 | middleware(req, res, next); 57 | req.context.searchTerm.should.equal(term); 58 | }) 59 | 60 | it('Should respond with the correct data - 1 ', (done) => { 61 | chai.request(server) 62 | .get('/recipes?q=c&page=1&limit=4') 63 | .then(({body}) => { 64 | body.page.should.equal(1); 65 | body.skip.should.equal(0); 66 | body.limit.should.equal(4); 67 | body.search.should.equal('c'); 68 | body.data.length.should.equal(4); 69 | body.data.forEach(d => { 70 | switch (d.id) { 71 | case 1: 72 | d.name.should.equal('Crock Pot Roast') 73 | break; 74 | 75 | case 3: 76 | d.name.should.equal('Curried Lentils and Rice'); 77 | break; 78 | 79 | case 5: 80 | d.name.should.equal('Cranberry and Apple Stuffed Acorn Squash Recipe'); 81 | break; 82 | 83 | case 6: 84 | d.name.should.equal("Mic's Yorkshire Puds") 85 | break; 86 | } 87 | }) 88 | done(); 89 | }) 90 | }); 91 | 92 | it('Should respond with the correct data - 2', (done) => { 93 | chai.request(server) 94 | .get('/recipes?page=3&limit=4') 95 | .then(({body}) => { 96 | body.data.length.should.equal(1); 97 | body.data[0].name.should.equal('Curried chicken salad'); 98 | done(); 99 | }) 100 | }); 101 | }); 102 | -------------------------------------------------------------------------------- /node-find-recipe-step/recipes.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "Crock Pot Roast", 5 | "steps": [ 6 | "Place beef roast in crock pot.", 7 | "Mix the dried mixes together in a bowl and sprinkle over the roast.", 8 | "Pour the water around the roast.", 9 | "Cook on low for 7-9 hours." 10 | ], 11 | "timers": [ 12 | 0, 13 | 0, 14 | 0, 15 | 420 16 | ] 17 | }, 18 | { 19 | "id": 2, 20 | "name": "Roasted Asparagus", 21 | "steps": [ 22 | "Preheat oven to 425°F.", 23 | "Cut off the woody bottom part of the asparagus spears and discard.", 24 | "With a vegetable peeler, peel off the skin on the bottom 2-3 inches of the spears (this keeps the asparagus from being all and if you eat asparagus you know what I mean by that).", 25 | "Place asparagus on foil-lined baking sheet and drizzle with olive oil.", 26 | "Sprinkle with salt.", 27 | "With your hands, roll the asparagus around until they are evenly coated with oil and salt.", 28 | "Roast for 10-15 minutes, depending on the thickness of your stalks and how tender you like them.", 29 | "They should be tender when pierced with the tip of a knife.", 30 | "The tips of the spears will get very brown but watch them to prevent burning.", 31 | "They are great plain, but sometimes I serve them with a light vinaigrette if we need something acidic to balance out our meal." 32 | ], 33 | "timers": [ 34 | 0, 35 | 0, 36 | 0, 37 | 0, 38 | 0, 39 | 0, 40 | 10, 41 | 0, 42 | 0, 43 | 0 44 | ] 45 | }, 46 | { 47 | "id": 3, 48 | "name": "Curried Lentils and Rice", 49 | "steps": [ 50 | "Bring broth to a low boil.", 51 | "Add curry powder and salt.", 52 | "Cook lentils for 20 minutes.", 53 | "Add rice and simmer for 20 minutes.", 54 | "Enjoy!" 55 | ], 56 | "timers": [ 57 | 0, 58 | 0, 59 | 20, 60 | 20, 61 | 0 62 | ] 63 | }, 64 | { 65 | "id": 4, 66 | "name": "Big Night Pizza", 67 | "steps": [ 68 | "Add hot water to yeast in a large bowl and let sit for 15 minutes.", 69 | "Mix in oil, sugar, salt, and flour and let sit for 1 hour.", 70 | "Knead the dough and spread onto a pan.", 71 | "Spread pizza sauce and sprinkle cheese.", 72 | "Add any optional toppings as you wish.", 73 | "Bake at 400 deg Fahrenheit for 15 minutes.", 74 | "Enjoy!" 75 | ], 76 | "timers": [ 77 | 15, 78 | 60, 79 | 0, 80 | 0, 81 | 0, 82 | 15, 83 | 0 84 | ] 85 | }, 86 | { 87 | "id": 5, 88 | "name": "Cranberry and Apple Stuffed Acorn Squash Recipe", 89 | "steps": [ 90 | "Cut squash in half, remove seeds.", 91 | "Place squash in baking dish, cut-side down.", 92 | "Pour 1/4-inch water into dish.", 93 | "Bake for 30 minutes at 350 degrees F.", 94 | "In large bowl, combine remaining ingredients.", 95 | "Remove squash from oven, fill with mix.", 96 | "Bake for 30-40 more minutes, until squash tender.", 97 | "Enjoy!" 98 | ], 99 | "timers": [ 100 | 0, 101 | 0, 102 | 0, 103 | 30, 104 | 0, 105 | 0, 106 | 30, 107 | 0 108 | ] 109 | }, 110 | { 111 | "id": 6, 112 | "name": "Mic's Yorkshire Puds", 113 | "steps": [ 114 | "Put the flour and some seasoning into a large bowl.", 115 | "Stir in eggs, one at a time.", 116 | "Whisk in milk until you have a smooth batter.", 117 | "Chill in the fridge for at least 30 minutes.", 118 | "Heat oven to 220C/gas mark 7.", 119 | "Pour the oil into the holes of a 8-hole muffin tin.", 120 | "Heat tin in the oven for 5 minutes.", 121 | "Ladle the batter mix into the tin.", 122 | "Bake for 30 minutes until well browned and risen." 123 | ], 124 | "timers": [ 125 | 0, 126 | 0, 127 | 0, 128 | 30, 129 | 0, 130 | 0, 131 | 5, 132 | 0, 133 | 30 134 | ] 135 | }, 136 | { 137 | "id": 7, 138 | "name": "Old-Fashioned Oatmeal Cookies", 139 | "steps": [ 140 | "Simmer raisins and water over medium heat until raisins are plump, about 15 minutes.", 141 | "Drain raisins, reserving the liquid.", 142 | "Add enough water to reserved liquid to measure 1/2 cup.", 143 | "Heat oven to 400°.", 144 | "Mix thoroughly shortening, sugar, eggs and vanilla.", 145 | "Stir in reserved liquid.", 146 | "Blend in remaining ingredients.", 147 | "Drop dough by rounded teaspoonfuls about 2 inches apart onto ungreased baking sheet.", 148 | "Bake 8 to 10 minutes or until light brown.", 149 | "About 6 1/2 dozen cookies." 150 | ], 151 | "timers": [ 152 | 15, 153 | 0, 154 | 0, 155 | 0, 156 | 0, 157 | 0, 158 | 0, 159 | 0, 160 | 8, 161 | 0 162 | ] 163 | }, 164 | { 165 | "id": 8, 166 | "name": "Blueberry Oatmeal Squares", 167 | "steps": [ 168 | "Filling: In saucepan, bring blueberries, sugar and orange juice to boil; reduce heat and simmer until tender, about 10 minutes.", 169 | "Whisk cornstarch with 2 tbsp (25 mL) water; whisk into blueberries and boil, stirring, until thickened, about 1 minute.", 170 | "Place plastic wrap directly on surface; refrigerate until cooled, about 1 hour.", 171 | "In large bowl, whisk together oats, flour, sugar, orange rind and salt ; with pastry blender, cut in butter until in coarse crumbs.", 172 | "Press half into 8-inch (2 L) square parchment paper–lined metal cake pan; spread with blueberry filling.", 173 | "Bake in centre of 350°F oven until light golden, about 45 minutes.", 174 | "Let cool on rack before cutting into squares.", 175 | "(Make-ahead: Cover and refrigerate for up to 2 days or overwrap with heavy-duty foil and freeze for up to 2 weeks.)" 176 | ], 177 | "timers": [ 178 | 10, 179 | 1, 180 | 60, 181 | 0, 182 | 0, 183 | 45, 184 | 0, 185 | 0 186 | ] 187 | }, 188 | { 189 | "id": 9, 190 | "name": "Curried chicken salad", 191 | "steps": [ 192 | "ARRANGE chicken in a single layer in a large pot.", 193 | "Add water to just cover.", 194 | "Bring to a boil over medium-high.", 195 | "Flip chicken, reduce heat to medium and simmer until cooked, about 6 more min.", 196 | "Cool.", 197 | "STIR mayo with lemon zest, juice, curry and salt in large bowl.", 198 | "Using 2 forks, shred chicken, then stir into mayo mixture with mango, cranberries, green onions and celery.", 199 | "Divide among muffins with lettuce leaves", 200 | "Sandwich with tops" 201 | ], 202 | "timers": [ 203 | 0, 204 | 0, 205 | 0, 206 | 6, 207 | 0, 208 | 0, 209 | 0, 210 | 0, 211 | 0 212 | ] 213 | } 214 | ] 215 | -------------------------------------------------------------------------------- /node-find-recipe-step/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-routes", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/chai": { 8 | "version": "4.2.9", 9 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.9.tgz", 10 | "integrity": "sha512-NeXgZj+MFL4izGqA4sapdYzkzQG+MtGra9vhQ58dnmDY++VgJaRUws+aLVV5zRJCYJl/8s9IjMmhiUw1WsKSmw==" 11 | }, 12 | "@types/cookiejar": { 13 | "version": "2.1.1", 14 | "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", 15 | "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==" 16 | }, 17 | "@types/node": { 18 | "version": "13.7.7", 19 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.7.tgz", 20 | "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==" 21 | }, 22 | "@types/superagent": { 23 | "version": "3.8.7", 24 | "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", 25 | "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", 26 | "requires": { 27 | "@types/cookiejar": "*", 28 | "@types/node": "*" 29 | } 30 | }, 31 | "accepts": { 32 | "version": "1.3.7", 33 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 34 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 35 | "requires": { 36 | "mime-types": "~2.1.24", 37 | "negotiator": "0.6.2" 38 | } 39 | }, 40 | "acorn": { 41 | "version": "2.7.0", 42 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 43 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 44 | }, 45 | "acorn-globals": { 46 | "version": "1.0.9", 47 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 48 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 49 | "requires": { 50 | "acorn": "^2.1.0" 51 | } 52 | }, 53 | "align-text": { 54 | "version": "0.1.4", 55 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 56 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 57 | "requires": { 58 | "kind-of": "^3.0.2", 59 | "longest": "^1.0.1", 60 | "repeat-string": "^1.5.2" 61 | } 62 | }, 63 | "amdefine": { 64 | "version": "1.0.1", 65 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 66 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 67 | }, 68 | "ansi-colors": { 69 | "version": "3.2.3", 70 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 71 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" 72 | }, 73 | "ansi-regex": { 74 | "version": "3.0.0", 75 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 76 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 77 | }, 78 | "ansi-styles": { 79 | "version": "3.2.1", 80 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 81 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 82 | "requires": { 83 | "color-convert": "^1.9.0" 84 | } 85 | }, 86 | "anymatch": { 87 | "version": "3.1.1", 88 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 89 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 90 | "requires": { 91 | "normalize-path": "^3.0.0", 92 | "picomatch": "^2.0.4" 93 | } 94 | }, 95 | "argparse": { 96 | "version": "1.0.10", 97 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 98 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 99 | "requires": { 100 | "sprintf-js": "~1.0.2" 101 | } 102 | }, 103 | "array-flatten": { 104 | "version": "1.1.1", 105 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 106 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 107 | }, 108 | "asap": { 109 | "version": "1.0.0", 110 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 111 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" 112 | }, 113 | "assertion-error": { 114 | "version": "1.1.0", 115 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 116 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" 117 | }, 118 | "asynckit": { 119 | "version": "0.4.0", 120 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 121 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 122 | }, 123 | "balanced-match": { 124 | "version": "1.0.0", 125 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 126 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 127 | }, 128 | "basic-auth": { 129 | "version": "2.0.1", 130 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 131 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 132 | "requires": { 133 | "safe-buffer": "5.1.2" 134 | } 135 | }, 136 | "binary-extensions": { 137 | "version": "2.0.0", 138 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 139 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" 140 | }, 141 | "bluebird": { 142 | "version": "3.7.2", 143 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 144 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" 145 | }, 146 | "body-parser": { 147 | "version": "1.18.3", 148 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 149 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 150 | "requires": { 151 | "bytes": "3.0.0", 152 | "content-type": "~1.0.4", 153 | "debug": "2.6.9", 154 | "depd": "~1.1.2", 155 | "http-errors": "~1.6.3", 156 | "iconv-lite": "0.4.23", 157 | "on-finished": "~2.3.0", 158 | "qs": "6.5.2", 159 | "raw-body": "2.3.3", 160 | "type-is": "~1.6.16" 161 | } 162 | }, 163 | "brace-expansion": { 164 | "version": "1.1.11", 165 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 166 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 167 | "requires": { 168 | "balanced-match": "^1.0.0", 169 | "concat-map": "0.0.1" 170 | } 171 | }, 172 | "braces": { 173 | "version": "3.0.2", 174 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 175 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 176 | "requires": { 177 | "fill-range": "^7.0.1" 178 | } 179 | }, 180 | "browser-stdout": { 181 | "version": "1.3.1", 182 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 183 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" 184 | }, 185 | "bytes": { 186 | "version": "3.0.0", 187 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 188 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 189 | }, 190 | "camelcase": { 191 | "version": "1.2.1", 192 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 193 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 194 | }, 195 | "center-align": { 196 | "version": "0.1.3", 197 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 198 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 199 | "requires": { 200 | "align-text": "^0.1.3", 201 | "lazy-cache": "^1.0.3" 202 | } 203 | }, 204 | "chai": { 205 | "version": "4.2.0", 206 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 207 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 208 | "requires": { 209 | "assertion-error": "^1.1.0", 210 | "check-error": "^1.0.2", 211 | "deep-eql": "^3.0.1", 212 | "get-func-name": "^2.0.0", 213 | "pathval": "^1.1.0", 214 | "type-detect": "^4.0.5" 215 | } 216 | }, 217 | "chai-http": { 218 | "version": "4.3.0", 219 | "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", 220 | "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", 221 | "requires": { 222 | "@types/chai": "4", 223 | "@types/superagent": "^3.8.3", 224 | "cookiejar": "^2.1.1", 225 | "is-ip": "^2.0.0", 226 | "methods": "^1.1.2", 227 | "qs": "^6.5.1", 228 | "superagent": "^3.7.0" 229 | } 230 | }, 231 | "chalk": { 232 | "version": "2.4.2", 233 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 234 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 235 | "requires": { 236 | "ansi-styles": "^3.2.1", 237 | "escape-string-regexp": "^1.0.5", 238 | "supports-color": "^5.3.0" 239 | }, 240 | "dependencies": { 241 | "supports-color": { 242 | "version": "5.5.0", 243 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 244 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 245 | "requires": { 246 | "has-flag": "^3.0.0" 247 | } 248 | } 249 | } 250 | }, 251 | "character-parser": { 252 | "version": "1.2.1", 253 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", 254 | "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" 255 | }, 256 | "charenc": { 257 | "version": "0.0.2", 258 | "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", 259 | "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" 260 | }, 261 | "check-error": { 262 | "version": "1.0.2", 263 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 264 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" 265 | }, 266 | "chokidar": { 267 | "version": "3.3.0", 268 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 269 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 270 | "requires": { 271 | "anymatch": "~3.1.1", 272 | "braces": "~3.0.2", 273 | "fsevents": "~2.1.1", 274 | "glob-parent": "~5.1.0", 275 | "is-binary-path": "~2.1.0", 276 | "is-glob": "~4.0.1", 277 | "normalize-path": "~3.0.0", 278 | "readdirp": "~3.2.0" 279 | } 280 | }, 281 | "clean-css": { 282 | "version": "3.4.28", 283 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", 284 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", 285 | "requires": { 286 | "commander": "2.8.x", 287 | "source-map": "0.4.x" 288 | }, 289 | "dependencies": { 290 | "commander": { 291 | "version": "2.8.1", 292 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 293 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 294 | "requires": { 295 | "graceful-readlink": ">= 1.0.0" 296 | } 297 | } 298 | } 299 | }, 300 | "cliui": { 301 | "version": "2.1.0", 302 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 303 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 304 | "requires": { 305 | "center-align": "^0.1.1", 306 | "right-align": "^0.1.1", 307 | "wordwrap": "0.0.2" 308 | }, 309 | "dependencies": { 310 | "wordwrap": { 311 | "version": "0.0.2", 312 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 313 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 314 | } 315 | } 316 | }, 317 | "color-convert": { 318 | "version": "1.9.3", 319 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 320 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 321 | "requires": { 322 | "color-name": "1.1.3" 323 | } 324 | }, 325 | "color-name": { 326 | "version": "1.1.3", 327 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 328 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 329 | }, 330 | "combined-stream": { 331 | "version": "1.0.8", 332 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 333 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 334 | "requires": { 335 | "delayed-stream": "~1.0.0" 336 | } 337 | }, 338 | "commander": { 339 | "version": "2.6.0", 340 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 341 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" 342 | }, 343 | "component-emitter": { 344 | "version": "1.3.0", 345 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 346 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 347 | }, 348 | "concat-map": { 349 | "version": "0.0.1", 350 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 351 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 352 | }, 353 | "constantinople": { 354 | "version": "3.0.2", 355 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", 356 | "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", 357 | "requires": { 358 | "acorn": "^2.1.0" 359 | } 360 | }, 361 | "content-disposition": { 362 | "version": "0.5.2", 363 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 364 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 365 | }, 366 | "content-type": { 367 | "version": "1.0.4", 368 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 369 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 370 | }, 371 | "cookie": { 372 | "version": "0.3.1", 373 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 374 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 375 | }, 376 | "cookie-parser": { 377 | "version": "1.4.4", 378 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", 379 | "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", 380 | "requires": { 381 | "cookie": "0.3.1", 382 | "cookie-signature": "1.0.6" 383 | } 384 | }, 385 | "cookie-signature": { 386 | "version": "1.0.6", 387 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 388 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 389 | }, 390 | "cookiejar": { 391 | "version": "2.1.2", 392 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", 393 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" 394 | }, 395 | "core-util-is": { 396 | "version": "1.0.2", 397 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 398 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 399 | }, 400 | "cross-env": { 401 | "version": "7.0.2", 402 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", 403 | "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", 404 | "dev": true, 405 | "requires": { 406 | "cross-spawn": "^7.0.1" 407 | } 408 | }, 409 | "cross-spawn": { 410 | "version": "7.0.1", 411 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", 412 | "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", 413 | "dev": true, 414 | "requires": { 415 | "path-key": "^3.1.0", 416 | "shebang-command": "^2.0.0", 417 | "which": "^2.0.1" 418 | }, 419 | "dependencies": { 420 | "which": { 421 | "version": "2.0.2", 422 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 423 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 424 | "dev": true, 425 | "requires": { 426 | "isexe": "^2.0.0" 427 | } 428 | } 429 | } 430 | }, 431 | "crypt": { 432 | "version": "0.0.2", 433 | "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", 434 | "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" 435 | }, 436 | "css": { 437 | "version": "1.0.8", 438 | "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", 439 | "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", 440 | "requires": { 441 | "css-parse": "1.0.4", 442 | "css-stringify": "1.0.5" 443 | } 444 | }, 445 | "css-parse": { 446 | "version": "1.0.4", 447 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", 448 | "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" 449 | }, 450 | "css-stringify": { 451 | "version": "1.0.5", 452 | "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", 453 | "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" 454 | }, 455 | "debug": { 456 | "version": "2.6.9", 457 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 458 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 459 | "requires": { 460 | "ms": "2.0.0" 461 | } 462 | }, 463 | "decamelize": { 464 | "version": "1.2.0", 465 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 466 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 467 | }, 468 | "deep-eql": { 469 | "version": "3.0.1", 470 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 471 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 472 | "requires": { 473 | "type-detect": "^4.0.0" 474 | } 475 | }, 476 | "define-properties": { 477 | "version": "1.1.3", 478 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 479 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 480 | "requires": { 481 | "object-keys": "^1.0.12" 482 | } 483 | }, 484 | "delayed-stream": { 485 | "version": "1.0.0", 486 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 487 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 488 | }, 489 | "depd": { 490 | "version": "1.1.2", 491 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 492 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 493 | }, 494 | "destroy": { 495 | "version": "1.0.4", 496 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 497 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 498 | }, 499 | "diff": { 500 | "version": "3.5.0", 501 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 502 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" 503 | }, 504 | "ee-first": { 505 | "version": "1.1.1", 506 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 507 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 508 | }, 509 | "emoji-regex": { 510 | "version": "7.0.3", 511 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 512 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 513 | }, 514 | "encodeurl": { 515 | "version": "1.0.2", 516 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 517 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 518 | }, 519 | "es-abstract": { 520 | "version": "1.17.4", 521 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 522 | "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 523 | "requires": { 524 | "es-to-primitive": "^1.2.1", 525 | "function-bind": "^1.1.1", 526 | "has": "^1.0.3", 527 | "has-symbols": "^1.0.1", 528 | "is-callable": "^1.1.5", 529 | "is-regex": "^1.0.5", 530 | "object-inspect": "^1.7.0", 531 | "object-keys": "^1.1.1", 532 | "object.assign": "^4.1.0", 533 | "string.prototype.trimleft": "^2.1.1", 534 | "string.prototype.trimright": "^2.1.1" 535 | } 536 | }, 537 | "es-to-primitive": { 538 | "version": "1.2.1", 539 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 540 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 541 | "requires": { 542 | "is-callable": "^1.1.4", 543 | "is-date-object": "^1.0.1", 544 | "is-symbol": "^1.0.2" 545 | } 546 | }, 547 | "escape-html": { 548 | "version": "1.0.3", 549 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 550 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 551 | }, 552 | "escape-string-regexp": { 553 | "version": "1.0.5", 554 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 555 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 556 | }, 557 | "esprima": { 558 | "version": "4.0.1", 559 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 560 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 561 | }, 562 | "etag": { 563 | "version": "1.8.1", 564 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 565 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 566 | }, 567 | "express": { 568 | "version": "4.16.4", 569 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 570 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 571 | "requires": { 572 | "accepts": "~1.3.5", 573 | "array-flatten": "1.1.1", 574 | "body-parser": "1.18.3", 575 | "content-disposition": "0.5.2", 576 | "content-type": "~1.0.4", 577 | "cookie": "0.3.1", 578 | "cookie-signature": "1.0.6", 579 | "debug": "2.6.9", 580 | "depd": "~1.1.2", 581 | "encodeurl": "~1.0.2", 582 | "escape-html": "~1.0.3", 583 | "etag": "~1.8.1", 584 | "finalhandler": "1.1.1", 585 | "fresh": "0.5.2", 586 | "merge-descriptors": "1.0.1", 587 | "methods": "~1.1.2", 588 | "on-finished": "~2.3.0", 589 | "parseurl": "~1.3.2", 590 | "path-to-regexp": "0.1.7", 591 | "proxy-addr": "~2.0.4", 592 | "qs": "6.5.2", 593 | "range-parser": "~1.2.0", 594 | "safe-buffer": "5.1.2", 595 | "send": "0.16.2", 596 | "serve-static": "1.13.2", 597 | "setprototypeof": "1.1.0", 598 | "statuses": "~1.4.0", 599 | "type-is": "~1.6.16", 600 | "utils-merge": "1.0.1", 601 | "vary": "~1.1.2" 602 | } 603 | }, 604 | "extend": { 605 | "version": "3.0.2", 606 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 607 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 608 | }, 609 | "fill-range": { 610 | "version": "7.0.1", 611 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 612 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 613 | "requires": { 614 | "to-regex-range": "^5.0.1" 615 | } 616 | }, 617 | "finalhandler": { 618 | "version": "1.1.1", 619 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 620 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 621 | "requires": { 622 | "debug": "2.6.9", 623 | "encodeurl": "~1.0.2", 624 | "escape-html": "~1.0.3", 625 | "on-finished": "~2.3.0", 626 | "parseurl": "~1.3.2", 627 | "statuses": "~1.4.0", 628 | "unpipe": "~1.0.0" 629 | } 630 | }, 631 | "find-up": { 632 | "version": "3.0.0", 633 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 634 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 635 | "requires": { 636 | "locate-path": "^3.0.0" 637 | } 638 | }, 639 | "flat": { 640 | "version": "4.1.0", 641 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 642 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 643 | "requires": { 644 | "is-buffer": "~2.0.3" 645 | }, 646 | "dependencies": { 647 | "is-buffer": { 648 | "version": "2.0.4", 649 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 650 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 651 | } 652 | } 653 | }, 654 | "form-data": { 655 | "version": "2.5.1", 656 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 657 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 658 | "requires": { 659 | "asynckit": "^0.4.0", 660 | "combined-stream": "^1.0.6", 661 | "mime-types": "^2.1.12" 662 | } 663 | }, 664 | "formidable": { 665 | "version": "1.2.2", 666 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", 667 | "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" 668 | }, 669 | "forwarded": { 670 | "version": "0.1.2", 671 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 672 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 673 | }, 674 | "fresh": { 675 | "version": "0.5.2", 676 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 677 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 678 | }, 679 | "fs.realpath": { 680 | "version": "1.0.0", 681 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 682 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 683 | }, 684 | "fsevents": { 685 | "version": "2.1.2", 686 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", 687 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", 688 | "optional": true 689 | }, 690 | "function-bind": { 691 | "version": "1.1.1", 692 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 693 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 694 | }, 695 | "get-caller-file": { 696 | "version": "2.0.5", 697 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 698 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 699 | }, 700 | "get-func-name": { 701 | "version": "2.0.0", 702 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 703 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" 704 | }, 705 | "glob": { 706 | "version": "7.1.3", 707 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 708 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 709 | "requires": { 710 | "fs.realpath": "^1.0.0", 711 | "inflight": "^1.0.4", 712 | "inherits": "2", 713 | "minimatch": "^3.0.4", 714 | "once": "^1.3.0", 715 | "path-is-absolute": "^1.0.0" 716 | } 717 | }, 718 | "glob-parent": { 719 | "version": "5.1.2", 720 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 721 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 722 | "requires": { 723 | "is-glob": "^4.0.1" 724 | } 725 | }, 726 | "graceful-readlink": { 727 | "version": "1.0.1", 728 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 729 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 730 | }, 731 | "growl": { 732 | "version": "1.10.5", 733 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 734 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" 735 | }, 736 | "has": { 737 | "version": "1.0.3", 738 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 739 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 740 | "requires": { 741 | "function-bind": "^1.1.1" 742 | } 743 | }, 744 | "has-flag": { 745 | "version": "3.0.0", 746 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 747 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 748 | }, 749 | "has-symbols": { 750 | "version": "1.0.1", 751 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 752 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 753 | }, 754 | "he": { 755 | "version": "1.2.0", 756 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 757 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 758 | }, 759 | "http-errors": { 760 | "version": "1.6.3", 761 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 762 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 763 | "requires": { 764 | "depd": "~1.1.2", 765 | "inherits": "2.0.3", 766 | "setprototypeof": "1.1.0", 767 | "statuses": ">= 1.4.0 < 2" 768 | } 769 | }, 770 | "iconv-lite": { 771 | "version": "0.4.23", 772 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 773 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 774 | "requires": { 775 | "safer-buffer": ">= 2.1.2 < 3" 776 | } 777 | }, 778 | "inflight": { 779 | "version": "1.0.6", 780 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 781 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 782 | "requires": { 783 | "once": "^1.3.0", 784 | "wrappy": "1" 785 | } 786 | }, 787 | "inherits": { 788 | "version": "2.0.3", 789 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 790 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 791 | }, 792 | "ip-regex": { 793 | "version": "2.1.0", 794 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", 795 | "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" 796 | }, 797 | "ipaddr.js": { 798 | "version": "1.9.1", 799 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 800 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 801 | }, 802 | "is-binary-path": { 803 | "version": "2.1.0", 804 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 805 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 806 | "requires": { 807 | "binary-extensions": "^2.0.0" 808 | } 809 | }, 810 | "is-buffer": { 811 | "version": "1.1.6", 812 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 813 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 814 | }, 815 | "is-callable": { 816 | "version": "1.1.5", 817 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 818 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 819 | }, 820 | "is-date-object": { 821 | "version": "1.0.2", 822 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 823 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 824 | }, 825 | "is-extglob": { 826 | "version": "2.1.1", 827 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 828 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 829 | }, 830 | "is-fullwidth-code-point": { 831 | "version": "2.0.0", 832 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 833 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 834 | }, 835 | "is-glob": { 836 | "version": "4.0.1", 837 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 838 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 839 | "requires": { 840 | "is-extglob": "^2.1.1" 841 | } 842 | }, 843 | "is-ip": { 844 | "version": "2.0.0", 845 | "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", 846 | "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", 847 | "requires": { 848 | "ip-regex": "^2.0.0" 849 | } 850 | }, 851 | "is-number": { 852 | "version": "7.0.0", 853 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 854 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 855 | }, 856 | "is-promise": { 857 | "version": "2.1.0", 858 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 859 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 860 | }, 861 | "is-regex": { 862 | "version": "1.0.5", 863 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 864 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 865 | "requires": { 866 | "has": "^1.0.3" 867 | } 868 | }, 869 | "is-symbol": { 870 | "version": "1.0.3", 871 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 872 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 873 | "requires": { 874 | "has-symbols": "^1.0.1" 875 | } 876 | }, 877 | "isarray": { 878 | "version": "1.0.0", 879 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 880 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 881 | }, 882 | "isexe": { 883 | "version": "2.0.0", 884 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 885 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 886 | }, 887 | "jade": { 888 | "version": "1.11.0", 889 | "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", 890 | "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", 891 | "requires": { 892 | "character-parser": "1.2.1", 893 | "clean-css": "^3.1.9", 894 | "commander": "~2.6.0", 895 | "constantinople": "~3.0.1", 896 | "jstransformer": "0.0.2", 897 | "mkdirp": "~0.5.0", 898 | "transformers": "2.1.0", 899 | "uglify-js": "^2.4.19", 900 | "void-elements": "~2.0.1", 901 | "with": "~4.0.0" 902 | } 903 | }, 904 | "js-yaml": { 905 | "version": "3.13.1", 906 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 907 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 908 | "requires": { 909 | "argparse": "^1.0.7", 910 | "esprima": "^4.0.0" 911 | } 912 | }, 913 | "jstransformer": { 914 | "version": "0.0.2", 915 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", 916 | "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", 917 | "requires": { 918 | "is-promise": "^2.0.0", 919 | "promise": "^6.0.1" 920 | } 921 | }, 922 | "kind-of": { 923 | "version": "3.2.2", 924 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 925 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 926 | "requires": { 927 | "is-buffer": "^1.1.5" 928 | } 929 | }, 930 | "lazy-cache": { 931 | "version": "1.0.4", 932 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 933 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 934 | }, 935 | "locate-path": { 936 | "version": "3.0.0", 937 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 938 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 939 | "requires": { 940 | "p-locate": "^3.0.0", 941 | "path-exists": "^3.0.0" 942 | } 943 | }, 944 | "lodash": { 945 | "version": "4.17.21", 946 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 947 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 948 | }, 949 | "log-symbols": { 950 | "version": "3.0.0", 951 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 952 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 953 | "requires": { 954 | "chalk": "^2.4.2" 955 | } 956 | }, 957 | "longest": { 958 | "version": "1.0.1", 959 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 960 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 961 | }, 962 | "md5": { 963 | "version": "2.2.1", 964 | "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", 965 | "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", 966 | "requires": { 967 | "charenc": "~0.0.1", 968 | "crypt": "~0.0.1", 969 | "is-buffer": "~1.1.1" 970 | } 971 | }, 972 | "media-typer": { 973 | "version": "0.3.0", 974 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 975 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 976 | }, 977 | "merge-descriptors": { 978 | "version": "1.0.1", 979 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 980 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 981 | }, 982 | "methods": { 983 | "version": "1.1.2", 984 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 985 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 986 | }, 987 | "mime": { 988 | "version": "1.4.1", 989 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 990 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 991 | }, 992 | "mime-db": { 993 | "version": "1.43.0", 994 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 995 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 996 | }, 997 | "mime-types": { 998 | "version": "2.1.26", 999 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 1000 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 1001 | "requires": { 1002 | "mime-db": "1.43.0" 1003 | } 1004 | }, 1005 | "minimatch": { 1006 | "version": "3.0.4", 1007 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1008 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1009 | "requires": { 1010 | "brace-expansion": "^1.1.7" 1011 | } 1012 | }, 1013 | "minimist": { 1014 | "version": "0.0.8", 1015 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1016 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1017 | }, 1018 | "mkdirp": { 1019 | "version": "0.5.1", 1020 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1021 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1022 | "requires": { 1023 | "minimist": "0.0.8" 1024 | } 1025 | }, 1026 | "mocha": { 1027 | "version": "7.1.0", 1028 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.0.tgz", 1029 | "integrity": "sha512-MymHK8UkU0K15Q/zX7uflZgVoRWiTjy0fXE/QjKts6mowUvGxOdPhZ2qj3b0iZdUrNZlW9LAIMFHB4IW+2b3EQ==", 1030 | "requires": { 1031 | "ansi-colors": "3.2.3", 1032 | "browser-stdout": "1.3.1", 1033 | "chokidar": "3.3.0", 1034 | "debug": "3.2.6", 1035 | "diff": "3.5.0", 1036 | "escape-string-regexp": "1.0.5", 1037 | "find-up": "3.0.0", 1038 | "glob": "7.1.3", 1039 | "growl": "1.10.5", 1040 | "he": "1.2.0", 1041 | "js-yaml": "3.13.1", 1042 | "log-symbols": "3.0.0", 1043 | "minimatch": "3.0.4", 1044 | "mkdirp": "0.5.1", 1045 | "ms": "2.1.1", 1046 | "node-environment-flags": "1.0.6", 1047 | "object.assign": "4.1.0", 1048 | "strip-json-comments": "2.0.1", 1049 | "supports-color": "6.0.0", 1050 | "which": "1.3.1", 1051 | "wide-align": "1.1.3", 1052 | "yargs": "13.3.0", 1053 | "yargs-parser": "13.1.1", 1054 | "yargs-unparser": "1.6.0" 1055 | }, 1056 | "dependencies": { 1057 | "ansi-regex": { 1058 | "version": "4.1.0", 1059 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1060 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 1061 | }, 1062 | "camelcase": { 1063 | "version": "5.3.1", 1064 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1065 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 1066 | }, 1067 | "cliui": { 1068 | "version": "5.0.0", 1069 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 1070 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 1071 | "requires": { 1072 | "string-width": "^3.1.0", 1073 | "strip-ansi": "^5.2.0", 1074 | "wrap-ansi": "^5.1.0" 1075 | } 1076 | }, 1077 | "debug": { 1078 | "version": "3.2.6", 1079 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1080 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1081 | "requires": { 1082 | "ms": "^2.1.1" 1083 | } 1084 | }, 1085 | "ms": { 1086 | "version": "2.1.1", 1087 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1088 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1089 | }, 1090 | "string-width": { 1091 | "version": "3.1.0", 1092 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1093 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1094 | "requires": { 1095 | "emoji-regex": "^7.0.1", 1096 | "is-fullwidth-code-point": "^2.0.0", 1097 | "strip-ansi": "^5.1.0" 1098 | } 1099 | }, 1100 | "strip-ansi": { 1101 | "version": "5.2.0", 1102 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1103 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1104 | "requires": { 1105 | "ansi-regex": "^4.1.0" 1106 | } 1107 | }, 1108 | "yargs": { 1109 | "version": "13.3.0", 1110 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1111 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1112 | "requires": { 1113 | "cliui": "^5.0.0", 1114 | "find-up": "^3.0.0", 1115 | "get-caller-file": "^2.0.1", 1116 | "require-directory": "^2.1.1", 1117 | "require-main-filename": "^2.0.0", 1118 | "set-blocking": "^2.0.0", 1119 | "string-width": "^3.0.0", 1120 | "which-module": "^2.0.0", 1121 | "y18n": "^4.0.0", 1122 | "yargs-parser": "^13.1.1" 1123 | }, 1124 | "dependencies": { 1125 | "y18n": { 1126 | "version": "4.0.3", 1127 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 1128 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" 1129 | } 1130 | } 1131 | }, 1132 | "yargs-parser": { 1133 | "version": "13.1.1", 1134 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 1135 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 1136 | "requires": { 1137 | "camelcase": "^5.0.0", 1138 | "decamelize": "^1.2.0" 1139 | } 1140 | } 1141 | } 1142 | }, 1143 | "mocha-junit-reporter": { 1144 | "version": "1.23.3", 1145 | "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz", 1146 | "integrity": "sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==", 1147 | "requires": { 1148 | "debug": "^2.2.0", 1149 | "md5": "^2.1.0", 1150 | "mkdirp": "~0.5.1", 1151 | "strip-ansi": "^4.0.0", 1152 | "xml": "^1.0.0" 1153 | } 1154 | }, 1155 | "mocha-multi-reporters": { 1156 | "version": "1.1.7", 1157 | "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz", 1158 | "integrity": "sha1-zH8/TTL0eFIJQdhSq7ZNmYhYfYI=", 1159 | "requires": { 1160 | "debug": "^3.1.0", 1161 | "lodash": "^4.16.4" 1162 | }, 1163 | "dependencies": { 1164 | "debug": { 1165 | "version": "3.2.6", 1166 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1167 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1168 | "requires": { 1169 | "ms": "^2.1.1" 1170 | } 1171 | }, 1172 | "ms": { 1173 | "version": "2.1.2", 1174 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1175 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1176 | } 1177 | } 1178 | }, 1179 | "morgan": { 1180 | "version": "1.9.1", 1181 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1182 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1183 | "requires": { 1184 | "basic-auth": "~2.0.0", 1185 | "debug": "2.6.9", 1186 | "depd": "~1.1.2", 1187 | "on-finished": "~2.3.0", 1188 | "on-headers": "~1.0.1" 1189 | } 1190 | }, 1191 | "ms": { 1192 | "version": "2.0.0", 1193 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1194 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1195 | }, 1196 | "negotiator": { 1197 | "version": "0.6.2", 1198 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1199 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1200 | }, 1201 | "node-environment-flags": { 1202 | "version": "1.0.6", 1203 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", 1204 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", 1205 | "requires": { 1206 | "object.getownpropertydescriptors": "^2.0.3", 1207 | "semver": "^5.7.0" 1208 | } 1209 | }, 1210 | "normalize-path": { 1211 | "version": "3.0.0", 1212 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1213 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1214 | }, 1215 | "object-inspect": { 1216 | "version": "1.7.0", 1217 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1218 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 1219 | }, 1220 | "object-keys": { 1221 | "version": "1.1.1", 1222 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1223 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1224 | }, 1225 | "object.assign": { 1226 | "version": "4.1.0", 1227 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1228 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1229 | "requires": { 1230 | "define-properties": "^1.1.2", 1231 | "function-bind": "^1.1.1", 1232 | "has-symbols": "^1.0.0", 1233 | "object-keys": "^1.0.11" 1234 | } 1235 | }, 1236 | "object.getownpropertydescriptors": { 1237 | "version": "2.1.0", 1238 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 1239 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 1240 | "requires": { 1241 | "define-properties": "^1.1.3", 1242 | "es-abstract": "^1.17.0-next.1" 1243 | } 1244 | }, 1245 | "on-finished": { 1246 | "version": "2.3.0", 1247 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1248 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1249 | "requires": { 1250 | "ee-first": "1.1.1" 1251 | } 1252 | }, 1253 | "on-headers": { 1254 | "version": "1.0.2", 1255 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1256 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 1257 | }, 1258 | "once": { 1259 | "version": "1.4.0", 1260 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1261 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1262 | "requires": { 1263 | "wrappy": "1" 1264 | } 1265 | }, 1266 | "optimist": { 1267 | "version": "0.3.7", 1268 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 1269 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 1270 | "requires": { 1271 | "wordwrap": "~0.0.2" 1272 | } 1273 | }, 1274 | "p-limit": { 1275 | "version": "2.2.2", 1276 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", 1277 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", 1278 | "requires": { 1279 | "p-try": "^2.0.0" 1280 | } 1281 | }, 1282 | "p-locate": { 1283 | "version": "3.0.0", 1284 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1285 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1286 | "requires": { 1287 | "p-limit": "^2.0.0" 1288 | } 1289 | }, 1290 | "p-try": { 1291 | "version": "2.2.0", 1292 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1293 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1294 | }, 1295 | "parseurl": { 1296 | "version": "1.3.3", 1297 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1298 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1299 | }, 1300 | "path-exists": { 1301 | "version": "3.0.0", 1302 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1303 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1304 | }, 1305 | "path-is-absolute": { 1306 | "version": "1.0.1", 1307 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1308 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1309 | }, 1310 | "path-key": { 1311 | "version": "3.1.1", 1312 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1313 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1314 | "dev": true 1315 | }, 1316 | "path-to-regexp": { 1317 | "version": "0.1.7", 1318 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1319 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1320 | }, 1321 | "pathval": { 1322 | "version": "1.1.1", 1323 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1324 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" 1325 | }, 1326 | "picomatch": { 1327 | "version": "2.2.1", 1328 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", 1329 | "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" 1330 | }, 1331 | "process-nextick-args": { 1332 | "version": "2.0.1", 1333 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1334 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1335 | }, 1336 | "promise": { 1337 | "version": "6.1.0", 1338 | "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", 1339 | "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", 1340 | "requires": { 1341 | "asap": "~1.0.0" 1342 | } 1343 | }, 1344 | "proxy-addr": { 1345 | "version": "2.0.6", 1346 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1347 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1348 | "requires": { 1349 | "forwarded": "~0.1.2", 1350 | "ipaddr.js": "1.9.1" 1351 | } 1352 | }, 1353 | "qs": { 1354 | "version": "6.5.2", 1355 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1356 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1357 | }, 1358 | "range-parser": { 1359 | "version": "1.2.1", 1360 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1361 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1362 | }, 1363 | "raw-body": { 1364 | "version": "2.3.3", 1365 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 1366 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 1367 | "requires": { 1368 | "bytes": "3.0.0", 1369 | "http-errors": "1.6.3", 1370 | "iconv-lite": "0.4.23", 1371 | "unpipe": "1.0.0" 1372 | } 1373 | }, 1374 | "readable-stream": { 1375 | "version": "2.3.7", 1376 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1377 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1378 | "requires": { 1379 | "core-util-is": "~1.0.0", 1380 | "inherits": "~2.0.3", 1381 | "isarray": "~1.0.0", 1382 | "process-nextick-args": "~2.0.0", 1383 | "safe-buffer": "~5.1.1", 1384 | "string_decoder": "~1.1.1", 1385 | "util-deprecate": "~1.0.1" 1386 | } 1387 | }, 1388 | "readdirp": { 1389 | "version": "3.2.0", 1390 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 1391 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 1392 | "requires": { 1393 | "picomatch": "^2.0.4" 1394 | } 1395 | }, 1396 | "repeat-string": { 1397 | "version": "1.6.1", 1398 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1399 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 1400 | }, 1401 | "require-directory": { 1402 | "version": "2.1.1", 1403 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1404 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1405 | }, 1406 | "require-main-filename": { 1407 | "version": "2.0.0", 1408 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1409 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1410 | }, 1411 | "right-align": { 1412 | "version": "0.1.3", 1413 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1414 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1415 | "requires": { 1416 | "align-text": "^0.1.1" 1417 | } 1418 | }, 1419 | "safe-buffer": { 1420 | "version": "5.1.2", 1421 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1422 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1423 | }, 1424 | "safer-buffer": { 1425 | "version": "2.1.2", 1426 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1427 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1428 | }, 1429 | "semver": { 1430 | "version": "5.7.1", 1431 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1432 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1433 | }, 1434 | "send": { 1435 | "version": "0.16.2", 1436 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1437 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1438 | "requires": { 1439 | "debug": "2.6.9", 1440 | "depd": "~1.1.2", 1441 | "destroy": "~1.0.4", 1442 | "encodeurl": "~1.0.2", 1443 | "escape-html": "~1.0.3", 1444 | "etag": "~1.8.1", 1445 | "fresh": "0.5.2", 1446 | "http-errors": "~1.6.2", 1447 | "mime": "1.4.1", 1448 | "ms": "2.0.0", 1449 | "on-finished": "~2.3.0", 1450 | "range-parser": "~1.2.0", 1451 | "statuses": "~1.4.0" 1452 | } 1453 | }, 1454 | "serve-static": { 1455 | "version": "1.13.2", 1456 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1457 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1458 | "requires": { 1459 | "encodeurl": "~1.0.2", 1460 | "escape-html": "~1.0.3", 1461 | "parseurl": "~1.3.2", 1462 | "send": "0.16.2" 1463 | } 1464 | }, 1465 | "set-blocking": { 1466 | "version": "2.0.0", 1467 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1468 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1469 | }, 1470 | "setprototypeof": { 1471 | "version": "1.1.0", 1472 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1473 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1474 | }, 1475 | "shebang-command": { 1476 | "version": "2.0.0", 1477 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1478 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1479 | "dev": true, 1480 | "requires": { 1481 | "shebang-regex": "^3.0.0" 1482 | } 1483 | }, 1484 | "shebang-regex": { 1485 | "version": "3.0.0", 1486 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1487 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1488 | "dev": true 1489 | }, 1490 | "source-map": { 1491 | "version": "0.4.4", 1492 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 1493 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 1494 | "requires": { 1495 | "amdefine": ">=0.0.4" 1496 | } 1497 | }, 1498 | "sprintf-js": { 1499 | "version": "1.0.3", 1500 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1501 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1502 | }, 1503 | "statuses": { 1504 | "version": "1.4.0", 1505 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1506 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1507 | }, 1508 | "string-width": { 1509 | "version": "2.1.1", 1510 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1511 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1512 | "requires": { 1513 | "is-fullwidth-code-point": "^2.0.0", 1514 | "strip-ansi": "^4.0.0" 1515 | } 1516 | }, 1517 | "string.prototype.trimleft": { 1518 | "version": "2.1.1", 1519 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1520 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1521 | "requires": { 1522 | "define-properties": "^1.1.3", 1523 | "function-bind": "^1.1.1" 1524 | } 1525 | }, 1526 | "string.prototype.trimright": { 1527 | "version": "2.1.1", 1528 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1529 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1530 | "requires": { 1531 | "define-properties": "^1.1.3", 1532 | "function-bind": "^1.1.1" 1533 | } 1534 | }, 1535 | "string_decoder": { 1536 | "version": "1.1.1", 1537 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1538 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1539 | "requires": { 1540 | "safe-buffer": "~5.1.0" 1541 | } 1542 | }, 1543 | "strip-ansi": { 1544 | "version": "4.0.0", 1545 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1546 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1547 | "requires": { 1548 | "ansi-regex": "^3.0.0" 1549 | } 1550 | }, 1551 | "strip-json-comments": { 1552 | "version": "2.0.1", 1553 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1554 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1555 | }, 1556 | "superagent": { 1557 | "version": "3.8.3", 1558 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", 1559 | "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", 1560 | "requires": { 1561 | "component-emitter": "^1.2.0", 1562 | "cookiejar": "^2.1.0", 1563 | "debug": "^3.1.0", 1564 | "extend": "^3.0.0", 1565 | "form-data": "^2.3.1", 1566 | "formidable": "^1.2.0", 1567 | "methods": "^1.1.1", 1568 | "mime": "^1.4.1", 1569 | "qs": "^6.5.1", 1570 | "readable-stream": "^2.3.5" 1571 | }, 1572 | "dependencies": { 1573 | "debug": { 1574 | "version": "3.2.6", 1575 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1576 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1577 | "requires": { 1578 | "ms": "^2.1.1" 1579 | } 1580 | }, 1581 | "ms": { 1582 | "version": "2.1.2", 1583 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1584 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1585 | } 1586 | } 1587 | }, 1588 | "supports-color": { 1589 | "version": "6.0.0", 1590 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 1591 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 1592 | "requires": { 1593 | "has-flag": "^3.0.0" 1594 | } 1595 | }, 1596 | "to-regex-range": { 1597 | "version": "5.0.1", 1598 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1599 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1600 | "requires": { 1601 | "is-number": "^7.0.0" 1602 | } 1603 | }, 1604 | "transformers": { 1605 | "version": "2.1.0", 1606 | "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", 1607 | "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", 1608 | "requires": { 1609 | "css": "~1.0.8", 1610 | "promise": "~2.0", 1611 | "uglify-js": "~2.2.5" 1612 | }, 1613 | "dependencies": { 1614 | "is-promise": { 1615 | "version": "1.0.1", 1616 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", 1617 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" 1618 | }, 1619 | "promise": { 1620 | "version": "2.0.0", 1621 | "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", 1622 | "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", 1623 | "requires": { 1624 | "is-promise": "~1" 1625 | } 1626 | }, 1627 | "source-map": { 1628 | "version": "0.1.43", 1629 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 1630 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 1631 | "requires": { 1632 | "amdefine": ">=0.0.4" 1633 | } 1634 | }, 1635 | "uglify-js": { 1636 | "version": "2.2.5", 1637 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 1638 | "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", 1639 | "requires": { 1640 | "optimist": "~0.3.5", 1641 | "source-map": "~0.1.7" 1642 | } 1643 | } 1644 | } 1645 | }, 1646 | "type-detect": { 1647 | "version": "4.0.8", 1648 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1649 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" 1650 | }, 1651 | "type-is": { 1652 | "version": "1.6.18", 1653 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1654 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1655 | "requires": { 1656 | "media-typer": "0.3.0", 1657 | "mime-types": "~2.1.24" 1658 | } 1659 | }, 1660 | "uglify-js": { 1661 | "version": "2.8.29", 1662 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 1663 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 1664 | "requires": { 1665 | "source-map": "~0.5.1", 1666 | "uglify-to-browserify": "~1.0.0", 1667 | "yargs": "~3.10.0" 1668 | }, 1669 | "dependencies": { 1670 | "source-map": { 1671 | "version": "0.5.7", 1672 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1673 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1674 | } 1675 | } 1676 | }, 1677 | "uglify-to-browserify": { 1678 | "version": "1.0.2", 1679 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1680 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1681 | "optional": true 1682 | }, 1683 | "unpipe": { 1684 | "version": "1.0.0", 1685 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1686 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1687 | }, 1688 | "util-deprecate": { 1689 | "version": "1.0.2", 1690 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1691 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1692 | }, 1693 | "utils-merge": { 1694 | "version": "1.0.1", 1695 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1696 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1697 | }, 1698 | "vary": { 1699 | "version": "1.1.2", 1700 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1701 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1702 | }, 1703 | "void-elements": { 1704 | "version": "2.0.1", 1705 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 1706 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 1707 | }, 1708 | "which": { 1709 | "version": "1.3.1", 1710 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1711 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1712 | "requires": { 1713 | "isexe": "^2.0.0" 1714 | } 1715 | }, 1716 | "which-module": { 1717 | "version": "2.0.0", 1718 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1719 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1720 | }, 1721 | "wide-align": { 1722 | "version": "1.1.3", 1723 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1724 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1725 | "requires": { 1726 | "string-width": "^1.0.2 || 2" 1727 | } 1728 | }, 1729 | "window-size": { 1730 | "version": "0.1.0", 1731 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1732 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 1733 | }, 1734 | "with": { 1735 | "version": "4.0.3", 1736 | "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", 1737 | "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", 1738 | "requires": { 1739 | "acorn": "^1.0.1", 1740 | "acorn-globals": "^1.0.3" 1741 | }, 1742 | "dependencies": { 1743 | "acorn": { 1744 | "version": "1.2.2", 1745 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 1746 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 1747 | } 1748 | } 1749 | }, 1750 | "wordwrap": { 1751 | "version": "0.0.3", 1752 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1753 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 1754 | }, 1755 | "wrap-ansi": { 1756 | "version": "5.1.0", 1757 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1758 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1759 | "requires": { 1760 | "ansi-styles": "^3.2.0", 1761 | "string-width": "^3.0.0", 1762 | "strip-ansi": "^5.0.0" 1763 | }, 1764 | "dependencies": { 1765 | "ansi-regex": { 1766 | "version": "4.1.1", 1767 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 1768 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" 1769 | }, 1770 | "string-width": { 1771 | "version": "3.1.0", 1772 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1773 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1774 | "requires": { 1775 | "emoji-regex": "^7.0.1", 1776 | "is-fullwidth-code-point": "^2.0.0", 1777 | "strip-ansi": "^5.1.0" 1778 | } 1779 | }, 1780 | "strip-ansi": { 1781 | "version": "5.2.0", 1782 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1783 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1784 | "requires": { 1785 | "ansi-regex": "^4.1.0" 1786 | } 1787 | } 1788 | } 1789 | }, 1790 | "wrappy": { 1791 | "version": "1.0.2", 1792 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1793 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1794 | }, 1795 | "xml": { 1796 | "version": "1.0.1", 1797 | "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", 1798 | "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" 1799 | }, 1800 | "yargs": { 1801 | "version": "3.10.0", 1802 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1803 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1804 | "requires": { 1805 | "camelcase": "^1.0.2", 1806 | "cliui": "^2.1.0", 1807 | "decamelize": "^1.0.0", 1808 | "window-size": "0.1.0" 1809 | } 1810 | }, 1811 | "yargs-unparser": { 1812 | "version": "1.6.0", 1813 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1814 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 1815 | "requires": { 1816 | "flat": "^4.1.0", 1817 | "lodash": "^4.17.15", 1818 | "yargs": "^13.3.0" 1819 | }, 1820 | "dependencies": { 1821 | "ansi-regex": { 1822 | "version": "4.1.0", 1823 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1824 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 1825 | }, 1826 | "camelcase": { 1827 | "version": "5.3.1", 1828 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1829 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 1830 | }, 1831 | "cliui": { 1832 | "version": "5.0.0", 1833 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 1834 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 1835 | "requires": { 1836 | "string-width": "^3.1.0", 1837 | "strip-ansi": "^5.2.0", 1838 | "wrap-ansi": "^5.1.0" 1839 | } 1840 | }, 1841 | "string-width": { 1842 | "version": "3.1.0", 1843 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1844 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1845 | "requires": { 1846 | "emoji-regex": "^7.0.1", 1847 | "is-fullwidth-code-point": "^2.0.0", 1848 | "strip-ansi": "^5.1.0" 1849 | } 1850 | }, 1851 | "strip-ansi": { 1852 | "version": "5.2.0", 1853 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1854 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1855 | "requires": { 1856 | "ansi-regex": "^4.1.0" 1857 | } 1858 | }, 1859 | "yargs": { 1860 | "version": "13.3.0", 1861 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1862 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1863 | "requires": { 1864 | "cliui": "^5.0.0", 1865 | "find-up": "^3.0.0", 1866 | "get-caller-file": "^2.0.1", 1867 | "require-directory": "^2.1.1", 1868 | "require-main-filename": "^2.0.0", 1869 | "set-blocking": "^2.0.0", 1870 | "string-width": "^3.0.0", 1871 | "which-module": "^2.0.0", 1872 | "y18n": "^4.0.0", 1873 | "yargs-parser": "^13.1.1" 1874 | }, 1875 | "dependencies": { 1876 | "y18n": { 1877 | "version": "4.0.3", 1878 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 1879 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" 1880 | }, 1881 | "yargs-parser": { 1882 | "version": "13.1.2", 1883 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 1884 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 1885 | "requires": { 1886 | "camelcase": "^5.0.0", 1887 | "decamelize": "^1.2.0" 1888 | } 1889 | } 1890 | } 1891 | } 1892 | } 1893 | } 1894 | } 1895 | } 1896 | --------------------------------------------------------------------------------