└── 1_Why_Test ├── 1.4_The_Test_Suite ├── .gitignore ├── commands.sh ├── bin │ ├── wdio-test │ ├── mocha-test │ ├── setup │ └── www ├── server.config.js ├── public │ └── stylesheets │ │ └── style.css ├── database.js ├── views │ ├── layouts │ │ └── app.handlebars │ └── index.handlebars ├── .eslintrc.js ├── routes │ └── index.js ├── package.json ├── wdio.conf.js ├── models │ └── order.js ├── circle.yml ├── README.md ├── app.js ├── test │ ├── models │ │ └── order-test.js │ ├── routes │ │ └── index-test.js │ └── features │ │ └── user-visits-root-test.js └── package-lock.json ├── 1.1_Introduction └── commands.sh ├── 1.2_Manual_Testing └── commands.sh ├── 1.3_Automated_Testing └── commands.sh └── 1.2_Cake_O_Clock_Project ├── commands.sh ├── server.config.js ├── database.js ├── views ├── layouts │ └── app.handlebars └── index.handlebars ├── routes └── index.js ├── wdio.conf.js ├── package.json ├── circle.yml ├── models └── order.js ├── README.md ├── app.js ├── test ├── models │ └── order-test.js ├── features │ └── user-visits-index-test.js └── routes │ └── index-test.js └── public └── stylesheets └── style.css /1_Why_Test/1.4_The_Test_Suite/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /1_Why_Test/1.1_Introduction/commands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm start 3 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Manual_Testing/commands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm start 3 | -------------------------------------------------------------------------------- /1_Why_Test/1.3_Automated_Testing/commands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm test 3 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/commands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm test 3 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/commands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | npm start 4 | npm test 5 | npm test 6 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/bin/wdio-test: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | 3 | set -e 4 | 5 | export NODE_ENV=test 6 | wdio wdio.conf.js 7 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/server.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | development: { 3 | port: 4001, 4 | }, 5 | test: { 6 | port: 8001, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/server.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | development: { 3 | port: 4001, 4 | }, 5 | test: { 6 | port: 8001, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/bin/mocha-test: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | 3 | set -e 4 | 5 | export NODE_ENV=test 6 | tests_that_are_not_features="$(ls test/**/*-test.js | grep -v features)" 7 | 8 | mocha ${tests_that_are_not_features} 9 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/database.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | mongoose.Promise = global.Promise; 3 | 4 | const env = process.env.NODE_ENV || 'development'; 5 | const databaseUrl = process.env.DATABASE_URL || `mongodb://localhost/why-test_${env}`; 6 | const options= { 7 | useMongoClient: true, 8 | }; 9 | 10 | module.exports = { 11 | mongoose, 12 | databaseUrl, 13 | options, 14 | }; 15 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/database.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | mongoose.Promise = global.Promise; 3 | 4 | const env = process.env.NODE_ENV || 'development'; 5 | const databaseUrl = process.env.DATABASE_URL || `mongodb://localhost/why-test_${env}`; 6 | const options = { 7 | useMongoClient: true, 8 | }; 9 | 10 | module.exports = { 11 | mongoose, 12 | databaseUrl, 13 | options, 14 | }; 15 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/views/layouts/app.handlebars: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ title }} 5 | 6 | 7 | 8 | 9 | 10 | {{{ body }}} 11 | 12 | 13 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/views/layouts/app.handlebars: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ title }} 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{{ body }}} 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "extends": "google", 3 | "parserOptions": { 4 | "ecmaVersion": 8, 5 | "env": { 6 | "browser": true, 7 | "node": true, 8 | "es6": true 9 | } 10 | }, 11 | "rules": { 12 | // Required to override Google styleguide rules we do not enforce 13 | "arrow-parens": ["off"], 14 | "require-jsdoc": ["off"], 15 | "new-cap": ["off"], 16 | }, 17 | }; -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/bin/setup: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | if ! command -v brew > /dev/null; then 6 | echo 7 | echo "Install homebrew: see https://brew.sh" 8 | echo 9 | exit 1 10 | fi 11 | 12 | packages=" 13 | coreutils 14 | selenium-server-standalone 15 | mongodb 16 | " 17 | 18 | for package in $packages; do 19 | brew install $package || true 20 | done 21 | 22 | brew cask install java 23 | 24 | cat << EOF 25 | 26 | ----- 27 | 28 | To have launchd start mongodb now and restart at login: 29 | 30 | $ brew services start mongodb 31 | 32 | Or, if you don't want/need a background service you can just run: 33 | 34 | $ mongod --config /usr/local/etc/mongod.conf 35 | 36 | ----- 37 | 38 | EOF 39 | 40 | npm install 41 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const router = express.Router(); 4 | const Order = require('../models/order'); 5 | 6 | router.get('/', async (req, res) => { 7 | const order = await Order.findOne({}); 8 | 9 | res.render('index', { order }); 10 | }); 11 | 12 | router.post('/place-order', async (req, res) => { 13 | const { name, cakeType, fillings, size } = req.body; 14 | 15 | const order = await Order.updateOrCreate({ name, cakeType, fillings, size }) 16 | res.redirect('/'); 17 | }); 18 | 19 | /* 20 | router.post('/clear-order', async (req, res) => { 21 | await Order.deleteOne({}); 22 | 23 | res.redirect('/'); 24 | }); 25 | */ 26 | 27 | module.exports = router; 28 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const router = express.Router(); 4 | const Order = require('../models/order'); 5 | 6 | router.get('/', async (req, res) => { 7 | const order = await Order.findOne({}); 8 | 9 | res.render('index', { order }); 10 | }); 11 | 12 | router.post('/place-order', async (req, res) => { 13 | const { name, cakeType, fillings, size, pickUp } = req.body; 14 | 15 | const order = await Order.updateOrCreate({ name, cakeType, fillings, size, pickUp }); 16 | res.redirect('/'); 17 | }); 18 | 19 | router.post('/clear-order', async (req, res) => { 20 | await Order.deleteOne({}); 21 | 22 | res.redirect('/'); 23 | }); 24 | 25 | module.exports = router; 26 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calculator-js", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www", 7 | "test": "bin/wdio-test" 8 | }, 9 | "dependencies": { 10 | "body-parser": "1.17.1", 11 | "cookie-parser": "1.4.3", 12 | "debug": "2.6.3", 13 | "express": "4.15.2", 14 | "express-handlebars": "3.0.0", 15 | "jsdom": "9.12.0", 16 | "mongoose": "4.11.13", 17 | "morgan": "1.8.1", 18 | "serve-favicon": "2.4.2" 19 | }, 20 | "devDependencies": { 21 | "chai": "3.5.0", 22 | "eslint-config-google": "0.9.1", 23 | "mocha": "3.0.0", 24 | "supertest": "3.0.0", 25 | "wdio-mocha-framework": "0.4.0", 26 | "wdio-phantomjs-service": "0.2.2", 27 | "wdio-spec-reporter": "0.1.2", 28 | "webdriverio": "4.2.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/wdio.conf.js: -------------------------------------------------------------------------------- 1 | const app = require('./app'); 2 | const port = process.env.PORT || require('./server.config').test.port; 3 | const {mongoose, databaseUrl, options} = require('./database'); 4 | 5 | let expressServer; 6 | 7 | exports.config = { 8 | specs: [ 9 | 'test/features/*.js', 10 | ], 11 | coloredLogs: true, 12 | baseUrl: `http://localhost:${port}/`, 13 | framework: 'mocha', 14 | reporters: ['spec'], 15 | waitforTimeout: 10 * 1000, 16 | capabilities: [{ 17 | browserName: 'phantomjs', 18 | }], 19 | services: ['phantomjs'], 20 | 21 | async beforeTest() { 22 | await mongoose.connect(databaseUrl, options); 23 | await mongoose.connection.db.dropDatabase(); 24 | expressServer = app.listen(port); 25 | }, 26 | 27 | async afterTest() { 28 | await mongoose.disconnect(); 29 | expressServer.close(); 30 | }, 31 | }; 32 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/wdio.conf.js: -------------------------------------------------------------------------------- 1 | const app = require('./app'); 2 | const port = process.env.PORT || require('./server.config').test.port; 3 | const { mongoose, databaseUrl, options } = require('./database'); 4 | 5 | let expressServer; 6 | 7 | exports.config = { 8 | specs: [ 9 | 'test/features/*.js', 10 | ], 11 | coloredLogs: true, 12 | baseUrl: `http://localhost:${port}/`, 13 | framework: 'mocha', 14 | reporters: ['spec'], 15 | waitforTimeout: 10 * 1000, 16 | capabilities: [{ 17 | browserName: 'phantomjs', 18 | }], 19 | services: ['phantomjs'], 20 | 21 | async beforeTest() { 22 | await mongoose.connect(databaseUrl, options); 23 | await mongoose.connection.db.dropDatabase(); 24 | expressServer = app.listen(port); 25 | }, 26 | 27 | async afterTest() { 28 | await mongoose.disconnect(); 29 | expressServer.close(); 30 | }, 31 | }; 32 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cake-bar-js", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www", 7 | "test": "bin/wdio-test" 8 | }, 9 | "dependencies": { 10 | "body-parser": "~1.17.1", 11 | "cookie-parser": "~1.4.3", 12 | "debug": "~2.6.3", 13 | "express": "~4.15.2", 14 | "express-handlebars": "^3.0.0", 15 | "jsdom": "9.12.0", 16 | "mongoose": "^4.11.13", 17 | "morgan": "~1.8.1", 18 | "serve-favicon": "~2.4.2" 19 | }, 20 | "devDependencies": { 21 | "chai": "3.5.0", 22 | "eslint-config-google": "^0.9.1", 23 | "mocha": "^3.0.0", 24 | "supertest": "^3.0.0", 25 | "wdio-mocha-framework": "^0.4.0", 26 | "wdio-phantomjs-service": "^0.2.2", 27 | "wdio-spec-reporter": "^0.1.2", 28 | "webdriverio": "^4.2.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/models/order.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const orderSchema = mongoose.Schema({ 4 | cakeType: { type: String }, 5 | name: { type: String }, 6 | fillings: { type: [] }, 7 | size: { type: String }, 8 | }); 9 | 10 | orderSchema.statics.updateOrCreate = async function(attributes, callback) { 11 | const firstOrder = await this.findOne({}); 12 | 13 | if (firstOrder) { 14 | firstOrder.name = attributes.name || firstOrder.name; 15 | firstOrder.cakeType = attributes.cakeType || firstOrder.cakeType; 16 | if (attributes.fillings && (typeof attributes.fillings === 'string')) { 17 | attributes.fillings = [attributes.fillings]; 18 | }; 19 | firstOrder.fillings = attributes.fillings || firstOrder.fillings; 20 | firstOrder.size = attributes.size || firstOrder.size; 21 | return firstOrder.save(callback); 22 | } else { 23 | return this.create(attributes, callback); 24 | } 25 | }; 26 | 27 | module.exports = mongoose.model('Order', orderSchema); 28 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/circle.yml: -------------------------------------------------------------------------------- 1 | # Javascript Node CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details 4 | # 5 | version: 2 6 | jobs: 7 | build: 8 | docker: 9 | # specify the version you desire here 10 | - image: circleci/node:7.10 11 | - image: circleci/openjdk:9 12 | - image: selenium/standalone-chrome:3.1.0 13 | - image: circleci/mongo:3.4.4 14 | 15 | working_directory: ~/repo 16 | 17 | steps: 18 | - checkout 19 | 20 | # Download and cache dependencies 21 | - restore_cache: 22 | keys: 23 | - v1-dependencies-{{ checksum "package.json" }} 24 | # fallback to using the latest cache if no exact match is found 25 | - v1-dependencies- 26 | 27 | - run: yarn install 28 | 29 | - save_cache: 30 | paths: 31 | - node_modules 32 | key: v1-dependencies-{{ checksum "package.json" }} 33 | 34 | # run tests! 35 | - run: yarn test 36 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/models/order.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const orderSchema = mongoose.Schema({ 4 | cakeType: { type: String }, 5 | name: { type: String }, 6 | fillings: { type: [] }, 7 | size: { type: String }, 8 | pickUp: { 9 | type: String, 10 | } 11 | }); 12 | 13 | orderSchema.statics.updateOrCreate = async function (attributes, callback) { 14 | const firstOrder = await this.findOne({}); 15 | 16 | if (firstOrder) { 17 | firstOrder.name = attributes.name || firstOrder.name; 18 | firstOrder.cakeType = attributes.cakeType || firstOrder.cakeType; 19 | firstOrder.fillings = attributes.fillings || firstOrder.fillings; 20 | firstOrder.size = attributes.size || firstOrder.size; 21 | firstOrder.pickUp = attributes.pickUp || firstOrder.pickUp; 22 | return firstOrder.save(callback); 23 | } else { 24 | return this.create(attributes, callback); 25 | } 26 | }; 27 | 28 | module.exports = mongoose.model('Order', orderSchema); 29 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/circle.yml: -------------------------------------------------------------------------------- 1 | # Javascript Node CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details 4 | # 5 | version: 2 6 | jobs: 7 | build: 8 | docker: 9 | # specify the version you desire here 10 | - image: circleci/node:7.10 11 | - image: circleci/openjdk:9 12 | - image: selenium/standalone-chrome:3.1.0 13 | - image: circleci/mongo:3.4.4 14 | 15 | working_directory: ~/repo 16 | 17 | steps: 18 | - checkout 19 | 20 | # Download and cache dependencies 21 | - restore_cache: 22 | keys: 23 | - v1-dependencies-{{ checksum "package.json" }} 24 | # fallback to using the latest cache if no exact match is found 25 | - v1-dependencies- 26 | 27 | - run: yarn install 28 | 29 | - save_cache: 30 | paths: 31 | - node_modules 32 | key: v1-dependencies-{{ checksum "package.json" }} 33 | 34 | # run tests! 35 | - run: yarn test 36 | 37 | 38 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/README.md: -------------------------------------------------------------------------------- 1 | # why-test-web-app 2 | 3 | A sample web app for exploratory and internal training purposes. 4 | 5 | ## Getting Started 6 | 7 | These instructions will get you a copy of the project up and running on your local machine. 8 | 9 | ### Installing 10 | 11 | Clone this repo. 12 | 13 | ``` 14 | $ git clone https://github.com/thoughtbot/why-test-web-app.git 15 | ``` 16 | 17 | Run the `setup` script to check for and install dependencies for setup. 18 | 19 | ``` 20 | $ bin/setup 21 | ``` 22 | 23 | To have launchd start mongodb now and restart at login: 24 | 25 | ``` 26 | $ brew services start mongodb 27 | ``` 28 | 29 | Or, if you don't want/need a background service you can just run: 30 | 31 | ``` 32 | $ mongod --config /usr/local/etc/mongod.conf 33 | ``` 34 | 35 | Start up the server. 36 | 37 | ``` 38 | $ npm start 39 | ``` 40 | 41 | Confirm it's working by navigating to [localhost:3000](localhost:3000). 42 | 43 | 44 | ## Running the tests 45 | 46 | Run the test suite with the `test` script. 47 | 48 | ``` 49 | $ npm test 50 | ``` 51 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/README.md: -------------------------------------------------------------------------------- 1 | # why-test-web-app 2 | 3 | A sample web app for exploratory and internal training purposes. 4 | 5 | ## Getting Started 6 | 7 | These instructions will get you a copy of the project up and running on your local machine. 8 | 9 | ### Installing 10 | 11 | Clone this repo. 12 | 13 | ``` 14 | $ git clone https://github.com/thoughtbot/why-test-web-app.git 15 | ``` 16 | 17 | Run the `setup` script to check for and install dependencies for setup. 18 | 19 | ``` 20 | $ bin/setup 21 | ``` 22 | 23 | To have launchd start mongodb now and restart at login: 24 | 25 | ``` 26 | $ brew services start mongodb 27 | ``` 28 | 29 | Or, if you don't want/need a background service you can just run: 30 | 31 | ``` 32 | $ mongod --config /usr/local/etc/mongod.conf 33 | ``` 34 | 35 | Start up the server. 36 | 37 | ``` 38 | $ npm start 39 | ``` 40 | 41 | Confirm it's working by navigating to [localhost:3000](localhost:3000). 42 | 43 | 44 | ## Running the tests 45 | 46 | Run the test suite with the `test` script. 47 | 48 | ``` 49 | $ npm test 50 | ``` 51 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const expressHandlebars = require('express-handlebars'); 3 | const path = require('path'); 4 | const logger = require('morgan'); 5 | const bodyParser = require('body-parser'); 6 | 7 | const index = require('./routes/index'); 8 | 9 | const app = express(); 10 | 11 | // View engine setup 12 | app.engine('handlebars', expressHandlebars({defaultLayout: 'app'})); 13 | app.set('views', path.join(__dirname, 'views')); 14 | app.set('view engine', 'handlebars'); 15 | 16 | //app.use(logger('dev')); 17 | app.use(bodyParser.urlencoded({extended: true})); 18 | app.use(express.static(path.join(__dirname, 'public'))); 19 | 20 | app.use('/', index); 21 | 22 | // Catch 404 and forward to error handler 23 | app.use(function(req, res, next) { 24 | const err = new Error('Not Found'); 25 | err.status = 404; 26 | next(err); 27 | }); 28 | 29 | // Error handler 30 | app.use((err, req, res, next) => { 31 | // Set locals, only providing error in development 32 | res.locals.message = err.message; 33 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 34 | 35 | // Render the error page 36 | res.status(err.status || 500); 37 | //res.render('error'); 38 | }); 39 | 40 | module.exports = app; 41 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const expressHandlebars = require('express-handlebars'); 3 | const path = require('path'); 4 | const logger = require('morgan'); 5 | const bodyParser = require('body-parser'); 6 | 7 | const index = require('./routes/index'); 8 | 9 | const app = express(); 10 | 11 | // View engine setup 12 | app.engine('handlebars', expressHandlebars({ defaultLayout: 'app' })); 13 | app.set('views', path.join(__dirname, 'views')); 14 | app.set('view engine', 'handlebars'); 15 | 16 | //app.use(logger('dev')); 17 | app.use(bodyParser.urlencoded({ extended: true })); 18 | app.use(express.static(path.join(__dirname, 'public'))); 19 | 20 | app.use('/', index); 21 | 22 | // Catch 404 and forward to error handler 23 | app.use(function (req, res, next) { 24 | const err = new Error('Not Found'); 25 | err.status = 404; 26 | next(err); 27 | }); 28 | 29 | // Error handler 30 | app.use((err, req, res, next) => { 31 | // Set locals, only providing error in development 32 | res.locals.message = err.message; 33 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 34 | 35 | // Render the error page 36 | res.status(err.status || 500); 37 | // res.render('error'); 38 | }); 39 | 40 | module.exports = app; 41 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/test/models/order-test.js: -------------------------------------------------------------------------------- 1 | const Message = require('../../models/order'); 2 | const {assert} = require('chai'); 3 | const {mongoose, databaseUrl, options} = require('../../database'); 4 | 5 | describe('Message', () => { 6 | beforeEach(async () => { 7 | await mongoose.connect(databaseUrl, options); 8 | await mongoose.connection.db.dropDatabase(); 9 | }); 10 | 11 | afterEach(async () => { 12 | await mongoose.disconnect(); 13 | }); 14 | 15 | describe('#author', () => { 16 | it('is a String', () => { 17 | const authorAsAnInt = 1; 18 | 19 | const message = new Message({ author: authorAsAnInt }); 20 | 21 | assert.strictEqual(message.author, authorAsAnInt.toString()); 22 | }); 23 | 24 | it('is required', () => { 25 | const message = new Message({ author: null }) 26 | 27 | message.validateSync(); 28 | 29 | const errors = message.errors; 30 | assert.equal(errors.author.message, 'Path `author` is required.'); 31 | }); 32 | }); 33 | 34 | describe('#message', () => { 35 | it('is a String', () => { 36 | const messageAsAnInt = 1; 37 | 38 | const message = new Message({ message: messageAsAnInt }); 39 | 40 | assert.strictEqual(message.message, messageAsAnInt.toString()); 41 | }); 42 | 43 | it('is required', () => { 44 | const message = new Message({ message: null }) 45 | 46 | message.validateSync(); 47 | 48 | const errors = message.errors; 49 | assert.equal(errors.message.message, 'Path `message` is required.'); 50 | }); 51 | }); 52 | }); 53 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | const app = require('../app'); 8 | const http = require('http'); 9 | const {mongoose, databaseUrl, options} = require('../database'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | const port = normalizePort(process.env.PORT || require('../server.config').development.port); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | const server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | mongoose.connect(databaseUrl, options).then(() => { 29 | server.listen(port); 30 | }); 31 | server.on('error', onError); 32 | server.on('listening', onListening); 33 | 34 | /** 35 | * Normalize a port into a number, string, or false. 36 | */ 37 | 38 | function normalizePort(val) { 39 | const port = parseInt(val, 10); 40 | 41 | if (isNaN(port)) { 42 | // Named pipe 43 | return val; 44 | } 45 | 46 | if (port >= 0) { 47 | // Port number 48 | return port; 49 | } 50 | 51 | return false; 52 | } 53 | 54 | /** 55 | * Event listener for HTTP server "error" event. 56 | */ 57 | 58 | function onError(error) { 59 | if (error.syscall !== 'listen') { 60 | throw error; 61 | } 62 | 63 | const bind = typeof port === 'string' 64 | ? 'Pipe ' + port 65 | : 'Port ' + port; 66 | 67 | // handle specific listen errors with friendly messages 68 | switch (error.code) { 69 | case 'EACCES': 70 | console.error(bind + ' requires elevated privileges'); 71 | process.exit(1); 72 | break; 73 | case 'EADDRINUSE': 74 | console.error(bind + ' is already in use'); 75 | process.exit(1); 76 | break; 77 | default: 78 | throw error; 79 | } 80 | } 81 | 82 | /** 83 | * Event listener for HTTP server "listening" event. 84 | */ 85 | 86 | function onListening() { 87 | const addr = server.address(); 88 | const bind = typeof addr === 'string' 89 | ? 'pipe ' + addr 90 | : 'port ' + addr.port; 91 | console.log('Listening on ' + bind); 92 | } 93 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/test/routes/index-test.js: -------------------------------------------------------------------------------- 1 | const {assert} = require('chai'); 2 | const request = require('supertest'); 3 | const {jsdom} = require('jsdom'); 4 | 5 | const app = require('../../app'); 6 | const {mongoose, databaseUrl, options} = require('../database'); 7 | const Message = require('../../models/order'); 8 | 9 | const parseTextFromHTML = (htmlAsString, selector) => { 10 | const selectedElement = jsdom(htmlAsString).querySelector(selector); 11 | if (selectedElement !== null) { 12 | return selectedElement.textContent; 13 | } else { 14 | throw new Error(`No element with selector ${selector} found in HTML string`); 15 | } 16 | }; 17 | 18 | describe('/messages', () => { 19 | beforeEach('Start server', async () => { 20 | await mongoose.connect(databaseUrl, options); 21 | await mongoose.connection.db.dropDatabase(); 22 | }); 23 | 24 | afterEach('Drop database and close server', async () => { 25 | await mongoose.disconnect(); 26 | }); 27 | 28 | describe('POST', () => { 29 | describe('when the Message is valid', () => { 30 | it('creates a new message', async () => { 31 | const author = 'Inquisitive User'; 32 | const message = 'Why Test?'; 33 | 34 | const response = await request(app) 35 | .post('/messages') 36 | .type('form') 37 | .send({author, message}); 38 | 39 | assert.ok(await Message.findOne({message, author}), 'Creates a Message record'); 40 | }); 41 | 42 | it('redirects to the index', async () => { 43 | const author = 'Inquisitive User'; 44 | const message = 'Why Test?'; 45 | 46 | const response = await request(app) 47 | .post('/messages') 48 | .type('form') 49 | .send({author, message}); 50 | 51 | assert.equal(response.status, 302); 52 | assert.equal(response.headers.location, '/'); 53 | }); 54 | }); 55 | 56 | describe('when the author is blank', () => { 57 | it('renders an error message', async () => { 58 | const message = 'Why Test?'; 59 | 60 | const response = await request(app) 61 | .post('/messages') 62 | .send({message}); 63 | 64 | assert.equal(response.status, 400); 65 | assert.include(parseTextFromHTML(response.text, '#message-form'), 'required'); 66 | assert.equal((await Message.find({})).length, 0, 'did not save the Message'); 67 | }); 68 | }); 69 | 70 | describe('when the message is blank', () => { 71 | it('displays an error message', async () => { 72 | const author = 'A User'; 73 | 74 | const response = await request(app) 75 | .post('/messages') 76 | .send({author}); 77 | 78 | assert.equal(response.status, 400); 79 | assert.include(parseTextFromHTML(response.text, '#message-form'), 'required'); 80 | assert.equal((await Message.find({})).length, 0, 'did not save the Message'); 81 | }); 82 | }); 83 | }); 84 | }); 85 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/test/features/user-visits-root-test.js: -------------------------------------------------------------------------------- 1 | const {assert} = require('chai'); 2 | 3 | describe('User visits index', () => { 4 | describe('to post an order', () => { 5 | /* 6 | * Run `npm start` in the terminal and reload the page. Expect the webpage to be visible and the order form to be empty. 7 | */ 8 | // Edit the line below 9 | it('starts with an empty order (Behavior 1)', () => { 10 | browser.url('/'); 11 | 12 | assert.equal(browser.getText('#deliver-to span'), ''); 13 | assert.equal(browser.getText('#cake-type span'), ''); 14 | assert.equal(browser.getText('#fillings span'), ''); 15 | assert.equal(browser.getText('#size span'), ''); 16 | }); 17 | 18 | /* 19 | * Type a name and click "Place Order". Expect "Deliver to:" to display the submitted name. (You may need to scroll down.) 20 | */ 21 | it('displays the submitted name (Behavior 2)', () => { 22 | const name = 'Hungry Person'; 23 | 24 | browser.url('/'); 25 | browser.setValue('#name', name); 26 | browser.click('#submit-order'); 27 | browser.url('/'); 28 | 29 | assert.include(browser.getText('#deliver-to'), name); 30 | }); 31 | 32 | it('does not overwrite name if blank name submitted (Behavior 3)', () => { 33 | const name = 'Hungry Person'; 34 | 35 | browser.url('/'); 36 | browser.setValue('#name', name); 37 | browser.click('#submit-order'); 38 | browser.url('/'); 39 | browser.click('#submit-order'); 40 | browser.url('/'); 41 | 42 | assert.include(browser.getText('#deliver-to'), name); 43 | }); 44 | 45 | /* 46 | * Select a cake type and place the order. Expect "Cake" to display the selected type. 47 | */ 48 | it('displays the selected cake type (Behavior 4)', () => { 49 | const cakeType = 'Whole Wheat'; 50 | 51 | browser.url('/'); 52 | browser.click('#whole-wheat'); 53 | browser.click('#submit-order'); 54 | browser.url('/'); 55 | 56 | assert.include(browser.getText('#cake-type'), cakeType); 57 | }); 58 | 59 | /* 60 | * Check some fillings. Expect "Fillings" to display your selection. 61 | */ 62 | it('displays multiple fillings (Behavior 5)', () => { 63 | const firstChoice = 'Strawberries'; 64 | const secondChoice = 'Banana'; 65 | 66 | browser.url('/'); 67 | browser.click('#strawberries'); 68 | browser.click('#banana'); 69 | browser.click('#submit-order'); 70 | browser.url('/'); 71 | 72 | assert.include(browser.getText('#fillings'), firstChoice); 73 | assert.include(browser.getText('#fillings'), secondChoice); 74 | }); 75 | 76 | /* 77 | * Choose a stack size. Expect "Pancake Count:" to display the number equivalent to the stack size, e.g. "Double" is "2". 78 | */ 79 | it('displays the number equivalent to the stack size (Behavior 6)', () => { 80 | const optionText = 'Septuple Stack'; 81 | const optionNum = '7'; 82 | 83 | browser.url('/'); 84 | browser.selectByVisibleText('#select-stack', optionText) 85 | browser.click('#submit-order'); 86 | browser.url('/'); 87 | 88 | assert.include(browser.getText('#size'), optionNum); 89 | }); 90 | }); 91 | }); 92 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/test/models/order-test.js: -------------------------------------------------------------------------------- 1 | const Order = require('../../models/order'); 2 | const { assert } = require('chai'); 3 | const { mongoose, databaseUrl, options } = require('../../database'); 4 | 5 | describe('Order', () => { 6 | beforeEach(async () => { 7 | await mongoose.connect(databaseUrl, options); 8 | await mongoose.connection.db.dropDatabase(); 9 | }); 10 | 11 | afterEach(async () => { 12 | await mongoose.disconnect(); 13 | }); 14 | 15 | describe('.updateOrCreate', () => { 16 | describe('when a record already exists', () => { 17 | it('updates the record', async () => { 18 | const partialOrder = { 19 | name: 'Regular Joe', 20 | cakeType: 'Plain', 21 | size: '2', 22 | pickUp: '9:00', 23 | }; 24 | const update = ['Apple', 'Bacon', 'Chocolate Chips']; 25 | const existingOrder = await Order.create(partialOrder); 26 | 27 | const updatedOrder = await Order.updateOrCreate({ fillings: update }); 28 | 29 | const allOrders = await Order.find({}); 30 | assert.equal(allOrders.length, 1); 31 | // toObject resolves issues with mongoose metadata in arrays 32 | assert.deepEqual(updatedOrder.fillings.toObject(), update); 33 | // check remaining fields 34 | assert.include(updatedOrder, partialOrder); 35 | }); 36 | }); 37 | 38 | describe('when a record does not exist', () => { 39 | it('creates the record', async () => { 40 | let healthyOrder = { 41 | name: 'Healthy Person', 42 | cakeType: 'Whole Wheat', 43 | fillings: ['Macadamia Nuts'], 44 | size: '1', 45 | pickUp: '11:00', 46 | } 47 | 48 | const order = await Order.updateOrCreate(healthyOrder); 49 | 50 | const allOrders = await Order.find({}); 51 | assert.equal(allOrders.length, 1); 52 | assert.deepEqual(allOrders[0].fillings.toObject(), healthyOrder.fillings); 53 | delete healthyOrder.fillings; 54 | assert.include(allOrders[0], healthyOrder); 55 | }); 56 | }); 57 | }); 58 | 59 | describe('#cakeType', () => { 60 | it('is a String', () => { 61 | const nameAsAnInt = 1; 62 | 63 | const order = new Order({ cakeType: nameAsAnInt }); 64 | 65 | assert.strictEqual(order.cakeType, nameAsAnInt.toString()); 66 | }); 67 | }); 68 | 69 | describe('#name', () => { 70 | it('is a String', () => { 71 | const nameAsAnInt = 1; 72 | 73 | const order = new Order({ name: nameAsAnInt }); 74 | 75 | assert.strictEqual(order.name, nameAsAnInt.toString()); 76 | }); 77 | }); 78 | 79 | describe('#fillings', () => { 80 | it('is an Array', () => { 81 | const fillings = ['Apple', 'Bacon']; 82 | 83 | const order = new Order({ fillings }); 84 | 85 | // toObject resolves issues with mongoose metadata 86 | assert.deepEqual(order.fillings.toObject(), fillings); 87 | }); 88 | }); 89 | 90 | describe('#size', () => { 91 | it('is a String', () => { 92 | const sizeAsAnInt = 3; 93 | 94 | const order = new Order({ size: sizeAsAnInt }); 95 | 96 | assert.strictEqual(order.size, sizeAsAnInt.toString()); 97 | }); 98 | }); 99 | }); 100 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #b1e7e9; 3 | font-family: Montserrat, sans-serif; 4 | font-size: 16px; 5 | } 6 | 7 | .tracker { 8 | position: fixed; 9 | z-index: 1; 10 | top: 0px; 11 | right: 0px; 12 | width: 303px; 13 | height: 120px; 14 | padding: 5px; 15 | background-color: #f6b835; 16 | font-size: 20px; 17 | font-weight: 600; 18 | letter-spacing: 1.7px; 19 | color: #000000; 20 | } 21 | 22 | .tracker-meter { 23 | display: flex; 24 | flex-direction: row; 25 | justify-content: center; 26 | padding: 10px; 27 | } 28 | 29 | 30 | .image-container { 31 | margin: 0px 5px; 32 | } 33 | 34 | .tracker-name { 35 | text-align: center; 36 | } 37 | 38 | .tracker-name p { 39 | margin: 5px; 40 | font-size: 20px; 41 | font-weight: 600; 42 | letter-spacing: 1.7px; 43 | color: #000000; 44 | } 45 | 46 | .banner { 47 | position: relative; 48 | top: 130px; 49 | text-align: center; 50 | } 51 | 52 | h1 { 53 | margin: 0px 0px 60px 0px; 54 | font-size: 70px; 55 | font-weight: 600; 56 | letter-spacing: 6.1px; 57 | color: #ffffff; 58 | text-shadow: 3px 5px #e44480; 59 | 60 | } 61 | 62 | .body-container { 63 | position: relative; 64 | width: 100%; 65 | top: 130px; 66 | display: flex; 67 | flex-direction: row; 68 | flex-wrap: wrap; 69 | justify-content: center; 70 | font-weight: 600; 71 | letter-spacing: 1.2px; 72 | text-align: left; 73 | color: #ffffff; 74 | } 75 | 76 | h2 { 77 | font-size: 14px; 78 | font-weight: 600; 79 | letter-spacing: 1.2px; 80 | text-align: left; 81 | color: #ffffff; 82 | text-transform: uppercase; 83 | } 84 | 85 | label, input#name { 86 | font-size: 14px; 87 | letter-spacing: 0.4px; 88 | text-align: left; 89 | color: #0b3553; 90 | } 91 | 92 | label, input, select { 93 | cursor: pointer; 94 | } 95 | 96 | .menu { 97 | /* intended svg dimensions are 552px 741px 98 | * 552 - (25 + 100) = 427 99 | * 741 - (100 + 25) = 616 100 | */ 101 | width: 427px; 102 | height: 616px; 103 | /* padding: top | right | bottom | left */ 104 | padding: 100px 25px 25px 100px; 105 | background: url(../images/shape_1.svg); 106 | background-size: 552px 741px; 107 | display: flex; 108 | flex-direction: column; 109 | } 110 | 111 | .form-container { 112 | margin: 5px 10px 0px 10px; 113 | display: flex; 114 | flex-direction: column; 115 | } 116 | 117 | .form-row {} 118 | 119 | .name-flex { 120 | display: flex; 121 | flex-direction: row; 122 | flex-wrap: wrap; 123 | align-items: center; 124 | } 125 | 126 | #name { 127 | height: 38px; 128 | width: 200px; 129 | border: solid 1px #c32362; 130 | } 131 | 132 | .name-col-1 { 133 | width: 60%; 134 | } 135 | 136 | .name-col-2 { 137 | width: 40%; 138 | } 139 | 140 | .input-col { 141 | float: left; 142 | width: 50%; 143 | text-align: left; 144 | } 145 | 146 | .select-row { 147 | display: flex; 148 | flex-direction: row; 149 | } 150 | 151 | .select-col { 152 | width: 50%; 153 | } 154 | 155 | .styled-select { 156 | width: 160px; 157 | overflow: hidden; 158 | background: url(../images/dropdown_arrows.svg) no-repeat right white; 159 | } 160 | 161 | .styled-select select { 162 | background: transparent; 163 | -webkit-appearance: none; 164 | padding: 5px; 165 | } 166 | 167 | select { 168 | width: 160px; 169 | height: 40px; 170 | border: solid 1px #c32362; 171 | border-radius: 2px; 172 | font-size: 14px; 173 | } 174 | 175 | .place-order-div { 176 | margin: 25px auto 0px auto; 177 | } 178 | 179 | .button { 180 | width: 200px; 181 | height: 40px; 182 | margin: 0 auto; 183 | border-radius: 2px; 184 | font-size: 14px; 185 | font-weight: 600; 186 | letter-spacing: 0.3px; 187 | color: #ffffff; 188 | text-transform: uppercase; 189 | background-color: #e44480; 190 | border: solid 1px #c32362; 191 | box-shadow: -3px 0px #c32362; 192 | } 193 | 194 | .order { 195 | /* intended svg dimensions are 430px 266px 196 | * 430 - (70 + 30) = 330 197 | * 266 - (50 + 50) = 166 198 | */ 199 | width: 330px; 200 | height: 166px; 201 | padding: 70px 50px 30px 50px; 202 | background: url(../images/shape_2.svg); 203 | background-size: 430px 266px; 204 | } 205 | 206 | span { 207 | font-size: 16px; 208 | font-weight: 600; 209 | letter-spacing: 0.4px; 210 | color: #0b3653; 211 | text-transform: none; 212 | } 213 | 214 | .top { 215 | position: fixed; 216 | width: 100%; 217 | top: 0; 218 | height: 150px; 219 | background: grey; 220 | color: white 221 | } 222 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/test/features/user-visits-index-test.js: -------------------------------------------------------------------------------- 1 | const { assert } = require('chai'); 2 | const { jsdom } = require('jsdom'); 3 | 4 | const parseTextFromHTML = (htmlAsString, selector) => { 5 | const selectedElement = jsdom(htmlAsString).querySelector(selector); 6 | if (selectedElement !== null) { 7 | return selectedElement.textContent; 8 | } else { 9 | throw new Error(`No element with selector ${selector} found in HTML string`); 10 | } 11 | }; 12 | 13 | describe('User visits index', () => { 14 | describe('to post an order', () => { 15 | it('starts with a blank order', () => { 16 | browser.url('/'); 17 | 18 | assert.equal(browser.getText('#deliver-to span'), ''); 19 | assert.equal(browser.getText('#cake-type span'), ''); 20 | assert.equal(browser.getText('#fillings span'), ''); 21 | assert.equal(browser.getText('#size span'), ''); 22 | }); 23 | 24 | // Add the 'outside of working hours' test here 25 | it('shows an error message when outside of working hours', () => { 26 | const earlyTime = '7:00'; 27 | const lateTime = '13:00'; 28 | 29 | browser.url('/'); 30 | 31 | const HTML = browser.getHTML('body'); 32 | const parsedHTML = parseTextFromHTML(HTML, '#select-pickUp'); 33 | 34 | assert.notInclude(parsedHTML, earlyHr); 35 | assert.notInclude(parsedHTML, lateHr); 36 | }); 37 | 38 | // Add the 'displays the selected hour' test here 39 | it('displays the selected hour', () => { 40 | const hour = '9:00'; 41 | 42 | browser.url('/'); 43 | browser.selectByVisibleText('#select-pickUp', hour); 44 | browser.click('#submit-order'); 45 | browser.url('/'); 46 | 47 | assert.include(browser.getText('#pickUp'), hour); 48 | }); 49 | 50 | 51 | 52 | // Add the 'labels the pick up hour' test here 53 | it('labels the pick up hour correctly', () => { 54 | const label = 'pick up time:'; 55 | 56 | browser.url('/'); 57 | const HTML = browser.getHTML('body'); 58 | const parsedHTML = parseTextFromHTML(HTML, '#pickUp'); 59 | 60 | assert.include(parsedHTML, label); 61 | }); 62 | 63 | it('accepts the customer name', () => { 64 | const name = 'Hungry Person'; 65 | 66 | browser.url('/'); 67 | browser.setValue('#name', name); 68 | browser.click('#submit-order'); 69 | browser.url('/'); 70 | 71 | assert.include(browser.getText('#deliver-to'), name); 72 | }); 73 | 74 | it('accepts the cake type', () => { 75 | const cakeType = 'Whole Wheat'; 76 | 77 | browser.url('/'); 78 | browser.click('#whole-wheat'); 79 | browser.click('#submit-order'); 80 | browser.url('/'); 81 | 82 | assert.include(browser.getText('#cake-type'), cakeType); 83 | }); 84 | 85 | it('accepts multiple fillings', () => { 86 | const firstChoice = 'Strawberries'; 87 | const secondChoice = 'Banana'; 88 | 89 | browser.url('/'); 90 | browser.click('#strawberries'); 91 | browser.click('#banana'); 92 | browser.click('#submit-order'); 93 | browser.url('/'); 94 | 95 | assert.include(browser.getText('#fillings'), firstChoice); 96 | assert.include(browser.getText('#fillings'), secondChoice); 97 | }); 98 | 99 | it('accepts the stack size', () => { 100 | const optionText = 'Double Stack'; 101 | const optionNum = '2'; 102 | 103 | browser.url('/'); 104 | browser.selectByVisibleText('#select-stack', optionText) 105 | browser.click('#submit-order'); 106 | browser.url('/'); 107 | 108 | assert.include(browser.getText('#size'), optionNum); 109 | }); 110 | }); 111 | 112 | describe('to clear an order', () => { 113 | it('deletes the selected options', () => { 114 | const name = 'Indecisive Person'; 115 | const time = '10:00'; 116 | 117 | browser.url('/'); 118 | browser.setValue('#name', name); 119 | browser.selectByVisibleText('#select-pickUp', time) 120 | browser.click('#submit-order'); 121 | browser.click('#clear-order'); 122 | browser.url('/'); 123 | 124 | assert.equal(browser.getText('#deliver-to span'), ''); 125 | assert.equal(browser.getText('#cake-type span'), ''); 126 | assert.equal(browser.getText('#fillings span'), ''); 127 | assert.equal(browser.getText('#size span'), ''); 128 | }); 129 | }); 130 | }); 131 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/views/index.handlebars: -------------------------------------------------------------------------------- 1 |
2 |
3 | 8 |
9 |
10 |

BUG-O-METER

11 |
12 |
13 | 14 | 17 | 18 |
19 | 119 | 120 |
121 | 122 |

deliver to: My-Name{{order.name}}

123 |

cake: {{order.cakeType}}

124 |

fillings: {{order.fillings}}

125 |

pancake count: {{order.size}}

126 |
127 |
128 | 129 | 130 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/views/index.handlebars: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | 130 | 131 |
132 |

deliver to: {{order.name}}

133 |

cake: {{order.cakeType}}

134 |

fillings: {{order.fillings}}

135 |

pancake count: {{order.size}}

136 |

pick up time: {{order.pickUp}}

137 |
138 |
139 | -------------------------------------------------------------------------------- /1_Why_Test/1.2_Cake_O_Clock_Project/test/routes/index-test.js: -------------------------------------------------------------------------------- 1 | const { assert } = require('chai'); 2 | const request = require('supertest'); 3 | const { jsdom } = require('jsdom'); 4 | 5 | const app = require('../../app'); 6 | const { mongoose, databaseUrl, options } = require('../../database'); 7 | const Order = require('../../models/order'); 8 | const { port } = require('../../server.config').test; 9 | 10 | const PORT = process.env.PORT || port; 11 | 12 | const parseTextFromHTML = (htmlAsString, selector) => { 13 | const selectedElement = jsdom(htmlAsString).querySelector(selector); 14 | if (selectedElement !== null) { 15 | return selectedElement.textContent; 16 | } else { 17 | throw new Error(`No element with selector ${selector} found in HTML string`); 18 | } 19 | }; 20 | 21 | describe('Routes', () => { 22 | let server; 23 | 24 | beforeEach('Start server', async () => { 25 | await mongoose.connect(databaseUrl, options); 26 | await mongoose.connection.db.dropDatabase(); 27 | server = await app.listen(PORT); 28 | }); 29 | 30 | afterEach('Drop database and close server', async () => { 31 | await mongoose.disconnect(); 32 | await server.close(); 33 | }); 34 | 35 | describe('GET /', () => { 36 | describe('when the Order is new', () => { 37 | it('renders a blank Order', async () => { 38 | const response = await request(server).get('/'); 39 | 40 | assert.equal(response.status, 200); 41 | }); 42 | }); 43 | 44 | describe('when the Order already exists', () => { 45 | it('renders the name', async () => { 46 | const name = 'Hungry User' 47 | const order = await Order.create({ name }) 48 | 49 | const response = await request(server).get('/'); 50 | 51 | assert.equal(response.status, 200); 52 | assert.include(parseTextFromHTML(response.text, '#deliver-to'), name); 53 | }); 54 | 55 | it('renders the cake type', async () => { 56 | const cakeType = 'Whole wheat' 57 | const order = await Order.create({ cakeType }) 58 | 59 | const response = await request(server).get('/'); 60 | 61 | assert.equal(response.status, 200); 62 | assert.include(parseTextFromHTML(response.text, '#cake-type'), cakeType); 63 | }); 64 | }); 65 | }); 66 | 67 | describe('POST /place-order', () => { 68 | it('redirects to the index', async () => { 69 | const response = await request(server) 70 | .post('/place-order') 71 | .type('form'); 72 | 73 | assert.equal(response.status, 302); 74 | assert.equal(response.headers.location, '/'); 75 | }); 76 | 77 | describe('when the Order is new', () => { 78 | // Add the new test here 79 | it('creates an order with the selected time', async () => { 80 | const pickUp = '8:00'; 81 | 82 | const response = await request(server) 83 | .post('/place-order') 84 | .type('form') 85 | .send({ pickUp }); 86 | 87 | const order = await Order.findOne({}); 88 | assert.strictEqual(order.pickUp, pickUp); 89 | }); 90 | 91 | it('sets the name on the order', async () => { 92 | const name = 'Inquisitive User'; 93 | 94 | const response = await request(server) 95 | .post('/place-order') 96 | .type('form') 97 | .send({ name }) 98 | 99 | assert.equal(response.status, 302); 100 | const order = await Order.findOne(); 101 | assert.equal(order.name, name); 102 | }); 103 | 104 | it('creates an order with the selected Cake Type', async () => { 105 | const cakeType = 'Whole wheat'; 106 | 107 | const response = await request(server) 108 | .post('/place-order') 109 | .type('form') 110 | .send({ cakeType }); 111 | 112 | const order = await Order.findOne({}); 113 | assert.equal(order.cakeType, cakeType); 114 | }); 115 | 116 | it('creates an order with the selected fillings', async () => { 117 | const fillings = ['Chocolate chips', 'Sprinkles']; 118 | 119 | const response = await request(server) 120 | .post('/place-order') 121 | .type('form') 122 | .send({ fillings }); 123 | 124 | const order = await Order.findOne({}); 125 | assert.deepEqual(order.fillings.toObject(), fillings); 126 | }); 127 | 128 | it('creates an order with the selected size', async () => { 129 | const size = '6'; 130 | 131 | const response = await request(server) 132 | .post('/place-order') 133 | .type('form') 134 | .send({ size }); 135 | 136 | const order = await Order.findOne({}); 137 | assert.strictEqual(order.size, size); 138 | }); 139 | }); 140 | 141 | describe('when the Order already exists', () => { 142 | it('updates the name on the order', async () => { 143 | const initialName = 'Inquisitive User'; 144 | const updatedName = 'Anxious User'; 145 | 146 | await request(server) 147 | .post('/place-order') 148 | .type('form') 149 | .send({ name: initialName }); 150 | 151 | const response = await request(server) 152 | .post('/place-order') 153 | .type('form') 154 | .send({ name: updatedName }); 155 | 156 | assert.equal(response.status, 302); 157 | const order = await Order.findOne(); 158 | assert.equal(order.name, updatedName); 159 | }); 160 | 161 | it('updates the order with the selected Cake Type', async () => { 162 | const cakeType = 'Whole wheat'; 163 | await Order.create({ cakeType: 'Not Whole wheat' }); 164 | 165 | const response = await request(server) 166 | .post('/place-order') 167 | .type('form') 168 | .send({ cakeType }); 169 | 170 | const order = await Order.findOne({}); 171 | assert.equal(order.cakeType, cakeType); 172 | }); 173 | 174 | it('updates the order with the selected fillings', async () => { 175 | const first = ['Bacon', 'Banana']; 176 | const second = ['Strawberries', 'Blueberries']; 177 | await Order.create({ fillings: first }); 178 | 179 | const response = await request(server) 180 | .post('/place-order') 181 | .type('form') 182 | .send({ fillings: second }); 183 | 184 | const order = await Order.findOne({}); 185 | assert.deepEqual(order.fillings.toObject(), second); 186 | }); 187 | 188 | it('updates the order with the selected size', async () => { 189 | const oldSize = '5'; 190 | const newSize = '4'; 191 | await Order.create({ size: oldSize }); 192 | 193 | const response = await request(server) 194 | .post('/place-order') 195 | .type('form') 196 | .send({ size: newSize }); 197 | 198 | const order = await Order.findOne({}); 199 | assert.strictEqual(order.size, newSize); 200 | }); 201 | }); 202 | }); 203 | 204 | describe('POST /clear-order', () => { 205 | it('clears all fields', async () => { 206 | const newOrder = { 207 | name: 'Another Person', 208 | cakeType: 'Whole Wheat', 209 | fillings: ['Chocolate Chips', 'Banana'], 210 | size: '3', 211 | pickUp: '12:00', 212 | }; 213 | await Order.create(newOrder); 214 | 215 | const response = await request(server) 216 | .post('/clear-order') 217 | .type('form') 218 | .send({}); 219 | 220 | const order = await Order.findOne({}); 221 | assert.isNull(order); 222 | }); 223 | }); 224 | }); 225 | -------------------------------------------------------------------------------- /1_Why_Test/1.4_The_Test_Suite/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calculator-js", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abab": { 8 | "version": "1.0.4", 9 | "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", 10 | "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" 11 | }, 12 | "accepts": { 13 | "version": "1.3.4", 14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", 15 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", 16 | "requires": { 17 | "mime-types": "2.1.17", 18 | "negotiator": "0.6.1" 19 | } 20 | }, 21 | "acorn": { 22 | "version": "4.0.13", 23 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 24 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" 25 | }, 26 | "acorn-globals": { 27 | "version": "3.1.0", 28 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", 29 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", 30 | "requires": { 31 | "acorn": "4.0.13" 32 | } 33 | }, 34 | "ajv": { 35 | "version": "4.11.8", 36 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 37 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 38 | "dev": true, 39 | "requires": { 40 | "co": "4.6.0", 41 | "json-stable-stringify": "1.0.1" 42 | } 43 | }, 44 | "align-text": { 45 | "version": "0.1.4", 46 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 47 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 48 | "requires": { 49 | "kind-of": "3.2.2", 50 | "longest": "1.0.1", 51 | "repeat-string": "1.6.1" 52 | } 53 | }, 54 | "amdefine": { 55 | "version": "1.0.1", 56 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 57 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 58 | }, 59 | "ansi-escapes": { 60 | "version": "1.4.0", 61 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 62 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 63 | "dev": true 64 | }, 65 | "ansi-regex": { 66 | "version": "2.1.1", 67 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 68 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 69 | }, 70 | "ansi-styles": { 71 | "version": "2.2.1", 72 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 73 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 74 | }, 75 | "archiver": { 76 | "version": "1.3.0", 77 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", 78 | "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", 79 | "dev": true, 80 | "requires": { 81 | "archiver-utils": "1.3.0", 82 | "async": "2.5.0", 83 | "buffer-crc32": "0.2.13", 84 | "glob": "7.1.2", 85 | "lodash": "4.17.4", 86 | "readable-stream": "2.3.3", 87 | "tar-stream": "1.5.2", 88 | "walkdir": "0.0.11", 89 | "zip-stream": "1.2.0" 90 | }, 91 | "dependencies": { 92 | "async": { 93 | "version": "2.5.0", 94 | "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", 95 | "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", 96 | "dev": true, 97 | "requires": { 98 | "lodash": "4.17.4" 99 | } 100 | }, 101 | "glob": { 102 | "version": "7.1.2", 103 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 104 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 105 | "dev": true, 106 | "requires": { 107 | "fs.realpath": "1.0.0", 108 | "inflight": "1.0.6", 109 | "inherits": "2.0.3", 110 | "minimatch": "3.0.4", 111 | "once": "1.4.0", 112 | "path-is-absolute": "1.0.1" 113 | } 114 | } 115 | } 116 | }, 117 | "archiver-utils": { 118 | "version": "1.3.0", 119 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", 120 | "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", 121 | "dev": true, 122 | "requires": { 123 | "glob": "7.1.2", 124 | "graceful-fs": "4.1.11", 125 | "lazystream": "1.0.0", 126 | "lodash": "4.17.4", 127 | "normalize-path": "2.1.1", 128 | "readable-stream": "2.3.3" 129 | }, 130 | "dependencies": { 131 | "glob": { 132 | "version": "7.1.2", 133 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 134 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 135 | "dev": true, 136 | "requires": { 137 | "fs.realpath": "1.0.0", 138 | "inflight": "1.0.6", 139 | "inherits": "2.0.3", 140 | "minimatch": "3.0.4", 141 | "once": "1.4.0", 142 | "path-is-absolute": "1.0.1" 143 | } 144 | } 145 | } 146 | }, 147 | "array-equal": { 148 | "version": "1.0.0", 149 | "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", 150 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 151 | }, 152 | "array-flatten": { 153 | "version": "1.1.1", 154 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 155 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 156 | }, 157 | "asap": { 158 | "version": "2.0.6", 159 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 160 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 161 | }, 162 | "asn1": { 163 | "version": "0.2.3", 164 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 165 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 166 | }, 167 | "assert-plus": { 168 | "version": "0.2.0", 169 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 170 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 171 | }, 172 | "assertion-error": { 173 | "version": "1.0.2", 174 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 175 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 176 | "dev": true 177 | }, 178 | "async": { 179 | "version": "1.5.2", 180 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 181 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 182 | }, 183 | "asynckit": { 184 | "version": "0.4.0", 185 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 186 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 187 | }, 188 | "atob": { 189 | "version": "1.1.3", 190 | "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", 191 | "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", 192 | "dev": true 193 | }, 194 | "aws-sign2": { 195 | "version": "0.6.0", 196 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 197 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 198 | }, 199 | "aws4": { 200 | "version": "1.6.0", 201 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 202 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 203 | }, 204 | "babel-runtime": { 205 | "version": "5.8.38", 206 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", 207 | "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", 208 | "dev": true, 209 | "requires": { 210 | "core-js": "1.2.7" 211 | } 212 | }, 213 | "balanced-match": { 214 | "version": "1.0.0", 215 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 216 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 217 | }, 218 | "basic-auth": { 219 | "version": "1.1.0", 220 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", 221 | "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" 222 | }, 223 | "bcrypt-pbkdf": { 224 | "version": "1.0.1", 225 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 226 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 227 | "optional": true, 228 | "requires": { 229 | "tweetnacl": "0.14.5" 230 | } 231 | }, 232 | "bl": { 233 | "version": "1.2.1", 234 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", 235 | "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", 236 | "dev": true, 237 | "requires": { 238 | "readable-stream": "2.3.3" 239 | } 240 | }, 241 | "bluebird": { 242 | "version": "2.10.2", 243 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", 244 | "integrity": "sha1-AkpVFylTCIV/FPkfEQb8O1VfRGs=" 245 | }, 246 | "body-parser": { 247 | "version": "1.17.2", 248 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", 249 | "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", 250 | "requires": { 251 | "bytes": "2.4.0", 252 | "content-type": "1.0.4", 253 | "debug": "2.6.7", 254 | "depd": "1.1.1", 255 | "http-errors": "1.6.2", 256 | "iconv-lite": "0.4.15", 257 | "on-finished": "2.3.0", 258 | "qs": "6.4.0", 259 | "raw-body": "2.2.0", 260 | "type-is": "1.6.15" 261 | }, 262 | "dependencies": { 263 | "debug": { 264 | "version": "2.6.7", 265 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", 266 | "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", 267 | "requires": { 268 | "ms": "2.0.0" 269 | } 270 | } 271 | } 272 | }, 273 | "boom": { 274 | "version": "2.10.1", 275 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 276 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 277 | "requires": { 278 | "hoek": "2.16.3" 279 | } 280 | }, 281 | "brace-expansion": { 282 | "version": "1.1.8", 283 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 284 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 285 | "requires": { 286 | "balanced-match": "1.0.0", 287 | "concat-map": "0.0.1" 288 | } 289 | }, 290 | "browser-stdout": { 291 | "version": "1.3.0", 292 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 293 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 294 | "dev": true 295 | }, 296 | "bson": { 297 | "version": "1.0.4", 298 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", 299 | "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" 300 | }, 301 | "buffer-crc32": { 302 | "version": "0.2.13", 303 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 304 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 305 | "dev": true 306 | }, 307 | "buffer-shims": { 308 | "version": "1.0.0", 309 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 310 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 311 | }, 312 | "bytes": { 313 | "version": "2.4.0", 314 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", 315 | "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" 316 | }, 317 | "camel-case": { 318 | "version": "3.0.0", 319 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", 320 | "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", 321 | "dev": true, 322 | "requires": { 323 | "no-case": "2.3.2", 324 | "upper-case": "1.1.3" 325 | } 326 | }, 327 | "camelcase": { 328 | "version": "1.2.1", 329 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 330 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 331 | "optional": true 332 | }, 333 | "caseless": { 334 | "version": "0.11.0", 335 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", 336 | "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" 337 | }, 338 | "center-align": { 339 | "version": "0.1.3", 340 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 341 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 342 | "optional": true, 343 | "requires": { 344 | "align-text": "0.1.4", 345 | "lazy-cache": "1.0.4" 346 | } 347 | }, 348 | "chai": { 349 | "version": "3.5.0", 350 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 351 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 352 | "dev": true, 353 | "requires": { 354 | "assertion-error": "1.0.2", 355 | "deep-eql": "0.1.3", 356 | "type-detect": "1.0.0" 357 | }, 358 | "dependencies": { 359 | "deep-eql": { 360 | "version": "0.1.3", 361 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 362 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 363 | "dev": true, 364 | "requires": { 365 | "type-detect": "0.1.1" 366 | }, 367 | "dependencies": { 368 | "type-detect": { 369 | "version": "0.1.1", 370 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 371 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 372 | "dev": true 373 | } 374 | } 375 | }, 376 | "type-detect": { 377 | "version": "1.0.0", 378 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 379 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 380 | "dev": true 381 | } 382 | } 383 | }, 384 | "chalk": { 385 | "version": "1.1.3", 386 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 387 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 388 | "requires": { 389 | "ansi-styles": "2.2.1", 390 | "escape-string-regexp": "1.0.5", 391 | "has-ansi": "2.0.0", 392 | "strip-ansi": "3.0.1", 393 | "supports-color": "2.0.0" 394 | }, 395 | "dependencies": { 396 | "supports-color": { 397 | "version": "2.0.0", 398 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 399 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 400 | } 401 | } 402 | }, 403 | "change-case": { 404 | "version": "3.0.1", 405 | "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.1.tgz", 406 | "integrity": "sha1-7l9a0EFa0a2egHLPSc1M+nZgpVQ=", 407 | "dev": true, 408 | "requires": { 409 | "camel-case": "3.0.0", 410 | "constant-case": "2.0.0", 411 | "dot-case": "2.1.1", 412 | "header-case": "1.0.1", 413 | "is-lower-case": "1.1.3", 414 | "is-upper-case": "1.1.2", 415 | "lower-case": "1.1.4", 416 | "lower-case-first": "1.0.2", 417 | "no-case": "2.3.2", 418 | "param-case": "2.1.1", 419 | "pascal-case": "2.0.1", 420 | "path-case": "2.1.1", 421 | "sentence-case": "2.1.1", 422 | "snake-case": "2.1.0", 423 | "swap-case": "1.1.2", 424 | "title-case": "2.1.1", 425 | "upper-case": "1.1.3", 426 | "upper-case-first": "1.1.2" 427 | } 428 | }, 429 | "cli-cursor": { 430 | "version": "2.1.0", 431 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 432 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 433 | "dev": true, 434 | "requires": { 435 | "restore-cursor": "2.0.0" 436 | } 437 | }, 438 | "cli-width": { 439 | "version": "2.2.0", 440 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 441 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 442 | "dev": true 443 | }, 444 | "cliui": { 445 | "version": "2.1.0", 446 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 447 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 448 | "optional": true, 449 | "requires": { 450 | "center-align": "0.1.3", 451 | "right-align": "0.1.3", 452 | "wordwrap": "0.0.2" 453 | }, 454 | "dependencies": { 455 | "wordwrap": { 456 | "version": "0.0.2", 457 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 458 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 459 | "optional": true 460 | } 461 | } 462 | }, 463 | "co": { 464 | "version": "4.6.0", 465 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 466 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 467 | "dev": true 468 | }, 469 | "combined-stream": { 470 | "version": "1.0.5", 471 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 472 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 473 | "requires": { 474 | "delayed-stream": "1.0.0" 475 | } 476 | }, 477 | "commander": { 478 | "version": "2.9.0", 479 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 480 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 481 | "requires": { 482 | "graceful-readlink": "1.0.1" 483 | } 484 | }, 485 | "component-emitter": { 486 | "version": "1.2.1", 487 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 488 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", 489 | "dev": true 490 | }, 491 | "compress-commons": { 492 | "version": "1.2.0", 493 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", 494 | "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", 495 | "dev": true, 496 | "requires": { 497 | "buffer-crc32": "0.2.13", 498 | "crc32-stream": "2.0.0", 499 | "normalize-path": "2.1.1", 500 | "readable-stream": "2.3.3" 501 | } 502 | }, 503 | "concat-map": { 504 | "version": "0.0.1", 505 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 506 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 507 | }, 508 | "concat-stream": { 509 | "version": "1.6.0", 510 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 511 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 512 | "dev": true, 513 | "requires": { 514 | "inherits": "2.0.3", 515 | "readable-stream": "2.3.3", 516 | "typedarray": "0.0.6" 517 | } 518 | }, 519 | "constant-case": { 520 | "version": "2.0.0", 521 | "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", 522 | "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", 523 | "dev": true, 524 | "requires": { 525 | "snake-case": "2.1.0", 526 | "upper-case": "1.1.3" 527 | } 528 | }, 529 | "content-disposition": { 530 | "version": "0.5.2", 531 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 532 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 533 | }, 534 | "content-type": { 535 | "version": "1.0.4", 536 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 537 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 538 | }, 539 | "content-type-parser": { 540 | "version": "1.0.2", 541 | "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", 542 | "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" 543 | }, 544 | "cookie": { 545 | "version": "0.3.1", 546 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 547 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 548 | }, 549 | "cookie-parser": { 550 | "version": "1.4.3", 551 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", 552 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", 553 | "requires": { 554 | "cookie": "0.3.1", 555 | "cookie-signature": "1.0.6" 556 | } 557 | }, 558 | "cookie-signature": { 559 | "version": "1.0.6", 560 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 561 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 562 | }, 563 | "cookiejar": { 564 | "version": "2.1.1", 565 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", 566 | "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", 567 | "dev": true 568 | }, 569 | "core-js": { 570 | "version": "1.2.7", 571 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 572 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 573 | "dev": true 574 | }, 575 | "core-util-is": { 576 | "version": "1.0.2", 577 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 578 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 579 | }, 580 | "crc": { 581 | "version": "3.4.4", 582 | "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", 583 | "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=", 584 | "dev": true 585 | }, 586 | "crc32-stream": { 587 | "version": "2.0.0", 588 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", 589 | "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", 590 | "dev": true, 591 | "requires": { 592 | "crc": "3.4.4", 593 | "readable-stream": "2.3.3" 594 | } 595 | }, 596 | "cryptiles": { 597 | "version": "2.0.5", 598 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 599 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 600 | "requires": { 601 | "boom": "2.10.1" 602 | } 603 | }, 604 | "css": { 605 | "version": "2.2.1", 606 | "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", 607 | "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", 608 | "dev": true, 609 | "requires": { 610 | "inherits": "2.0.3", 611 | "source-map": "0.1.43", 612 | "source-map-resolve": "0.3.1", 613 | "urix": "0.1.0" 614 | }, 615 | "dependencies": { 616 | "source-map": { 617 | "version": "0.1.43", 618 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 619 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 620 | "dev": true, 621 | "requires": { 622 | "amdefine": "1.0.1" 623 | } 624 | } 625 | } 626 | }, 627 | "css-parse": { 628 | "version": "2.0.0", 629 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", 630 | "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", 631 | "dev": true, 632 | "requires": { 633 | "css": "2.2.1" 634 | } 635 | }, 636 | "css-value": { 637 | "version": "0.0.1", 638 | "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", 639 | "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", 640 | "dev": true 641 | }, 642 | "cssom": { 643 | "version": "0.3.2", 644 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", 645 | "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" 646 | }, 647 | "cssstyle": { 648 | "version": "0.2.37", 649 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", 650 | "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", 651 | "requires": { 652 | "cssom": "0.3.2" 653 | } 654 | }, 655 | "dashdash": { 656 | "version": "1.14.1", 657 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 658 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 659 | "requires": { 660 | "assert-plus": "1.0.0" 661 | }, 662 | "dependencies": { 663 | "assert-plus": { 664 | "version": "1.0.0", 665 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 666 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 667 | } 668 | } 669 | }, 670 | "debug": { 671 | "version": "2.6.8", 672 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 673 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 674 | "requires": { 675 | "ms": "2.0.0" 676 | } 677 | }, 678 | "decamelize": { 679 | "version": "1.2.0", 680 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 681 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 682 | "optional": true 683 | }, 684 | "deep-is": { 685 | "version": "0.1.3", 686 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 687 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 688 | }, 689 | "deepmerge": { 690 | "version": "1.3.2", 691 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", 692 | "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", 693 | "dev": true 694 | }, 695 | "define-properties": { 696 | "version": "1.1.2", 697 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 698 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 699 | "requires": { 700 | "foreach": "2.0.5", 701 | "object-keys": "1.0.11" 702 | } 703 | }, 704 | "delayed-stream": { 705 | "version": "1.0.0", 706 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 707 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 708 | }, 709 | "depd": { 710 | "version": "1.1.1", 711 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 712 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 713 | }, 714 | "destroy": { 715 | "version": "1.0.4", 716 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 717 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 718 | }, 719 | "diff": { 720 | "version": "3.2.0", 721 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", 722 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", 723 | "dev": true 724 | }, 725 | "dot-case": { 726 | "version": "2.1.1", 727 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", 728 | "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", 729 | "dev": true, 730 | "requires": { 731 | "no-case": "2.3.2" 732 | } 733 | }, 734 | "ecc-jsbn": { 735 | "version": "0.1.1", 736 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 737 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 738 | "optional": true, 739 | "requires": { 740 | "jsbn": "0.1.1" 741 | } 742 | }, 743 | "ee-first": { 744 | "version": "1.1.1", 745 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 746 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 747 | }, 748 | "ejs": { 749 | "version": "2.5.7", 750 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", 751 | "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", 752 | "dev": true 753 | }, 754 | "encodeurl": { 755 | "version": "1.0.1", 756 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 757 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" 758 | }, 759 | "end-of-stream": { 760 | "version": "1.4.0", 761 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", 762 | "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", 763 | "dev": true, 764 | "requires": { 765 | "once": "1.4.0" 766 | } 767 | }, 768 | "es6-promise": { 769 | "version": "3.2.1", 770 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", 771 | "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" 772 | }, 773 | "escape-html": { 774 | "version": "1.0.3", 775 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 776 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 777 | }, 778 | "escape-string-regexp": { 779 | "version": "1.0.5", 780 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 781 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 782 | }, 783 | "escodegen": { 784 | "version": "1.9.0", 785 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", 786 | "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", 787 | "requires": { 788 | "esprima": "3.1.3", 789 | "estraverse": "4.2.0", 790 | "esutils": "2.0.2", 791 | "optionator": "0.8.2", 792 | "source-map": "0.5.7" 793 | }, 794 | "dependencies": { 795 | "source-map": { 796 | "version": "0.5.7", 797 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 798 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 799 | "optional": true 800 | } 801 | } 802 | }, 803 | "eslint-config-google": { 804 | "version": "0.9.1", 805 | "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", 806 | "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", 807 | "dev": true 808 | }, 809 | "esprima": { 810 | "version": "3.1.3", 811 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 812 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 813 | }, 814 | "estraverse": { 815 | "version": "4.2.0", 816 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 817 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 818 | }, 819 | "esutils": { 820 | "version": "2.0.2", 821 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 822 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 823 | }, 824 | "etag": { 825 | "version": "1.8.1", 826 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 827 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 828 | }, 829 | "express": { 830 | "version": "4.15.4", 831 | "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", 832 | "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", 833 | "requires": { 834 | "accepts": "1.3.4", 835 | "array-flatten": "1.1.1", 836 | "content-disposition": "0.5.2", 837 | "content-type": "1.0.4", 838 | "cookie": "0.3.1", 839 | "cookie-signature": "1.0.6", 840 | "debug": "2.6.8", 841 | "depd": "1.1.1", 842 | "encodeurl": "1.0.1", 843 | "escape-html": "1.0.3", 844 | "etag": "1.8.1", 845 | "finalhandler": "1.0.5", 846 | "fresh": "0.5.0", 847 | "merge-descriptors": "1.0.1", 848 | "methods": "1.1.2", 849 | "on-finished": "2.3.0", 850 | "parseurl": "1.3.2", 851 | "path-to-regexp": "0.1.7", 852 | "proxy-addr": "1.1.5", 853 | "qs": "6.5.0", 854 | "range-parser": "1.2.0", 855 | "send": "0.15.4", 856 | "serve-static": "1.12.4", 857 | "setprototypeof": "1.0.3", 858 | "statuses": "1.3.1", 859 | "type-is": "1.6.15", 860 | "utils-merge": "1.0.0", 861 | "vary": "1.1.1" 862 | }, 863 | "dependencies": { 864 | "qs": { 865 | "version": "6.5.0", 866 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", 867 | "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" 868 | } 869 | } 870 | }, 871 | "express-handlebars": { 872 | "version": "3.0.0", 873 | "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.0.0.tgz", 874 | "integrity": "sha1-gKBwu4GbCeSvLKbQeA91zgXnXC8=", 875 | "requires": { 876 | "glob": "6.0.4", 877 | "graceful-fs": "4.1.11", 878 | "handlebars": "4.0.10", 879 | "object.assign": "4.0.4", 880 | "promise": "7.3.1" 881 | } 882 | }, 883 | "extend": { 884 | "version": "3.0.1", 885 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 886 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 887 | }, 888 | "external-editor": { 889 | "version": "2.0.5", 890 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", 891 | "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", 892 | "dev": true, 893 | "requires": { 894 | "iconv-lite": "0.4.19", 895 | "jschardet": "1.5.1", 896 | "tmp": "0.0.33" 897 | }, 898 | "dependencies": { 899 | "iconv-lite": { 900 | "version": "0.4.19", 901 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 902 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 903 | "dev": true 904 | } 905 | } 906 | }, 907 | "extract-zip": { 908 | "version": "1.6.6", 909 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", 910 | "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", 911 | "dev": true, 912 | "requires": { 913 | "concat-stream": "1.6.0", 914 | "debug": "2.6.9", 915 | "mkdirp": "0.5.0", 916 | "yauzl": "2.4.1" 917 | }, 918 | "dependencies": { 919 | "debug": { 920 | "version": "2.6.9", 921 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 922 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 923 | "dev": true, 924 | "requires": { 925 | "ms": "2.0.0" 926 | } 927 | }, 928 | "minimist": { 929 | "version": "0.0.8", 930 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 931 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 932 | "dev": true 933 | }, 934 | "mkdirp": { 935 | "version": "0.5.0", 936 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 937 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 938 | "dev": true, 939 | "requires": { 940 | "minimist": "0.0.8" 941 | } 942 | } 943 | } 944 | }, 945 | "extsprintf": { 946 | "version": "1.3.0", 947 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 948 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 949 | }, 950 | "fast-deep-equal": { 951 | "version": "1.0.0", 952 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 953 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 954 | "dev": true 955 | }, 956 | "fast-json-stable-stringify": { 957 | "version": "2.0.0", 958 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 959 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 960 | "dev": true 961 | }, 962 | "fast-levenshtein": { 963 | "version": "2.0.6", 964 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 965 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 966 | }, 967 | "fd-slicer": { 968 | "version": "1.0.1", 969 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 970 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 971 | "dev": true, 972 | "requires": { 973 | "pend": "1.2.0" 974 | } 975 | }, 976 | "fibers": { 977 | "version": "1.0.15", 978 | "resolved": "https://registry.npmjs.org/fibers/-/fibers-1.0.15.tgz", 979 | "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=", 980 | "dev": true 981 | }, 982 | "figures": { 983 | "version": "2.0.0", 984 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 985 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 986 | "dev": true, 987 | "requires": { 988 | "escape-string-regexp": "1.0.5" 989 | } 990 | }, 991 | "finalhandler": { 992 | "version": "1.0.5", 993 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.5.tgz", 994 | "integrity": "sha1-pwEwPSV6G8gv6lR6M+WuiVMXI98=", 995 | "requires": { 996 | "debug": "2.6.8", 997 | "encodeurl": "1.0.1", 998 | "escape-html": "1.0.3", 999 | "on-finished": "2.3.0", 1000 | "parseurl": "1.3.2", 1001 | "statuses": "1.3.1", 1002 | "unpipe": "1.0.0" 1003 | } 1004 | }, 1005 | "foreach": { 1006 | "version": "2.0.5", 1007 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 1008 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 1009 | }, 1010 | "forever-agent": { 1011 | "version": "0.6.1", 1012 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1013 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1014 | }, 1015 | "form-data": { 1016 | "version": "2.1.4", 1017 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 1018 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 1019 | "requires": { 1020 | "asynckit": "0.4.0", 1021 | "combined-stream": "1.0.5", 1022 | "mime-types": "2.1.17" 1023 | } 1024 | }, 1025 | "formidable": { 1026 | "version": "1.1.1", 1027 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", 1028 | "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", 1029 | "dev": true 1030 | }, 1031 | "forwarded": { 1032 | "version": "0.1.2", 1033 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1034 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1035 | }, 1036 | "fresh": { 1037 | "version": "0.5.0", 1038 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", 1039 | "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" 1040 | }, 1041 | "fs-extra": { 1042 | "version": "1.0.0", 1043 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 1044 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 1045 | "dev": true, 1046 | "requires": { 1047 | "graceful-fs": "4.1.11", 1048 | "jsonfile": "2.4.0", 1049 | "klaw": "1.3.1" 1050 | } 1051 | }, 1052 | "fs.realpath": { 1053 | "version": "1.0.0", 1054 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1055 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1056 | "dev": true 1057 | }, 1058 | "function-bind": { 1059 | "version": "1.1.1", 1060 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1061 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1062 | }, 1063 | "gaze": { 1064 | "version": "1.1.2", 1065 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", 1066 | "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", 1067 | "dev": true, 1068 | "requires": { 1069 | "globule": "1.2.0" 1070 | } 1071 | }, 1072 | "generate-function": { 1073 | "version": "2.0.0", 1074 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 1075 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" 1076 | }, 1077 | "generate-object-property": { 1078 | "version": "1.2.0", 1079 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 1080 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 1081 | "requires": { 1082 | "is-property": "1.0.2" 1083 | } 1084 | }, 1085 | "getpass": { 1086 | "version": "0.1.7", 1087 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1088 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1089 | "requires": { 1090 | "assert-plus": "1.0.0" 1091 | }, 1092 | "dependencies": { 1093 | "assert-plus": { 1094 | "version": "1.0.0", 1095 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1096 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1097 | } 1098 | } 1099 | }, 1100 | "glob": { 1101 | "version": "6.0.4", 1102 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", 1103 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", 1104 | "requires": { 1105 | "inflight": "1.0.6", 1106 | "inherits": "2.0.3", 1107 | "minimatch": "3.0.4", 1108 | "once": "1.4.0", 1109 | "path-is-absolute": "1.0.1" 1110 | } 1111 | }, 1112 | "globule": { 1113 | "version": "1.2.0", 1114 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", 1115 | "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", 1116 | "dev": true, 1117 | "requires": { 1118 | "glob": "7.1.2", 1119 | "lodash": "4.17.4", 1120 | "minimatch": "3.0.4" 1121 | }, 1122 | "dependencies": { 1123 | "glob": { 1124 | "version": "7.1.2", 1125 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1126 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1127 | "dev": true, 1128 | "requires": { 1129 | "fs.realpath": "1.0.0", 1130 | "inflight": "1.0.6", 1131 | "inherits": "2.0.3", 1132 | "minimatch": "3.0.4", 1133 | "once": "1.4.0", 1134 | "path-is-absolute": "1.0.1" 1135 | } 1136 | } 1137 | } 1138 | }, 1139 | "graceful-fs": { 1140 | "version": "4.1.11", 1141 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1142 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1143 | }, 1144 | "graceful-readlink": { 1145 | "version": "1.0.1", 1146 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 1147 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 1148 | }, 1149 | "growl": { 1150 | "version": "1.9.2", 1151 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 1152 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 1153 | "dev": true 1154 | }, 1155 | "handlebars": { 1156 | "version": "4.0.10", 1157 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", 1158 | "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", 1159 | "requires": { 1160 | "async": "1.5.2", 1161 | "optimist": "0.6.1", 1162 | "source-map": "0.4.4", 1163 | "uglify-js": "2.8.29" 1164 | } 1165 | }, 1166 | "har-schema": { 1167 | "version": "1.0.5", 1168 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 1169 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", 1170 | "dev": true 1171 | }, 1172 | "har-validator": { 1173 | "version": "2.0.6", 1174 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", 1175 | "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", 1176 | "requires": { 1177 | "chalk": "1.1.3", 1178 | "commander": "2.9.0", 1179 | "is-my-json-valid": "2.16.1", 1180 | "pinkie-promise": "2.0.1" 1181 | } 1182 | }, 1183 | "has-ansi": { 1184 | "version": "2.0.0", 1185 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1186 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1187 | "requires": { 1188 | "ansi-regex": "2.1.1" 1189 | } 1190 | }, 1191 | "has-flag": { 1192 | "version": "1.0.0", 1193 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1194 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1195 | "dev": true 1196 | }, 1197 | "hasha": { 1198 | "version": "2.2.0", 1199 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 1200 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 1201 | "dev": true, 1202 | "requires": { 1203 | "is-stream": "1.1.0", 1204 | "pinkie-promise": "2.0.1" 1205 | } 1206 | }, 1207 | "hawk": { 1208 | "version": "3.1.3", 1209 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 1210 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 1211 | "requires": { 1212 | "boom": "2.10.1", 1213 | "cryptiles": "2.0.5", 1214 | "hoek": "2.16.3", 1215 | "sntp": "1.0.9" 1216 | } 1217 | }, 1218 | "he": { 1219 | "version": "1.1.1", 1220 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 1221 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 1222 | "dev": true 1223 | }, 1224 | "header-case": { 1225 | "version": "1.0.1", 1226 | "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", 1227 | "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", 1228 | "dev": true, 1229 | "requires": { 1230 | "no-case": "2.3.2", 1231 | "upper-case": "1.1.3" 1232 | } 1233 | }, 1234 | "hoek": { 1235 | "version": "2.16.3", 1236 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 1237 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 1238 | }, 1239 | "hooks-fixed": { 1240 | "version": "2.0.0", 1241 | "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.0.tgz", 1242 | "integrity": "sha1-oB2JTVKsf2WZu7H2PfycQR33DLo=" 1243 | }, 1244 | "html-encoding-sniffer": { 1245 | "version": "1.0.2", 1246 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", 1247 | "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", 1248 | "requires": { 1249 | "whatwg-encoding": "1.0.3" 1250 | } 1251 | }, 1252 | "http-errors": { 1253 | "version": "1.6.2", 1254 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 1255 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 1256 | "requires": { 1257 | "depd": "1.1.1", 1258 | "inherits": "2.0.3", 1259 | "setprototypeof": "1.0.3", 1260 | "statuses": "1.3.1" 1261 | } 1262 | }, 1263 | "http-signature": { 1264 | "version": "1.1.1", 1265 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 1266 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 1267 | "requires": { 1268 | "assert-plus": "0.2.0", 1269 | "jsprim": "1.4.1", 1270 | "sshpk": "1.13.1" 1271 | } 1272 | }, 1273 | "humanize-duration": { 1274 | "version": "3.10.1", 1275 | "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.10.1.tgz", 1276 | "integrity": "sha512-FHD+u5OKj8TSsSdMHJxSCC78N5Rt4ecil6sWvI+xPbUKhxvHmkKo/V8imbR1m2dXueZYLIl7PcSYX9i/oEiOIA==", 1277 | "dev": true 1278 | }, 1279 | "iconv-lite": { 1280 | "version": "0.4.15", 1281 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", 1282 | "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" 1283 | }, 1284 | "inflight": { 1285 | "version": "1.0.6", 1286 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1287 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1288 | "requires": { 1289 | "once": "1.4.0", 1290 | "wrappy": "1.0.2" 1291 | } 1292 | }, 1293 | "inherits": { 1294 | "version": "2.0.3", 1295 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1296 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1297 | }, 1298 | "inquirer": { 1299 | "version": "3.0.6", 1300 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", 1301 | "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", 1302 | "dev": true, 1303 | "requires": { 1304 | "ansi-escapes": "1.4.0", 1305 | "chalk": "1.1.3", 1306 | "cli-cursor": "2.1.0", 1307 | "cli-width": "2.2.0", 1308 | "external-editor": "2.0.5", 1309 | "figures": "2.0.0", 1310 | "lodash": "4.17.4", 1311 | "mute-stream": "0.0.7", 1312 | "run-async": "2.3.0", 1313 | "rx": "4.1.0", 1314 | "string-width": "2.1.1", 1315 | "strip-ansi": "3.0.1", 1316 | "through": "2.3.8" 1317 | } 1318 | }, 1319 | "ipaddr.js": { 1320 | "version": "1.4.0", 1321 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", 1322 | "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" 1323 | }, 1324 | "is-buffer": { 1325 | "version": "1.1.5", 1326 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 1327 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" 1328 | }, 1329 | "is-fullwidth-code-point": { 1330 | "version": "2.0.0", 1331 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1332 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1333 | "dev": true 1334 | }, 1335 | "is-lower-case": { 1336 | "version": "1.1.3", 1337 | "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", 1338 | "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", 1339 | "dev": true, 1340 | "requires": { 1341 | "lower-case": "1.1.4" 1342 | } 1343 | }, 1344 | "is-my-json-valid": { 1345 | "version": "2.16.1", 1346 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 1347 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 1348 | "requires": { 1349 | "generate-function": "2.0.0", 1350 | "generate-object-property": "1.2.0", 1351 | "jsonpointer": "4.0.1", 1352 | "xtend": "4.0.1" 1353 | } 1354 | }, 1355 | "is-promise": { 1356 | "version": "2.1.0", 1357 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1358 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1359 | "dev": true 1360 | }, 1361 | "is-property": { 1362 | "version": "1.0.2", 1363 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1364 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 1365 | }, 1366 | "is-stream": { 1367 | "version": "1.1.0", 1368 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1369 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1370 | "dev": true 1371 | }, 1372 | "is-typedarray": { 1373 | "version": "1.0.0", 1374 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1375 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1376 | }, 1377 | "is-upper-case": { 1378 | "version": "1.1.2", 1379 | "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", 1380 | "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", 1381 | "dev": true, 1382 | "requires": { 1383 | "upper-case": "1.1.3" 1384 | } 1385 | }, 1386 | "isarray": { 1387 | "version": "1.0.0", 1388 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1389 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1390 | }, 1391 | "isexe": { 1392 | "version": "2.0.0", 1393 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1394 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1395 | "dev": true 1396 | }, 1397 | "isstream": { 1398 | "version": "0.1.2", 1399 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1400 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1401 | }, 1402 | "jade": { 1403 | "version": "0.26.3", 1404 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1405 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 1406 | "dev": true, 1407 | "requires": { 1408 | "commander": "0.6.1", 1409 | "mkdirp": "0.3.0" 1410 | }, 1411 | "dependencies": { 1412 | "commander": { 1413 | "version": "0.6.1", 1414 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1415 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 1416 | "dev": true 1417 | }, 1418 | "mkdirp": { 1419 | "version": "0.3.0", 1420 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1421 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 1422 | "dev": true 1423 | } 1424 | } 1425 | }, 1426 | "jsbn": { 1427 | "version": "0.1.1", 1428 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1429 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1430 | "optional": true 1431 | }, 1432 | "jschardet": { 1433 | "version": "1.5.1", 1434 | "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", 1435 | "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", 1436 | "dev": true 1437 | }, 1438 | "jsdom": { 1439 | "version": "9.12.0", 1440 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", 1441 | "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", 1442 | "requires": { 1443 | "abab": "1.0.4", 1444 | "acorn": "4.0.13", 1445 | "acorn-globals": "3.1.0", 1446 | "array-equal": "1.0.0", 1447 | "content-type-parser": "1.0.2", 1448 | "cssom": "0.3.2", 1449 | "cssstyle": "0.2.37", 1450 | "escodegen": "1.9.0", 1451 | "html-encoding-sniffer": "1.0.2", 1452 | "nwmatcher": "1.4.3", 1453 | "parse5": "1.5.1", 1454 | "request": "2.79.0", 1455 | "sax": "1.2.4", 1456 | "symbol-tree": "3.2.2", 1457 | "tough-cookie": "2.3.2", 1458 | "webidl-conversions": "4.0.2", 1459 | "whatwg-encoding": "1.0.3", 1460 | "whatwg-url": "4.8.0", 1461 | "xml-name-validator": "2.0.1" 1462 | } 1463 | }, 1464 | "json-schema": { 1465 | "version": "0.2.3", 1466 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1467 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1468 | }, 1469 | "json-schema-traverse": { 1470 | "version": "0.3.1", 1471 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1472 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1473 | "dev": true 1474 | }, 1475 | "json-stable-stringify": { 1476 | "version": "1.0.1", 1477 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1478 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1479 | "dev": true, 1480 | "requires": { 1481 | "jsonify": "0.0.0" 1482 | } 1483 | }, 1484 | "json-stringify-safe": { 1485 | "version": "5.0.1", 1486 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1487 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1488 | }, 1489 | "json3": { 1490 | "version": "3.3.2", 1491 | "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", 1492 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", 1493 | "dev": true 1494 | }, 1495 | "jsonfile": { 1496 | "version": "2.4.0", 1497 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 1498 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 1499 | "dev": true, 1500 | "requires": { 1501 | "graceful-fs": "4.1.11" 1502 | } 1503 | }, 1504 | "jsonify": { 1505 | "version": "0.0.0", 1506 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1507 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1508 | "dev": true 1509 | }, 1510 | "jsonpointer": { 1511 | "version": "4.0.1", 1512 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1513 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" 1514 | }, 1515 | "jsprim": { 1516 | "version": "1.4.1", 1517 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1518 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1519 | "requires": { 1520 | "assert-plus": "1.0.0", 1521 | "extsprintf": "1.3.0", 1522 | "json-schema": "0.2.3", 1523 | "verror": "1.10.0" 1524 | }, 1525 | "dependencies": { 1526 | "assert-plus": { 1527 | "version": "1.0.0", 1528 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1529 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1530 | } 1531 | } 1532 | }, 1533 | "kareem": { 1534 | "version": "1.5.0", 1535 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", 1536 | "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" 1537 | }, 1538 | "kew": { 1539 | "version": "0.7.0", 1540 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 1541 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", 1542 | "dev": true 1543 | }, 1544 | "kind-of": { 1545 | "version": "3.2.2", 1546 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1547 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1548 | "requires": { 1549 | "is-buffer": "1.1.5" 1550 | } 1551 | }, 1552 | "klaw": { 1553 | "version": "1.3.1", 1554 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 1555 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 1556 | "dev": true, 1557 | "requires": { 1558 | "graceful-fs": "4.1.11" 1559 | } 1560 | }, 1561 | "lazy-cache": { 1562 | "version": "1.0.4", 1563 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1564 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1565 | "optional": true 1566 | }, 1567 | "lazystream": { 1568 | "version": "1.0.0", 1569 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 1570 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 1571 | "dev": true, 1572 | "requires": { 1573 | "readable-stream": "2.3.3" 1574 | } 1575 | }, 1576 | "levn": { 1577 | "version": "0.3.0", 1578 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1579 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1580 | "requires": { 1581 | "prelude-ls": "1.1.2", 1582 | "type-check": "0.3.2" 1583 | } 1584 | }, 1585 | "lodash": { 1586 | "version": "4.17.4", 1587 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1588 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1589 | }, 1590 | "lodash._baseassign": { 1591 | "version": "3.2.0", 1592 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 1593 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 1594 | "dev": true, 1595 | "requires": { 1596 | "lodash._basecopy": "3.0.1", 1597 | "lodash.keys": "3.1.2" 1598 | } 1599 | }, 1600 | "lodash._basecopy": { 1601 | "version": "3.0.1", 1602 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 1603 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 1604 | "dev": true 1605 | }, 1606 | "lodash._basecreate": { 1607 | "version": "3.0.3", 1608 | "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", 1609 | "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", 1610 | "dev": true 1611 | }, 1612 | "lodash._getnative": { 1613 | "version": "3.9.1", 1614 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 1615 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 1616 | "dev": true 1617 | }, 1618 | "lodash._isiterateecall": { 1619 | "version": "3.0.9", 1620 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 1621 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 1622 | "dev": true 1623 | }, 1624 | "lodash.create": { 1625 | "version": "3.1.1", 1626 | "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", 1627 | "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", 1628 | "dev": true, 1629 | "requires": { 1630 | "lodash._baseassign": "3.2.0", 1631 | "lodash._basecreate": "3.0.3", 1632 | "lodash._isiterateecall": "3.0.9" 1633 | } 1634 | }, 1635 | "lodash.isarguments": { 1636 | "version": "3.1.0", 1637 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 1638 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 1639 | "dev": true 1640 | }, 1641 | "lodash.isarray": { 1642 | "version": "3.0.4", 1643 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 1644 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 1645 | "dev": true 1646 | }, 1647 | "lodash.keys": { 1648 | "version": "3.1.2", 1649 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 1650 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 1651 | "dev": true, 1652 | "requires": { 1653 | "lodash._getnative": "3.9.1", 1654 | "lodash.isarguments": "3.1.0", 1655 | "lodash.isarray": "3.0.4" 1656 | } 1657 | }, 1658 | "longest": { 1659 | "version": "1.0.1", 1660 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1661 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 1662 | }, 1663 | "lower-case": { 1664 | "version": "1.1.4", 1665 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", 1666 | "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", 1667 | "dev": true 1668 | }, 1669 | "lower-case-first": { 1670 | "version": "1.0.2", 1671 | "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", 1672 | "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", 1673 | "dev": true, 1674 | "requires": { 1675 | "lower-case": "1.1.4" 1676 | } 1677 | }, 1678 | "lru-cache": { 1679 | "version": "2.7.3", 1680 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1681 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1682 | "dev": true 1683 | }, 1684 | "media-typer": { 1685 | "version": "0.3.0", 1686 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1687 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1688 | }, 1689 | "merge-descriptors": { 1690 | "version": "1.0.1", 1691 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1692 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1693 | }, 1694 | "methods": { 1695 | "version": "1.1.2", 1696 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1697 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1698 | }, 1699 | "mime": { 1700 | "version": "1.3.4", 1701 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", 1702 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" 1703 | }, 1704 | "mime-db": { 1705 | "version": "1.30.0", 1706 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 1707 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 1708 | }, 1709 | "mime-types": { 1710 | "version": "2.1.17", 1711 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 1712 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 1713 | "requires": { 1714 | "mime-db": "1.30.0" 1715 | } 1716 | }, 1717 | "mimic-fn": { 1718 | "version": "1.1.0", 1719 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", 1720 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", 1721 | "dev": true 1722 | }, 1723 | "minimatch": { 1724 | "version": "3.0.4", 1725 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1726 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1727 | "requires": { 1728 | "brace-expansion": "1.1.8" 1729 | } 1730 | }, 1731 | "minimist": { 1732 | "version": "0.0.10", 1733 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1734 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 1735 | }, 1736 | "mkdirp": { 1737 | "version": "0.5.1", 1738 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1739 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1740 | "dev": true, 1741 | "requires": { 1742 | "minimist": "0.0.8" 1743 | }, 1744 | "dependencies": { 1745 | "minimist": { 1746 | "version": "0.0.8", 1747 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1748 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1749 | "dev": true 1750 | } 1751 | } 1752 | }, 1753 | "mocha": { 1754 | "version": "3.5.3", 1755 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", 1756 | "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", 1757 | "dev": true, 1758 | "requires": { 1759 | "browser-stdout": "1.3.0", 1760 | "commander": "2.9.0", 1761 | "debug": "2.6.8", 1762 | "diff": "3.2.0", 1763 | "escape-string-regexp": "1.0.5", 1764 | "glob": "7.1.1", 1765 | "growl": "1.9.2", 1766 | "he": "1.1.1", 1767 | "json3": "3.3.2", 1768 | "lodash.create": "3.1.1", 1769 | "mkdirp": "0.5.1", 1770 | "supports-color": "3.1.2" 1771 | }, 1772 | "dependencies": { 1773 | "glob": { 1774 | "version": "7.1.1", 1775 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 1776 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", 1777 | "dev": true, 1778 | "requires": { 1779 | "fs.realpath": "1.0.0", 1780 | "inflight": "1.0.6", 1781 | "inherits": "2.0.3", 1782 | "minimatch": "3.0.4", 1783 | "once": "1.4.0", 1784 | "path-is-absolute": "1.0.1" 1785 | } 1786 | } 1787 | } 1788 | }, 1789 | "mongodb": { 1790 | "version": "2.2.31", 1791 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", 1792 | "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", 1793 | "requires": { 1794 | "es6-promise": "3.2.1", 1795 | "mongodb-core": "2.1.15", 1796 | "readable-stream": "2.2.7" 1797 | }, 1798 | "dependencies": { 1799 | "readable-stream": { 1800 | "version": "2.2.7", 1801 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", 1802 | "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", 1803 | "requires": { 1804 | "buffer-shims": "1.0.0", 1805 | "core-util-is": "1.0.2", 1806 | "inherits": "2.0.3", 1807 | "isarray": "1.0.0", 1808 | "process-nextick-args": "1.0.7", 1809 | "string_decoder": "1.0.3", 1810 | "util-deprecate": "1.0.2" 1811 | } 1812 | } 1813 | } 1814 | }, 1815 | "mongodb-core": { 1816 | "version": "2.1.15", 1817 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", 1818 | "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", 1819 | "requires": { 1820 | "bson": "1.0.4", 1821 | "require_optional": "1.0.1" 1822 | } 1823 | }, 1824 | "mongoose": { 1825 | "version": "4.11.13", 1826 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.11.13.tgz", 1827 | "integrity": "sha512-z7w4KTn5pHCJB5nz6+2nOMZf/2xllOsoB0QKQS2ZfYNjdJUimjVhoLHMG6IEHU905sz32QSQwH5jHqOPSJtZbg==", 1828 | "requires": { 1829 | "async": "2.1.4", 1830 | "bson": "1.0.4", 1831 | "hooks-fixed": "2.0.0", 1832 | "kareem": "1.5.0", 1833 | "mongodb": "2.2.31", 1834 | "mpath": "0.3.0", 1835 | "mpromise": "0.5.5", 1836 | "mquery": "2.3.1", 1837 | "ms": "2.0.0", 1838 | "muri": "1.2.2", 1839 | "regexp-clone": "0.0.1", 1840 | "sliced": "1.0.1" 1841 | }, 1842 | "dependencies": { 1843 | "async": { 1844 | "version": "2.1.4", 1845 | "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", 1846 | "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", 1847 | "requires": { 1848 | "lodash": "4.17.4" 1849 | } 1850 | } 1851 | } 1852 | }, 1853 | "morgan": { 1854 | "version": "1.8.2", 1855 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", 1856 | "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=", 1857 | "requires": { 1858 | "basic-auth": "1.1.0", 1859 | "debug": "2.6.8", 1860 | "depd": "1.1.1", 1861 | "on-finished": "2.3.0", 1862 | "on-headers": "1.0.1" 1863 | } 1864 | }, 1865 | "mpath": { 1866 | "version": "0.3.0", 1867 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", 1868 | "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" 1869 | }, 1870 | "mpromise": { 1871 | "version": "0.5.5", 1872 | "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", 1873 | "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" 1874 | }, 1875 | "mquery": { 1876 | "version": "2.3.1", 1877 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.1.tgz", 1878 | "integrity": "sha1-mrNnSXFIAP8LtTpoHOS8TV8HyHs=", 1879 | "requires": { 1880 | "bluebird": "2.10.2", 1881 | "debug": "2.6.8", 1882 | "regexp-clone": "0.0.1", 1883 | "sliced": "0.0.5" 1884 | }, 1885 | "dependencies": { 1886 | "sliced": { 1887 | "version": "0.0.5", 1888 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", 1889 | "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" 1890 | } 1891 | } 1892 | }, 1893 | "ms": { 1894 | "version": "2.0.0", 1895 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1896 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1897 | }, 1898 | "muri": { 1899 | "version": "1.2.2", 1900 | "resolved": "https://registry.npmjs.org/muri/-/muri-1.2.2.tgz", 1901 | "integrity": "sha1-YxmBMmUNsIoEzHnM0A3Tia/SYxw=" 1902 | }, 1903 | "mute-stream": { 1904 | "version": "0.0.7", 1905 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1906 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1907 | "dev": true 1908 | }, 1909 | "negotiator": { 1910 | "version": "0.6.1", 1911 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1912 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1913 | }, 1914 | "no-case": { 1915 | "version": "2.3.2", 1916 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", 1917 | "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", 1918 | "dev": true, 1919 | "requires": { 1920 | "lower-case": "1.1.4" 1921 | } 1922 | }, 1923 | "normalize-path": { 1924 | "version": "2.1.1", 1925 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1926 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1927 | "dev": true, 1928 | "requires": { 1929 | "remove-trailing-separator": "1.1.0" 1930 | } 1931 | }, 1932 | "npm-install-package": { 1933 | "version": "2.1.0", 1934 | "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", 1935 | "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=", 1936 | "dev": true 1937 | }, 1938 | "nwmatcher": { 1939 | "version": "1.4.3", 1940 | "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", 1941 | "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==" 1942 | }, 1943 | "oauth-sign": { 1944 | "version": "0.8.2", 1945 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1946 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1947 | }, 1948 | "object-keys": { 1949 | "version": "1.0.11", 1950 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 1951 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" 1952 | }, 1953 | "object.assign": { 1954 | "version": "4.0.4", 1955 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", 1956 | "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", 1957 | "requires": { 1958 | "define-properties": "1.1.2", 1959 | "function-bind": "1.1.1", 1960 | "object-keys": "1.0.11" 1961 | } 1962 | }, 1963 | "on-finished": { 1964 | "version": "2.3.0", 1965 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1966 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1967 | "requires": { 1968 | "ee-first": "1.1.1" 1969 | } 1970 | }, 1971 | "on-headers": { 1972 | "version": "1.0.1", 1973 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 1974 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 1975 | }, 1976 | "once": { 1977 | "version": "1.4.0", 1978 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1979 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1980 | "requires": { 1981 | "wrappy": "1.0.2" 1982 | } 1983 | }, 1984 | "onetime": { 1985 | "version": "2.0.1", 1986 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1987 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1988 | "dev": true, 1989 | "requires": { 1990 | "mimic-fn": "1.1.0" 1991 | } 1992 | }, 1993 | "optimist": { 1994 | "version": "0.6.1", 1995 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1996 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1997 | "requires": { 1998 | "minimist": "0.0.10", 1999 | "wordwrap": "0.0.3" 2000 | } 2001 | }, 2002 | "optionator": { 2003 | "version": "0.8.2", 2004 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 2005 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2006 | "requires": { 2007 | "deep-is": "0.1.3", 2008 | "fast-levenshtein": "2.0.6", 2009 | "levn": "0.3.0", 2010 | "prelude-ls": "1.1.2", 2011 | "type-check": "0.3.2", 2012 | "wordwrap": "1.0.0" 2013 | }, 2014 | "dependencies": { 2015 | "wordwrap": { 2016 | "version": "1.0.0", 2017 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2018 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 2019 | } 2020 | } 2021 | }, 2022 | "os-tmpdir": { 2023 | "version": "1.0.2", 2024 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2025 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2026 | "dev": true 2027 | }, 2028 | "param-case": { 2029 | "version": "2.1.1", 2030 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", 2031 | "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", 2032 | "dev": true, 2033 | "requires": { 2034 | "no-case": "2.3.2" 2035 | } 2036 | }, 2037 | "parse5": { 2038 | "version": "1.5.1", 2039 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", 2040 | "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" 2041 | }, 2042 | "parseurl": { 2043 | "version": "1.3.2", 2044 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2045 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2046 | }, 2047 | "pascal-case": { 2048 | "version": "2.0.1", 2049 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", 2050 | "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", 2051 | "dev": true, 2052 | "requires": { 2053 | "camel-case": "3.0.0", 2054 | "upper-case-first": "1.1.2" 2055 | } 2056 | }, 2057 | "path-case": { 2058 | "version": "2.1.1", 2059 | "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", 2060 | "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", 2061 | "dev": true, 2062 | "requires": { 2063 | "no-case": "2.3.2" 2064 | } 2065 | }, 2066 | "path-is-absolute": { 2067 | "version": "1.0.1", 2068 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2069 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2070 | }, 2071 | "path-to-regexp": { 2072 | "version": "0.1.7", 2073 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2074 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2075 | }, 2076 | "pend": { 2077 | "version": "1.2.0", 2078 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 2079 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 2080 | "dev": true 2081 | }, 2082 | "performance-now": { 2083 | "version": "0.2.0", 2084 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 2085 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", 2086 | "dev": true 2087 | }, 2088 | "phantomjs-prebuilt": { 2089 | "version": "2.1.16", 2090 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 2091 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 2092 | "dev": true, 2093 | "requires": { 2094 | "es6-promise": "4.1.1", 2095 | "extract-zip": "1.6.6", 2096 | "fs-extra": "1.0.0", 2097 | "hasha": "2.2.0", 2098 | "kew": "0.7.0", 2099 | "progress": "1.1.8", 2100 | "request": "2.83.0", 2101 | "request-progress": "2.0.1", 2102 | "which": "1.3.0" 2103 | }, 2104 | "dependencies": { 2105 | "ajv": { 2106 | "version": "5.3.0", 2107 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", 2108 | "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", 2109 | "dev": true, 2110 | "requires": { 2111 | "co": "4.6.0", 2112 | "fast-deep-equal": "1.0.0", 2113 | "fast-json-stable-stringify": "2.0.0", 2114 | "json-schema-traverse": "0.3.1" 2115 | } 2116 | }, 2117 | "assert-plus": { 2118 | "version": "1.0.0", 2119 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2120 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 2121 | "dev": true 2122 | }, 2123 | "aws-sign2": { 2124 | "version": "0.7.0", 2125 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 2126 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 2127 | "dev": true 2128 | }, 2129 | "boom": { 2130 | "version": "4.3.1", 2131 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 2132 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 2133 | "dev": true, 2134 | "requires": { 2135 | "hoek": "4.2.0" 2136 | } 2137 | }, 2138 | "caseless": { 2139 | "version": "0.12.0", 2140 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 2141 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 2142 | "dev": true 2143 | }, 2144 | "cryptiles": { 2145 | "version": "3.1.2", 2146 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 2147 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 2148 | "dev": true, 2149 | "requires": { 2150 | "boom": "5.2.0" 2151 | }, 2152 | "dependencies": { 2153 | "boom": { 2154 | "version": "5.2.0", 2155 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 2156 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 2157 | "dev": true, 2158 | "requires": { 2159 | "hoek": "4.2.0" 2160 | } 2161 | } 2162 | } 2163 | }, 2164 | "es6-promise": { 2165 | "version": "4.1.1", 2166 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", 2167 | "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==", 2168 | "dev": true 2169 | }, 2170 | "form-data": { 2171 | "version": "2.3.1", 2172 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", 2173 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", 2174 | "dev": true, 2175 | "requires": { 2176 | "asynckit": "0.4.0", 2177 | "combined-stream": "1.0.5", 2178 | "mime-types": "2.1.17" 2179 | } 2180 | }, 2181 | "har-schema": { 2182 | "version": "2.0.0", 2183 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 2184 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 2185 | "dev": true 2186 | }, 2187 | "har-validator": { 2188 | "version": "5.0.3", 2189 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 2190 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 2191 | "dev": true, 2192 | "requires": { 2193 | "ajv": "5.3.0", 2194 | "har-schema": "2.0.0" 2195 | } 2196 | }, 2197 | "hawk": { 2198 | "version": "6.0.2", 2199 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 2200 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 2201 | "dev": true, 2202 | "requires": { 2203 | "boom": "4.3.1", 2204 | "cryptiles": "3.1.2", 2205 | "hoek": "4.2.0", 2206 | "sntp": "2.1.0" 2207 | } 2208 | }, 2209 | "hoek": { 2210 | "version": "4.2.0", 2211 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 2212 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", 2213 | "dev": true 2214 | }, 2215 | "http-signature": { 2216 | "version": "1.2.0", 2217 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 2218 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 2219 | "dev": true, 2220 | "requires": { 2221 | "assert-plus": "1.0.0", 2222 | "jsprim": "1.4.1", 2223 | "sshpk": "1.13.1" 2224 | } 2225 | }, 2226 | "performance-now": { 2227 | "version": "2.1.0", 2228 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2229 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 2230 | "dev": true 2231 | }, 2232 | "qs": { 2233 | "version": "6.5.1", 2234 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 2235 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", 2236 | "dev": true 2237 | }, 2238 | "request": { 2239 | "version": "2.83.0", 2240 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", 2241 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", 2242 | "dev": true, 2243 | "requires": { 2244 | "aws-sign2": "0.7.0", 2245 | "aws4": "1.6.0", 2246 | "caseless": "0.12.0", 2247 | "combined-stream": "1.0.5", 2248 | "extend": "3.0.1", 2249 | "forever-agent": "0.6.1", 2250 | "form-data": "2.3.1", 2251 | "har-validator": "5.0.3", 2252 | "hawk": "6.0.2", 2253 | "http-signature": "1.2.0", 2254 | "is-typedarray": "1.0.0", 2255 | "isstream": "0.1.2", 2256 | "json-stringify-safe": "5.0.1", 2257 | "mime-types": "2.1.17", 2258 | "oauth-sign": "0.8.2", 2259 | "performance-now": "2.1.0", 2260 | "qs": "6.5.1", 2261 | "safe-buffer": "5.1.1", 2262 | "stringstream": "0.0.5", 2263 | "tough-cookie": "2.3.3", 2264 | "tunnel-agent": "0.6.0", 2265 | "uuid": "3.1.0" 2266 | } 2267 | }, 2268 | "sntp": { 2269 | "version": "2.1.0", 2270 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 2271 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 2272 | "dev": true, 2273 | "requires": { 2274 | "hoek": "4.2.0" 2275 | } 2276 | }, 2277 | "tough-cookie": { 2278 | "version": "2.3.3", 2279 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 2280 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 2281 | "dev": true, 2282 | "requires": { 2283 | "punycode": "1.4.1" 2284 | } 2285 | }, 2286 | "tunnel-agent": { 2287 | "version": "0.6.0", 2288 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2289 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2290 | "dev": true, 2291 | "requires": { 2292 | "safe-buffer": "5.1.1" 2293 | } 2294 | } 2295 | } 2296 | }, 2297 | "pinkie": { 2298 | "version": "2.0.4", 2299 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2300 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 2301 | }, 2302 | "pinkie-promise": { 2303 | "version": "2.0.1", 2304 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2305 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2306 | "requires": { 2307 | "pinkie": "2.0.4" 2308 | } 2309 | }, 2310 | "prelude-ls": { 2311 | "version": "1.1.2", 2312 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2313 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 2314 | }, 2315 | "process-nextick-args": { 2316 | "version": "1.0.7", 2317 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2318 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 2319 | }, 2320 | "progress": { 2321 | "version": "1.1.8", 2322 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 2323 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 2324 | "dev": true 2325 | }, 2326 | "promise": { 2327 | "version": "7.3.1", 2328 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 2329 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 2330 | "requires": { 2331 | "asap": "2.0.6" 2332 | } 2333 | }, 2334 | "proxy-addr": { 2335 | "version": "1.1.5", 2336 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", 2337 | "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", 2338 | "requires": { 2339 | "forwarded": "0.1.2", 2340 | "ipaddr.js": "1.4.0" 2341 | } 2342 | }, 2343 | "punycode": { 2344 | "version": "1.4.1", 2345 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2346 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 2347 | }, 2348 | "q": { 2349 | "version": "1.5.0", 2350 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", 2351 | "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", 2352 | "dev": true 2353 | }, 2354 | "qs": { 2355 | "version": "6.4.0", 2356 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 2357 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 2358 | }, 2359 | "querystring": { 2360 | "version": "0.2.0", 2361 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2362 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 2363 | "dev": true 2364 | }, 2365 | "range-parser": { 2366 | "version": "1.2.0", 2367 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2368 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2369 | }, 2370 | "raw-body": { 2371 | "version": "2.2.0", 2372 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", 2373 | "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", 2374 | "requires": { 2375 | "bytes": "2.4.0", 2376 | "iconv-lite": "0.4.15", 2377 | "unpipe": "1.0.0" 2378 | } 2379 | }, 2380 | "readable-stream": { 2381 | "version": "2.3.3", 2382 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 2383 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 2384 | "dev": true, 2385 | "requires": { 2386 | "core-util-is": "1.0.2", 2387 | "inherits": "2.0.3", 2388 | "isarray": "1.0.0", 2389 | "process-nextick-args": "1.0.7", 2390 | "safe-buffer": "5.1.1", 2391 | "string_decoder": "1.0.3", 2392 | "util-deprecate": "1.0.2" 2393 | } 2394 | }, 2395 | "regenerator-runtime": { 2396 | "version": "0.10.5", 2397 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", 2398 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", 2399 | "dev": true 2400 | }, 2401 | "regexp-clone": { 2402 | "version": "0.0.1", 2403 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", 2404 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" 2405 | }, 2406 | "remove-trailing-separator": { 2407 | "version": "1.1.0", 2408 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2409 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 2410 | "dev": true 2411 | }, 2412 | "repeat-string": { 2413 | "version": "1.6.1", 2414 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2415 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2416 | }, 2417 | "request": { 2418 | "version": "2.79.0", 2419 | "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", 2420 | "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", 2421 | "requires": { 2422 | "aws-sign2": "0.6.0", 2423 | "aws4": "1.6.0", 2424 | "caseless": "0.11.0", 2425 | "combined-stream": "1.0.5", 2426 | "extend": "3.0.1", 2427 | "forever-agent": "0.6.1", 2428 | "form-data": "2.1.4", 2429 | "har-validator": "2.0.6", 2430 | "hawk": "3.1.3", 2431 | "http-signature": "1.1.1", 2432 | "is-typedarray": "1.0.0", 2433 | "isstream": "0.1.2", 2434 | "json-stringify-safe": "5.0.1", 2435 | "mime-types": "2.1.17", 2436 | "oauth-sign": "0.8.2", 2437 | "qs": "6.3.2", 2438 | "stringstream": "0.0.5", 2439 | "tough-cookie": "2.3.2", 2440 | "tunnel-agent": "0.4.3", 2441 | "uuid": "3.1.0" 2442 | }, 2443 | "dependencies": { 2444 | "qs": { 2445 | "version": "6.3.2", 2446 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", 2447 | "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" 2448 | } 2449 | } 2450 | }, 2451 | "request-progress": { 2452 | "version": "2.0.1", 2453 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 2454 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 2455 | "dev": true, 2456 | "requires": { 2457 | "throttleit": "1.0.0" 2458 | } 2459 | }, 2460 | "require_optional": { 2461 | "version": "1.0.1", 2462 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 2463 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 2464 | "requires": { 2465 | "resolve-from": "2.0.0", 2466 | "semver": "5.4.1" 2467 | } 2468 | }, 2469 | "resolve-from": { 2470 | "version": "2.0.0", 2471 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 2472 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 2473 | }, 2474 | "resolve-url": { 2475 | "version": "0.2.1", 2476 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2477 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 2478 | "dev": true 2479 | }, 2480 | "restore-cursor": { 2481 | "version": "2.0.0", 2482 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2483 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2484 | "dev": true, 2485 | "requires": { 2486 | "onetime": "2.0.1", 2487 | "signal-exit": "3.0.2" 2488 | } 2489 | }, 2490 | "rgb2hex": { 2491 | "version": "0.1.0", 2492 | "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.0.tgz", 2493 | "integrity": "sha1-zNVfhgrgxcTqN1BLlY5ELY0SMls=", 2494 | "dev": true 2495 | }, 2496 | "right-align": { 2497 | "version": "0.1.3", 2498 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 2499 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 2500 | "optional": true, 2501 | "requires": { 2502 | "align-text": "0.1.4" 2503 | } 2504 | }, 2505 | "run-async": { 2506 | "version": "2.3.0", 2507 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 2508 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2509 | "dev": true, 2510 | "requires": { 2511 | "is-promise": "2.1.0" 2512 | } 2513 | }, 2514 | "rx": { 2515 | "version": "4.1.0", 2516 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 2517 | "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", 2518 | "dev": true 2519 | }, 2520 | "safe-buffer": { 2521 | "version": "5.1.1", 2522 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2523 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 2524 | }, 2525 | "sax": { 2526 | "version": "1.2.4", 2527 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2528 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 2529 | }, 2530 | "semver": { 2531 | "version": "5.4.1", 2532 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 2533 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" 2534 | }, 2535 | "send": { 2536 | "version": "0.15.4", 2537 | "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", 2538 | "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", 2539 | "requires": { 2540 | "debug": "2.6.8", 2541 | "depd": "1.1.1", 2542 | "destroy": "1.0.4", 2543 | "encodeurl": "1.0.1", 2544 | "escape-html": "1.0.3", 2545 | "etag": "1.8.1", 2546 | "fresh": "0.5.0", 2547 | "http-errors": "1.6.2", 2548 | "mime": "1.3.4", 2549 | "ms": "2.0.0", 2550 | "on-finished": "2.3.0", 2551 | "range-parser": "1.2.0", 2552 | "statuses": "1.3.1" 2553 | } 2554 | }, 2555 | "sentence-case": { 2556 | "version": "2.1.1", 2557 | "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", 2558 | "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", 2559 | "dev": true, 2560 | "requires": { 2561 | "no-case": "2.3.2", 2562 | "upper-case-first": "1.1.2" 2563 | } 2564 | }, 2565 | "serve-favicon": { 2566 | "version": "2.4.4", 2567 | "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.4.tgz", 2568 | "integrity": "sha1-QS3ddJZRUcn3TAgo811QxSUCEN4=", 2569 | "requires": { 2570 | "etag": "1.8.1", 2571 | "fresh": "0.5.1", 2572 | "ms": "2.0.0", 2573 | "parseurl": "1.3.2", 2574 | "safe-buffer": "5.1.1" 2575 | }, 2576 | "dependencies": { 2577 | "fresh": { 2578 | "version": "0.5.1", 2579 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.1.tgz", 2580 | "integrity": "sha1-w6CLzsD83MIj7fOyPrMn8fn8v1w=" 2581 | } 2582 | } 2583 | }, 2584 | "serve-static": { 2585 | "version": "1.12.4", 2586 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", 2587 | "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", 2588 | "requires": { 2589 | "encodeurl": "1.0.1", 2590 | "escape-html": "1.0.3", 2591 | "parseurl": "1.3.2", 2592 | "send": "0.15.4" 2593 | } 2594 | }, 2595 | "setprototypeof": { 2596 | "version": "1.0.3", 2597 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 2598 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 2599 | }, 2600 | "sigmund": { 2601 | "version": "1.0.1", 2602 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2603 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2604 | "dev": true 2605 | }, 2606 | "signal-exit": { 2607 | "version": "3.0.2", 2608 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2609 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2610 | "dev": true 2611 | }, 2612 | "sliced": { 2613 | "version": "1.0.1", 2614 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 2615 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 2616 | }, 2617 | "snake-case": { 2618 | "version": "2.1.0", 2619 | "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", 2620 | "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", 2621 | "dev": true, 2622 | "requires": { 2623 | "no-case": "2.3.2" 2624 | } 2625 | }, 2626 | "sntp": { 2627 | "version": "1.0.9", 2628 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 2629 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 2630 | "requires": { 2631 | "hoek": "2.16.3" 2632 | } 2633 | }, 2634 | "source-map": { 2635 | "version": "0.4.4", 2636 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 2637 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 2638 | "requires": { 2639 | "amdefine": "1.0.1" 2640 | } 2641 | }, 2642 | "source-map-resolve": { 2643 | "version": "0.3.1", 2644 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", 2645 | "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", 2646 | "dev": true, 2647 | "requires": { 2648 | "atob": "1.1.3", 2649 | "resolve-url": "0.2.1", 2650 | "source-map-url": "0.3.0", 2651 | "urix": "0.1.0" 2652 | } 2653 | }, 2654 | "source-map-url": { 2655 | "version": "0.3.0", 2656 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", 2657 | "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", 2658 | "dev": true 2659 | }, 2660 | "sshpk": { 2661 | "version": "1.13.1", 2662 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 2663 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 2664 | "requires": { 2665 | "asn1": "0.2.3", 2666 | "assert-plus": "1.0.0", 2667 | "bcrypt-pbkdf": "1.0.1", 2668 | "dashdash": "1.14.1", 2669 | "ecc-jsbn": "0.1.1", 2670 | "getpass": "0.1.7", 2671 | "jsbn": "0.1.1", 2672 | "tweetnacl": "0.14.5" 2673 | }, 2674 | "dependencies": { 2675 | "assert-plus": { 2676 | "version": "1.0.0", 2677 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2678 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 2679 | } 2680 | } 2681 | }, 2682 | "statuses": { 2683 | "version": "1.3.1", 2684 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 2685 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 2686 | }, 2687 | "string-width": { 2688 | "version": "2.1.1", 2689 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2690 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2691 | "dev": true, 2692 | "requires": { 2693 | "is-fullwidth-code-point": "2.0.0", 2694 | "strip-ansi": "4.0.0" 2695 | }, 2696 | "dependencies": { 2697 | "ansi-regex": { 2698 | "version": "3.0.0", 2699 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2700 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2701 | "dev": true 2702 | }, 2703 | "strip-ansi": { 2704 | "version": "4.0.0", 2705 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2706 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2707 | "dev": true, 2708 | "requires": { 2709 | "ansi-regex": "3.0.0" 2710 | } 2711 | } 2712 | } 2713 | }, 2714 | "string_decoder": { 2715 | "version": "1.0.3", 2716 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2717 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2718 | "requires": { 2719 | "safe-buffer": "5.1.1" 2720 | } 2721 | }, 2722 | "stringstream": { 2723 | "version": "0.0.5", 2724 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2725 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 2726 | }, 2727 | "strip-ansi": { 2728 | "version": "3.0.1", 2729 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2730 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2731 | "requires": { 2732 | "ansi-regex": "2.1.1" 2733 | } 2734 | }, 2735 | "superagent": { 2736 | "version": "3.6.0", 2737 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.0.tgz", 2738 | "integrity": "sha512-oWsu4mboo8sVxagp4bNwZIR1rUmypeAJDmNIwT9mF4k06hSu6P92aOjEWLaIj7vsX3fOUp+cRH/04tao+q5Q7A==", 2739 | "dev": true, 2740 | "requires": { 2741 | "component-emitter": "1.2.1", 2742 | "cookiejar": "2.1.1", 2743 | "debug": "2.6.8", 2744 | "extend": "3.0.1", 2745 | "form-data": "2.1.4", 2746 | "formidable": "1.1.1", 2747 | "methods": "1.1.2", 2748 | "mime": "1.4.0", 2749 | "qs": "6.4.0", 2750 | "readable-stream": "2.3.3" 2751 | }, 2752 | "dependencies": { 2753 | "mime": { 2754 | "version": "1.4.0", 2755 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.0.tgz", 2756 | "integrity": "sha512-n9ChLv77+QQEapYz8lV+rIZAW3HhAPW2CXnzb1GN5uMkuczshwvkW7XPsbzU0ZQN3sP47Er2KVkp2p3KyqZKSQ==", 2757 | "dev": true 2758 | } 2759 | } 2760 | }, 2761 | "supertest": { 2762 | "version": "3.0.0", 2763 | "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", 2764 | "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", 2765 | "dev": true, 2766 | "requires": { 2767 | "methods": "1.1.2", 2768 | "superagent": "3.6.0" 2769 | } 2770 | }, 2771 | "supports-color": { 2772 | "version": "3.1.2", 2773 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", 2774 | "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", 2775 | "dev": true, 2776 | "requires": { 2777 | "has-flag": "1.0.0" 2778 | } 2779 | }, 2780 | "swap-case": { 2781 | "version": "1.1.2", 2782 | "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", 2783 | "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", 2784 | "dev": true, 2785 | "requires": { 2786 | "lower-case": "1.1.4", 2787 | "upper-case": "1.1.3" 2788 | } 2789 | }, 2790 | "symbol-tree": { 2791 | "version": "3.2.2", 2792 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", 2793 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 2794 | }, 2795 | "tar-stream": { 2796 | "version": "1.5.2", 2797 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz", 2798 | "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=", 2799 | "dev": true, 2800 | "requires": { 2801 | "bl": "1.2.1", 2802 | "end-of-stream": "1.4.0", 2803 | "readable-stream": "2.3.3", 2804 | "xtend": "4.0.1" 2805 | } 2806 | }, 2807 | "throttleit": { 2808 | "version": "1.0.0", 2809 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 2810 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 2811 | "dev": true 2812 | }, 2813 | "through": { 2814 | "version": "2.3.8", 2815 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2816 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2817 | "dev": true 2818 | }, 2819 | "title-case": { 2820 | "version": "2.1.1", 2821 | "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", 2822 | "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", 2823 | "dev": true, 2824 | "requires": { 2825 | "no-case": "2.3.2", 2826 | "upper-case": "1.1.3" 2827 | } 2828 | }, 2829 | "tmp": { 2830 | "version": "0.0.33", 2831 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2832 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2833 | "dev": true, 2834 | "requires": { 2835 | "os-tmpdir": "1.0.2" 2836 | } 2837 | }, 2838 | "to-iso-string": { 2839 | "version": "0.0.2", 2840 | "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", 2841 | "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", 2842 | "dev": true 2843 | }, 2844 | "tough-cookie": { 2845 | "version": "2.3.2", 2846 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 2847 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 2848 | "requires": { 2849 | "punycode": "1.4.1" 2850 | } 2851 | }, 2852 | "tr46": { 2853 | "version": "0.0.3", 2854 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2855 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 2856 | }, 2857 | "tunnel-agent": { 2858 | "version": "0.4.3", 2859 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", 2860 | "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" 2861 | }, 2862 | "tweetnacl": { 2863 | "version": "0.14.5", 2864 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2865 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2866 | "optional": true 2867 | }, 2868 | "type-check": { 2869 | "version": "0.3.2", 2870 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2871 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2872 | "requires": { 2873 | "prelude-ls": "1.1.2" 2874 | } 2875 | }, 2876 | "type-is": { 2877 | "version": "1.6.15", 2878 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 2879 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 2880 | "requires": { 2881 | "media-typer": "0.3.0", 2882 | "mime-types": "2.1.17" 2883 | } 2884 | }, 2885 | "typedarray": { 2886 | "version": "0.0.6", 2887 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2888 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2889 | "dev": true 2890 | }, 2891 | "uglify-js": { 2892 | "version": "2.8.29", 2893 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 2894 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 2895 | "optional": true, 2896 | "requires": { 2897 | "source-map": "0.5.7", 2898 | "uglify-to-browserify": "1.0.2", 2899 | "yargs": "3.10.0" 2900 | }, 2901 | "dependencies": { 2902 | "source-map": { 2903 | "version": "0.5.7", 2904 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2905 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2906 | "optional": true 2907 | } 2908 | } 2909 | }, 2910 | "uglify-to-browserify": { 2911 | "version": "1.0.2", 2912 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 2913 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 2914 | "optional": true 2915 | }, 2916 | "unpipe": { 2917 | "version": "1.0.0", 2918 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2919 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2920 | }, 2921 | "upper-case": { 2922 | "version": "1.1.3", 2923 | "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", 2924 | "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", 2925 | "dev": true 2926 | }, 2927 | "upper-case-first": { 2928 | "version": "1.1.2", 2929 | "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", 2930 | "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", 2931 | "dev": true, 2932 | "requires": { 2933 | "upper-case": "1.1.3" 2934 | } 2935 | }, 2936 | "urix": { 2937 | "version": "0.1.0", 2938 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 2939 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 2940 | "dev": true 2941 | }, 2942 | "url": { 2943 | "version": "0.11.0", 2944 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2945 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 2946 | "dev": true, 2947 | "requires": { 2948 | "punycode": "1.3.2", 2949 | "querystring": "0.2.0" 2950 | }, 2951 | "dependencies": { 2952 | "punycode": { 2953 | "version": "1.3.2", 2954 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2955 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 2956 | "dev": true 2957 | } 2958 | } 2959 | }, 2960 | "util-deprecate": { 2961 | "version": "1.0.2", 2962 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2963 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2964 | }, 2965 | "utils-merge": { 2966 | "version": "1.0.0", 2967 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", 2968 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" 2969 | }, 2970 | "uuid": { 2971 | "version": "3.1.0", 2972 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 2973 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 2974 | }, 2975 | "validator": { 2976 | "version": "7.0.0", 2977 | "resolved": "https://registry.npmjs.org/validator/-/validator-7.0.0.tgz", 2978 | "integrity": "sha1-x03rgGNRL6w1VHk45vCxUEooL9I=", 2979 | "dev": true 2980 | }, 2981 | "vary": { 2982 | "version": "1.1.1", 2983 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", 2984 | "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" 2985 | }, 2986 | "verror": { 2987 | "version": "1.10.0", 2988 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2989 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2990 | "requires": { 2991 | "assert-plus": "1.0.0", 2992 | "core-util-is": "1.0.2", 2993 | "extsprintf": "1.3.0" 2994 | }, 2995 | "dependencies": { 2996 | "assert-plus": { 2997 | "version": "1.0.0", 2998 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2999 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 3000 | } 3001 | } 3002 | }, 3003 | "walkdir": { 3004 | "version": "0.0.11", 3005 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", 3006 | "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", 3007 | "dev": true 3008 | }, 3009 | "wdio-dot-reporter": { 3010 | "version": "0.0.9", 3011 | "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz", 3012 | "integrity": "sha1-kpsq2v1J1rBTT9oGjocxm0fjj+U=", 3013 | "dev": true 3014 | }, 3015 | "wdio-mocha-framework": { 3016 | "version": "0.4.6", 3017 | "resolved": "https://registry.npmjs.org/wdio-mocha-framework/-/wdio-mocha-framework-0.4.6.tgz", 3018 | "integrity": "sha1-GU3sQM+RDtE7fgVr3aek0MWcTUY=", 3019 | "dev": true, 3020 | "requires": { 3021 | "babel-runtime": "5.8.38", 3022 | "mocha": "2.5.3", 3023 | "wdio-sync": "0.5.16" 3024 | }, 3025 | "dependencies": { 3026 | "commander": { 3027 | "version": "2.3.0", 3028 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 3029 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 3030 | "dev": true 3031 | }, 3032 | "debug": { 3033 | "version": "2.2.0", 3034 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 3035 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 3036 | "dev": true, 3037 | "requires": { 3038 | "ms": "0.7.1" 3039 | } 3040 | }, 3041 | "diff": { 3042 | "version": "1.4.0", 3043 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 3044 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 3045 | "dev": true 3046 | }, 3047 | "escape-string-regexp": { 3048 | "version": "1.0.2", 3049 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 3050 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 3051 | "dev": true 3052 | }, 3053 | "glob": { 3054 | "version": "3.2.11", 3055 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 3056 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 3057 | "dev": true, 3058 | "requires": { 3059 | "inherits": "2.0.3", 3060 | "minimatch": "0.3.0" 3061 | } 3062 | }, 3063 | "minimatch": { 3064 | "version": "0.3.0", 3065 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 3066 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 3067 | "dev": true, 3068 | "requires": { 3069 | "lru-cache": "2.7.3", 3070 | "sigmund": "1.0.1" 3071 | } 3072 | }, 3073 | "mocha": { 3074 | "version": "2.5.3", 3075 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", 3076 | "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", 3077 | "dev": true, 3078 | "requires": { 3079 | "commander": "2.3.0", 3080 | "debug": "2.2.0", 3081 | "diff": "1.4.0", 3082 | "escape-string-regexp": "1.0.2", 3083 | "glob": "3.2.11", 3084 | "growl": "1.9.2", 3085 | "jade": "0.26.3", 3086 | "mkdirp": "0.5.1", 3087 | "supports-color": "1.2.0", 3088 | "to-iso-string": "0.0.2" 3089 | } 3090 | }, 3091 | "ms": { 3092 | "version": "0.7.1", 3093 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 3094 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 3095 | "dev": true 3096 | }, 3097 | "supports-color": { 3098 | "version": "1.2.0", 3099 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", 3100 | "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", 3101 | "dev": true 3102 | } 3103 | } 3104 | }, 3105 | "wdio-phantomjs-service": { 3106 | "version": "0.2.2", 3107 | "resolved": "https://registry.npmjs.org/wdio-phantomjs-service/-/wdio-phantomjs-service-0.2.2.tgz", 3108 | "integrity": "sha1-vG8XJPDEjbhBNfj5AOTjSEKBKtw=", 3109 | "dev": true, 3110 | "requires": { 3111 | "change-case": "3.0.1", 3112 | "phantomjs-prebuilt": "2.1.16" 3113 | } 3114 | }, 3115 | "wdio-spec-reporter": { 3116 | "version": "0.1.2", 3117 | "resolved": "https://registry.npmjs.org/wdio-spec-reporter/-/wdio-spec-reporter-0.1.2.tgz", 3118 | "integrity": "sha1-kcb2CX+SrSUc0rZuOIUFxMDiR2A=", 3119 | "dev": true, 3120 | "requires": { 3121 | "babel-runtime": "6.25.0", 3122 | "humanize-duration": "3.10.1" 3123 | }, 3124 | "dependencies": { 3125 | "babel-runtime": { 3126 | "version": "6.25.0", 3127 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", 3128 | "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", 3129 | "dev": true, 3130 | "requires": { 3131 | "core-js": "2.5.1", 3132 | "regenerator-runtime": "0.10.5" 3133 | } 3134 | }, 3135 | "core-js": { 3136 | "version": "2.5.1", 3137 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", 3138 | "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", 3139 | "dev": true 3140 | } 3141 | } 3142 | }, 3143 | "wdio-sync": { 3144 | "version": "0.5.16", 3145 | "resolved": "https://registry.npmjs.org/wdio-sync/-/wdio-sync-0.5.16.tgz", 3146 | "integrity": "sha1-iTuBaN+OzwUKFLGicX43WqXNN34=", 3147 | "dev": true, 3148 | "requires": { 3149 | "fibers": "1.0.15", 3150 | "object.assign": "4.0.4" 3151 | } 3152 | }, 3153 | "webdriverio": { 3154 | "version": "4.8.0", 3155 | "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.8.0.tgz", 3156 | "integrity": "sha1-1Skpt0kID4mWf24WFAUcvIFy0TI=", 3157 | "dev": true, 3158 | "requires": { 3159 | "archiver": "1.3.0", 3160 | "babel-runtime": "6.23.0", 3161 | "css-parse": "2.0.0", 3162 | "css-value": "0.0.1", 3163 | "deepmerge": "1.3.2", 3164 | "ejs": "2.5.7", 3165 | "gaze": "1.1.2", 3166 | "glob": "7.1.2", 3167 | "inquirer": "3.0.6", 3168 | "json-stringify-safe": "5.0.1", 3169 | "mkdirp": "0.5.1", 3170 | "npm-install-package": "2.1.0", 3171 | "optimist": "0.6.1", 3172 | "q": "1.5.0", 3173 | "request": "2.81.0", 3174 | "rgb2hex": "0.1.0", 3175 | "safe-buffer": "5.0.1", 3176 | "supports-color": "3.2.3", 3177 | "url": "0.11.0", 3178 | "validator": "7.0.0", 3179 | "wdio-dot-reporter": "0.0.9", 3180 | "wgxpath": "1.0.0" 3181 | }, 3182 | "dependencies": { 3183 | "babel-runtime": { 3184 | "version": "6.23.0", 3185 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", 3186 | "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", 3187 | "dev": true, 3188 | "requires": { 3189 | "core-js": "2.5.1", 3190 | "regenerator-runtime": "0.10.5" 3191 | } 3192 | }, 3193 | "caseless": { 3194 | "version": "0.12.0", 3195 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 3196 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 3197 | "dev": true 3198 | }, 3199 | "core-js": { 3200 | "version": "2.5.1", 3201 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", 3202 | "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", 3203 | "dev": true 3204 | }, 3205 | "glob": { 3206 | "version": "7.1.2", 3207 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 3208 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 3209 | "dev": true, 3210 | "requires": { 3211 | "fs.realpath": "1.0.0", 3212 | "inflight": "1.0.6", 3213 | "inherits": "2.0.3", 3214 | "minimatch": "3.0.4", 3215 | "once": "1.4.0", 3216 | "path-is-absolute": "1.0.1" 3217 | } 3218 | }, 3219 | "har-validator": { 3220 | "version": "4.2.1", 3221 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 3222 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", 3223 | "dev": true, 3224 | "requires": { 3225 | "ajv": "4.11.8", 3226 | "har-schema": "1.0.5" 3227 | } 3228 | }, 3229 | "request": { 3230 | "version": "2.81.0", 3231 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 3232 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", 3233 | "dev": true, 3234 | "requires": { 3235 | "aws-sign2": "0.6.0", 3236 | "aws4": "1.6.0", 3237 | "caseless": "0.12.0", 3238 | "combined-stream": "1.0.5", 3239 | "extend": "3.0.1", 3240 | "forever-agent": "0.6.1", 3241 | "form-data": "2.1.4", 3242 | "har-validator": "4.2.1", 3243 | "hawk": "3.1.3", 3244 | "http-signature": "1.1.1", 3245 | "is-typedarray": "1.0.0", 3246 | "isstream": "0.1.2", 3247 | "json-stringify-safe": "5.0.1", 3248 | "mime-types": "2.1.17", 3249 | "oauth-sign": "0.8.2", 3250 | "performance-now": "0.2.0", 3251 | "qs": "6.4.0", 3252 | "safe-buffer": "5.0.1", 3253 | "stringstream": "0.0.5", 3254 | "tough-cookie": "2.3.2", 3255 | "tunnel-agent": "0.6.0", 3256 | "uuid": "3.1.0" 3257 | } 3258 | }, 3259 | "safe-buffer": { 3260 | "version": "5.0.1", 3261 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", 3262 | "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", 3263 | "dev": true 3264 | }, 3265 | "supports-color": { 3266 | "version": "3.2.3", 3267 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 3268 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 3269 | "dev": true, 3270 | "requires": { 3271 | "has-flag": "1.0.0" 3272 | } 3273 | }, 3274 | "tunnel-agent": { 3275 | "version": "0.6.0", 3276 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3277 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3278 | "dev": true, 3279 | "requires": { 3280 | "safe-buffer": "5.0.1" 3281 | } 3282 | } 3283 | } 3284 | }, 3285 | "webidl-conversions": { 3286 | "version": "4.0.2", 3287 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 3288 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" 3289 | }, 3290 | "wgxpath": { 3291 | "version": "1.0.0", 3292 | "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", 3293 | "integrity": "sha1-7vikudVYzEla06mit1FZfs2a9pA=", 3294 | "dev": true 3295 | }, 3296 | "whatwg-encoding": { 3297 | "version": "1.0.3", 3298 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", 3299 | "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", 3300 | "requires": { 3301 | "iconv-lite": "0.4.19" 3302 | }, 3303 | "dependencies": { 3304 | "iconv-lite": { 3305 | "version": "0.4.19", 3306 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 3307 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 3308 | } 3309 | } 3310 | }, 3311 | "whatwg-url": { 3312 | "version": "4.8.0", 3313 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", 3314 | "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", 3315 | "requires": { 3316 | "tr46": "0.0.3", 3317 | "webidl-conversions": "3.0.1" 3318 | }, 3319 | "dependencies": { 3320 | "webidl-conversions": { 3321 | "version": "3.0.1", 3322 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3323 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 3324 | } 3325 | } 3326 | }, 3327 | "which": { 3328 | "version": "1.3.0", 3329 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 3330 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 3331 | "dev": true, 3332 | "requires": { 3333 | "isexe": "2.0.0" 3334 | } 3335 | }, 3336 | "window-size": { 3337 | "version": "0.1.0", 3338 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 3339 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 3340 | "optional": true 3341 | }, 3342 | "wordwrap": { 3343 | "version": "0.0.3", 3344 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 3345 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 3346 | }, 3347 | "wrappy": { 3348 | "version": "1.0.2", 3349 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3350 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3351 | }, 3352 | "xml-name-validator": { 3353 | "version": "2.0.1", 3354 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", 3355 | "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" 3356 | }, 3357 | "xtend": { 3358 | "version": "4.0.1", 3359 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 3360 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 3361 | }, 3362 | "yargs": { 3363 | "version": "3.10.0", 3364 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 3365 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 3366 | "optional": true, 3367 | "requires": { 3368 | "camelcase": "1.2.1", 3369 | "cliui": "2.1.0", 3370 | "decamelize": "1.2.0", 3371 | "window-size": "0.1.0" 3372 | } 3373 | }, 3374 | "yauzl": { 3375 | "version": "2.4.1", 3376 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 3377 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 3378 | "dev": true, 3379 | "requires": { 3380 | "fd-slicer": "1.0.1" 3381 | } 3382 | }, 3383 | "zip-stream": { 3384 | "version": "1.2.0", 3385 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", 3386 | "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", 3387 | "dev": true, 3388 | "requires": { 3389 | "archiver-utils": "1.3.0", 3390 | "compress-commons": "1.2.0", 3391 | "lodash": "4.17.4", 3392 | "readable-stream": "2.3.3" 3393 | } 3394 | } 3395 | } 3396 | } 3397 | --------------------------------------------------------------------------------