├── client ├── static │ └── .gitkeep ├── .eslintignore ├── config │ ├── prod.env.js │ ├── test.env.js │ ├── dev.env.js │ └── index.js ├── src │ ├── assets │ │ ├── logo.png │ │ └── login_logo@2x.png │ ├── routes │ │ └── home │ │ │ └── Home.vue │ ├── components │ │ ├── AppSidebar │ │ │ └── AppSidebar.vue │ │ └── AppHeader │ │ │ └── AppHeader.vue │ ├── router │ │ └── index.js │ ├── main.js │ └── App.vue ├── .gitignore ├── test │ ├── unit │ │ ├── .eslintrc │ │ ├── specs │ │ │ └── Hello.spec.js │ │ ├── index.js │ │ └── karma.conf.js │ └── e2e │ │ ├── specs │ │ └── test.js │ │ ├── custom-assertions │ │ └── elementCount.js │ │ ├── runner.js │ │ └── nightwatch.conf.js ├── .editorconfig ├── .postcssrc.js ├── README.md ├── index.html ├── build │ ├── dev-client.js │ ├── vue-loader.conf.js │ ├── webpack.test.conf.js │ ├── build.js │ ├── check-versions.js │ ├── webpack.dev.conf.js │ ├── webpack.base.conf.js │ ├── utils.js │ ├── dev-server.js │ └── webpack.prod.conf.js ├── .babelrc ├── .eslintrc.js └── package.json ├── server ├── .gitignore ├── src │ ├── models │ │ ├── index.js │ │ └── users │ │ │ └── userModel.js │ ├── api │ │ └── v1 │ │ │ ├── login │ │ │ ├── loginRoutes.js │ │ │ └── loginController.js │ │ │ ├── users │ │ │ ├── userValidation.js │ │ │ ├── userRoutes.js │ │ │ └── userController.js │ │ │ └── signUp │ │ │ ├── signupValidation.js │ │ │ ├── signUpRoutes.js │ │ │ └── signUpController.js │ ├── utils │ │ ├── ApiError.js │ │ └── passportMiddleweare.js │ ├── libs │ │ └── winston.js │ ├── config │ │ ├── config.js │ │ ├── dbTest.js │ │ └── db.js │ └── index.js ├── Dockerfile ├── docker-compose.yml ├── README.md ├── package.json ├── test │ ├── login │ │ └── login.spec.js │ ├── users │ │ └── users.spec.js │ └── signup │ │ └── signup.spec.js └── yarn.lock └── README.md /client/static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /client/config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ 3 | npm-debug.log 4 | coverage 5 | .DS_Store 6 | /*.env -------------------------------------------------------------------------------- /client/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madmous/HipChat-Clone/HEAD/client/src/assets/logo.png -------------------------------------------------------------------------------- /client/src/assets/login_logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madmous/HipChat-Clone/HEAD/client/src/assets/login_logo@2x.png -------------------------------------------------------------------------------- /server/src/models/index.js: -------------------------------------------------------------------------------- 1 | let index = {}; 2 | 3 | index.userModel = require ('./users/userModel'); 4 | 5 | module.exports = index; -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log 5 | yarn-error.log 6 | test/unit/coverage 7 | test/e2e/reports 8 | selenium-debug.log 9 | -------------------------------------------------------------------------------- /client/test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | }, 5 | "globals": { 6 | "expect": true, 7 | "sinon": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /client/config/test.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var devEnv = require('./dev.env') 3 | 4 | module.exports = merge(devEnv, { 5 | NODE_ENV: '"testing"' 6 | }) 7 | -------------------------------------------------------------------------------- /client/config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [HipChat Clone](https://github.com/Madmous/Trello-Clone/tree/develop/client/hipchat) was moved. Check my huge mono repo that will contain a bunch of application and micro services. -------------------------------------------------------------------------------- /client/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:6 2 | 3 | RUN mkdir -p /src/app 4 | COPY . /src/app 5 | WORKDIR /src/app 6 | RUN npm install --production 7 | 8 | ENV PORT 80 9 | EXPOSE $PORT 10 | 11 | CMD ["npm", "start"] -------------------------------------------------------------------------------- /client/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserlist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped with [Vue cli](https://github.com/vuejs/vue-cli). 2 | 3 | ## Main Libraries 4 | 5 | * Vuex 6 | 7 | ## Achievements 8 | 9 | ## Areas for Improvements / involvement 10 | 11 | -- 12 | 13 | -------------------------------------------------------------------------------- /client/src/routes/home/Home.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HipChat-Clone 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /server/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | services: 3 | web: 4 | build: . 5 | ports: 6 | - "3001:80" 7 | links: 8 | - mongo 9 | mongo: 10 | image: mongo 11 | ports: 12 | - "27017:27017" 13 | volumes: 14 | - /data/mongodb:/data/db -------------------------------------------------------------------------------- /server/src/api/v1/login/loginRoutes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const express = require ('express'); 4 | const router = express.Router(); 5 | 6 | const loginController = require ('./loginController'); 7 | 8 | router.route('/') 9 | .post(loginController.authenticate) 10 | 11 | module.exports = router; -------------------------------------------------------------------------------- /server/src/utils/ApiError.js: -------------------------------------------------------------------------------- 1 | function ApiError(message, status) { 2 | this.message = message; 3 | this.status = status; 4 | this.stack = Error().stack; 5 | } 6 | 7 | ApiError.prototype = Object.create(Error.prototype); 8 | ApiError.prototype.name = "ApiError"; 9 | 10 | module.exports = ApiError; -------------------------------------------------------------------------------- /client/build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function (event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /server/src/api/v1/users/userValidation.js: -------------------------------------------------------------------------------- 1 | const Joi = require ('joi'); 2 | 3 | const userValidation = {}; 4 | 5 | userValidation.updateUser = { 6 | body: { 7 | name: Joi.string().required(), 8 | fullname: Joi.string().required(), 9 | initials: Joi.string().required() 10 | } 11 | }; 12 | 13 | module.exports = userValidation -------------------------------------------------------------------------------- /client/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["latest", { 4 | "es2015": { "modules": false } 5 | }], 6 | "stage-2" 7 | ], 8 | "plugins": ["transform-runtime"], 9 | "comments": false, 10 | "env": { 11 | "test": { 12 | "presets": ["latest", "stage-2"], 13 | "plugins": [ "istanbul" ] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /client/src/components/AppSidebar/AppSidebar.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /client/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Router from 'vue-router'; 2 | import Vuex from 'vuex'; 3 | import Vue from 'vue'; 4 | 5 | import Home from '../routes/home/Home'; 6 | 7 | Vue.use(Router); 8 | Vue.use(Vuex); 9 | 10 | export default new Router({ 11 | routes: [ 12 | { 13 | path: '/', 14 | name: 'Home', 15 | component: Home, 16 | }, 17 | ], 18 | }); 19 | -------------------------------------------------------------------------------- /client/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var config = require('../config') 3 | var isProduction = process.env.NODE_ENV === 'production' 4 | 5 | module.exports = { 6 | loaders: utils.cssLoaders({ 7 | sourceMap: isProduction 8 | ? config.build.productionSourceMap 9 | : config.dev.cssSourceMap, 10 | extract: isProduction 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /server/README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped from my [Trello Clone project](https://github.com/Madmous/Trello-Clone/tree/develop/server). 2 | 3 | ## Main Libraries 4 | 5 | * Passport (basic and jwt strategies) 6 | * JWT simple 7 | * Winston 8 | * Bluebird 9 | * Joi 10 | * Express-Validator 11 | 12 | ## Achievements 13 | 14 | ## Areas for Improvements / involvement 15 | 16 | -- 17 | -------------------------------------------------------------------------------- /client/test/unit/specs/Hello.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Hello from '@/components/Hello'; 3 | 4 | describe('Hello.vue', () => { 5 | it('should render correct contents', () => { 6 | const Constructor = Vue.extend(Hello); 7 | const vm = new Constructor().$mount(); 8 | expect(vm.$el.querySelector('.hello h1').textContent) 9 | .to.equal('Welcome to Your Vue.js App'); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /server/src/api/v1/signUp/signupValidation.js: -------------------------------------------------------------------------------- 1 | const Joi = require ('joi'); 2 | 3 | const signupValidation = {}; 4 | 5 | signupValidation.saveUser = { 6 | body: { 7 | name: Joi.string().required(), 8 | fullname: Joi.string().required(), 9 | initials: Joi.string().required(), 10 | email: Joi.string().email().required(), 11 | password: Joi.string().required() 12 | } 13 | }; 14 | 15 | module.exports = signupValidation -------------------------------------------------------------------------------- /client/src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue'; 4 | import App from './App'; 5 | import router from './router'; 6 | 7 | Vue.config.productionTip = false; 8 | 9 | /* eslint-disable no-new */ 10 | new Vue({ 11 | el: '#app', 12 | router, 13 | template: '', 14 | components: { App }, 15 | }); 16 | -------------------------------------------------------------------------------- /server/src/api/v1/signUp/signUpRoutes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const validate = require ('express-validation'); 4 | const express = require ('express'); 5 | const router = express.Router(); 6 | 7 | const signupValidation = require ('./signupValidation'); 8 | const signUpController = require ('./signUpController'); 9 | 10 | router.route('/') 11 | .post(validate(signupValidation.saveUser), signUpController.saveUser) 12 | 13 | module.exports = router; -------------------------------------------------------------------------------- /server/src/api/v1/users/userRoutes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const validate = require ('express-validation'); 4 | const express = require ('express'); 5 | const router = express.Router(); 6 | 7 | const userValidation = require ('./userValidation'); 8 | const userController = require ('./userController'); 9 | 10 | router.route('/') 11 | .get(userController.getUser) 12 | .put(validate(userValidation.updateUser), userController.updateUser) 13 | .delete(userController.removeUser) 14 | 15 | module.exports = router; -------------------------------------------------------------------------------- /server/src/libs/winston.js: -------------------------------------------------------------------------------- 1 | const winston = require ('winston'); 2 | 3 | function getLogger (module) { 4 | let path = module.filename.split('/').slice(-2).join('/'); 5 | 6 | return new winston.Logger({ 7 | transports : [ 8 | new winston.transports.Console({ 9 | timestamp: () => { 10 | return new Date().toLocaleTimeString(); 11 | }, 12 | colorize : true, 13 | level : 'debug', 14 | label : path 15 | }) 16 | ] 17 | }); 18 | } 19 | 20 | module.exports = getLogger; -------------------------------------------------------------------------------- /server/src/config/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'database': (function() { 3 | if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') { 4 | return 'mongodb://localhost/hipchatCloneApi'; 5 | } else { 6 | return 'mongodb://mongo:27017/hipchatCloneApi'; 7 | } 8 | })(), 9 | 'port': (function() { 10 | if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') { 11 | return 3001; 12 | } else { 13 | return 80; 14 | } 15 | })(), 16 | 'databaseTest': 'mongodb://localhost/hipchatCloneApiTest', 17 | 'secret': 'apitest' 18 | }; -------------------------------------------------------------------------------- /server/src/config/dbTest.js: -------------------------------------------------------------------------------- 1 | 'user strict'; 2 | 3 | const mongoose = require ('mongoose'); 4 | const log = require ('../libs/winston')(module); 5 | 6 | const dbURI = require ('../config/config').databaseTest; 7 | 8 | let db = {}; 9 | 10 | db.connect = () => { 11 | const mongooseConnection = mongoose.connection; 12 | 13 | mongoose.connect(dbURI); 14 | 15 | mongooseConnection.on('connected', () => { 16 | log.info('Mongoose default connection connected to ' + dbURI); 17 | }); 18 | 19 | mongooseConnection.on('error', (err) => { 20 | log.error('Mongoose default connection error: ' + err); 21 | }); 22 | } 23 | 24 | module.exports = db; -------------------------------------------------------------------------------- /client/test/e2e/specs/test.js: -------------------------------------------------------------------------------- 1 | // For authoring Nightwatch tests, see 2 | // http://nightwatchjs.org/guide#usage 3 | 4 | module.exports = { 5 | 'default e2e tests': function test(browser) { 6 | // automatically uses dev Server port from /config.index.js 7 | // default: http://localhost:8080 8 | // see nightwatch.conf.js 9 | const devServer = browser.globals.devServerURL; 10 | 11 | browser 12 | .url(devServer) 13 | .waitForElementVisible('#app', 5000) 14 | .assert.elementPresent('.hello') 15 | .assert.containsText('h1', 'Welcome to Your Vue.js App') 16 | .assert.elementCount('img', 1) 17 | .end(); 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /client/test/unit/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | Vue.config.productionTip = false; 3 | 4 | // Polyfill fn.bind() for PhantomJS 5 | /* eslint-disable no-extend-native */ 6 | Function.prototype.bind = require('function-bind'); 7 | 8 | // require all test files (files that ends with .spec.js) 9 | const testsContext = require.context('./specs', true, /\.spec$/); 10 | testsContext.keys().forEach(testsContext); 11 | 12 | // require all src files except main.js for coverage. 13 | // you can also change this to match only the subset of files that 14 | // you want coverage for. 15 | const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/); 16 | srcContext.keys().forEach(srcContext); 17 | -------------------------------------------------------------------------------- /client/build/webpack.test.conf.js: -------------------------------------------------------------------------------- 1 | // This is the webpack config used for unit tests. 2 | 3 | var utils = require('./utils') 4 | var webpack = require('webpack') 5 | var merge = require('webpack-merge') 6 | var baseConfig = require('./webpack.base.conf') 7 | 8 | var webpackConfig = merge(baseConfig, { 9 | // use inline sourcemap for karma-sourcemap-loader 10 | module: { 11 | rules: utils.styleLoaders() 12 | }, 13 | devtool: '#inline-source-map', 14 | plugins: [ 15 | new webpack.DefinePlugin({ 16 | 'process.env': require('../config/test.env') 17 | }) 18 | ] 19 | }) 20 | 21 | // no need for app entry during tests 22 | delete webpackConfig.entry 23 | 24 | module.exports = webpackConfig 25 | -------------------------------------------------------------------------------- /server/src/api/v1/login/loginController.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const async = require ('async'); 4 | 5 | const models = require ('../../../models/index'); 6 | const config = require ('../../../config/config'); 7 | const log = require ('../../../libs/winston')(module); 8 | 9 | const userModel = models.userModel; 10 | 11 | let loginController = {}; 12 | 13 | loginController.authenticate = (req, res) => { 14 | const reqUser = req.user; 15 | 16 | if (reqUser.err) { 17 | return res.status(401).json({ 18 | data: { 19 | uiError : reqUser.err 20 | } 21 | }); 22 | } else { 23 | return res.status(200).json({ 24 | data: { 25 | token: reqUser.token 26 | } 27 | }); 28 | } 29 | }; 30 | 31 | module.exports = loginController; -------------------------------------------------------------------------------- /client/test/e2e/custom-assertions/elementCount.js: -------------------------------------------------------------------------------- 1 | // A custom Nightwatch assertion. 2 | // the name of the method is the filename. 3 | // can be used in tests like this: 4 | // 5 | // browser.assert.elementCount(selector, count) 6 | // 7 | // for how to write custom assertions see 8 | // http://nightwatchjs.org/guide#writing-custom-assertions 9 | exports.assertion = function (selector, count) { 10 | this.message = 'Testing if element <' + selector + '> has count: ' + count; 11 | this.expected = count; 12 | this.pass = function (val) { 13 | return val === this.expected; 14 | } 15 | this.value = function (res) { 16 | return res.value; 17 | } 18 | this.command = function (cb) { 19 | var self = this; 20 | return this.api.execute(function (selector) { 21 | return document.querySelectorAll(selector).length; 22 | }, [selector], function (res) { 23 | cb.call(self, res); 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /client/src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | 24 | 51 | -------------------------------------------------------------------------------- /client/.eslintrc.js: -------------------------------------------------------------------------------- 1 | // http://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | extends: 'airbnb-base', 13 | // required to lint *.vue files 14 | plugins: [ 15 | 'html' 16 | ], 17 | // check if imports actually resolve 18 | 'settings': { 19 | 'import/resolver': { 20 | 'webpack': { 21 | 'config': 'build/webpack.base.conf.js' 22 | } 23 | } 24 | }, 25 | // add your custom rules here 26 | 'rules': { 27 | // don't require .vue extension when importing 28 | 'import/extensions': ['error', 'always', { 29 | 'js': 'never', 30 | 'vue': 'never' 31 | }], 32 | // allow optionalDependencies 33 | 'import/no-extraneous-dependencies': ['error', { 34 | 'optionalDependencies': ['test/unit/index.js'] 35 | }], 36 | // allow debugger during development 37 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server/src/config/db.js: -------------------------------------------------------------------------------- 1 | 'user strict'; 2 | 3 | const mongoose = require ('mongoose'); 4 | const Promise = require ('bluebird'); 5 | const log = require ('../libs/winston')(module); 6 | 7 | const dbURI = require ('../config/config').database; 8 | 9 | mongoose.Promise = Promise; 10 | 11 | let db = {}; 12 | 13 | db.connect = () => { 14 | const mongooseConnection = mongoose.connection; 15 | 16 | mongoose.connect(dbURI); 17 | 18 | mongooseConnection.on('connected', () => { 19 | log.info('Mongoose default connection connected to ' + dbURI); 20 | }); 21 | 22 | mongooseConnection.on('error', (err) => { 23 | log.error('Mongoose default connection error: ' + err); 24 | }); 25 | 26 | mongooseConnection.on('disconnected', () => { 27 | log.info('Mongoose default connection disconnected'); 28 | }); 29 | 30 | process.on('SIGINT', () => { 31 | mongooseConnection.close( () => { 32 | log.info('Mongoose default connection disconnected through app termination'); 33 | process.exit(0); 34 | }); 35 | }); 36 | } 37 | 38 | module.exports = db; -------------------------------------------------------------------------------- /client/build/build.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | process.env.NODE_ENV = 'production' 4 | 5 | var ora = require('ora') 6 | var rm = require('rimraf') 7 | var path = require('path') 8 | var chalk = require('chalk') 9 | var webpack = require('webpack') 10 | var config = require('../config') 11 | var webpackConfig = require('./webpack.prod.conf') 12 | 13 | var spinner = ora('building for production...') 14 | spinner.start() 15 | 16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 17 | if (err) throw err 18 | webpack(webpackConfig, function (err, stats) { 19 | spinner.stop() 20 | if (err) throw err 21 | process.stdout.write(stats.toString({ 22 | colors: true, 23 | modules: false, 24 | children: false, 25 | chunks: false, 26 | chunkModules: false 27 | }) + '\n\n') 28 | 29 | console.log(chalk.cyan(' Build complete.\n')) 30 | console.log(chalk.yellow( 31 | ' Tip: built files are meant to be served over an HTTP server.\n' + 32 | ' Opening index.html over file:// won\'t work.\n' 33 | )) 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /client/test/unit/karma.conf.js: -------------------------------------------------------------------------------- 1 | // This is a karma config file. For more details see 2 | // http://karma-runner.github.io/0.13/config/configuration-file.html 3 | // we are also using it with karma-webpack 4 | // https://github.com/webpack/karma-webpack 5 | 6 | var webpackConfig = require('../../build/webpack.test.conf'); 7 | 8 | module.exports = function (config) { 9 | config.set({ 10 | // to run in additional browsers: 11 | // 1. install corresponding karma launcher 12 | // http://karma-runner.github.io/0.13/config/browsers.html 13 | // 2. add it to the `browsers` array below. 14 | browsers: ['PhantomJS'], 15 | frameworks: ['mocha', 'sinon-chai'], 16 | reporters: ['spec', 'coverage'], 17 | files: ['./index.js'], 18 | preprocessors: { 19 | './index.js': ['webpack', 'sourcemap'] 20 | }, 21 | webpack: webpackConfig, 22 | webpackMiddleware: { 23 | noInfo: true, 24 | }, 25 | coverageReporter: { 26 | dir: './coverage', 27 | reporters: [ 28 | { type: 'lcov', subdir: '.' }, 29 | { type: 'text-summary' }, 30 | ] 31 | }, 32 | }); 33 | }; 34 | -------------------------------------------------------------------------------- /client/test/e2e/runner.js: -------------------------------------------------------------------------------- 1 | // 1. start the dev server using production config 2 | process.env.NODE_ENV = 'testing'; 3 | var server = require('../../build/dev-server.js'); 4 | 5 | // 2. run the nightwatch test suite against it 6 | // to run in additional browsers: 7 | // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" 8 | // 2. add it to the --env flag below 9 | // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` 10 | // For more information on Nightwatch's config file, see 11 | // http://nightwatchjs.org/guide#settings-file 12 | var opts = process.argv.slice(2); 13 | if (opts.indexOf('--config') === -1) { 14 | opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']); 15 | } 16 | if (opts.indexOf('--env') === -1) { 17 | opts = opts.concat(['--env', 'chrome']); 18 | } 19 | 20 | var spawn = require('cross-spawn'); 21 | var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }); 22 | 23 | runner.on('exit', function (code) { 24 | server.close(); 25 | process.exit(code); 26 | }); 27 | 28 | runner.on('error', function (err) { 29 | server.close(); 30 | throw err; 31 | }); 32 | -------------------------------------------------------------------------------- /client/test/e2e/nightwatch.conf.js: -------------------------------------------------------------------------------- 1 | require('babel-register') 2 | var config = require('../../config') 3 | 4 | // http://nightwatchjs.org/guide#settings-file 5 | module.exports = { 6 | src_folders: ['test/e2e/specs'], 7 | output_folder: 'test/e2e/reports', 8 | custom_assertions_path: ['test/e2e/custom-assertions'], 9 | 10 | selenium: { 11 | start_process: true, 12 | server_path: require('selenium-server').path, 13 | host: '127.0.0.1', 14 | port: 4444, 15 | cli_args: { 16 | 'webdriver.chrome.driver': require('chromedriver').path 17 | } 18 | }, 19 | 20 | test_settings: { 21 | default: { 22 | selenium_port: 4444, 23 | selenium_host: 'localhost', 24 | silent: true, 25 | globals: { 26 | devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) 27 | } 28 | }, 29 | 30 | chrome: { 31 | desiredCapabilities: { 32 | browserName: 'chrome', 33 | javascriptEnabled: true, 34 | acceptSslCerts: true 35 | } 36 | }, 37 | 38 | firefox: { 39 | desiredCapabilities: { 40 | browserName: 'firefox', 41 | javascriptEnabled: true, 42 | acceptSslCerts: true 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /client/src/components/AppHeader/AppHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | 21 | 55 | -------------------------------------------------------------------------------- /client/build/check-versions.js: -------------------------------------------------------------------------------- 1 | var chalk = require('chalk') 2 | var semver = require('semver') 3 | var packageConfig = require('../package.json') 4 | 5 | function exec (cmd) { 6 | return require('child_process').execSync(cmd).toString().trim() 7 | } 8 | 9 | var versionRequirements = [ 10 | { 11 | name: 'node', 12 | currentVersion: semver.clean(process.version), 13 | versionRequirement: packageConfig.engines.node 14 | }, 15 | { 16 | name: 'npm', 17 | currentVersion: exec('npm --version'), 18 | versionRequirement: packageConfig.engines.npm 19 | } 20 | ] 21 | 22 | module.exports = function () { 23 | var warnings = [] 24 | for (var i = 0; i < versionRequirements.length; i++) { 25 | var mod = versionRequirements[i] 26 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 27 | warnings.push(mod.name + ': ' + 28 | chalk.red(mod.currentVersion) + ' should be ' + 29 | chalk.green(mod.versionRequirement) 30 | ) 31 | } 32 | } 33 | 34 | if (warnings.length) { 35 | console.log('') 36 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 37 | console.log() 38 | for (var i = 0; i < warnings.length; i++) { 39 | var warning = warnings[i] 40 | console.log(' ' + warning) 41 | } 42 | console.log() 43 | process.exit(1) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /client/build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var webpack = require('webpack') 3 | var config = require('../config') 4 | var merge = require('webpack-merge') 5 | var baseWebpackConfig = require('./webpack.base.conf') 6 | var HtmlWebpackPlugin = require('html-webpack-plugin') 7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 8 | 9 | // add hot-reload related code to entry chunks 10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) { 11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) 12 | }) 13 | 14 | module.exports = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) 17 | }, 18 | // cheap-module-eval-source-map is faster for development 19 | devtool: '#cheap-module-eval-source-map', 20 | plugins: [ 21 | new webpack.DefinePlugin({ 22 | 'process.env': config.dev.env 23 | }), 24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage 25 | new webpack.HotModuleReplacementPlugin(), 26 | new webpack.NoEmitOnErrorsPlugin(), 27 | // https://github.com/ampedandwired/html-webpack-plugin 28 | new HtmlWebpackPlugin({ 29 | filename: 'index.html', 30 | template: 'index.html', 31 | inject: true 32 | }), 33 | new FriendlyErrorsPlugin() 34 | ] 35 | }) 36 | -------------------------------------------------------------------------------- /server/src/api/v1/signUp/signUpController.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const async = require ('async'); 4 | 5 | const models = require ('../../../models/index'); 6 | const config = require ('../../../config/config'); 7 | const log = require ('../../../libs/winston')(module); 8 | const jwt = require('jwt-simple'); 9 | 10 | const secret = require('../../../config/config').secret; 11 | 12 | const userModel = models.userModel; 13 | 14 | let signUpController = {}; 15 | 16 | function buildResponse(statusCode, data, res) { 17 | if (statusCode === 200) { 18 | return res.status(200).json({ 19 | data: data 20 | }) 21 | } else if (statusCode === 404) { 22 | return res.status(404).json({ 23 | data: data 24 | }) 25 | } 26 | } 27 | 28 | signUpController.saveUser = (req, res) => { 29 | userModel.findOne({name: req.body.name}) 30 | .then(user => { 31 | if (user) { 32 | throw ('That name is already taken'); 33 | } else { 34 | const user = new userModel({ 35 | name: req.body.name, 36 | fullname: req.body.fullname, 37 | password: req.body.password, 38 | initials: req.body.initials, 39 | email: req.body.email 40 | }); 41 | 42 | return user.save(); 43 | } 44 | }) 45 | .then(user => buildResponse(200, jwt.encode(user._id, secret), res)) 46 | .catch(err => buildResponse(404, err, res)); 47 | }; 48 | 49 | module.exports = signUpController; -------------------------------------------------------------------------------- /server/src/models/users/userModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose'); 2 | const bcrypt = require ('bcrypt'); 3 | 4 | const Schema = mongoose.Schema; 5 | 6 | const UserSchema = new Schema({ 7 | name: { 8 | type: String, 9 | unique: true, 10 | required: true 11 | }, 12 | fullname: { 13 | type: String, 14 | required: true 15 | }, 16 | password: { 17 | type: String, 18 | required: true 19 | }, 20 | initials: { 21 | type: String, 22 | required: true 23 | }, 24 | email: { 25 | type: String, 26 | unique: true, 27 | required: true 28 | } 29 | }); 30 | 31 | UserSchema.pre('save', function (callback) { 32 | let userName = this; 33 | 34 | if (this.isModified('password') || this.isNew) { 35 | bcrypt.genSalt(10, (err, salt) => { 36 | if (err) { 37 | return callback(err); 38 | } 39 | bcrypt.hash(userName.password, salt, (err, hash) => { 40 | if (err) { 41 | return callback(err); 42 | } 43 | userName.password = hash; 44 | callback(); 45 | }); 46 | }); 47 | } else { 48 | return callback(); 49 | } 50 | }); 51 | 52 | UserSchema.methods.arePasswordsMatching = function (password, callback) { 53 | bcrypt.compare(password, this.password, (err, isMatch) => { 54 | if (err) { 55 | return callback(err); 56 | } 57 | callback(null, isMatch); 58 | }); 59 | } 60 | 61 | module.exports = mongoose.model('User', UserSchema); -------------------------------------------------------------------------------- /server/src/api/v1/users/userController.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const log = require ('../../../libs/winston')(module); 4 | 5 | let userController = {}; 6 | 7 | function formatResponse(pUser) { 8 | return { 9 | user: { 10 | _id: pUser._id, 11 | fullname: pUser.fullname, 12 | } 13 | } 14 | } 15 | 16 | function buildResponse(statusCode, data, res) { 17 | if (statusCode === 200) { 18 | return res.status(200).json({ 19 | data: formatResponse(data) 20 | }) 21 | } else if (statusCode === 404) { 22 | return res.status(404).json({ 23 | data: data 24 | }) 25 | } 26 | } 27 | 28 | userController.getUser = (req, res) => { 29 | const user = req.user; 30 | 31 | if (!user) { 32 | buildResponse(404, req.err, res); 33 | } else { 34 | buildResponse(200, user, res); 35 | } 36 | }; 37 | 38 | userController.updateUser = (req, res) => { 39 | const errorMessage = 'Sorry. I could not update that user'; 40 | 41 | let user = req.user; 42 | 43 | user.name = req.body.name; 44 | user.fullname = req.body.fullname; 45 | user.initials = req.body.initials; 46 | 47 | user.save() 48 | .then(user => buildResponse(200, user, res)) 49 | .catch(buildResponse(404, errorMessage, res)); 50 | }; 51 | 52 | userController.removeUser = (req, res) => { 53 | const errorMessage = 'Sorry. I could not remove that user'; 54 | 55 | user.remove() 56 | .then(user => buildResponse(200, user, res)) 57 | .catch(buildResponse(404, errorMessage, res)); 58 | }; 59 | 60 | module.exports = userController; -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "trello-clone-api", 3 | "version": "0.1.0", 4 | "author": "Moustapha Amadou Diouf", 5 | "license": "MIT", 6 | "main": "./src/index.js", 7 | "scripts": { 8 | "start": "node ./src/index", 9 | "start:dev": "NODE_ENV=development nodemon ./src/index", 10 | "start:debug": "NODE_ENV=development node --inspect ./src/index", 11 | "test": "NODE_ENV=test ./node_modules/.bin/mocha test/**/*.spec.js", 12 | "test:debug": "NODE_ENV=test ./node_modules/.bin/mocha --inspect --recursive --debug-brk", 13 | "test:cover": "NODE_ENV=test istanbul cover ./node_modules/.bin/_mocha -- -R spec test/**/*.spec.js" 14 | }, 15 | "devDependencies": { 16 | "chai": "^3.5.0", 17 | "chai-http": "^3.0.0", 18 | "istanbul": "^0.4.5", 19 | "mocha": "^3.2.0", 20 | "nodemon": "^1.11.0", 21 | "sinon": "^1.17.6", 22 | "sinon-mongoose": "^1.3.0" 23 | }, 24 | "dependencies": { 25 | "bcrypt": "^0.8.7", 26 | "bluebird": "^3.5.0", 27 | "body-parser": "^1.15.2", 28 | "cors": "^2.8.1", 29 | "express": "^4.14.0", 30 | "express-validation": "^1.0.1", 31 | "global": "^4.3.1", 32 | "helmet": "^3.1.0", 33 | "joi": "^10.2.2", 34 | "jwt-simple": "^0.5.1", 35 | "mongodb": "^2.2.11", 36 | "mongoose": "^4.7.0", 37 | "nodemon": "^1.11.0", 38 | "passport": "^0.3.2", 39 | "passport-http": "^0.3.0", 40 | "passport-jwt": "^2.2.1", 41 | "winston": "^2.3.0" 42 | }, 43 | "engines": { 44 | "node": "6.9.1" 45 | }, 46 | "proxy": "http:://localhost" 47 | } 48 | -------------------------------------------------------------------------------- /client/config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../dist/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../dist'), 9 | assetsSubDirectory: 'static', 10 | assetsPublicPath: '/', 11 | productionSourceMap: true, 12 | // Gzip off by default as many popular static hosts such as 13 | // Surge or Netlify already gzip all static assets for you. 14 | // Before setting to `true`, make sure to: 15 | // npm install --save-dev compression-webpack-plugin 16 | productionGzip: false, 17 | productionGzipExtensions: ['js', 'css'], 18 | // Run the build command with an extra argument to 19 | // View the bundle analyzer report after build finishes: 20 | // `npm run build --report` 21 | // Set to `true` or `false` to always turn it on or off 22 | bundleAnalyzerReport: process.env.npm_config_report 23 | }, 24 | dev: { 25 | env: require('./dev.env'), 26 | port: 8080, 27 | autoOpenBrowser: true, 28 | assetsSubDirectory: 'static', 29 | assetsPublicPath: '/', 30 | proxyTable: {}, 31 | // CSS Sourcemaps off by default because relative paths are "buggy" 32 | // with this option, according to the CSS-Loader README 33 | // (https://github.com/webpack/css-loader#sourcemaps) 34 | // In our experience, they generally work as expected, 35 | // just be aware of this issue when enabling this option. 36 | cssSourceMap: false 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /client/build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var config = require('../config') 4 | var vueLoaderConfig = require('./vue-loader.conf') 5 | 6 | function resolve (dir) { 7 | return path.join(__dirname, '..', dir) 8 | } 9 | 10 | module.exports = { 11 | entry: { 12 | app: './src/main.js' 13 | }, 14 | output: { 15 | path: config.build.assetsRoot, 16 | filename: '[name].js', 17 | publicPath: process.env.NODE_ENV === 'production' 18 | ? config.build.assetsPublicPath 19 | : config.dev.assetsPublicPath 20 | }, 21 | resolve: { 22 | extensions: ['.js', '.vue', '.json'], 23 | alias: { 24 | 'vue$': 'vue/dist/vue.esm.js', 25 | '@': resolve('src'), 26 | } 27 | }, 28 | module: { 29 | rules: [ 30 | { 31 | test: /\.(js|vue)$/, 32 | loader: 'eslint-loader', 33 | enforce: "pre", 34 | include: [resolve('src'), resolve('test')], 35 | options: { 36 | formatter: require('eslint-friendly-formatter') 37 | } 38 | }, 39 | { 40 | test: /\.vue$/, 41 | loader: 'vue-loader', 42 | options: vueLoaderConfig 43 | }, 44 | { 45 | test: /\.js$/, 46 | loader: 'babel-loader', 47 | include: [resolve('src'), resolve('test')] 48 | }, 49 | { 50 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 51 | loader: 'url-loader', 52 | query: { 53 | limit: 10000, 54 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 55 | } 56 | }, 57 | { 58 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 59 | loader: 'url-loader', 60 | query: { 61 | limit: 10000, 62 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 63 | } 64 | } 65 | ] 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /server/src/utils/passportMiddleweare.js: -------------------------------------------------------------------------------- 1 | const passport = require('passport'); 2 | const BasicStrategy = require('passport-http').BasicStrategy; 3 | const async = require('async'); 4 | const jwt = require('jwt-simple'); 5 | 6 | const JwtStrategy = require('passport-jwt').Strategy; 7 | const ExtractJwt = require('passport-jwt').ExtractJwt; 8 | 9 | const secret = require('../config/config').secret; 10 | 11 | const models = require('../models/index'); 12 | const userModel = models.userModel; 13 | 14 | passport.use(new BasicStrategy( 15 | function(username, password, callback) { 16 | 17 | userModel.findOne({ name: username }, function (err, user) { 18 | 19 | if (err) { 20 | return callback(err); 21 | } 22 | 23 | if (!user) { 24 | return callback(null, { err: {usernameErr: 'There is not an account for this username' } }); 25 | } 26 | 27 | user.arePasswordsMatching(password, function(err, isMatch) { 28 | 29 | if (err) { 30 | return callback(err); 31 | } 32 | 33 | if (!isMatch) { 34 | return callback(null, { err: { passwordErr: 'Invalid password' } }); 35 | } 36 | 37 | const token = jwt.encode(user._id, secret) 38 | 39 | return callback(null, { token: token }); 40 | }); 41 | }); 42 | } 43 | )); 44 | 45 | let opts = {}; 46 | 47 | opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 48 | opts.secretOrKey = secret; 49 | 50 | passport.use(new JwtStrategy(opts, 51 | function(jwt_payload, callback) { 52 | const userId = jwt_payload; 53 | 54 | userModel.findById(userId, function(err, user) { 55 | 56 | if (err) { 57 | return callback(err, false); 58 | } 59 | 60 | if (user) { 61 | return callback(null, user); 62 | } else { 63 | return callback(null, { err: 'There is not a user for this token' }); 64 | } 65 | }); 66 | } 67 | )); 68 | 69 | exports.isAuthenticatedWithToken = passport.authenticate('jwt', { session : false }); 70 | exports.isAuthenticatedWithBasic = passport.authenticate('basic', { session : false }); -------------------------------------------------------------------------------- /client/build/utils.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | exports.assetsPath = function (_path) { 6 | var assetsSubDirectory = process.env.NODE_ENV === 'production' 7 | ? config.build.assetsSubDirectory 8 | : config.dev.assetsSubDirectory 9 | return path.posix.join(assetsSubDirectory, _path) 10 | } 11 | 12 | exports.cssLoaders = function (options) { 13 | options = options || {} 14 | 15 | var cssLoader = { 16 | loader: 'css-loader', 17 | options: { 18 | minimize: process.env.NODE_ENV === 'production', 19 | sourceMap: options.sourceMap 20 | } 21 | } 22 | 23 | // generate loader string to be used with extract text plugin 24 | function generateLoaders (loader, loaderOptions) { 25 | var loaders = [cssLoader] 26 | if (loader) { 27 | loaders.push({ 28 | loader: loader + '-loader', 29 | options: Object.assign({}, loaderOptions, { 30 | sourceMap: options.sourceMap 31 | }) 32 | }) 33 | } 34 | 35 | // Extract CSS when that option is specified 36 | // (which is the case during production build) 37 | if (options.extract) { 38 | return ExtractTextPlugin.extract({ 39 | use: loaders, 40 | fallback: 'vue-style-loader' 41 | }) 42 | } else { 43 | return ['vue-style-loader'].concat(loaders) 44 | } 45 | } 46 | 47 | // http://vuejs.github.io/vue-loader/en/configurations/extract-css.html 48 | return { 49 | css: generateLoaders(), 50 | postcss: generateLoaders(), 51 | less: generateLoaders('less'), 52 | sass: generateLoaders('sass', { indentedSyntax: true }), 53 | scss: generateLoaders('sass'), 54 | stylus: generateLoaders('stylus'), 55 | styl: generateLoaders('stylus') 56 | } 57 | } 58 | 59 | // Generate loaders for standalone style files (outside of .vue) 60 | exports.styleLoaders = function (options) { 61 | var output = [] 62 | var loaders = exports.cssLoaders(options) 63 | for (var extension in loaders) { 64 | var loader = loaders[extension] 65 | output.push({ 66 | test: new RegExp('\\.' + extension + '$'), 67 | use: loader 68 | }) 69 | } 70 | return output 71 | } 72 | -------------------------------------------------------------------------------- /server/src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const expressValidation = require ('express-validation'); 4 | const bodyParser = require ('body-parser'); 5 | const passport = require ('passport'); 6 | const express = require ('express'); 7 | const winston = require ('winston'); 8 | const helmet = require ('helmet'); 9 | 10 | const signUpRoutes = require ('./api/v1/signUp/signUpRoutes'); 11 | const loginRoutes = require ('./api/v1/login/loginRoutes'); 12 | const userRoutes = require ('./api/v1/users/userRoutes'); 13 | 14 | const config = require ('./config/config'); 15 | const dbTest = require ('./config/dbTest'); 16 | const port = require ('./config/config').port; 17 | const cors = require ('cors'); 18 | const log = require ('./libs/winston')(module); 19 | const db = require ('./config/db'); 20 | 21 | const passportMiddleweare = require ('./utils/passportMiddleweare'); 22 | 23 | const app = express (); 24 | 25 | app.use(cors()); 26 | app.use(passport.initialize()); 27 | app.use(helmet()); 28 | app.use(bodyParser.urlencoded({ extended: true })); 29 | app.use(bodyParser.json()); 30 | 31 | app.disable('x-powered-by'); 32 | 33 | app.use('/api/v1/signup', signUpRoutes); 34 | 35 | app.use('/api/v1/login', passportMiddleweare.isAuthenticatedWithBasic, loginRoutes); 36 | 37 | app.use('/api/v1/users', passportMiddleweare.isAuthenticatedWithToken, userRoutes); 38 | 39 | app.use((err, req, res, next) => { 40 | if (err instanceof expressValidation.ValidationError) { 41 | const unifiedErrorMessage = err.errors.map(error => error.messages.join('. ')).join(' and '); 42 | 43 | return res.status(err.status).json({ 44 | message: unifiedErrorMessage 45 | }); 46 | } 47 | }); 48 | 49 | app.use((req, res) => { 50 | res.status(404).json({ 51 | status: 404, 52 | message: 'The requested URL ' + req.originalUrl + ' was not found on the server.' 53 | }); 54 | }); 55 | 56 | let server = app.listen(port, (err) => { 57 | server.address().port; 58 | 59 | if (err) { 60 | log.error('something bad happened', err); 61 | } else if (process.env.NODE_ENV === 'test') { 62 | dbTest.connect(); 63 | } else { 64 | db.connect(); 65 | } 66 | 67 | log.info(`server is listening on ${port}`); 68 | }); 69 | 70 | module.exports = server; -------------------------------------------------------------------------------- /server/test/login/login.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const mongoose = require('mongoose'); 4 | const chaiHttp = require('chai-http'); 5 | const chai = require('chai'); 6 | 7 | const models = require('../../src/models/index'); 8 | 9 | const userModel = models.userModel; 10 | 11 | const log = require('../../src/libs/winston')(module); 12 | const app = require('../../src/index'); 13 | 14 | chai.use(chaiHttp); 15 | 16 | const loginUrl = '/api/v1/login/'; 17 | const assert = chai.assert; 18 | 19 | describe('Login' , () => { 20 | 21 | before(done => { 22 | const userTest = new userModel({ 23 | name: 'testName', 24 | fullname: 'testFullname', 25 | password: 'testPassword', 26 | initials: 'testInitials', 27 | email: 'testEmail@email.com' 28 | }); 29 | 30 | userTest.save(err => { 31 | done(); 32 | }); 33 | }); 34 | 35 | after(done => { 36 | userModel.find().remove().exec(); 37 | 38 | done(); 39 | }); 40 | 41 | describe('/POST', () => { 42 | 43 | it ('should login - success', done => { 44 | chai.request(app) 45 | .post(loginUrl) 46 | .auth('testName', 'testPassword') 47 | .end((err, res) => { 48 | assert.equal(res.status, '200', 'status equals 200'); 49 | 50 | done(); 51 | }); 52 | }); 53 | 54 | it ('should login - fail', done => { 55 | chai.request(app) 56 | .post(loginUrl) 57 | .auth('testName') 58 | .end((err, res) => { 59 | assert.equal(res.status, '401', 'status equals 401 because second argument is missing'); 60 | 61 | done(); 62 | }); 63 | }); 64 | 65 | it ('should login - fail', done => { 66 | chai.request(app) 67 | .post(loginUrl) 68 | .auth('name', 'testPassword') 69 | .end((err, res) => { 70 | assert.equal(res.status, '401', 'status equals 401 because username is invalid'); 71 | 72 | done(); 73 | }); 74 | }); 75 | 76 | it ('should login - fail', done => { 77 | chai.request(app) 78 | .post(loginUrl) 79 | .auth('testName', 'password') 80 | .end((err, res) => { 81 | assert.equal(res.status, '401', 'status equals 401 because password is invalid'); 82 | 83 | done(); 84 | }); 85 | }); 86 | 87 | it ('should login - fail', done => { 88 | chai.request(app) 89 | .post(loginUrl) 90 | .end((err, res) => { 91 | assert.equal(res.status, '401', 'status equals 401 because arguments are missing'); 92 | 93 | done(); 94 | }); 95 | }); 96 | }); 97 | }); -------------------------------------------------------------------------------- /client/build/dev-server.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | var config = require('../config') 4 | if (!process.env.NODE_ENV) { 5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) 6 | } 7 | 8 | var opn = require('opn') 9 | var path = require('path') 10 | var express = require('express') 11 | var webpack = require('webpack') 12 | var proxyMiddleware = require('http-proxy-middleware') 13 | var webpackConfig = process.env.NODE_ENV === 'testing' 14 | ? require('./webpack.prod.conf') 15 | : require('./webpack.dev.conf') 16 | 17 | // default port where dev server listens for incoming traffic 18 | var port = process.env.PORT || config.dev.port 19 | // automatically open browser, if not set will be false 20 | var autoOpenBrowser = !!config.dev.autoOpenBrowser 21 | // Define HTTP proxies to your custom API backend 22 | // https://github.com/chimurai/http-proxy-middleware 23 | var proxyTable = config.dev.proxyTable 24 | 25 | var app = express() 26 | var compiler = webpack(webpackConfig) 27 | 28 | var devMiddleware = require('webpack-dev-middleware')(compiler, { 29 | publicPath: webpackConfig.output.publicPath, 30 | quiet: true 31 | }) 32 | 33 | var hotMiddleware = require('webpack-hot-middleware')(compiler, { 34 | log: () => {} 35 | }) 36 | // force page reload when html-webpack-plugin template changes 37 | compiler.plugin('compilation', function (compilation) { 38 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { 39 | hotMiddleware.publish({ action: 'reload' }) 40 | cb() 41 | }) 42 | }) 43 | 44 | // proxy api requests 45 | Object.keys(proxyTable).forEach(function (context) { 46 | var options = proxyTable[context] 47 | if (typeof options === 'string') { 48 | options = { target: options } 49 | } 50 | app.use(proxyMiddleware(options.filter || context, options)) 51 | }) 52 | 53 | // handle fallback for HTML5 history API 54 | app.use(require('connect-history-api-fallback')()) 55 | 56 | // serve webpack bundle output 57 | app.use(devMiddleware) 58 | 59 | // enable hot-reload and state-preserving 60 | // compilation error display 61 | app.use(hotMiddleware) 62 | 63 | // serve pure static assets 64 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) 65 | app.use(staticPath, express.static('./static')) 66 | 67 | var uri = 'http://localhost:' + port 68 | 69 | devMiddleware.waitUntilValid(function () { 70 | console.log('> Listening at ' + uri + '\n') 71 | }) 72 | 73 | module.exports = app.listen(port, function (err) { 74 | if (err) { 75 | console.log(err) 76 | return 77 | } 78 | 79 | // when env is testing, don't need open it 80 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { 81 | opn(uri) 82 | } 83 | }) 84 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hipchat-clone", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "Moustapha A Diouf ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "build": "node build/build.js", 10 | "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", 11 | "e2e": "node test/e2e/runner.js", 12 | "test": "npm run unit && npm run e2e", 13 | "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs" 14 | }, 15 | "dependencies": { 16 | "vue": "^2.2.1", 17 | "vue-router": "^2.2.0", 18 | "vuex": "^2.2.1" 19 | }, 20 | "devDependencies": { 21 | "autoprefixer": "^6.7.2", 22 | "babel-core": "^6.22.1", 23 | "babel-eslint": "^7.1.1", 24 | "babel-loader": "^6.2.10", 25 | "babel-plugin-istanbul": "^3.1.2", 26 | "babel-plugin-transform-runtime": "^6.22.0", 27 | "babel-preset-latest": "^6.22.0", 28 | "babel-preset-stage-2": "^6.22.0", 29 | "babel-register": "^6.22.0", 30 | "chai": "^3.5.0", 31 | "chalk": "^1.1.3", 32 | "chromedriver": "^2.27.2", 33 | "connect-history-api-fallback": "^1.3.0", 34 | "copy-webpack-plugin": "^4.0.1", 35 | "cross-env": "^3.1.4", 36 | "cross-spawn": "^5.0.1", 37 | "css-loader": "^0.26.1", 38 | "eslint": "^3.14.1", 39 | "eslint-config-airbnb-base": "^11.0.1", 40 | "eslint-friendly-formatter": "^2.0.7", 41 | "eslint-import-resolver-webpack": "^0.8.1", 42 | "eslint-loader": "^1.6.1", 43 | "eslint-plugin-html": "^2.0.0", 44 | "eslint-plugin-import": "^2.2.0", 45 | "eventsource-polyfill": "^0.9.6", 46 | "express": "^4.14.1", 47 | "extract-text-webpack-plugin": "^2.0.0", 48 | "file-loader": "^0.10.0", 49 | "friendly-errors-webpack-plugin": "^1.1.3", 50 | "function-bind": "^1.1.0", 51 | "html-webpack-plugin": "^2.28.0", 52 | "http-proxy-middleware": "^0.17.3", 53 | "inject-loader": "^2.0.1", 54 | "karma": "^1.4.1", 55 | "karma-coverage": "^1.1.1", 56 | "karma-mocha": "^1.3.0", 57 | "karma-phantomjs-launcher": "^1.0.2", 58 | "karma-sinon-chai": "^1.2.4", 59 | "karma-sourcemap-loader": "^0.3.7", 60 | "karma-spec-reporter": "0.0.26", 61 | "karma-webpack": "^2.0.2", 62 | "lolex": "^1.5.2", 63 | "mocha": "^3.2.0", 64 | "nightwatch": "^0.9.12", 65 | "opn": "^4.0.2", 66 | "optimize-css-assets-webpack-plugin": "^1.3.0", 67 | "ora": "^1.1.0", 68 | "phantomjs-prebuilt": "^2.1.14", 69 | "rimraf": "^2.6.0", 70 | "selenium-server": "^3.0.1", 71 | "semver": "^5.3.0", 72 | "sinon": "^1.17.7", 73 | "sinon-chai": "^2.8.0", 74 | "url-loader": "^0.5.7", 75 | "vue-awesome": "^2.1.0", 76 | "vue-loader": "^11.1.4", 77 | "vue-style-loader": "^2.0.0", 78 | "vue-template-compiler": "^2.2.1", 79 | "webpack": "^2.2.1", 80 | "webpack-bundle-analyzer": "^2.2.1", 81 | "webpack-dev-middleware": "^1.10.0", 82 | "webpack-hot-middleware": "^2.16.1", 83 | "webpack-merge": "^2.6.1" 84 | }, 85 | "engines": { 86 | "node": ">= 4.0.0", 87 | "npm": ">= 3.0.0" 88 | }, 89 | "browserlist": [ 90 | "> 1%", 91 | "last 2 versions", 92 | "not ie <= 8" 93 | ] 94 | } 95 | -------------------------------------------------------------------------------- /client/build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var webpack = require('webpack') 4 | var config = require('../config') 5 | var merge = require('webpack-merge') 6 | var baseWebpackConfig = require('./webpack.base.conf') 7 | var CopyWebpackPlugin = require('copy-webpack-plugin') 8 | var HtmlWebpackPlugin = require('html-webpack-plugin') 9 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 11 | 12 | var env = process.env.NODE_ENV === 'testing' 13 | ? require('../config/test.env') 14 | : config.build.env 15 | 16 | var webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true 21 | }) 22 | }, 23 | devtool: config.build.productionSourceMap ? '#source-map' : false, 24 | output: { 25 | path: config.build.assetsRoot, 26 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 27 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 28 | }, 29 | plugins: [ 30 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 31 | new webpack.DefinePlugin({ 32 | 'process.env': env 33 | }), 34 | new webpack.optimize.UglifyJsPlugin({ 35 | compress: { 36 | warnings: false 37 | }, 38 | sourceMap: true 39 | }), 40 | // extract css into its own file 41 | new ExtractTextPlugin({ 42 | filename: utils.assetsPath('css/[name].[contenthash].css') 43 | }), 44 | // Compress extracted CSS. We are using this plugin so that possible 45 | // duplicated CSS from different components can be deduped. 46 | new OptimizeCSSPlugin(), 47 | // generate dist index.html with correct asset hash for caching. 48 | // you can customize output by editing /index.html 49 | // see https://github.com/ampedandwired/html-webpack-plugin 50 | new HtmlWebpackPlugin({ 51 | filename: process.env.NODE_ENV === 'testing' 52 | ? 'index.html' 53 | : config.build.index, 54 | template: 'index.html', 55 | inject: true, 56 | minify: { 57 | removeComments: true, 58 | collapseWhitespace: true, 59 | removeAttributeQuotes: true 60 | // more options: 61 | // https://github.com/kangax/html-minifier#options-quick-reference 62 | }, 63 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 64 | chunksSortMode: 'dependency' 65 | }), 66 | // split vendor js into its own file 67 | new webpack.optimize.CommonsChunkPlugin({ 68 | name: 'vendor', 69 | minChunks: function (module, count) { 70 | // any required modules inside node_modules are extracted to vendor 71 | return ( 72 | module.resource && 73 | /\.js$/.test(module.resource) && 74 | module.resource.indexOf( 75 | path.join(__dirname, '../node_modules') 76 | ) === 0 77 | ) 78 | } 79 | }), 80 | // extract webpack runtime and module manifest to its own file in order to 81 | // prevent vendor hash from being updated whenever app bundle is updated 82 | new webpack.optimize.CommonsChunkPlugin({ 83 | name: 'manifest', 84 | chunks: ['vendor'] 85 | }), 86 | // copy custom static assets 87 | new CopyWebpackPlugin([ 88 | { 89 | from: path.resolve(__dirname, '../static'), 90 | to: config.build.assetsSubDirectory, 91 | ignore: ['.*'] 92 | } 93 | ]) 94 | ] 95 | }) 96 | 97 | if (config.build.productionGzip) { 98 | var CompressionWebpackPlugin = require('compression-webpack-plugin') 99 | 100 | webpackConfig.plugins.push( 101 | new CompressionWebpackPlugin({ 102 | asset: '[path].gz[query]', 103 | algorithm: 'gzip', 104 | test: new RegExp( 105 | '\\.(' + 106 | config.build.productionGzipExtensions.join('|') + 107 | ')$' 108 | ), 109 | threshold: 10240, 110 | minRatio: 0.8 111 | }) 112 | ) 113 | } 114 | 115 | if (config.build.bundleAnalyzerReport) { 116 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 117 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 118 | } 119 | 120 | module.exports = webpackConfig 121 | -------------------------------------------------------------------------------- /server/test/users/users.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const mongoose = require('mongoose'); 4 | const chaiHttp = require('chai-http'); 5 | const chai = require('chai'); 6 | 7 | const userModel = require('../../src/models/index').userModel; 8 | 9 | const log = require('../../src/libs/winston')(module); 10 | const app = require('../../src/index'); 11 | 12 | chai.use(chaiHttp); 13 | 14 | const signupUrl = '/api/v1/signup/'; 15 | const userUrl = '/api/v1/users/'; 16 | const assert = chai.assert; 17 | 18 | describe('Users' , () => { 19 | 20 | let token = ''; 21 | 22 | after(done => { 23 | userModel.find().remove().exec(); 24 | 25 | done(); 26 | }); 27 | 28 | it ('should signup - success', done => { 29 | const user = { 30 | name: 'testName', 31 | fullname: 'testFullname', 32 | password: 'testPassword', 33 | initials: 'testInitials', 34 | email: 'testEmail@email.com' 35 | }; 36 | 37 | chai.request(app) 38 | .post(signupUrl) 39 | .send(user) 40 | .end((err, res) => { 41 | assert.equal(res.status, '200', 'status equals 200'); 42 | token = res.body.data.token; 43 | 44 | done(); 45 | }); 46 | }); 47 | 48 | describe('/GET', () => { 49 | 50 | it ('should get user - success', done => { 51 | chai.request(app) 52 | .get(userUrl) 53 | .set('Authorization', `JWT ${token}`) 54 | .end((err, res) => { 55 | assert.equal(res.status, '200', 'status equals 200'); 56 | 57 | done(); 58 | }); 59 | }); 60 | 61 | it ('should get user - fail', done => { 62 | chai.request(app) 63 | .get(userUrl) 64 | .set('Authorization', `JWT`) 65 | .end((err, res) => { 66 | assert.equal(res.status, '401', 'status equals 401'); 67 | 68 | done(); 69 | }); 70 | }); 71 | }); 72 | 73 | describe('/PUT', () => { 74 | 75 | it ('should update user - success', done => { 76 | const user = { 77 | name: 'testNameUpdated', 78 | fullname: 'testFullnameUpdated', 79 | initials: 'testInitialsUpdated', 80 | }; 81 | 82 | chai.request(app) 83 | .put(userUrl) 84 | .set('Authorization', `JWT ${token}`) 85 | .send(user) 86 | .end((err, res) => { 87 | assert.equal(res.status, '200', 'status equals 200'); 88 | assert.notEqual(res.body.data.user._id, undefined, 'User has an id value'); 89 | assert.equal(res.body.data.user.fullname, 'testFullnameUpdated', 'User fullname is testFullnameUpdated'); 90 | 91 | done(); 92 | }); 93 | }); 94 | 95 | it ('should not update user - fail', done => { 96 | const user = { 97 | fullname: 'testFullnameUpdated', 98 | initials: 'testInitialsUpdated' 99 | }; 100 | 101 | chai.request(app) 102 | .put(userUrl) 103 | .set('Authorization', `JWT ${token}`) 104 | .send(user) 105 | .end((err, res) => { 106 | assert.equal(res.status, '400', 'status equals 400 because name is missing'); 107 | assert.equal(res.body.data.error.missingName, 108 | 'Please enter your name'); 109 | 110 | done(); 111 | }); 112 | }); 113 | 114 | it ('should not update user - fail', done => { 115 | const user = { 116 | name: 'testNameUpdated', 117 | initials: 'testInitialsUpdated' 118 | }; 119 | 120 | chai.request(app) 121 | .put(userUrl) 122 | .set('Authorization', `JWT ${token}`) 123 | .send(user) 124 | .end((err, res) => { 125 | assert.equal(res.status, '400', 'status equals 400 because full name is missing'); 126 | assert.equal(res.body.data.error.missingFullName, 127 | 'Please enter your full name'); 128 | 129 | done(); 130 | }); 131 | }); 132 | 133 | it ('should not update user - fail', done => { 134 | const user = { 135 | name: 'testNameUpdated', 136 | fullname: 'testFullnameUpdated' 137 | }; 138 | 139 | chai.request(app) 140 | .put(userUrl) 141 | .set('Authorization', `JWT ${token}`) 142 | .send(user) 143 | .end((err, res) => { 144 | assert.equal(res.status, '400', 'status equals 400 because initials are missing'); 145 | assert.equal(res.body.data.error.missingInitials, 146 | 'Please enter your initials'); 147 | 148 | done(); 149 | }); 150 | }); 151 | 152 | it ('should not update user - fail', done => { 153 | chai.request(app) 154 | .put(userUrl) 155 | .set('Authorization', `JWT ${token}`) 156 | .end((err, res) => { 157 | assert.equal(res.status, '400', 158 | 'status equals 400 because username, full name and initials are missing'); 159 | assert.equal(res.body.data.error.missingName, 160 | 'Please enter your name'); 161 | assert.equal(res.body.data.error.missingFullName, 162 | 'Please enter your full name'); 163 | assert.equal(res.body.data.error.missingInitials, 164 | 'Please enter your initials'); 165 | 166 | done(); 167 | }); 168 | }); 169 | }); 170 | 171 | describe('/DELETE', () => { 172 | 173 | it ('should delete user - success', done => { 174 | chai.request(app) 175 | .delete(userUrl) 176 | .set('Authorization', `JWT ${token}`) 177 | .end((err, res) => { 178 | assert.equal(res.status, '200', 'status equals 200'); 179 | 180 | userModel.find({name: 'testFullnameUpdated'}, (err, res) => { 181 | assert.equal(0, res.length, 'No result for name testFullnameUpdated') 182 | }) 183 | 184 | done(); 185 | }); 186 | }); 187 | 188 | it ('should delete user - fail', done => { 189 | chai.request(app) 190 | .delete(userUrl) 191 | .set('Authorization', `JWT`) 192 | .end((err, res) => { 193 | assert.equal(res.status, '401', 'status equals 401'); 194 | 195 | done(); 196 | }); 197 | }); 198 | }); 199 | }); -------------------------------------------------------------------------------- /server/test/signup/signup.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const mongoose = require('mongoose'); 4 | const chaiHttp = require('chai-http'); 5 | const chai = require('chai'); 6 | 7 | const userModel = require('../../src/models/index').userModel; 8 | 9 | const log = require('../../src/libs/winston')(module); 10 | const app = require('../../src/index'); 11 | 12 | chai.use(chaiHttp); 13 | 14 | const signupUrl = '/api/v1/signup/'; 15 | const assert = chai.assert; 16 | 17 | describe('Signup' , () => { 18 | 19 | after(done => { 20 | userModel.find().remove().exec(); 21 | 22 | done(); 23 | }); 24 | 25 | describe('/POST', () => { 26 | 27 | it ('should signup - sucess', done => { 28 | const user = { 29 | name: 'testName', 30 | fullname: 'testFullname', 31 | password: 'testPassword', 32 | initials: 'testInitials', 33 | email: 'testEmail@email.com' 34 | }; 35 | 36 | chai.request(app) 37 | .post(signupUrl) 38 | .send(user) 39 | .end((err, res) => { 40 | assert.equal(res.status, '200', 'status equals 200'); 41 | 42 | done(); 43 | }); 44 | }); 45 | 46 | it ('should signup - fail', done => { 47 | const user = { 48 | name: 'testName', 49 | fullname: 'testFullname', 50 | password: 'testPassword', 51 | initials: 'testInitials', 52 | email: 'testEmail@email.com' 53 | }; 54 | 55 | chai.request(app) 56 | .post(signupUrl) 57 | .send(user) 58 | .end((err, res) => { 59 | assert.equal(res.status, '404', 'status equals 404 because username already exists'); 60 | done(); 61 | }); 62 | }); 63 | 64 | it ('should signup - fail', done => { 65 | const user = { 66 | name: 'testName2', 67 | fullname: 'testFullname', 68 | password: 'testPassword', 69 | initials: 'testInitials', 70 | email: 'testEmail@email.com' 71 | }; 72 | 73 | chai.request(app) 74 | .post(signupUrl) 75 | .send(user) 76 | .end((err, res) => { 77 | assert.equal(res.status, '404', 'status equals 404 because email already exists'); 78 | 79 | done(); 80 | }); 81 | }); 82 | 83 | it ('should signup - fail', done => { 84 | const user = { 85 | fullname: 'testFullname', 86 | password: 'testPassword', 87 | initials: 'testInitials', 88 | email: 'testEmail@email.com' 89 | }; 90 | 91 | chai.request(app) 92 | .post(signupUrl) 93 | .send(user) 94 | .end((err, res) => { 95 | assert.equal(res.status, '400', 'status equals 400 because name is missing'); 96 | done(); 97 | }); 98 | }); 99 | 100 | it ('should signup - fail', done => { 101 | const user = { 102 | name: 'testName', 103 | password: 'testPassword', 104 | initials: 'testInitials', 105 | email: 'testEmail@email.com' 106 | }; 107 | 108 | chai.request(app) 109 | .post(signupUrl) 110 | .send(user) 111 | .end((err, res) => { 112 | assert.equal(res.status, '400', 'status equals 400 because fullname is missing'); 113 | done(); 114 | }); 115 | }); 116 | 117 | it ('should signup - fail', done => { 118 | const user = { 119 | name: 'testName', 120 | fullname: 'testFullname', 121 | initials: 'testInitials', 122 | email: 'testEmail@email.com' 123 | }; 124 | 125 | chai.request(app) 126 | .post(signupUrl) 127 | .send(user) 128 | .end((err, res) => { 129 | assert.equal(res.status, '400', 'status equals 400 because password is missing'); 130 | done(); 131 | }); 132 | }); 133 | 134 | it ('should signup - fail', done => { 135 | const user = { 136 | name: 'testName', 137 | fullname: 'testFullname', 138 | password: 'testPassword', 139 | email: 'testEmail@email.com' 140 | }; 141 | 142 | chai.request(app) 143 | .post(signupUrl) 144 | .send(user) 145 | .end((err, res) => { 146 | assert.equal(res.status, '400', 'status equals 400 because initials missing'); 147 | done(); 148 | }); 149 | }); 150 | 151 | it ('should signup - fail', done => { 152 | const user = { 153 | name: 'testName', 154 | fullname: 'testFullname', 155 | password: 'testPassword', 156 | initials: 'testInitials' 157 | }; 158 | 159 | chai.request(app) 160 | .post(signupUrl) 161 | .send(user) 162 | .end((err, res) => { 163 | assert.equal(res.status, '400', 'status equals 400 because email is missing'); 164 | done(); 165 | }); 166 | }); 167 | 168 | it ('should signup - fail', done => { 169 | const user = { 170 | password: 'testPassword', 171 | initials: 'testInitials', 172 | email: 'testEmail@email.com' 173 | }; 174 | 175 | chai.request(app) 176 | .post(signupUrl) 177 | .send(user) 178 | .end((err, res) => { 179 | assert.equal(res.status, '400', 'status equals 400 because username and full name are missing'); 180 | done(); 181 | }); 182 | }); 183 | 184 | it ('should signup - fail', done => { 185 | const user = { 186 | initials: 'testInitials', 187 | email: 'testEmail@email.com' 188 | }; 189 | 190 | chai.request(app) 191 | .post(signupUrl) 192 | .send(user) 193 | .end((err, res) => { 194 | assert.equal(res.status, '400', 195 | 'status equals 400 because username, full name and password are missing'); 196 | done(); 197 | }); 198 | }); 199 | 200 | it ('should signup - fail', done => { 201 | const user = { 202 | email: 'testEmail@email.com' 203 | }; 204 | 205 | chai.request(app) 206 | .post(signupUrl) 207 | .send(user) 208 | .end((err, res) => { 209 | assert.equal(res.status, '400', 210 | 'status equals 400 because username, full name, password and initials are missing'); 211 | done(); 212 | }); 213 | }); 214 | 215 | it ('should signup - fail', done => { 216 | chai.request(app) 217 | .post(signupUrl) 218 | .end((err, res) => { 219 | assert.equal(res.status, '400', 220 | 'status equals 400 because all arguments are missing'); 221 | done(); 222 | }); 223 | }); 224 | }); 225 | }); -------------------------------------------------------------------------------- /server/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | abbrev@1, abbrev@1.0.x: 4 | version "1.0.9" 5 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 6 | 7 | accepts@~1.3.3: 8 | version "1.3.3" 9 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 10 | dependencies: 11 | mime-types "~2.1.11" 12 | negotiator "0.6.1" 13 | 14 | align-text@^0.1.1, align-text@^0.1.3: 15 | version "0.1.4" 16 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 17 | dependencies: 18 | kind-of "^3.0.2" 19 | longest "^1.0.1" 20 | repeat-string "^1.5.2" 21 | 22 | amdefine@>=0.0.4: 23 | version "1.0.1" 24 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 25 | 26 | ansi-regex@^2.0.0: 27 | version "2.0.0" 28 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 29 | 30 | ansi-styles@^2.2.1: 31 | version "2.2.1" 32 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 33 | 34 | anymatch@^1.3.0: 35 | version "1.3.0" 36 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 37 | dependencies: 38 | arrify "^1.0.0" 39 | micromatch "^2.1.5" 40 | 41 | aproba@^1.0.3: 42 | version "1.0.4" 43 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 44 | 45 | are-we-there-yet@~1.1.2: 46 | version "1.1.2" 47 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 48 | dependencies: 49 | delegates "^1.0.0" 50 | readable-stream "^2.0.0 || ^1.1.13" 51 | 52 | argparse@^1.0.7: 53 | version "1.0.9" 54 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 55 | dependencies: 56 | sprintf-js "~1.0.2" 57 | 58 | arr-diff@^2.0.0: 59 | version "2.0.0" 60 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 61 | dependencies: 62 | arr-flatten "^1.0.1" 63 | 64 | arr-flatten@^1.0.1: 65 | version "1.0.1" 66 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 67 | 68 | array-flatten@1.1.1: 69 | version "1.1.1" 70 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 71 | 72 | array-unique@^0.2.1: 73 | version "0.2.1" 74 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 75 | 76 | arrify@^1.0.0: 77 | version "1.0.1" 78 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 79 | 80 | asn1@~0.2.3: 81 | version "0.2.3" 82 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 83 | 84 | assert-plus@^0.2.0: 85 | version "0.2.0" 86 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 87 | 88 | assert-plus@^1.0.0: 89 | version "1.0.0" 90 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 91 | 92 | assertion-error@^1.0.1: 93 | version "1.0.2" 94 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 95 | 96 | async-each@^1.0.0: 97 | version "1.0.1" 98 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 99 | 100 | async@^1.4.0, async@^1.5.2, async@1.x: 101 | version "1.5.2" 102 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 103 | 104 | async@~0.2.6: 105 | version "0.2.10" 106 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 107 | 108 | async@~1.0.0: 109 | version "1.0.0" 110 | resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" 111 | 112 | async@2.1.2: 113 | version "2.1.2" 114 | resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" 115 | dependencies: 116 | lodash "^4.14.0" 117 | 118 | asynckit@^0.4.0: 119 | version "0.4.0" 120 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 121 | 122 | aws-sign2@~0.6.0: 123 | version "0.6.0" 124 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 125 | 126 | aws4@^1.2.1: 127 | version "1.5.0" 128 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 129 | 130 | balanced-match@^0.4.1: 131 | version "0.4.2" 132 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 133 | 134 | base64-url@^1.2.1: 135 | version "1.3.3" 136 | resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.3.3.tgz#f8b6c537f09a4fc58c99cb86e0b0e9c61461a20f" 137 | 138 | base64url@^2.0.0, base64url@2.0.0: 139 | version "2.0.0" 140 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" 141 | 142 | bcrypt-pbkdf@^1.0.0: 143 | version "1.0.0" 144 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 145 | dependencies: 146 | tweetnacl "^0.14.3" 147 | 148 | bcrypt@^0.8.7: 149 | version "0.8.7" 150 | resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-0.8.7.tgz#bc3875a9afd0a7b2cd231a6a7f218a5ce156b093" 151 | dependencies: 152 | bindings "1.2.1" 153 | nan "2.3.5" 154 | 155 | binary-extensions@^1.0.0: 156 | version "1.7.0" 157 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" 158 | 159 | bindings@1.2.1: 160 | version "1.2.1" 161 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" 162 | 163 | block-stream@*: 164 | version "0.0.9" 165 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 166 | dependencies: 167 | inherits "~2.0.0" 168 | 169 | bluebird: 170 | version "3.5.0" 171 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" 172 | 173 | bluebird@2.10.2: 174 | version "2.10.2" 175 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.10.2.tgz#024a5517295308857f14f91f1106fc3b555f446b" 176 | 177 | body-parser@^1.15.2: 178 | version "1.15.2" 179 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.15.2.tgz#d7578cf4f1d11d5f6ea804cef35dc7a7ff6dae67" 180 | dependencies: 181 | bytes "2.4.0" 182 | content-type "~1.0.2" 183 | debug "~2.2.0" 184 | depd "~1.1.0" 185 | http-errors "~1.5.0" 186 | iconv-lite "0.4.13" 187 | on-finished "~2.3.0" 188 | qs "6.2.0" 189 | raw-body "~2.1.7" 190 | type-is "~1.6.13" 191 | 192 | boom@2.x.x: 193 | version "2.10.1" 194 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 195 | dependencies: 196 | hoek "2.x.x" 197 | 198 | brace-expansion@^1.0.0: 199 | version "1.1.6" 200 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 201 | dependencies: 202 | balanced-match "^0.4.1" 203 | concat-map "0.0.1" 204 | 205 | braces@^1.8.2: 206 | version "1.8.5" 207 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 208 | dependencies: 209 | expand-range "^1.8.1" 210 | preserve "^0.2.0" 211 | repeat-element "^1.1.2" 212 | 213 | browser-stdout@1.3.0: 214 | version "1.3.0" 215 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 216 | 217 | bson@~0.5.4, bson@~0.5.6: 218 | version "0.5.7" 219 | resolved "https://registry.yarnpkg.com/bson/-/bson-0.5.7.tgz#0d11fe0936c1fee029e11f7063f5d0ab2422ea3e" 220 | 221 | buffer-equal-constant-time@1.0.1: 222 | version "1.0.1" 223 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 224 | 225 | buffer-shims@^1.0.0: 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 228 | 229 | bytes@2.4.0: 230 | version "2.4.0" 231 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" 232 | 233 | camelcase@^1.0.2: 234 | version "1.2.1" 235 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 236 | 237 | camelize@1.0.0: 238 | version "1.0.0" 239 | resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" 240 | 241 | caseless@~0.11.0: 242 | version "0.11.0" 243 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 244 | 245 | center-align@^0.1.1: 246 | version "0.1.3" 247 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 248 | dependencies: 249 | align-text "^0.1.3" 250 | lazy-cache "^1.0.3" 251 | 252 | chai: 253 | version "3.5.0" 254 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 255 | dependencies: 256 | assertion-error "^1.0.1" 257 | deep-eql "^0.1.3" 258 | type-detect "^1.0.0" 259 | 260 | chai-http: 261 | version "3.0.0" 262 | resolved "https://registry.yarnpkg.com/chai-http/-/chai-http-3.0.0.tgz#5460d8036e1f1a12b0b5b5cbd529e6dc1d31eb4b" 263 | dependencies: 264 | cookiejar "2.0.x" 265 | is-ip "1.0.0" 266 | methods "^1.1.2" 267 | qs "^6.2.0" 268 | superagent "^2.0.0" 269 | 270 | chalk@^1.0.0, chalk@^1.1.1: 271 | version "1.1.3" 272 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 273 | dependencies: 274 | ansi-styles "^2.2.1" 275 | escape-string-regexp "^1.0.2" 276 | has-ansi "^2.0.0" 277 | strip-ansi "^3.0.0" 278 | supports-color "^2.0.0" 279 | 280 | chokidar@^1.4.3: 281 | version "1.6.1" 282 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 283 | dependencies: 284 | anymatch "^1.3.0" 285 | async-each "^1.0.0" 286 | glob-parent "^2.0.0" 287 | inherits "^2.0.1" 288 | is-binary-path "^1.0.0" 289 | is-glob "^2.0.0" 290 | path-is-absolute "^1.0.0" 291 | readdirp "^2.0.0" 292 | optionalDependencies: 293 | fsevents "^1.0.0" 294 | 295 | cliui@^2.1.0: 296 | version "2.1.0" 297 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 298 | dependencies: 299 | center-align "^0.1.1" 300 | right-align "^0.1.1" 301 | wordwrap "0.0.2" 302 | 303 | code-point-at@^1.0.0: 304 | version "1.1.0" 305 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 306 | 307 | colors@1.0.x: 308 | version "1.0.3" 309 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 310 | 311 | combined-stream@^1.0.5, combined-stream@~1.0.5: 312 | version "1.0.5" 313 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 314 | dependencies: 315 | delayed-stream "~1.0.0" 316 | 317 | commander@^2.9.0, commander@2.9.0: 318 | version "2.9.0" 319 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 320 | dependencies: 321 | graceful-readlink ">= 1.0.0" 322 | 323 | component-emitter@^1.2.0: 324 | version "1.2.1" 325 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 326 | 327 | concat-map@0.0.1: 328 | version "0.0.1" 329 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 330 | 331 | configstore@^1.0.0: 332 | version "1.4.0" 333 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" 334 | dependencies: 335 | graceful-fs "^4.1.2" 336 | mkdirp "^0.5.0" 337 | object-assign "^4.0.1" 338 | os-tmpdir "^1.0.0" 339 | osenv "^0.1.0" 340 | uuid "^2.0.1" 341 | write-file-atomic "^1.1.2" 342 | xdg-basedir "^2.0.0" 343 | 344 | connect@3.4.1: 345 | version "3.4.1" 346 | resolved "https://registry.yarnpkg.com/connect/-/connect-3.4.1.tgz#a21361d3f4099ef761cda6dc4a973bb1ebb0a34d" 347 | dependencies: 348 | debug "~2.2.0" 349 | finalhandler "0.4.1" 350 | parseurl "~1.3.1" 351 | utils-merge "1.0.0" 352 | 353 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 354 | version "1.1.0" 355 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 356 | 357 | content-disposition@0.5.1: 358 | version "0.5.1" 359 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" 360 | 361 | content-security-policy-builder@1.1.0: 362 | version "1.1.0" 363 | resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz#d91f1b076236c119850c7dee9924bf55e05772b3" 364 | dependencies: 365 | dashify "^0.2.0" 366 | 367 | content-type@~1.0.2: 368 | version "1.0.2" 369 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 370 | 371 | cookie-signature@1.0.6: 372 | version "1.0.6" 373 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 374 | 375 | cookie@0.3.1: 376 | version "0.3.1" 377 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 378 | 379 | cookiejar@^2.0.6: 380 | version "2.1.0" 381 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.0.tgz#86549689539b6d0e269b6637a304be508194d898" 382 | 383 | cookiejar@2.0.x: 384 | version "2.0.6" 385 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.0.6.tgz#0abf356ad00d1c5a219d88d44518046dd026acfe" 386 | 387 | core-util-is@~1.0.0, core-util-is@1.0.2: 388 | version "1.0.2" 389 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 390 | 391 | cors: 392 | version "2.8.1" 393 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.1.tgz#6181aa56abb45a2825be3304703747ae4e9d2383" 394 | dependencies: 395 | vary "^1" 396 | 397 | cryptiles@2.x.x: 398 | version "2.0.5" 399 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 400 | dependencies: 401 | boom "2.x.x" 402 | 403 | cycle@1.0.x: 404 | version "1.0.3" 405 | resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" 406 | 407 | dashdash@^1.12.0: 408 | version "1.14.1" 409 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 410 | dependencies: 411 | assert-plus "^1.0.0" 412 | 413 | dasherize@2.0.0: 414 | version "2.0.0" 415 | resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" 416 | 417 | dashify@^0.2.0: 418 | version "0.2.2" 419 | resolved "https://registry.yarnpkg.com/dashify/-/dashify-0.2.2.tgz#6a07415a01c91faf4a32e38d9dfba71f61cb20fe" 420 | 421 | debug@^2.2.0: 422 | version "2.3.3" 423 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" 424 | dependencies: 425 | ms "0.7.2" 426 | 427 | debug@~2.2.0, debug@2.2.0: 428 | version "2.2.0" 429 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 430 | dependencies: 431 | ms "0.7.1" 432 | 433 | decamelize@^1.0.0: 434 | version "1.2.0" 435 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 436 | 437 | deep-eql@^0.1.3: 438 | version "0.1.3" 439 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 440 | dependencies: 441 | type-detect "0.1.1" 442 | 443 | deep-extend@~0.4.0: 444 | version "0.4.1" 445 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 446 | 447 | deep-is@~0.1.3: 448 | version "0.1.3" 449 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 450 | 451 | delayed-stream@~1.0.0: 452 | version "1.0.0" 453 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 454 | 455 | delegates@^1.0.0: 456 | version "1.0.0" 457 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 458 | 459 | depd@~1.1.0: 460 | version "1.1.0" 461 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 462 | 463 | destroy@~1.0.4: 464 | version "1.0.4" 465 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 466 | 467 | diff@1.4.0: 468 | version "1.4.0" 469 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 470 | 471 | dns-prefetch-control@0.1.0: 472 | version "0.1.0" 473 | resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" 474 | 475 | dom-walk@^0.1.0: 476 | version "0.1.1" 477 | resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" 478 | 479 | dont-sniff-mimetype@1.0.0: 480 | version "1.0.0" 481 | resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" 482 | 483 | duplexer@~0.1.1: 484 | version "0.1.1" 485 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 486 | 487 | duplexify@^3.2.0: 488 | version "3.5.0" 489 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" 490 | dependencies: 491 | end-of-stream "1.0.0" 492 | inherits "^2.0.1" 493 | readable-stream "^2.0.0" 494 | stream-shift "^1.0.0" 495 | 496 | ecc-jsbn@~0.1.1: 497 | version "0.1.1" 498 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 499 | dependencies: 500 | jsbn "~0.1.0" 501 | 502 | ecdsa-sig-formatter@1.0.7: 503 | version "1.0.7" 504 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.7.tgz#3137e976a1d6232517e2513e04e32f79bcbdf126" 505 | dependencies: 506 | base64-url "^1.2.1" 507 | 508 | ee-first@1.1.1: 509 | version "1.1.1" 510 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 511 | 512 | encodeurl@~1.0.1: 513 | version "1.0.1" 514 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 515 | 516 | end-of-stream@1.0.0: 517 | version "1.0.0" 518 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" 519 | dependencies: 520 | once "~1.3.0" 521 | 522 | es6-promise@^3.0.2: 523 | version "3.3.1" 524 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" 525 | 526 | es6-promise@3.2.1: 527 | version "3.2.1" 528 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" 529 | 530 | escape-html@~1.0.3: 531 | version "1.0.3" 532 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 533 | 534 | escape-string-regexp@^1.0.2, escape-string-regexp@1.0.5: 535 | version "1.0.5" 536 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 537 | 538 | escodegen@1.8.x: 539 | version "1.8.1" 540 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" 541 | dependencies: 542 | esprima "^2.7.1" 543 | estraverse "^1.9.1" 544 | esutils "^2.0.2" 545 | optionator "^0.8.1" 546 | optionalDependencies: 547 | source-map "~0.2.0" 548 | 549 | esprima@^2.6.0, esprima@^2.7.1, esprima@2.7.x: 550 | version "2.7.3" 551 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 552 | 553 | estraverse@^1.9.1: 554 | version "1.9.3" 555 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" 556 | 557 | esutils@^2.0.2: 558 | version "2.0.2" 559 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 560 | 561 | etag@~1.7.0: 562 | version "1.7.0" 563 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" 564 | 565 | event-stream@~3.3.0: 566 | version "3.3.4" 567 | resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" 568 | dependencies: 569 | duplexer "~0.1.1" 570 | from "~0" 571 | map-stream "~0.1.0" 572 | pause-stream "0.0.11" 573 | split "0.3" 574 | stream-combiner "~0.0.4" 575 | through "~2.3.1" 576 | 577 | expand-brackets@^0.1.4: 578 | version "0.1.5" 579 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 580 | dependencies: 581 | is-posix-bracket "^0.1.0" 582 | 583 | expand-range@^1.8.1: 584 | version "1.8.2" 585 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 586 | dependencies: 587 | fill-range "^2.1.0" 588 | 589 | express-validation: 590 | version "1.0.1" 591 | resolved "https://registry.yarnpkg.com/express-validation/-/express-validation-1.0.1.tgz#630946f10cff406406ab19881e37be14562a0fba" 592 | dependencies: 593 | lodash "^4.9.0" 594 | 595 | express@^4.14.0: 596 | version "4.14.0" 597 | resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" 598 | dependencies: 599 | accepts "~1.3.3" 600 | array-flatten "1.1.1" 601 | content-disposition "0.5.1" 602 | content-type "~1.0.2" 603 | cookie "0.3.1" 604 | cookie-signature "1.0.6" 605 | debug "~2.2.0" 606 | depd "~1.1.0" 607 | encodeurl "~1.0.1" 608 | escape-html "~1.0.3" 609 | etag "~1.7.0" 610 | finalhandler "0.5.0" 611 | fresh "0.3.0" 612 | merge-descriptors "1.0.1" 613 | methods "~1.1.2" 614 | on-finished "~2.3.0" 615 | parseurl "~1.3.1" 616 | path-to-regexp "0.1.7" 617 | proxy-addr "~1.1.2" 618 | qs "6.2.0" 619 | range-parser "~1.2.0" 620 | send "0.14.1" 621 | serve-static "~1.11.1" 622 | type-is "~1.6.13" 623 | utils-merge "1.0.0" 624 | vary "~1.1.0" 625 | 626 | extend@^3.0.0, extend@~3.0.0: 627 | version "3.0.0" 628 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 629 | 630 | extglob@^0.3.1: 631 | version "0.3.2" 632 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 633 | dependencies: 634 | is-extglob "^1.0.0" 635 | 636 | extsprintf@1.0.2: 637 | version "1.0.2" 638 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 639 | 640 | eyes@0.1.x: 641 | version "0.1.8" 642 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 643 | 644 | fast-levenshtein@~2.0.4: 645 | version "2.0.5" 646 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" 647 | 648 | filename-regex@^2.0.0: 649 | version "2.0.0" 650 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 651 | 652 | fill-range@^2.1.0: 653 | version "2.2.3" 654 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 655 | dependencies: 656 | is-number "^2.1.0" 657 | isobject "^2.0.0" 658 | randomatic "^1.1.3" 659 | repeat-element "^1.1.2" 660 | repeat-string "^1.5.2" 661 | 662 | finalhandler@0.4.1: 663 | version "0.4.1" 664 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.1.tgz#85a17c6c59a94717d262d61230d4b0ebe3d4a14d" 665 | dependencies: 666 | debug "~2.2.0" 667 | escape-html "~1.0.3" 668 | on-finished "~2.3.0" 669 | unpipe "~1.0.0" 670 | 671 | finalhandler@0.5.0: 672 | version "0.5.0" 673 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" 674 | dependencies: 675 | debug "~2.2.0" 676 | escape-html "~1.0.3" 677 | on-finished "~2.3.0" 678 | statuses "~1.3.0" 679 | unpipe "~1.0.0" 680 | 681 | for-in@^0.1.5: 682 | version "0.1.6" 683 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 684 | 685 | for-own@^0.1.4: 686 | version "0.1.4" 687 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 688 | dependencies: 689 | for-in "^0.1.5" 690 | 691 | forever-agent@~0.6.1: 692 | version "0.6.1" 693 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 694 | 695 | form-data@~2.1.1: 696 | version "2.1.2" 697 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 698 | dependencies: 699 | asynckit "^0.4.0" 700 | combined-stream "^1.0.5" 701 | mime-types "^2.1.12" 702 | 703 | form-data@1.0.0-rc4: 704 | version "1.0.0-rc4" 705 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc4.tgz#05ac6bc22227b43e4461f488161554699d4f8b5e" 706 | dependencies: 707 | async "^1.5.2" 708 | combined-stream "^1.0.5" 709 | mime-types "^2.1.10" 710 | 711 | formatio@1.1.1: 712 | version "1.1.1" 713 | resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" 714 | dependencies: 715 | samsam "~1.1" 716 | 717 | formidable@^1.0.17: 718 | version "1.0.17" 719 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" 720 | 721 | forwarded@~0.1.0: 722 | version "0.1.0" 723 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" 724 | 725 | frameguard@3.0.0: 726 | version "3.0.0" 727 | resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.0.0.tgz#7bcad469ee7b96e91d12ceb3959c78235a9272e9" 728 | 729 | fresh@0.3.0: 730 | version "0.3.0" 731 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" 732 | 733 | from@~0: 734 | version "0.1.3" 735 | resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" 736 | 737 | fs.realpath@^1.0.0: 738 | version "1.0.0" 739 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 740 | 741 | fsevents@^1.0.0: 742 | version "1.0.15" 743 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" 744 | dependencies: 745 | nan "^2.3.0" 746 | node-pre-gyp "^0.6.29" 747 | 748 | fstream-ignore@~1.0.5: 749 | version "1.0.5" 750 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 751 | dependencies: 752 | fstream "^1.0.0" 753 | inherits "2" 754 | minimatch "^3.0.0" 755 | 756 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: 757 | version "1.0.10" 758 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" 759 | dependencies: 760 | graceful-fs "^4.1.2" 761 | inherits "~2.0.0" 762 | mkdirp ">=0.5 0" 763 | rimraf "2" 764 | 765 | gauge@~2.7.1: 766 | version "2.7.1" 767 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.1.tgz#388473894fe8be5e13ffcdb8b93e4ed0616428c7" 768 | dependencies: 769 | aproba "^1.0.3" 770 | console-control-strings "^1.0.0" 771 | has-color "^0.1.7" 772 | has-unicode "^2.0.0" 773 | object-assign "^4.1.0" 774 | signal-exit "^3.0.0" 775 | string-width "^1.0.1" 776 | strip-ansi "^3.0.1" 777 | wide-align "^1.1.0" 778 | 779 | generate-function@^2.0.0: 780 | version "2.0.0" 781 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 782 | 783 | generate-object-property@^1.1.0: 784 | version "1.2.0" 785 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 786 | dependencies: 787 | is-property "^1.0.0" 788 | 789 | getpass@^0.1.1: 790 | version "0.1.6" 791 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 792 | dependencies: 793 | assert-plus "^1.0.0" 794 | 795 | glob-base@^0.3.0: 796 | version "0.3.0" 797 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 798 | dependencies: 799 | glob-parent "^2.0.0" 800 | is-glob "^2.0.0" 801 | 802 | glob-parent@^2.0.0: 803 | version "2.0.0" 804 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 805 | dependencies: 806 | is-glob "^2.0.0" 807 | 808 | glob@^5.0.15: 809 | version "5.0.15" 810 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 811 | dependencies: 812 | inflight "^1.0.4" 813 | inherits "2" 814 | minimatch "2 || 3" 815 | once "^1.3.0" 816 | path-is-absolute "^1.0.0" 817 | 818 | glob@^7.0.5: 819 | version "7.1.1" 820 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 821 | dependencies: 822 | fs.realpath "^1.0.0" 823 | inflight "^1.0.4" 824 | inherits "2" 825 | minimatch "^3.0.2" 826 | once "^1.3.0" 827 | path-is-absolute "^1.0.0" 828 | 829 | glob@7.0.5: 830 | version "7.0.5" 831 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 832 | dependencies: 833 | fs.realpath "^1.0.0" 834 | inflight "^1.0.4" 835 | inherits "2" 836 | minimatch "^3.0.2" 837 | once "^1.3.0" 838 | path-is-absolute "^1.0.0" 839 | 840 | global@^4.3.1: 841 | version "4.3.1" 842 | resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" 843 | dependencies: 844 | min-document "^2.19.0" 845 | process "~0.5.1" 846 | 847 | got@^3.2.0: 848 | version "3.3.1" 849 | resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" 850 | dependencies: 851 | duplexify "^3.2.0" 852 | infinity-agent "^2.0.0" 853 | is-redirect "^1.0.0" 854 | is-stream "^1.0.0" 855 | lowercase-keys "^1.0.0" 856 | nested-error-stacks "^1.0.0" 857 | object-assign "^3.0.0" 858 | prepend-http "^1.0.0" 859 | read-all-stream "^3.0.0" 860 | timed-out "^2.0.0" 861 | 862 | graceful-fs@^4.1.2: 863 | version "4.1.11" 864 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 865 | 866 | "graceful-readlink@>= 1.0.0": 867 | version "1.0.1" 868 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 869 | 870 | growl@1.9.2: 871 | version "1.9.2" 872 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 873 | 874 | handlebars@^4.0.1: 875 | version "4.0.6" 876 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" 877 | dependencies: 878 | async "^1.4.0" 879 | optimist "^0.6.1" 880 | source-map "^0.4.4" 881 | optionalDependencies: 882 | uglify-js "^2.6" 883 | 884 | har-validator@~2.0.6: 885 | version "2.0.6" 886 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 887 | dependencies: 888 | chalk "^1.1.1" 889 | commander "^2.9.0" 890 | is-my-json-valid "^2.12.4" 891 | pinkie-promise "^2.0.0" 892 | 893 | has-ansi@^2.0.0: 894 | version "2.0.0" 895 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 896 | dependencies: 897 | ansi-regex "^2.0.0" 898 | 899 | has-color@^0.1.7: 900 | version "0.1.7" 901 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 902 | 903 | has-flag@^1.0.0: 904 | version "1.0.0" 905 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 906 | 907 | has-unicode@^2.0.0: 908 | version "2.0.1" 909 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 910 | 911 | hawk@~3.1.3: 912 | version "3.1.3" 913 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 914 | dependencies: 915 | boom "2.x.x" 916 | cryptiles "2.x.x" 917 | hoek "2.x.x" 918 | sntp "1.x.x" 919 | 920 | helmet-csp@2.1.0: 921 | version "2.1.0" 922 | resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.1.0.tgz#c0fbff8d9e8f3bbff2b83dc7fed3d47143184040" 923 | dependencies: 924 | camelize "1.0.0" 925 | content-security-policy-builder "1.1.0" 926 | dasherize "2.0.0" 927 | lodash.reduce "4.6.0" 928 | platform "1.3.1" 929 | 930 | helmet@^3.1.0: 931 | version "3.1.0" 932 | resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.1.0.tgz#64449547398e51b063fe1c75e7cb0274a557ea09" 933 | dependencies: 934 | connect "3.4.1" 935 | dns-prefetch-control "0.1.0" 936 | dont-sniff-mimetype "1.0.0" 937 | frameguard "3.0.0" 938 | helmet-csp "2.1.0" 939 | hide-powered-by "1.0.0" 940 | hpkp "2.0.0" 941 | hsts "2.0.0" 942 | ienoopen "1.0.0" 943 | nocache "2.0.0" 944 | referrer-policy "1.0.0" 945 | x-xss-protection "1.0.0" 946 | 947 | hide-powered-by@1.0.0: 948 | version "1.0.0" 949 | resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" 950 | 951 | hoek@2.x.x: 952 | version "2.16.3" 953 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 954 | 955 | hoek@4.x.x: 956 | version "4.1.0" 957 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.1.0.tgz#4a4557460f69842ed463aa00628cc26d2683afa7" 958 | 959 | hooks-fixed@1.2.0: 960 | version "1.2.0" 961 | resolved "https://registry.yarnpkg.com/hooks-fixed/-/hooks-fixed-1.2.0.tgz#0d2772d4d7d685ff9244724a9f0b5b2559aac96b" 962 | 963 | hpkp@2.0.0: 964 | version "2.0.0" 965 | resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" 966 | 967 | hsts@2.0.0: 968 | version "2.0.0" 969 | resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.0.0.tgz#a52234c6070decf214b2b6b70bb144d07e4776c7" 970 | dependencies: 971 | core-util-is "1.0.2" 972 | 973 | http-errors@~1.5.0: 974 | version "1.5.1" 975 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" 976 | dependencies: 977 | inherits "2.0.3" 978 | setprototypeof "1.0.2" 979 | statuses ">= 1.3.1 < 2" 980 | 981 | http-signature@~1.1.0: 982 | version "1.1.1" 983 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 984 | dependencies: 985 | assert-plus "^0.2.0" 986 | jsprim "^1.2.2" 987 | sshpk "^1.7.0" 988 | 989 | iconv-lite@0.4.13: 990 | version "0.4.13" 991 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" 992 | 993 | ienoopen@1.0.0: 994 | version "1.0.0" 995 | resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b" 996 | 997 | ignore-by-default@^1.0.0: 998 | version "1.0.1" 999 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 1000 | 1001 | imurmurhash@^0.1.4: 1002 | version "0.1.4" 1003 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1004 | 1005 | infinity-agent@^2.0.0: 1006 | version "2.0.3" 1007 | resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" 1008 | 1009 | inflight@^1.0.4: 1010 | version "1.0.6" 1011 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1012 | dependencies: 1013 | once "^1.3.0" 1014 | wrappy "1" 1015 | 1016 | inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3: 1017 | version "2.0.3" 1018 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1019 | 1020 | inherits@2.0.1: 1021 | version "2.0.1" 1022 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1023 | 1024 | ini@~1.3.0: 1025 | version "1.3.4" 1026 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1027 | 1028 | ip-regex@^1.0.0: 1029 | version "1.0.3" 1030 | resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" 1031 | 1032 | ipaddr.js@1.1.1: 1033 | version "1.1.1" 1034 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" 1035 | 1036 | is-binary-path@^1.0.0: 1037 | version "1.0.1" 1038 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1039 | dependencies: 1040 | binary-extensions "^1.0.0" 1041 | 1042 | is-buffer@^1.0.2: 1043 | version "1.1.4" 1044 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 1045 | 1046 | is-dotfile@^1.0.0: 1047 | version "1.0.2" 1048 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1049 | 1050 | is-equal-shallow@^0.1.3: 1051 | version "0.1.3" 1052 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1053 | dependencies: 1054 | is-primitive "^2.0.0" 1055 | 1056 | is-extendable@^0.1.1: 1057 | version "0.1.1" 1058 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1059 | 1060 | is-extglob@^1.0.0: 1061 | version "1.0.0" 1062 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1063 | 1064 | is-finite@^1.0.0: 1065 | version "1.0.2" 1066 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1067 | dependencies: 1068 | number-is-nan "^1.0.0" 1069 | 1070 | is-fullwidth-code-point@^1.0.0: 1071 | version "1.0.0" 1072 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1073 | dependencies: 1074 | number-is-nan "^1.0.0" 1075 | 1076 | is-glob@^2.0.0, is-glob@^2.0.1: 1077 | version "2.0.1" 1078 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1079 | dependencies: 1080 | is-extglob "^1.0.0" 1081 | 1082 | is-ip@1.0.0: 1083 | version "1.0.0" 1084 | resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-1.0.0.tgz#2bb6959f797ccd6f9fdc812758bcbc87c4c59074" 1085 | dependencies: 1086 | ip-regex "^1.0.0" 1087 | 1088 | is-my-json-valid@^2.12.4: 1089 | version "2.15.0" 1090 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 1091 | dependencies: 1092 | generate-function "^2.0.0" 1093 | generate-object-property "^1.1.0" 1094 | jsonpointer "^4.0.0" 1095 | xtend "^4.0.0" 1096 | 1097 | is-npm@^1.0.0: 1098 | version "1.0.0" 1099 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 1100 | 1101 | is-number@^2.0.2, is-number@^2.1.0: 1102 | version "2.1.0" 1103 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1104 | dependencies: 1105 | kind-of "^3.0.2" 1106 | 1107 | is-posix-bracket@^0.1.0: 1108 | version "0.1.1" 1109 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1110 | 1111 | is-primitive@^2.0.0: 1112 | version "2.0.0" 1113 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1114 | 1115 | is-property@^1.0.0: 1116 | version "1.0.2" 1117 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1118 | 1119 | is-redirect@^1.0.0: 1120 | version "1.0.0" 1121 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1122 | 1123 | is-stream@^1.0.0: 1124 | version "1.1.0" 1125 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1126 | 1127 | is-typedarray@~1.0.0: 1128 | version "1.0.0" 1129 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1130 | 1131 | isarray@~1.0.0, isarray@1.0.0: 1132 | version "1.0.0" 1133 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1134 | 1135 | isemail@1.x.x: 1136 | version "1.2.0" 1137 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" 1138 | 1139 | isemail@2.x.x: 1140 | version "2.2.1" 1141 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" 1142 | 1143 | isexe@^1.1.1: 1144 | version "1.1.2" 1145 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 1146 | 1147 | isobject@^2.0.0: 1148 | version "2.1.0" 1149 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1150 | dependencies: 1151 | isarray "1.0.0" 1152 | 1153 | isstream@~0.1.2, isstream@0.1.x: 1154 | version "0.1.2" 1155 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1156 | 1157 | istanbul: 1158 | version "0.4.5" 1159 | resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" 1160 | dependencies: 1161 | abbrev "1.0.x" 1162 | async "1.x" 1163 | escodegen "1.8.x" 1164 | esprima "2.7.x" 1165 | glob "^5.0.15" 1166 | handlebars "^4.0.1" 1167 | js-yaml "3.x" 1168 | mkdirp "0.5.x" 1169 | nopt "3.x" 1170 | once "1.x" 1171 | resolve "1.1.x" 1172 | supports-color "^3.1.0" 1173 | which "^1.1.1" 1174 | wordwrap "^1.0.0" 1175 | 1176 | items@2.x.x: 1177 | version "2.1.1" 1178 | resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" 1179 | 1180 | jodid25519@^1.0.0: 1181 | version "1.0.2" 1182 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1183 | dependencies: 1184 | jsbn "~0.1.0" 1185 | 1186 | joi: 1187 | version "10.2.2" 1188 | resolved "https://registry.yarnpkg.com/joi/-/joi-10.2.2.tgz#dc5a792b7b4c6fffa562242a95b55d9d3f077e24" 1189 | dependencies: 1190 | hoek "4.x.x" 1191 | isemail "2.x.x" 1192 | items "2.x.x" 1193 | topo "2.x.x" 1194 | 1195 | joi@^6.10.1: 1196 | version "6.10.1" 1197 | resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" 1198 | dependencies: 1199 | hoek "2.x.x" 1200 | isemail "1.x.x" 1201 | moment "2.x.x" 1202 | topo "1.x.x" 1203 | 1204 | js-yaml@3.x: 1205 | version "3.7.0" 1206 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 1207 | dependencies: 1208 | argparse "^1.0.7" 1209 | esprima "^2.6.0" 1210 | 1211 | jsbn@~0.1.0: 1212 | version "0.1.0" 1213 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 1214 | 1215 | json-schema@0.2.3: 1216 | version "0.2.3" 1217 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1218 | 1219 | json-stringify-safe@~5.0.1: 1220 | version "5.0.1" 1221 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1222 | 1223 | json3@3.3.2: 1224 | version "3.3.2" 1225 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 1226 | 1227 | jsonpointer@^4.0.0: 1228 | version "4.0.0" 1229 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 1230 | 1231 | jsonwebtoken@^7.0.0: 1232 | version "7.1.9" 1233 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz#847804e5258bec5a9499a8dc4a5e7a3bae08d58a" 1234 | dependencies: 1235 | joi "^6.10.1" 1236 | jws "^3.1.3" 1237 | lodash.once "^4.0.0" 1238 | ms "^0.7.1" 1239 | xtend "^4.0.1" 1240 | 1241 | jsprim@^1.2.2: 1242 | version "1.3.1" 1243 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 1244 | dependencies: 1245 | extsprintf "1.0.2" 1246 | json-schema "0.2.3" 1247 | verror "1.3.6" 1248 | 1249 | jwa@^1.1.4: 1250 | version "1.1.4" 1251 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.4.tgz#dbb01bd38cd409899fa715107e90d90f9bcb161e" 1252 | dependencies: 1253 | base64url "2.0.0" 1254 | buffer-equal-constant-time "1.0.1" 1255 | ecdsa-sig-formatter "1.0.7" 1256 | safe-buffer "^5.0.1" 1257 | 1258 | jws@^3.1.3: 1259 | version "3.1.4" 1260 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" 1261 | dependencies: 1262 | base64url "^2.0.0" 1263 | jwa "^1.1.4" 1264 | safe-buffer "^5.0.1" 1265 | 1266 | jwt-simple: 1267 | version "0.5.1" 1268 | resolved "https://registry.yarnpkg.com/jwt-simple/-/jwt-simple-0.5.1.tgz#79ea01891b61de6b68e13e67c0b4b5bda937b294" 1269 | 1270 | kareem@1.1.3: 1271 | version "1.1.3" 1272 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.1.3.tgz#0877610d8879c38da62d1dbafde4e17f2692f041" 1273 | 1274 | kind-of@^3.0.2: 1275 | version "3.0.4" 1276 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 1277 | dependencies: 1278 | is-buffer "^1.0.2" 1279 | 1280 | latest-version@^1.0.0: 1281 | version "1.0.1" 1282 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" 1283 | dependencies: 1284 | package-json "^1.0.0" 1285 | 1286 | lazy-cache@^1.0.3: 1287 | version "1.0.4" 1288 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1289 | 1290 | levn@~0.3.0: 1291 | version "0.3.0" 1292 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1293 | dependencies: 1294 | prelude-ls "~1.1.2" 1295 | type-check "~0.3.2" 1296 | 1297 | lodash._baseassign@^3.0.0: 1298 | version "3.2.0" 1299 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1300 | dependencies: 1301 | lodash._basecopy "^3.0.0" 1302 | lodash.keys "^3.0.0" 1303 | 1304 | lodash._basecopy@^3.0.0: 1305 | version "3.0.1" 1306 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1307 | 1308 | lodash._basecreate@^3.0.0: 1309 | version "3.0.3" 1310 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 1311 | 1312 | lodash._bindcallback@^3.0.0: 1313 | version "3.0.1" 1314 | resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" 1315 | 1316 | lodash._createassigner@^3.0.0: 1317 | version "3.1.1" 1318 | resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" 1319 | dependencies: 1320 | lodash._bindcallback "^3.0.0" 1321 | lodash._isiterateecall "^3.0.0" 1322 | lodash.restparam "^3.0.0" 1323 | 1324 | lodash._getnative@^3.0.0: 1325 | version "3.9.1" 1326 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1327 | 1328 | lodash._isiterateecall@^3.0.0: 1329 | version "3.0.9" 1330 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1331 | 1332 | lodash.assign@^3.0.0: 1333 | version "3.2.0" 1334 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" 1335 | dependencies: 1336 | lodash._baseassign "^3.0.0" 1337 | lodash._createassigner "^3.0.0" 1338 | lodash.keys "^3.0.0" 1339 | 1340 | lodash.create@3.1.1: 1341 | version "3.1.1" 1342 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 1343 | dependencies: 1344 | lodash._baseassign "^3.0.0" 1345 | lodash._basecreate "^3.0.0" 1346 | lodash._isiterateecall "^3.0.0" 1347 | 1348 | lodash.defaults@^3.1.2: 1349 | version "3.1.2" 1350 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" 1351 | dependencies: 1352 | lodash.assign "^3.0.0" 1353 | lodash.restparam "^3.0.0" 1354 | 1355 | lodash.isarguments@^3.0.0: 1356 | version "3.1.0" 1357 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1358 | 1359 | lodash.isarray@^3.0.0: 1360 | version "3.0.4" 1361 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1362 | 1363 | lodash.keys@^3.0.0: 1364 | version "3.1.2" 1365 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1366 | dependencies: 1367 | lodash._getnative "^3.0.0" 1368 | lodash.isarguments "^3.0.0" 1369 | lodash.isarray "^3.0.0" 1370 | 1371 | lodash.once@^4.0.0: 1372 | version "4.1.1" 1373 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1374 | 1375 | lodash.reduce@4.6.0: 1376 | version "4.6.0" 1377 | resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" 1378 | 1379 | lodash.restparam@^3.0.0: 1380 | version "3.6.1" 1381 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 1382 | 1383 | lodash@^4.14.0: 1384 | version "4.17.2" 1385 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" 1386 | 1387 | lodash@^4.9.0: 1388 | version "4.17.4" 1389 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1390 | 1391 | lolex@1.3.2: 1392 | version "1.3.2" 1393 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" 1394 | 1395 | longest@^1.0.1: 1396 | version "1.0.1" 1397 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1398 | 1399 | lowercase-keys@^1.0.0: 1400 | version "1.0.0" 1401 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1402 | 1403 | map-stream@~0.1.0: 1404 | version "0.1.0" 1405 | resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" 1406 | 1407 | media-typer@0.3.0: 1408 | version "0.3.0" 1409 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1410 | 1411 | merge-descriptors@1.0.1: 1412 | version "1.0.1" 1413 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1414 | 1415 | methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: 1416 | version "1.1.2" 1417 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1418 | 1419 | micromatch@^2.1.5: 1420 | version "2.3.11" 1421 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1422 | dependencies: 1423 | arr-diff "^2.0.0" 1424 | array-unique "^0.2.1" 1425 | braces "^1.8.2" 1426 | expand-brackets "^0.1.4" 1427 | extglob "^0.3.1" 1428 | filename-regex "^2.0.0" 1429 | is-extglob "^1.0.0" 1430 | is-glob "^2.0.1" 1431 | kind-of "^3.0.2" 1432 | normalize-path "^2.0.1" 1433 | object.omit "^2.0.0" 1434 | parse-glob "^3.0.4" 1435 | regex-cache "^0.4.2" 1436 | 1437 | mime-db@~1.25.0: 1438 | version "1.25.0" 1439 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" 1440 | 1441 | mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: 1442 | version "2.1.13" 1443 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" 1444 | dependencies: 1445 | mime-db "~1.25.0" 1446 | 1447 | mime@^1.3.4, mime@1.3.4: 1448 | version "1.3.4" 1449 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 1450 | 1451 | min-document@^2.19.0: 1452 | version "2.19.0" 1453 | resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" 1454 | dependencies: 1455 | dom-walk "^0.1.0" 1456 | 1457 | minimatch@^3.0.0, minimatch@^3.0.2, "minimatch@2 || 3": 1458 | version "3.0.3" 1459 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1460 | dependencies: 1461 | brace-expansion "^1.0.0" 1462 | 1463 | minimist@^1.2.0: 1464 | version "1.2.0" 1465 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1466 | 1467 | minimist@~0.0.1: 1468 | version "0.0.10" 1469 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1470 | 1471 | minimist@0.0.8: 1472 | version "0.0.8" 1473 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1474 | 1475 | mkdirp@^0.5.0, "mkdirp@>=0.5 0", mkdirp@~0.5.1, mkdirp@0.5.1, mkdirp@0.5.x: 1476 | version "0.5.1" 1477 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1478 | dependencies: 1479 | minimist "0.0.8" 1480 | 1481 | mocha@^3.2.0: 1482 | version "3.2.0" 1483 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" 1484 | dependencies: 1485 | browser-stdout "1.3.0" 1486 | commander "2.9.0" 1487 | debug "2.2.0" 1488 | diff "1.4.0" 1489 | escape-string-regexp "1.0.5" 1490 | glob "7.0.5" 1491 | growl "1.9.2" 1492 | json3 "3.3.2" 1493 | lodash.create "3.1.1" 1494 | mkdirp "0.5.1" 1495 | supports-color "3.1.2" 1496 | 1497 | moment@2.x.x: 1498 | version "2.17.0" 1499 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.0.tgz#a4c292e02aac5ddefb29a6eed24f51938dd3b74f" 1500 | 1501 | mongodb-core@2.0.13: 1502 | version "2.0.13" 1503 | resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.0.13.tgz#f9394b588dce0e579482e53d74dbc7d7a9d4519c" 1504 | dependencies: 1505 | bson "~0.5.6" 1506 | require_optional "~1.0.0" 1507 | 1508 | mongodb@^2.2.11, mongodb@2.2.11: 1509 | version "2.2.11" 1510 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.11.tgz#a828b036fe6a437a35e723af5f81781c4976306c" 1511 | dependencies: 1512 | es6-promise "3.2.1" 1513 | mongodb-core "2.0.13" 1514 | readable-stream "2.1.5" 1515 | 1516 | mongoose@^4.7.0: 1517 | version "4.7.0" 1518 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.7.0.tgz#adb7c6b73dfb76f204a70ba6cd364f887dcc2012" 1519 | dependencies: 1520 | async "2.1.2" 1521 | bson "~0.5.4" 1522 | hooks-fixed "1.2.0" 1523 | kareem "1.1.3" 1524 | mongodb "2.2.11" 1525 | mpath "0.2.1" 1526 | mpromise "0.5.5" 1527 | mquery "2.0.0" 1528 | ms "0.7.1" 1529 | muri "1.1.1" 1530 | regexp-clone "0.0.1" 1531 | sliced "1.0.1" 1532 | 1533 | mpath@0.2.1: 1534 | version "0.2.1" 1535 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.2.1.tgz#3a4e829359801de96309c27a6b2e102e89f9e96e" 1536 | 1537 | mpromise@0.5.5: 1538 | version "0.5.5" 1539 | resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6" 1540 | 1541 | mquery@2.0.0: 1542 | version "2.0.0" 1543 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.0.0.tgz#b5abc850b90dffc3e10ae49b4b6e7a479752df22" 1544 | dependencies: 1545 | bluebird "2.10.2" 1546 | debug "2.2.0" 1547 | regexp-clone "0.0.1" 1548 | sliced "0.0.5" 1549 | 1550 | ms@^0.7.1, ms@0.7.2: 1551 | version "0.7.2" 1552 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1553 | 1554 | ms@0.7.1: 1555 | version "0.7.1" 1556 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1557 | 1558 | muri@1.1.1: 1559 | version "1.1.1" 1560 | resolved "https://registry.yarnpkg.com/muri/-/muri-1.1.1.tgz#64bd904eaf8ff89600c994441fad3c5195905ac2" 1561 | 1562 | nan@^2.3.0: 1563 | version "2.4.0" 1564 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 1565 | 1566 | nan@2.3.5: 1567 | version "2.3.5" 1568 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.3.5.tgz#822a0dc266290ce4cd3a12282ca3e7e364668a08" 1569 | 1570 | negotiator@0.6.1: 1571 | version "0.6.1" 1572 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1573 | 1574 | nested-error-stacks@^1.0.0: 1575 | version "1.0.2" 1576 | resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" 1577 | dependencies: 1578 | inherits "~2.0.1" 1579 | 1580 | nocache@2.0.0: 1581 | version "2.0.0" 1582 | resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" 1583 | 1584 | node-pre-gyp@^0.6.29: 1585 | version "0.6.31" 1586 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" 1587 | dependencies: 1588 | mkdirp "~0.5.1" 1589 | nopt "~3.0.6" 1590 | npmlog "^4.0.0" 1591 | rc "~1.1.6" 1592 | request "^2.75.0" 1593 | rimraf "~2.5.4" 1594 | semver "~5.3.0" 1595 | tar "~2.2.1" 1596 | tar-pack "~3.3.0" 1597 | 1598 | nodemon: 1599 | version "1.11.0" 1600 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" 1601 | dependencies: 1602 | chokidar "^1.4.3" 1603 | debug "^2.2.0" 1604 | es6-promise "^3.0.2" 1605 | ignore-by-default "^1.0.0" 1606 | lodash.defaults "^3.1.2" 1607 | minimatch "^3.0.0" 1608 | ps-tree "^1.0.1" 1609 | touch "1.0.0" 1610 | undefsafe "0.0.3" 1611 | update-notifier "0.5.0" 1612 | 1613 | nopt@~1.0.10: 1614 | version "1.0.10" 1615 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1616 | dependencies: 1617 | abbrev "1" 1618 | 1619 | nopt@~3.0.6, nopt@3.x: 1620 | version "3.0.6" 1621 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1622 | dependencies: 1623 | abbrev "1" 1624 | 1625 | normalize-path@^2.0.1: 1626 | version "2.0.1" 1627 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1628 | 1629 | npmlog@^4.0.0: 1630 | version "4.0.1" 1631 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" 1632 | dependencies: 1633 | are-we-there-yet "~1.1.2" 1634 | console-control-strings "~1.1.0" 1635 | gauge "~2.7.1" 1636 | set-blocking "~2.0.0" 1637 | 1638 | number-is-nan@^1.0.0: 1639 | version "1.0.1" 1640 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1641 | 1642 | oauth-sign@~0.8.1: 1643 | version "0.8.2" 1644 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1645 | 1646 | object-assign@^3.0.0: 1647 | version "3.0.0" 1648 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 1649 | 1650 | object-assign@^4.0.1, object-assign@^4.1.0: 1651 | version "4.1.0" 1652 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1653 | 1654 | object.omit@^2.0.0: 1655 | version "2.0.1" 1656 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1657 | dependencies: 1658 | for-own "^0.1.4" 1659 | is-extendable "^0.1.1" 1660 | 1661 | on-finished@~2.3.0: 1662 | version "2.3.0" 1663 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1664 | dependencies: 1665 | ee-first "1.1.1" 1666 | 1667 | once@^1.3.0, once@1.x: 1668 | version "1.4.0" 1669 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1670 | dependencies: 1671 | wrappy "1" 1672 | 1673 | once@~1.3.0, once@~1.3.3: 1674 | version "1.3.3" 1675 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1676 | dependencies: 1677 | wrappy "1" 1678 | 1679 | optimist@^0.6.1: 1680 | version "0.6.1" 1681 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1682 | dependencies: 1683 | minimist "~0.0.1" 1684 | wordwrap "~0.0.2" 1685 | 1686 | optionator@^0.8.1: 1687 | version "0.8.2" 1688 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1689 | dependencies: 1690 | deep-is "~0.1.3" 1691 | fast-levenshtein "~2.0.4" 1692 | levn "~0.3.0" 1693 | prelude-ls "~1.1.2" 1694 | type-check "~0.3.2" 1695 | wordwrap "~1.0.0" 1696 | 1697 | os-homedir@^1.0.0: 1698 | version "1.0.2" 1699 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1700 | 1701 | os-tmpdir@^1.0.0: 1702 | version "1.0.2" 1703 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1704 | 1705 | osenv@^0.1.0: 1706 | version "0.1.3" 1707 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" 1708 | dependencies: 1709 | os-homedir "^1.0.0" 1710 | os-tmpdir "^1.0.0" 1711 | 1712 | package-json@^1.0.0: 1713 | version "1.2.0" 1714 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" 1715 | dependencies: 1716 | got "^3.2.0" 1717 | registry-url "^3.0.0" 1718 | 1719 | parse-glob@^3.0.4: 1720 | version "3.0.4" 1721 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1722 | dependencies: 1723 | glob-base "^0.3.0" 1724 | is-dotfile "^1.0.0" 1725 | is-extglob "^1.0.0" 1726 | is-glob "^2.0.0" 1727 | 1728 | parseurl@~1.3.1: 1729 | version "1.3.1" 1730 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 1731 | 1732 | passport: 1733 | version "0.3.2" 1734 | resolved "https://registry.yarnpkg.com/passport/-/passport-0.3.2.tgz#9dd009f915e8fe095b0124a01b8f82da07510102" 1735 | dependencies: 1736 | passport-strategy "1.x.x" 1737 | pause "0.0.1" 1738 | 1739 | passport-http: 1740 | version "0.3.0" 1741 | resolved "https://registry.yarnpkg.com/passport-http/-/passport-http-0.3.0.tgz#8ee53d4380be9c60df2151925029826f77115603" 1742 | dependencies: 1743 | passport-strategy "1.x.x" 1744 | 1745 | passport-jwt@^2.2.1: 1746 | version "2.2.1" 1747 | resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-2.2.1.tgz#0e004c94071319d673d9d9bcfd1574a868011527" 1748 | dependencies: 1749 | jsonwebtoken "^7.0.0" 1750 | passport-strategy "^1.0.0" 1751 | 1752 | passport-strategy@^1.0.0, passport-strategy@1.x.x: 1753 | version "1.0.0" 1754 | resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" 1755 | 1756 | path-is-absolute@^1.0.0: 1757 | version "1.0.1" 1758 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1759 | 1760 | path-to-regexp@0.1.7: 1761 | version "0.1.7" 1762 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1763 | 1764 | pause-stream@0.0.11: 1765 | version "0.0.11" 1766 | resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" 1767 | dependencies: 1768 | through "~2.3" 1769 | 1770 | pause@0.0.1: 1771 | version "0.0.1" 1772 | resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" 1773 | 1774 | pinkie-promise@^2.0.0: 1775 | version "2.0.1" 1776 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1777 | dependencies: 1778 | pinkie "^2.0.0" 1779 | 1780 | pinkie@^2.0.0: 1781 | version "2.0.4" 1782 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1783 | 1784 | platform@1.3.1: 1785 | version "1.3.1" 1786 | resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.1.tgz#492210892335bd3131c0a08dda2d93ec3543e423" 1787 | 1788 | prelude-ls@~1.1.2: 1789 | version "1.1.2" 1790 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1791 | 1792 | prepend-http@^1.0.0: 1793 | version "1.0.4" 1794 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1795 | 1796 | preserve@^0.2.0: 1797 | version "0.2.0" 1798 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1799 | 1800 | process-nextick-args@~1.0.6: 1801 | version "1.0.7" 1802 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1803 | 1804 | process@~0.5.1: 1805 | version "0.5.2" 1806 | resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" 1807 | 1808 | proxy-addr@~1.1.2: 1809 | version "1.1.2" 1810 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" 1811 | dependencies: 1812 | forwarded "~0.1.0" 1813 | ipaddr.js "1.1.1" 1814 | 1815 | ps-tree@^1.0.1: 1816 | version "1.1.0" 1817 | resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" 1818 | dependencies: 1819 | event-stream "~3.3.0" 1820 | 1821 | punycode@^1.4.1: 1822 | version "1.4.1" 1823 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1824 | 1825 | qs@^6.1.0, qs@^6.2.0, qs@~6.3.0: 1826 | version "6.3.0" 1827 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 1828 | 1829 | qs@6.2.0: 1830 | version "6.2.0" 1831 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" 1832 | 1833 | randomatic@^1.1.3: 1834 | version "1.1.6" 1835 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1836 | dependencies: 1837 | is-number "^2.0.2" 1838 | kind-of "^3.0.2" 1839 | 1840 | range-parser@~1.2.0: 1841 | version "1.2.0" 1842 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 1843 | 1844 | raw-body@~2.1.7: 1845 | version "2.1.7" 1846 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" 1847 | dependencies: 1848 | bytes "2.4.0" 1849 | iconv-lite "0.4.13" 1850 | unpipe "1.0.0" 1851 | 1852 | rc@^1.0.1, rc@~1.1.6: 1853 | version "1.1.6" 1854 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1855 | dependencies: 1856 | deep-extend "~0.4.0" 1857 | ini "~1.3.0" 1858 | minimist "^1.2.0" 1859 | strip-json-comments "~1.0.4" 1860 | 1861 | read-all-stream@^3.0.0: 1862 | version "3.1.0" 1863 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" 1864 | dependencies: 1865 | pinkie-promise "^2.0.0" 1866 | readable-stream "^2.0.0" 1867 | 1868 | readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5: 1869 | version "2.2.2" 1870 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" 1871 | dependencies: 1872 | buffer-shims "^1.0.0" 1873 | core-util-is "~1.0.0" 1874 | inherits "~2.0.1" 1875 | isarray "~1.0.0" 1876 | process-nextick-args "~1.0.6" 1877 | string_decoder "~0.10.x" 1878 | util-deprecate "~1.0.1" 1879 | 1880 | readable-stream@~2.1.4, readable-stream@2.1.5: 1881 | version "2.1.5" 1882 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1883 | dependencies: 1884 | buffer-shims "^1.0.0" 1885 | core-util-is "~1.0.0" 1886 | inherits "~2.0.1" 1887 | isarray "~1.0.0" 1888 | process-nextick-args "~1.0.6" 1889 | string_decoder "~0.10.x" 1890 | util-deprecate "~1.0.1" 1891 | 1892 | readdirp@^2.0.0: 1893 | version "2.1.0" 1894 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1895 | dependencies: 1896 | graceful-fs "^4.1.2" 1897 | minimatch "^3.0.2" 1898 | readable-stream "^2.0.2" 1899 | set-immediate-shim "^1.0.1" 1900 | 1901 | referrer-policy@1.0.0: 1902 | version "1.0.0" 1903 | resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.0.0.tgz#f60eedc92f942b01a6118121ec932d66e8fd7e14" 1904 | 1905 | regex-cache@^0.4.2: 1906 | version "0.4.3" 1907 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1908 | dependencies: 1909 | is-equal-shallow "^0.1.3" 1910 | is-primitive "^2.0.0" 1911 | 1912 | regexp-clone@0.0.1: 1913 | version "0.0.1" 1914 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" 1915 | 1916 | registry-url@^3.0.0: 1917 | version "3.1.0" 1918 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1919 | dependencies: 1920 | rc "^1.0.1" 1921 | 1922 | repeat-element@^1.1.2: 1923 | version "1.1.2" 1924 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1925 | 1926 | repeat-string@^1.5.2: 1927 | version "1.6.1" 1928 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1929 | 1930 | repeating@^1.1.2: 1931 | version "1.1.3" 1932 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" 1933 | dependencies: 1934 | is-finite "^1.0.0" 1935 | 1936 | request@^2.75.0: 1937 | version "2.79.0" 1938 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 1939 | dependencies: 1940 | aws-sign2 "~0.6.0" 1941 | aws4 "^1.2.1" 1942 | caseless "~0.11.0" 1943 | combined-stream "~1.0.5" 1944 | extend "~3.0.0" 1945 | forever-agent "~0.6.1" 1946 | form-data "~2.1.1" 1947 | har-validator "~2.0.6" 1948 | hawk "~3.1.3" 1949 | http-signature "~1.1.0" 1950 | is-typedarray "~1.0.0" 1951 | isstream "~0.1.2" 1952 | json-stringify-safe "~5.0.1" 1953 | mime-types "~2.1.7" 1954 | oauth-sign "~0.8.1" 1955 | qs "~6.3.0" 1956 | stringstream "~0.0.4" 1957 | tough-cookie "~2.3.0" 1958 | tunnel-agent "~0.4.1" 1959 | uuid "^3.0.0" 1960 | 1961 | require_optional@~1.0.0: 1962 | version "1.0.0" 1963 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.0.tgz#52a86137a849728eb60a55533617f8f914f59abf" 1964 | dependencies: 1965 | resolve-from "^2.0.0" 1966 | semver "^5.1.0" 1967 | 1968 | resolve-from@^2.0.0: 1969 | version "2.0.0" 1970 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1971 | 1972 | resolve@1.1.x: 1973 | version "1.1.7" 1974 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1975 | 1976 | right-align@^0.1.1: 1977 | version "0.1.3" 1978 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1979 | dependencies: 1980 | align-text "^0.1.1" 1981 | 1982 | rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: 1983 | version "2.5.4" 1984 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1985 | dependencies: 1986 | glob "^7.0.5" 1987 | 1988 | safe-buffer@^5.0.1: 1989 | version "5.0.1" 1990 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1991 | 1992 | samsam@~1.1: 1993 | version "1.1.3" 1994 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" 1995 | 1996 | samsam@1.1.2: 1997 | version "1.1.2" 1998 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" 1999 | 2000 | semver-diff@^2.0.0: 2001 | version "2.1.0" 2002 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 2003 | dependencies: 2004 | semver "^5.0.3" 2005 | 2006 | semver@^5.0.3, semver@^5.1.0, semver@~5.3.0: 2007 | version "5.3.0" 2008 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2009 | 2010 | send@0.14.1: 2011 | version "0.14.1" 2012 | resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" 2013 | dependencies: 2014 | debug "~2.2.0" 2015 | depd "~1.1.0" 2016 | destroy "~1.0.4" 2017 | encodeurl "~1.0.1" 2018 | escape-html "~1.0.3" 2019 | etag "~1.7.0" 2020 | fresh "0.3.0" 2021 | http-errors "~1.5.0" 2022 | mime "1.3.4" 2023 | ms "0.7.1" 2024 | on-finished "~2.3.0" 2025 | range-parser "~1.2.0" 2026 | statuses "~1.3.0" 2027 | 2028 | serve-static@~1.11.1: 2029 | version "1.11.1" 2030 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" 2031 | dependencies: 2032 | encodeurl "~1.0.1" 2033 | escape-html "~1.0.3" 2034 | parseurl "~1.3.1" 2035 | send "0.14.1" 2036 | 2037 | set-blocking@~2.0.0: 2038 | version "2.0.0" 2039 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2040 | 2041 | set-immediate-shim@^1.0.1: 2042 | version "1.0.1" 2043 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2044 | 2045 | setprototypeof@1.0.2: 2046 | version "1.0.2" 2047 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" 2048 | 2049 | signal-exit@^3.0.0: 2050 | version "3.0.1" 2051 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 2052 | 2053 | sinon: 2054 | version "1.17.6" 2055 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1" 2056 | dependencies: 2057 | formatio "1.1.1" 2058 | lolex "1.3.2" 2059 | samsam "1.1.2" 2060 | util ">=0.10.3 <1" 2061 | 2062 | sinon-mongoose: 2063 | version "1.3.0" 2064 | resolved "https://registry.yarnpkg.com/sinon-mongoose/-/sinon-mongoose-1.3.0.tgz#2a2c75c36e9d7b665390f23fc7f91d548f580e45" 2065 | 2066 | sliced@0.0.5: 2067 | version "0.0.5" 2068 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-0.0.5.tgz#5edc044ca4eb6f7816d50ba2fc63e25d8fe4707f" 2069 | 2070 | sliced@1.0.1: 2071 | version "1.0.1" 2072 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 2073 | 2074 | slide@^1.1.5: 2075 | version "1.1.6" 2076 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 2077 | 2078 | sntp@1.x.x: 2079 | version "1.0.9" 2080 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2081 | dependencies: 2082 | hoek "2.x.x" 2083 | 2084 | source-map@^0.4.4: 2085 | version "0.4.4" 2086 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 2087 | dependencies: 2088 | amdefine ">=0.0.4" 2089 | 2090 | source-map@~0.2.0: 2091 | version "0.2.0" 2092 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" 2093 | dependencies: 2094 | amdefine ">=0.0.4" 2095 | 2096 | source-map@~0.5.1: 2097 | version "0.5.6" 2098 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2099 | 2100 | split@0.3: 2101 | version "0.3.3" 2102 | resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" 2103 | dependencies: 2104 | through "2" 2105 | 2106 | sprintf-js@~1.0.2: 2107 | version "1.0.3" 2108 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2109 | 2110 | sshpk@^1.7.0: 2111 | version "1.10.1" 2112 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 2113 | dependencies: 2114 | asn1 "~0.2.3" 2115 | assert-plus "^1.0.0" 2116 | dashdash "^1.12.0" 2117 | getpass "^0.1.1" 2118 | optionalDependencies: 2119 | bcrypt-pbkdf "^1.0.0" 2120 | ecc-jsbn "~0.1.1" 2121 | jodid25519 "^1.0.0" 2122 | jsbn "~0.1.0" 2123 | tweetnacl "~0.14.0" 2124 | 2125 | stack-trace@0.0.x: 2126 | version "0.0.9" 2127 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" 2128 | 2129 | "statuses@>= 1.3.1 < 2", statuses@~1.3.0: 2130 | version "1.3.1" 2131 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 2132 | 2133 | stream-combiner@~0.0.4: 2134 | version "0.0.4" 2135 | resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" 2136 | dependencies: 2137 | duplexer "~0.1.1" 2138 | 2139 | stream-shift@^1.0.0: 2140 | version "1.0.0" 2141 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 2142 | 2143 | string_decoder@~0.10.x: 2144 | version "0.10.31" 2145 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2146 | 2147 | string-length@^1.0.0: 2148 | version "1.0.1" 2149 | resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" 2150 | dependencies: 2151 | strip-ansi "^3.0.0" 2152 | 2153 | string-width@^1.0.1: 2154 | version "1.0.2" 2155 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2156 | dependencies: 2157 | code-point-at "^1.0.0" 2158 | is-fullwidth-code-point "^1.0.0" 2159 | strip-ansi "^3.0.0" 2160 | 2161 | stringstream@~0.0.4: 2162 | version "0.0.5" 2163 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2164 | 2165 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2166 | version "3.0.1" 2167 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2168 | dependencies: 2169 | ansi-regex "^2.0.0" 2170 | 2171 | strip-json-comments@~1.0.4: 2172 | version "1.0.4" 2173 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 2174 | 2175 | superagent@^2.0.0: 2176 | version "2.3.0" 2177 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-2.3.0.tgz#703529a0714e57e123959ddefbce193b2e50d115" 2178 | dependencies: 2179 | component-emitter "^1.2.0" 2180 | cookiejar "^2.0.6" 2181 | debug "^2.2.0" 2182 | extend "^3.0.0" 2183 | form-data "1.0.0-rc4" 2184 | formidable "^1.0.17" 2185 | methods "^1.1.1" 2186 | mime "^1.3.4" 2187 | qs "^6.1.0" 2188 | readable-stream "^2.0.5" 2189 | 2190 | supports-color@^2.0.0: 2191 | version "2.0.0" 2192 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2193 | 2194 | supports-color@^3.1.0, supports-color@3.1.2: 2195 | version "3.1.2" 2196 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 2197 | dependencies: 2198 | has-flag "^1.0.0" 2199 | 2200 | tar-pack@~3.3.0: 2201 | version "3.3.0" 2202 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 2203 | dependencies: 2204 | debug "~2.2.0" 2205 | fstream "~1.0.10" 2206 | fstream-ignore "~1.0.5" 2207 | once "~1.3.3" 2208 | readable-stream "~2.1.4" 2209 | rimraf "~2.5.1" 2210 | tar "~2.2.1" 2211 | uid-number "~0.0.6" 2212 | 2213 | tar@~2.2.1: 2214 | version "2.2.1" 2215 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2216 | dependencies: 2217 | block-stream "*" 2218 | fstream "^1.0.2" 2219 | inherits "2" 2220 | 2221 | through@~2.3, through@~2.3.1, through@2: 2222 | version "2.3.8" 2223 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2224 | 2225 | timed-out@^2.0.0: 2226 | version "2.0.0" 2227 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" 2228 | 2229 | topo@1.x.x: 2230 | version "1.1.0" 2231 | resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" 2232 | dependencies: 2233 | hoek "2.x.x" 2234 | 2235 | topo@2.x.x: 2236 | version "2.0.2" 2237 | resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" 2238 | dependencies: 2239 | hoek "4.x.x" 2240 | 2241 | touch@1.0.0: 2242 | version "1.0.0" 2243 | resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" 2244 | dependencies: 2245 | nopt "~1.0.10" 2246 | 2247 | tough-cookie@~2.3.0: 2248 | version "2.3.2" 2249 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 2250 | dependencies: 2251 | punycode "^1.4.1" 2252 | 2253 | tunnel-agent@~0.4.1: 2254 | version "0.4.3" 2255 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 2256 | 2257 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2258 | version "0.14.3" 2259 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 2260 | 2261 | type-check@~0.3.2: 2262 | version "0.3.2" 2263 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2264 | dependencies: 2265 | prelude-ls "~1.1.2" 2266 | 2267 | type-detect@^1.0.0: 2268 | version "1.0.0" 2269 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 2270 | 2271 | type-detect@0.1.1: 2272 | version "0.1.1" 2273 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 2274 | 2275 | type-is@~1.6.13: 2276 | version "1.6.14" 2277 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" 2278 | dependencies: 2279 | media-typer "0.3.0" 2280 | mime-types "~2.1.13" 2281 | 2282 | uglify-js@^2.6: 2283 | version "2.7.4" 2284 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" 2285 | dependencies: 2286 | async "~0.2.6" 2287 | source-map "~0.5.1" 2288 | uglify-to-browserify "~1.0.0" 2289 | yargs "~3.10.0" 2290 | 2291 | uglify-to-browserify@~1.0.0: 2292 | version "1.0.2" 2293 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 2294 | 2295 | uid-number@~0.0.6: 2296 | version "0.0.6" 2297 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2298 | 2299 | undefsafe@0.0.3: 2300 | version "0.0.3" 2301 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" 2302 | 2303 | unpipe@~1.0.0, unpipe@1.0.0: 2304 | version "1.0.0" 2305 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2306 | 2307 | update-notifier@0.5.0: 2308 | version "0.5.0" 2309 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" 2310 | dependencies: 2311 | chalk "^1.0.0" 2312 | configstore "^1.0.0" 2313 | is-npm "^1.0.0" 2314 | latest-version "^1.0.0" 2315 | repeating "^1.1.2" 2316 | semver-diff "^2.0.0" 2317 | string-length "^1.0.0" 2318 | 2319 | util-deprecate@~1.0.1: 2320 | version "1.0.2" 2321 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2322 | 2323 | "util@>=0.10.3 <1": 2324 | version "0.10.3" 2325 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 2326 | dependencies: 2327 | inherits "2.0.1" 2328 | 2329 | utils-merge@1.0.0: 2330 | version "1.0.0" 2331 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 2332 | 2333 | uuid@^2.0.1: 2334 | version "2.0.3" 2335 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 2336 | 2337 | uuid@^3.0.0: 2338 | version "3.0.0" 2339 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" 2340 | 2341 | vary@^1, vary@~1.1.0: 2342 | version "1.1.0" 2343 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" 2344 | 2345 | verror@1.3.6: 2346 | version "1.3.6" 2347 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 2348 | dependencies: 2349 | extsprintf "1.0.2" 2350 | 2351 | which@^1.1.1: 2352 | version "1.2.12" 2353 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 2354 | dependencies: 2355 | isexe "^1.1.1" 2356 | 2357 | wide-align@^1.1.0: 2358 | version "1.1.0" 2359 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 2360 | dependencies: 2361 | string-width "^1.0.1" 2362 | 2363 | window-size@0.1.0: 2364 | version "0.1.0" 2365 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 2366 | 2367 | winston@^2.3.0: 2368 | version "2.3.0" 2369 | resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.0.tgz#207faaab6fccf3fe493743dd2b03dbafc7ceb78c" 2370 | dependencies: 2371 | async "~1.0.0" 2372 | colors "1.0.x" 2373 | cycle "1.0.x" 2374 | eyes "0.1.x" 2375 | isstream "0.1.x" 2376 | stack-trace "0.0.x" 2377 | 2378 | wordwrap@^1.0.0, wordwrap@~1.0.0: 2379 | version "1.0.0" 2380 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2381 | 2382 | wordwrap@~0.0.2: 2383 | version "0.0.3" 2384 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2385 | 2386 | wordwrap@0.0.2: 2387 | version "0.0.2" 2388 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 2389 | 2390 | wrappy@1: 2391 | version "1.0.2" 2392 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2393 | 2394 | write-file-atomic@^1.1.2: 2395 | version "1.2.0" 2396 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" 2397 | dependencies: 2398 | graceful-fs "^4.1.2" 2399 | imurmurhash "^0.1.4" 2400 | slide "^1.1.5" 2401 | 2402 | x-xss-protection@1.0.0: 2403 | version "1.0.0" 2404 | resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.0.0.tgz#898afb93869b24661cf9c52f9ee8db8ed0764dd9" 2405 | 2406 | xdg-basedir@^2.0.0: 2407 | version "2.0.0" 2408 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" 2409 | dependencies: 2410 | os-homedir "^1.0.0" 2411 | 2412 | xtend@^4.0.0, xtend@^4.0.1: 2413 | version "4.0.1" 2414 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2415 | 2416 | yargs@~3.10.0: 2417 | version "3.10.0" 2418 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 2419 | dependencies: 2420 | camelcase "^1.0.2" 2421 | cliui "^2.1.0" 2422 | decamelize "^1.0.0" 2423 | window-size "0.1.0" 2424 | 2425 | --------------------------------------------------------------------------------