├── .ctags ├── .dockerignore ├── .gitignore ├── .jshintrc ├── .jshintrc-spec ├── Dockerfile ├── Readme.md ├── api ├── helpers │ └── index.ts ├── ping │ ├── index.ts │ └── ping.controller.ts └── view │ ├── index.ts │ ├── view.controller.ts │ ├── view.model.ts │ └── view.spec.ts ├── app.ts ├── codeship-services.yml ├── codeship-steps.yml ├── config ├── environment │ ├── development.ts │ ├── index.ts │ ├── production.ts │ └── test.ts └── express.ts ├── docker-compose.yml ├── package.json ├── routes.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.ctags: -------------------------------------------------------------------------------- 1 | --recurse=yes 2 | --tag-relative=yes 3 | --exclude=.git 4 | --exclude=dist 5 | --exclude=node_modules 6 | 7 | --langdef=typescript 8 | --langmap=typescript:.ts 9 | --regex-typescript=/^[ \t]*(export)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\2/c,classes/ 10 | --regex-typescript=/^[ \t]*(export)?[ \t]*module[ \t]+([a-zA-Z0-9_]+)/\2/n,modules/ 11 | --regex-typescript=/^[ \t]*(export)?[ \t]*function[ \t]+([a-zA-Z0-9_]+)/\2/f,functions/ 12 | --regex-typescript=/^[ \t]*export[ \t]+var[ \t]+([a-zA-Z0-9_]+)/\1/v,variables/ 13 | --regex-typescript=/^[ \t]*var[ \t]+([a-zA-Z0-9_]+)[ \t]*=[ \t]*function[ \t]*\(\)/\1/v,varlambdas/ 14 | --regex-typescript=/^[ \t]*(export)?[ \t]*(public|protected|private)[ \t]+(static)?[ \t]*([a-zA-Z0-9_]+)/\4/m,members/ 15 | --regex-typescript=/^[ \t]*(export)?[ \t]*interface[ \t]+([a-zA-Z0-9_]+)/\2/i,interfaces/ 16 | --regex-typescript=/^[ \t]*(export)?[ \t]*enum[ \t]+([a-zA-Z0-9_]+)/\2/e,enums/ 17 | --regex-typescript=/^[ \t]*import[ \t]+([a-zA-Z0-9_]+)/\1/I,imports/ 18 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | api 2 | config 3 | dist 4 | node_modules 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | typings/ 3 | dist/ 4 | yarn-error.log 5 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | // JSHint Default Configuration File (as on JSHint website) 3 | // See http://jshint.com/docs/ for more details 4 | 5 | "maxerr" : 50, // {int} Maximum error before stopping 6 | 7 | // Enforcing 8 | "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) 9 | "camelcase" : false, // true: Identifiers must be in camelCase 10 | "curly" : true, // true: Require {} for every new block or scope 11 | "eqeqeq" : true, // true: Require triple equals (===) for comparison 12 | "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() 13 | "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. 14 | "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` 15 | "indent" : 2, // {int} Number of spaces to use for indentation 16 | "latedef" : false, // true: Require variables/functions to be defined before being used 17 | "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` 18 | "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` 19 | "noempty" : true, // true: Prohibit use of empty blocks 20 | "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. 21 | "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) 22 | "plusplus" : false, // true: Prohibit use of `++` & `--` 23 | "quotmark" : "single", // Quotation mark consistency: 24 | // false : do nothing (default) 25 | // true : ensure whatever is used is consistent 26 | // "single" : require single quotes 27 | // "double" : require double quotes 28 | "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) 29 | "unused" : false, // Unused variables: 30 | // true : all variables, last function parameter 31 | // "vars" : all variables only 32 | // "strict" : all variables, all function parameters 33 | "strict" : true, // true: Requires all functions run in ES5 Strict Mode 34 | "maxparams" : false, // {int} Max number of formal params allowed per function 35 | "maxdepth" : 3, // {int} Max depth of nested blocks (within functions) 36 | "maxstatements" : 30, // {int} Max number statements per function 37 | "maxcomplexity" : false, // {int} Max cyclomatic complexity per function 38 | "maxlen" : 150, // {int} Max number of characters per line 39 | 40 | // Relaxing 41 | "asi" : true, // true: Tolerate Automatic Semicolon Insertion (no semicolons) 42 | "boss" : false, // true: Tolerate assignments where comparisons would be expected 43 | "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. 44 | "eqnull" : false, // true: Tolerate use of `== null` 45 | "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) 46 | "esnext" : true, // true: Allow ES.next (ES6) syntax (ex: `const`) 47 | "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) 48 | // (ex: `for each`, multiple try/catch, function expression…) 49 | "evil" : false, // true: Tolerate use of `eval` and `new Function()` 50 | "expr" : false, // true: Tolerate `ExpressionStatement` as Programs 51 | "funcscope" : true, // true: Tolerate defining variables inside control statements 52 | "iterator" : false, // true: Tolerate using the `__iterator__` property 53 | "lastsemic" : true, // true: Tolerate omitting a semicolon for the last statement of a 1-line block 54 | "laxbreak" : false, // true: Tolerate possibly unsafe line breakings 55 | "laxcomma" : false, // true: Tolerate comma-first style coding 56 | "loopfunc" : false, // true: Tolerate functions being defined in loops 57 | "multistr" : false, // true: Tolerate multi-line strings 58 | "noyield" : false, // true: Tolerate generator functions with no yield statement in them. 59 | "notypeof" : false, // true: Tolerate invalid typeof operator values 60 | "proto" : false, // true: Tolerate using the `__proto__` property 61 | "scripturl" : false, // true: Tolerate script-targeted URLs 62 | "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` 63 | "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation 64 | "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` 65 | "validthis" : false, // true: Tolerate using this in a non-constructor function 66 | 67 | // Environments 68 | "browser" : true, // Web Browser (window, document, etc) 69 | "browserify" : false, // Browserify (node.js code in the browser) 70 | "couch" : false, // CouchDB 71 | "devel" : true, // Development/debugging (alert, confirm, etc) 72 | "dojo" : false, // Dojo Toolkit 73 | "jasmine" : false, // Jasmine 74 | "jquery" : false, // jQuery 75 | "mocha" : true, // Mocha 76 | "mootools" : false, // MooTools 77 | "node" : true, // Node.js 78 | "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) 79 | "phantom" : false, // PhantomJS 80 | "prototypejs" : false, // Prototype and Scriptaculous 81 | "qunit" : false, // QUnit 82 | "rhino" : false, // Rhino 83 | "shelljs" : false, // ShellJS 84 | "typed" : false, // Globals for typed array constructions 85 | "worker" : false, // Web Workers 86 | "wsh" : false, // Windows Scripting Host 87 | "yui" : false, // Yahoo User Interface 88 | 89 | // Custom Globals 90 | "globals" : { 91 | "exports": true, 92 | "module": true, 93 | "require": true 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /.jshintrc-spec: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ".jshintrc", 3 | "globals": { 4 | "describe": true, 5 | "it": true, 6 | "before": true, 7 | "beforeEach": true, 8 | "after": true, 9 | "afterEach": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mhart/alpine-node:8 2 | MAINTAINER Aurélien Hervé 3 | 4 | RUN mkdir /app 5 | WORKDIR /app 6 | 7 | RUN npm install -g yarn 8 | RUN yarn global add nodemon typescript@3.4.5 tslint mocha 9 | 10 | ADD ./package.json . 11 | ADD ./yarn.lock . 12 | RUN yarn 13 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Typescript + Docker + Express + Mongoose = Awesome 2 | 3 | [![Codeship Status for aherve/typescript-express-docker](https://app.codeship.com/projects/36222600-51a6-0137-c2cc-6af49133ab39/status?branch=master)](https://app.codeship.com/projects/340133) 4 | 5 | ## About this 6 | This project is a fully working bootstrap for developping an express-mongoose api with typescript. 7 | 8 | ## Why is it awesome ? 9 | 10 | - the ONLY install you need is docker. Don't worry about installing mongo, npm or whatever else. Docker-compose takes all the leverage for you (see [Installation](#installation)). 11 | - Typescript is awesome, and it's not only for frontend users. your code is checked against a LOT of possible mistakes. Try inserting some typos such as `ssend(...)` instead of `send()` and [see the console warn you about it](#typos). 12 | - [Possible usage of `await/async`](#await) and/or Promise-style code => no Callback Hell 13 | - Linters are already installed. Keep your code clean. 14 | - Automated mocha unit testing. Mocha tests are written in ts, but run on the transpiled javascript code. So the actual transpiled application is properly tested. 15 | - Automated testing by codeship on code commit. They run the same container as you do : if it works at home, it works on CI-servers. 16 | 17 | ## Installation 18 | 19 | - clone the repo 20 | - run `docker-compose up` 21 | - browse `http://localhost:9000/api/ping`, `http://localhost:9000/api/ping/fail`, `http://localhost:9000/api/views/visit` 22 | - profit 23 | 24 | ## Useful knowledge 25 | 26 | ### Rebuilding the images 27 | After adding new npm or typings package, you will have to rebuild your images as follows: 28 | 29 | - `docker-compose kill` 30 | - `docker-compose rm` 31 | - `docker-compose build` 32 | - `docker-compose up` 33 | 34 | ### Add new npm package: 35 | - `docker-compose run api yarn add `, then rebuild the images 36 | 37 | ### Can I deploy ? 38 | I'v not yet automated the deployment. For now you can do whatever you want with the `/dist` folder, that contains the transplied `js` code. 39 | 40 | ## Typos 41 | Typescript validations are awesome: 42 | 43 | ![typo](https://cloud.githubusercontent.com/assets/2798256/18518627/0efce218-7aa1-11e6-89a2-74455eede178.png) 44 | 45 | ![selection_063](https://cloud.githubusercontent.com/assets/2798256/18518718/6d7694ec-7aa1-11e6-83d2-0938e25f5f45.png) 46 | 47 | ## Await 48 | 49 | Typescript [support async/await](https://blogs.msdn.microsoft.com/typescript/2015/11/03/what-about-asyncawait/) and this build let you take advantage of it. See `/api/views` for two implementations of a simple mongoose request. 50 | 51 | The code now looks like as it where synchronous, but does not block the thread: 52 | 53 | ## Continuous Testing 54 | 55 | The config provided in `codeship-services.yml` and `codeship-steps.yml` will trigger a build at each code commit, provided you have connected account. 56 | -------------------------------------------------------------------------------- /api/helpers/index.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, RequestHandler } from 'express' 2 | 3 | export enum ErrorName { 4 | 'BadRequestError' = 'BadRequestError', 5 | 'Forbidden' = 'Forbidden', 6 | 'LimitRateExceeded' = 'LimitRateExceeded', 7 | 'MongoError' = 'MongoError', 8 | 'NotFound' = 'NotFound', 9 | 'Unauthorized' = 'Unauthorized', 10 | 'Unknown' = 'Unknown', 11 | 'ValidationError' = 'ValidationError', 12 | } 13 | 14 | // Define a standard format for throwing exceptions 15 | export interface ApiError { 16 | name: ErrorName 17 | message?: string 18 | code?: number 19 | } 20 | 21 | interface ApiMethodResponse { 22 | statusCode?: number 23 | data: T 24 | } 25 | 26 | type ApiMethodDefinition = (req: Request) => Promise> 27 | 28 | /* 29 | * Useful decorator. Helps to type the output of any api endpoint, and 30 | * always handle any exception if any 31 | */ 32 | export function apiMethod(f: ApiMethodDefinition): RequestHandler { 33 | return async function (req: Request, res: Response) { 34 | try { 35 | const { statusCode, data } = await f(req) 36 | if (data) { 37 | res.status(statusCode || 200).send(data) 38 | } else { 39 | res.sendStatus(statusCode || 200) 40 | } 41 | } catch (e) { 42 | handleError(res, e) 43 | } 44 | } 45 | } 46 | 47 | export function getIp(req: Request): string { 48 | return (req.headers['x-forwarded-for'] || req.connection.remoteAddress) as string 49 | } 50 | 51 | function handleError(res: Response, error: any): void { 52 | if (isApiError) { 53 | handleApiError(res, error) 54 | } else { 55 | res.status(500).send({ error }) 56 | } 57 | } 58 | 59 | /* 60 | * Provide a nice error code for proper ApiErrors 61 | */ 62 | function handleApiError(res: Response, error: ApiError): void { 63 | 64 | // error code can be overriden if necessary 65 | if (error.code) { 66 | res.status(error.code).send({ error }) 67 | return 68 | } 69 | 70 | switch (error.name) { 71 | case ErrorName.ValidationError: 72 | case ErrorName.BadRequestError: 73 | res.status(400).send({ error }) 74 | break 75 | case ErrorName.Unauthorized: 76 | res.status(401).send({ error }) 77 | break 78 | case ErrorName.Forbidden: 79 | res.status(403).send({ error }) 80 | break 81 | case ErrorName.NotFound: 82 | res.status(404).send({ error }) 83 | break 84 | case ErrorName.LimitRateExceeded: 85 | res.status(509).send({ error }) 86 | break 87 | case ErrorName.MongoError: 88 | res.status(400).send({ error }) 89 | break 90 | case ErrorName.Unknown: 91 | res.status(500).send({ error }) 92 | break 93 | default: 94 | assertUnreachable(error.name) 95 | } 96 | } 97 | 98 | function isApiError(err: any): err is ApiError { 99 | return typeof err === 'object' && 100 | 'name' in err && 101 | Object.keys(ErrorName).includes(err.name) && 102 | (['undefined', 'number'].includes(typeof err.code)) 103 | } 104 | 105 | function assertUnreachable(_: never): never { 106 | throw new Error('Did not expect to reach this code') 107 | } 108 | -------------------------------------------------------------------------------- /api/ping/index.ts: -------------------------------------------------------------------------------- 1 | import * as controller from './ping.controller' 2 | import { Router } from 'express' 3 | 4 | const router = Router() 5 | 6 | router.get('/', controller.ping) 7 | router.get('/fail', controller.fail) 8 | 9 | export default router 10 | -------------------------------------------------------------------------------- /api/ping/ping.controller.ts: -------------------------------------------------------------------------------- 1 | import { apiMethod, ApiError, ErrorName } from '../helpers'; 2 | 3 | export const ping = apiMethod<{ ping: string }>(async () => { 4 | return { 5 | data: { ping: 'pong' }, 6 | status: 200, 7 | } 8 | }) 9 | 10 | export const fail = apiMethod<{ message: string }>(async () => { 11 | 12 | /* 13 | * Safely throw exceptions and see them caught without breaking anything 14 | * Here for instance, we are calling a fail dice, that will randomly fail 15 | * failDice is here async for the sake of th example, but it does not have to 16 | */ 17 | await failDice() 18 | 19 | return { 20 | data: { 21 | message: 'Everything went fine !' 22 | } 23 | } 24 | }) 25 | 26 | async function failDice() { 27 | if (Math.random() > 0.5) { 28 | throw { 29 | name: ErrorName.BadRequestError, 30 | message: 'Give me one more chance !', 31 | } 32 | } 33 | return 34 | } 35 | -------------------------------------------------------------------------------- /api/view/index.ts: -------------------------------------------------------------------------------- 1 | import * as controller from './view.controller' 2 | import { Router } from 'express' 3 | 4 | const router = Router() 5 | 6 | router.get('/visit', controller.visit) 7 | 8 | export default router 9 | -------------------------------------------------------------------------------- /api/view/view.controller.ts: -------------------------------------------------------------------------------- 1 | import { View, IView } from './view.model' 2 | import { apiMethod, getIp } from '../helpers'; 3 | 4 | export const visit = apiMethod<{ count: number; lastVisit: Partial }>(async req => { 5 | const lastVisit = await View.create({ 6 | visitedAt: new Date(), 7 | visitedBy: getIp(req), 8 | }) 9 | 10 | const count = await View.countDocuments({}) 11 | return {data: { 12 | count, 13 | lastVisit: { 14 | visitedBy: lastVisit.visitedBy, 15 | visitedAt: lastVisit.visitedAt, 16 | } 17 | }} 18 | }) 19 | -------------------------------------------------------------------------------- /api/view/view.model.ts: -------------------------------------------------------------------------------- 1 | import * as mongoose from 'mongoose' 2 | 3 | export interface IView extends mongoose.Document { 4 | visitedAt: Date 5 | visitedBy: string 6 | } 7 | 8 | const ViewSchema = new mongoose.Schema({ 9 | visitedAt: Date, 10 | visitedBy: String, 11 | }) 12 | 13 | export const View = mongoose.model('View', ViewSchema) 14 | -------------------------------------------------------------------------------- /api/view/view.spec.ts: -------------------------------------------------------------------------------- 1 | import * as supertest from 'supertest-as-promised' 2 | import app from '../../app' 3 | import { View } from './view.model' 4 | import { expect } from 'chai' 5 | 6 | const request = supertest(app) 7 | 8 | describe('GET /api/views/visit', () => { 9 | 10 | before(async () => { 11 | await View.deleteMany({}) 12 | }) 13 | 14 | it('returns a new view', async () => { 15 | const t = await request.get('/api/views/visit') 16 | expect(t.status).to.equal(200) 17 | expect(t.body).to.have.property('lastVisit') 18 | expect(t.body).to.have.property('count', 1) 19 | }) 20 | 21 | it('creates a view', async () => { 22 | expect(await View.countDocuments({})).to.equal(1) 23 | }) 24 | 25 | }) 26 | -------------------------------------------------------------------------------- /app.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Main application file 3 | */ 4 | import * as express from 'express' 5 | import * as http from 'http' 6 | import * as mongoose from 'mongoose' 7 | 8 | import config from './config/environment' 9 | import expressConfig from './config/express' 10 | import routesConfig from './routes' 11 | 12 | // Set default node environment to development 13 | process.env.NODE_ENV = process.env.NODE_ENV || 'development'; 14 | 15 | // Connect to database 16 | mongoose.connect(config.mongo.uri, config.mongo.options); 17 | 18 | // Setup server 19 | const app: express.Application = express(); 20 | const server = http.createServer(app) 21 | 22 | expressConfig(app) 23 | routesConfig(app) 24 | 25 | // Start server 26 | server.listen(config.port, config.ip, () => { 27 | console.log('Express server listening on %d, in %s mode', config.port, app.get('env')); 28 | }) 29 | 30 | // Expose app 31 | export default app 32 | -------------------------------------------------------------------------------- /codeship-services.yml: -------------------------------------------------------------------------------- 1 | transpiler: 2 | build: . 3 | volumes: 4 | - ".:/app" 5 | - "/app/node_modules" 6 | 7 | linter: 8 | build: . 9 | volumes: 10 | - ".:/app" 11 | - "/app/node_modules" 12 | 13 | mocha: 14 | build: . 15 | volumes: 16 | - ".:/app" 17 | - "/app/node_modules" 18 | links: 19 | - 'mongo:mongo' 20 | environment: 21 | NODE_ENV: 'test' 22 | 23 | mongo: 24 | image: mvertes/alpine-mongo:3.2.1 25 | ports: 26 | - "27017" 27 | command: "mongod" 28 | -------------------------------------------------------------------------------- /codeship-steps.yml: -------------------------------------------------------------------------------- 1 | - type: 'parallel' 2 | steps: 3 | - type: 'serial' 4 | steps: 5 | - type: serial 6 | name: 'Transpile' 7 | service: 'transpiler' 8 | steps: 9 | - command: "tsc" 10 | - type: 'serial' 11 | name: 'mocha' 12 | service: 'mocha' 13 | steps: 14 | - command: "mocha --recursive --bail --colors --exit ./dist" 15 | - type: 'serial' 16 | name: 'Lint' 17 | service: 'linter' 18 | steps: 19 | - command: sh -c "find . -path ./ -prune -o -path ./node_modules -prune -o -path ./dist -prune -o -name '*.ts' -print | xargs tslint" 20 | -------------------------------------------------------------------------------- /config/environment/development.ts: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | // Development specific configuration 4 | // ================================== 5 | export default { 6 | allowedOrigins: [ 7 | 'http://localhost:9000', 8 | ], 9 | mongo: { 10 | uri: 'mongodb://mongo/typeExpress-dev' 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /config/environment/index.ts: -------------------------------------------------------------------------------- 1 | import * as _ from 'lodash' 2 | import * as mongoose from 'mongoose' 3 | 4 | import developmentConfig from './development' 5 | import productionConfig from './production' 6 | import testConfig from './test' 7 | 8 | export interface IConfig { 9 | allowedOrigins?: string[], 10 | appName?: string 11 | env?: string 12 | ip?: string 13 | mongo?: { 14 | options?: mongoose.ConnectionOptions 15 | uri?: string 16 | } 17 | port?: number 18 | secrets?: { 19 | session?: string 20 | } 21 | } 22 | 23 | // All configurations will extend these options 24 | // ============================================ 25 | const commonConfig = { 26 | appName: process.env.APP_NAME || `hunteed-${process.env.NODE_ENV}`, 27 | env: process.env.NODE_ENV, 28 | 29 | mongo: { 30 | options: { 31 | poolSize: 20, 32 | useCreateIndex: true, 33 | useNewUrlParser: true, 34 | }, 35 | }, 36 | 37 | // Server port 38 | port: Number(process.env.PORT) || 9000, 39 | 40 | // Secret for session, you will want to change this and make it an environment variable 41 | secrets: { 42 | session: process.env.SECRET_SESSION || 'superSecr3t' 43 | }, 44 | 45 | } 46 | 47 | // Export the config object based on the NODE_ENV 48 | // ============================================== 49 | const config: IConfig = commonConfig 50 | 51 | if (commonConfig.env === 'development') { 52 | _.merge(config, developmentConfig) 53 | } else if (commonConfig.env === 'test') { 54 | _.merge(config, testConfig) 55 | } else if (commonConfig.env === 'production') { 56 | _.merge(config, productionConfig) 57 | } else { 58 | throw new Error('Please set an environment') 59 | } 60 | 61 | export default config 62 | -------------------------------------------------------------------------------- /config/environment/production.ts: -------------------------------------------------------------------------------- 1 | // Production specific configuration 2 | // ================================= 3 | export default { 4 | allowedOrigins: [ 5 | 'https://your-site.com', 6 | ], 7 | 8 | // Server IP 9 | ip: process.env.OPENSHIFT_NODEJS_IP || process.env.IP || undefined, 10 | 11 | // Server port 12 | port: process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 8080, 13 | 14 | }; 15 | -------------------------------------------------------------------------------- /config/environment/test.ts: -------------------------------------------------------------------------------- 1 | // Test specific configuration 2 | // =========================== 3 | export default { 4 | allowedOrigins: [ 5 | '*' 6 | ], 7 | mongo: { 8 | uri: 'mongodb://mongo/typeExpress-test' 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /config/express.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express' 2 | /** 3 | * Express configuration 4 | */ 5 | 6 | import * as bodyParser from 'body-parser' 7 | import * as compression from 'compression' 8 | import * as methodOverride from 'method-override' 9 | 10 | export default (app: express.Application): void => { 11 | 12 | app.use(compression()); 13 | app.use(bodyParser.urlencoded({ extended: false })); 14 | app.use(bodyParser.json()); 15 | app.use(methodOverride()); 16 | 17 | }; 18 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | api: 2 | build: . 3 | links: 4 | - 'mongo:mongo' 5 | environment: 6 | NODE_ENV: 'development' 7 | volumes: 8 | - .:/app 9 | - /app/node_modules 10 | ports: 11 | - "0.0.0.0:9000:9000" 12 | command: sh -c "mkdir -p dist && touch ./dist/app.js && nodemon --delay 500ms --watch dist ./dist/app.js" 13 | 14 | transpiler: 15 | build: . 16 | volumes: 17 | - .:/app 18 | - /app/node_modules 19 | command: ["tsc", "-w"] 20 | 21 | linter: 22 | build: . 23 | volumes: 24 | - .:/app 25 | - /app/node_modules 26 | command: nodemon --delay 500ms --exec "find . -path ./ -prune -o -path ./node_modules -prune -o -path ./dist -prune -o -name '*.ts' -print | xargs tslint" 27 | 28 | mongo: 29 | image: mongo:3.6.6 30 | ports: 31 | - "27017" 32 | command: ["mongod"] 33 | 34 | mocha: 35 | build: . 36 | volumes: 37 | - .:/app 38 | - /app/node_modules 39 | links: 40 | - 'mongo:mongo' 41 | command: nodemon --delay 500ms --exec 'mocha --recursive --bail --colors' ./dist 42 | environment: 43 | NODE_ENV: 'test' 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "type-express", 3 | "version": "1.0.0", 4 | "description": "Dockerized node-express app written in typescript", 5 | "main": "app.js", 6 | "dependencies": { 7 | "body-parser": "^1.18.3", 8 | "compression": "^1.7", 9 | "express": "^4.16", 10 | "lodash": "^4.15.0", 11 | "method-override": "^2.3.6", 12 | "mongoose": "^5.2.5" 13 | }, 14 | "devDependencies": { 15 | "@types/body-parser": "^1.16.8", 16 | "@types/chai": "^4.1.0", 17 | "@types/compression": "^0.0.35", 18 | "@types/express": "^4.11.0", 19 | "@types/lodash": "^4.14.92", 20 | "@types/method-override": "^0.0.31", 21 | "@types/mocha": "^2.2.46", 22 | "@types/mongoose": "^5.2.2", 23 | "@types/supertest": "^2.0.4", 24 | "@types/supertest-as-promised": "^2.0.35", 25 | "chai": "^3.5.0", 26 | "supertest": "^3.0.0", 27 | "supertest-as-promised": "^4.0.2", 28 | "tslint": "^5.16.0", 29 | "tslint-microsoft-contrib": "^6.1.1", 30 | "typescript": "^3.4.5" 31 | }, 32 | "scripts": { 33 | "test": "echo \"Error: no test specified\" && exit 1" 34 | }, 35 | "keywords": [ 36 | "typescript", 37 | "node", 38 | "express", 39 | "docker" 40 | ], 41 | "author": "Aurélien Hervé", 42 | "license": "ISC" 43 | } 44 | -------------------------------------------------------------------------------- /routes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Main application routes 3 | */ 4 | 5 | import ping from './api/ping' 6 | import view from './api/view' 7 | import * as express from 'express' 8 | 9 | const routes = (app: express.Application): void => { 10 | // Insert routes below 11 | app.use('/api/ping', ping); 12 | app.use('/api/views', view); 13 | 14 | // All other routes should 404 15 | app.route('/*') 16 | .get((req: express.Request, res: express.Response) => { 17 | res.sendStatus(404) 18 | }); 19 | }; 20 | 21 | export default routes 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "noImplicitAny": true, 5 | "outDir": "./dist/", 6 | "pretty": true, 7 | "removeComments": true, 8 | "sourceMap": true, 9 | "target": "es6" 10 | }, 11 | "exclude": [ 12 | "node_modules", 13 | "dist/node_modules" 14 | ], 15 | "typeRoots": [ 16 | "node_modules/@types" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest", 3 | "rulesDirectory": [ 4 | "node_modules/tslint-microsoft-contrib" 5 | ], 6 | "rules": { 7 | "mocha-avoid-only": true, 8 | "arrow-parens": false, 9 | "ban-types": [ 10 | true, 11 | [ 12 | "Object", 13 | "Avoid using the `Object` type. Did you mean `object`?" 14 | ], 15 | [ 16 | "Boolean", 17 | "Avoid using the `Boolean` type. Did you mean `boolean`?" 18 | ], 19 | [ 20 | "Number", 21 | "Avoid using the `Number` type. Did you mean `number`?" 22 | ], 23 | [ 24 | "String", 25 | "Avoid using the `String` type. Did you mean `string`?" 26 | ], 27 | [ 28 | "Symbol", 29 | "Avoid using the `Symbol` type. Did you mean `symbol`?" 30 | ] 31 | ], 32 | "class-name": true, 33 | "comment-format": false, 34 | "curly": false, 35 | "eofline": true, 36 | "indent": [ 37 | "spaces" 38 | ], 39 | "interface-name": false, 40 | "max-line-length": [ 41 | true, 42 | 140 43 | ], 44 | "no-object-literal-type-assertion": false, 45 | "no-angle-bracket-type-assertion": false, 46 | "no-console": false, 47 | "no-implicit-dependencies": [ 48 | true, 49 | "dev" 50 | ], 51 | "no-string-literal": false, 52 | "object-literal-key-quotes": [ 53 | true, 54 | "as-needed" 55 | ], 56 | "object-literal-sort-keys": false, 57 | "only-arrow-functions": false, 58 | "ordered-imports": false, 59 | "member-ordering": [ 60 | true, 61 | [ 62 | "public-before-private", 63 | "static-before-instance", 64 | "variables-before-functions" 65 | ] 66 | ], 67 | "no-arg": true, 68 | "no-construct": true, 69 | "no-duplicate-variable": true, 70 | "no-empty": true, 71 | "no-eval": true, 72 | "no-namespace": false, 73 | "no-submodule-imports": [ 74 | true, 75 | "rxjs" 76 | ], 77 | "no-trailing-whitespace": true, 78 | "no-unused-expression": false, 79 | "one-line": [ 80 | true, 81 | "check-open-brace", 82 | "check-catch", 83 | "check-else", 84 | "check-whitespace" 85 | ], 86 | "quotemark": [ 87 | true, 88 | "single" 89 | ], 90 | "space-before-function-paren": false, 91 | "semicolon": false, 92 | "trailing-comma": true, 93 | "triple-equals": true, 94 | "variable-name": false, 95 | "prefer-conditional-expression": false 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.0.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 15 | integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@types/bluebird@*": 22 | version "3.5.26" 23 | resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.26.tgz#a38c438ae84fa02431d6892edf86e46edcbca291" 24 | integrity sha512-aj2mrBLn5ky0GmAg6IPXrQjnN0iB/ulozuJ+oZdrHRAzRbXjGmu4UXsNCjFvPbSaaPZmniocdOzsM392qLOlmQ== 25 | 26 | "@types/body-parser@*", "@types/body-parser@^1.16.8": 27 | version "1.17.0" 28 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 29 | integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== 30 | dependencies: 31 | "@types/connect" "*" 32 | "@types/node" "*" 33 | 34 | "@types/bson@*": 35 | version "4.0.0" 36 | resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.0.tgz#9073772679d749116eb1dfca56f8eaac6d59cc7a" 37 | integrity sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q== 38 | dependencies: 39 | "@types/node" "*" 40 | 41 | "@types/chai@^4.1.0": 42 | version "4.1.7" 43 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" 44 | integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== 45 | 46 | "@types/compression@^0.0.35": 47 | version "0.0.35" 48 | resolved "https://registry.yarnpkg.com/@types/compression/-/compression-0.0.35.tgz#7673a9c4b075e5194ada8c5938291015652a21e1" 49 | integrity sha512-SrHPmzvC5AL6cCrq0fDCU2AX9sOK/Azik2mdkbLhGpxOlzS7rTALjtdk/WzvKY3pQqEz3byvz1nnX/AmMk6X0Q== 50 | dependencies: 51 | "@types/express" "*" 52 | 53 | "@types/connect@*": 54 | version "3.4.32" 55 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 56 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 57 | dependencies: 58 | "@types/node" "*" 59 | 60 | "@types/cookiejar@*": 61 | version "2.1.1" 62 | resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.1.tgz#90b68446364baf9efd8e8349bb36bd3852b75b80" 63 | integrity sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw== 64 | 65 | "@types/express-serve-static-core@*": 66 | version "4.16.4" 67 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.4.tgz#56bb8be4559401d68af4a3624ae9dd3166103e60" 68 | integrity sha512-x/8h6FHm14rPWnW2HP5likD/rsqJ3t/77OWx2PLxym0hXbeBWQmcPyHmwX+CtCQpjIfgrUdEoDFcLPwPZWiqzQ== 69 | dependencies: 70 | "@types/node" "*" 71 | "@types/range-parser" "*" 72 | 73 | "@types/express@*", "@types/express@^4.11.0": 74 | version "4.16.1" 75 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" 76 | integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== 77 | dependencies: 78 | "@types/body-parser" "*" 79 | "@types/express-serve-static-core" "*" 80 | "@types/serve-static" "*" 81 | 82 | "@types/lodash@^4.14.92": 83 | version "4.14.123" 84 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d" 85 | integrity sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q== 86 | 87 | "@types/method-override@^0.0.31": 88 | version "0.0.31" 89 | resolved "https://registry.yarnpkg.com/@types/method-override/-/method-override-0.0.31.tgz#ec12b738c1b2a74a5d3d8af73c7d4952ad9c14d2" 90 | integrity sha512-aLA4MGzjYjBHGpr5TgAdPRyX97Jd+xlWN2wa6PbsjKYeoUKPsxVDFRSTjI3YG4MvGg3ZJkdMxjAXZfujU9qEPw== 91 | dependencies: 92 | "@types/express" "*" 93 | 94 | "@types/mime@*": 95 | version "2.0.1" 96 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 97 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 98 | 99 | "@types/mocha@^2.2.46": 100 | version "2.2.48" 101 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab" 102 | integrity sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw== 103 | 104 | "@types/mongodb@*": 105 | version "3.1.26" 106 | resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.1.26.tgz#6877554353fd9e9d03f28c62de09bad616ed7142" 107 | integrity sha512-i7+l95IbqnGLRW+AJ6F2nzqosLUgU022lDuoHhbQquMV7tgek0vNUg9RwC2Fn7ImBSQSFdCWeU394ciPEwSeaQ== 108 | dependencies: 109 | "@types/bson" "*" 110 | "@types/node" "*" 111 | 112 | "@types/mongoose@^5.2.2": 113 | version "5.3.27" 114 | resolved "https://registry.yarnpkg.com/@types/mongoose/-/mongoose-5.3.27.tgz#bfa893deab793118e59d7c3ea5deb5e2e84c0599" 115 | integrity sha512-1bQcQaYw4kN9mMuJC54FcfjyYe2gtxbUj9OAvrUA/5G2rSv0fuvu2jplizXqyADgBcXzPVEglDNzT3YrztWLoQ== 116 | dependencies: 117 | "@types/mongodb" "*" 118 | "@types/node" "*" 119 | 120 | "@types/node@*": 121 | version "12.0.0" 122 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.0.tgz#d11813b9c0ff8aaca29f04cbc12817f4c7d656e5" 123 | integrity sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg== 124 | 125 | "@types/range-parser@*": 126 | version "1.2.3" 127 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 128 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 129 | 130 | "@types/serve-static@*": 131 | version "1.13.2" 132 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 133 | integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== 134 | dependencies: 135 | "@types/express-serve-static-core" "*" 136 | "@types/mime" "*" 137 | 138 | "@types/superagent@*": 139 | version "4.1.1" 140 | resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.1.tgz#61f0b43d7db93a3c286c124512b7c228183c32fa" 141 | integrity sha512-NetXrraTWPcdGG6IwYJhJ5esUGx8AYNiozbc1ENWEsF6BsD4JmNODJczI6Rm1xFPVp6HZESds9YCfqz4zIsM6A== 142 | dependencies: 143 | "@types/cookiejar" "*" 144 | "@types/node" "*" 145 | 146 | "@types/supertest-as-promised@^2.0.35": 147 | version "2.0.37" 148 | resolved "https://registry.yarnpkg.com/@types/supertest-as-promised/-/supertest-as-promised-2.0.37.tgz#4c2d36c0665ebf5812eedce73c14aeac3ae009c3" 149 | integrity sha512-2sbGioTySNPJSGYJ/qtdK+hCRh6AaPwV5E7qyiAUBLSo/uj5nTg2Om3i2jUh00fopUDLLkQpV4WC9nqmlRn04Q== 150 | dependencies: 151 | "@types/bluebird" "*" 152 | "@types/superagent" "*" 153 | "@types/supertest" "*" 154 | 155 | "@types/supertest@*", "@types/supertest@^2.0.4": 156 | version "2.0.7" 157 | resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.7.tgz#46ff6508075cd4519736be060f0d6331a5c8ca7b" 158 | integrity sha512-GibTh4OTkal71btYe2fpZP/rVHIPnnUsYphEaoywVHo+mo2a/LhlOFkIm5wdN0H0DA0Hx8x+tKgCYMD9elHu5w== 159 | dependencies: 160 | "@types/superagent" "*" 161 | 162 | accepts@~1.3.5: 163 | version "1.3.7" 164 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 165 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 166 | dependencies: 167 | mime-types "~2.1.24" 168 | negotiator "0.6.2" 169 | 170 | ansi-styles@^3.2.1: 171 | version "3.2.1" 172 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 173 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 174 | dependencies: 175 | color-convert "^1.9.0" 176 | 177 | argparse@^1.0.7: 178 | version "1.0.10" 179 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 180 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 181 | dependencies: 182 | sprintf-js "~1.0.2" 183 | 184 | array-flatten@1.1.1: 185 | version "1.1.1" 186 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 187 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 188 | 189 | assertion-error@^1.0.1: 190 | version "1.1.0" 191 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 192 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 193 | 194 | async@2.6.1: 195 | version "2.6.1" 196 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" 197 | integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== 198 | dependencies: 199 | lodash "^4.17.10" 200 | 201 | asynckit@^0.4.0: 202 | version "0.4.0" 203 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 204 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 205 | 206 | balanced-match@^1.0.0: 207 | version "1.0.0" 208 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 209 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 210 | 211 | bluebird@3.5.1: 212 | version "3.5.1" 213 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 214 | integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== 215 | 216 | bluebird@^3.3.1: 217 | version "3.5.4" 218 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" 219 | integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== 220 | 221 | body-parser@1.18.3: 222 | version "1.18.3" 223 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 224 | integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= 225 | dependencies: 226 | bytes "3.0.0" 227 | content-type "~1.0.4" 228 | debug "2.6.9" 229 | depd "~1.1.2" 230 | http-errors "~1.6.3" 231 | iconv-lite "0.4.23" 232 | on-finished "~2.3.0" 233 | qs "6.5.2" 234 | raw-body "2.3.3" 235 | type-is "~1.6.16" 236 | 237 | body-parser@^1.18.3: 238 | version "1.19.0" 239 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 240 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 241 | dependencies: 242 | bytes "3.1.0" 243 | content-type "~1.0.4" 244 | debug "2.6.9" 245 | depd "~1.1.2" 246 | http-errors "1.7.2" 247 | iconv-lite "0.4.24" 248 | on-finished "~2.3.0" 249 | qs "6.7.0" 250 | raw-body "2.4.0" 251 | type-is "~1.6.17" 252 | 253 | brace-expansion@^1.1.7: 254 | version "1.1.11" 255 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 256 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 257 | dependencies: 258 | balanced-match "^1.0.0" 259 | concat-map "0.0.1" 260 | 261 | bson@^1.1.1, bson@~1.1.1: 262 | version "1.1.1" 263 | resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.1.tgz#4330f5e99104c4e751e7351859e2d408279f2f13" 264 | integrity sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg== 265 | 266 | builtin-modules@^1.1.1: 267 | version "1.1.1" 268 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 269 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 270 | 271 | bytes@3.0.0: 272 | version "3.0.0" 273 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 274 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 275 | 276 | bytes@3.1.0: 277 | version "3.1.0" 278 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 279 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 280 | 281 | chai@^3.5.0: 282 | version "3.5.0" 283 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 284 | integrity sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc= 285 | dependencies: 286 | assertion-error "^1.0.1" 287 | deep-eql "^0.1.3" 288 | type-detect "^1.0.0" 289 | 290 | chalk@^2.0.0, chalk@^2.3.0: 291 | version "2.4.2" 292 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 293 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 294 | dependencies: 295 | ansi-styles "^3.2.1" 296 | escape-string-regexp "^1.0.5" 297 | supports-color "^5.3.0" 298 | 299 | color-convert@^1.9.0: 300 | version "1.9.3" 301 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 302 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 303 | dependencies: 304 | color-name "1.1.3" 305 | 306 | color-name@1.1.3: 307 | version "1.1.3" 308 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 309 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 310 | 311 | combined-stream@^1.0.6: 312 | version "1.0.7" 313 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 314 | integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== 315 | dependencies: 316 | delayed-stream "~1.0.0" 317 | 318 | commander@^2.12.1: 319 | version "2.20.0" 320 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 321 | integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 322 | 323 | component-emitter@^1.2.0: 324 | version "1.3.0" 325 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 326 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 327 | 328 | compressible@~2.0.16: 329 | version "2.0.17" 330 | resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" 331 | integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== 332 | dependencies: 333 | mime-db ">= 1.40.0 < 2" 334 | 335 | compression@^1.7: 336 | version "1.7.4" 337 | resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" 338 | integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== 339 | dependencies: 340 | accepts "~1.3.5" 341 | bytes "3.0.0" 342 | compressible "~2.0.16" 343 | debug "2.6.9" 344 | on-headers "~1.0.2" 345 | safe-buffer "5.1.2" 346 | vary "~1.1.2" 347 | 348 | concat-map@0.0.1: 349 | version "0.0.1" 350 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 351 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 352 | 353 | content-disposition@0.5.2: 354 | version "0.5.2" 355 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 356 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 357 | 358 | content-type@~1.0.4: 359 | version "1.0.4" 360 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 361 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 362 | 363 | cookie-signature@1.0.6: 364 | version "1.0.6" 365 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 366 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 367 | 368 | cookie@0.3.1: 369 | version "0.3.1" 370 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 371 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 372 | 373 | cookiejar@^2.1.0: 374 | version "2.1.2" 375 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" 376 | integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== 377 | 378 | core-util-is@~1.0.0: 379 | version "1.0.2" 380 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 381 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 382 | 383 | debug@2.6.9: 384 | version "2.6.9" 385 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 386 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 387 | dependencies: 388 | ms "2.0.0" 389 | 390 | debug@3.1.0: 391 | version "3.1.0" 392 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 393 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 394 | dependencies: 395 | ms "2.0.0" 396 | 397 | debug@^3.1.0: 398 | version "3.2.6" 399 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 400 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 401 | dependencies: 402 | ms "^2.1.1" 403 | 404 | deep-eql@^0.1.3: 405 | version "0.1.3" 406 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 407 | integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= 408 | dependencies: 409 | type-detect "0.1.1" 410 | 411 | delayed-stream@~1.0.0: 412 | version "1.0.0" 413 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 414 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 415 | 416 | depd@~1.1.2: 417 | version "1.1.2" 418 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 419 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 420 | 421 | destroy@~1.0.4: 422 | version "1.0.4" 423 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 424 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 425 | 426 | diff@^3.2.0: 427 | version "3.5.0" 428 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 429 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 430 | 431 | ee-first@1.1.1: 432 | version "1.1.1" 433 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 434 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 435 | 436 | encodeurl@~1.0.2: 437 | version "1.0.2" 438 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 439 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 440 | 441 | escape-html@~1.0.3: 442 | version "1.0.3" 443 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 444 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 445 | 446 | escape-string-regexp@^1.0.5: 447 | version "1.0.5" 448 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 449 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 450 | 451 | esprima@^4.0.0: 452 | version "4.0.1" 453 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 454 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 455 | 456 | esutils@^2.0.2: 457 | version "2.0.2" 458 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 459 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 460 | 461 | etag@~1.8.1: 462 | version "1.8.1" 463 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 464 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 465 | 466 | express@^4.16: 467 | version "4.16.4" 468 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 469 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 470 | dependencies: 471 | accepts "~1.3.5" 472 | array-flatten "1.1.1" 473 | body-parser "1.18.3" 474 | content-disposition "0.5.2" 475 | content-type "~1.0.4" 476 | cookie "0.3.1" 477 | cookie-signature "1.0.6" 478 | debug "2.6.9" 479 | depd "~1.1.2" 480 | encodeurl "~1.0.2" 481 | escape-html "~1.0.3" 482 | etag "~1.8.1" 483 | finalhandler "1.1.1" 484 | fresh "0.5.2" 485 | merge-descriptors "1.0.1" 486 | methods "~1.1.2" 487 | on-finished "~2.3.0" 488 | parseurl "~1.3.2" 489 | path-to-regexp "0.1.7" 490 | proxy-addr "~2.0.4" 491 | qs "6.5.2" 492 | range-parser "~1.2.0" 493 | safe-buffer "5.1.2" 494 | send "0.16.2" 495 | serve-static "1.13.2" 496 | setprototypeof "1.1.0" 497 | statuses "~1.4.0" 498 | type-is "~1.6.16" 499 | utils-merge "1.0.1" 500 | vary "~1.1.2" 501 | 502 | extend@^3.0.0: 503 | version "3.0.2" 504 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 505 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 506 | 507 | finalhandler@1.1.1: 508 | version "1.1.1" 509 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 510 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 511 | dependencies: 512 | debug "2.6.9" 513 | encodeurl "~1.0.2" 514 | escape-html "~1.0.3" 515 | on-finished "~2.3.0" 516 | parseurl "~1.3.2" 517 | statuses "~1.4.0" 518 | unpipe "~1.0.0" 519 | 520 | form-data@^2.3.1: 521 | version "2.3.3" 522 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 523 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 524 | dependencies: 525 | asynckit "^0.4.0" 526 | combined-stream "^1.0.6" 527 | mime-types "^2.1.12" 528 | 529 | formidable@^1.2.0: 530 | version "1.2.1" 531 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" 532 | integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== 533 | 534 | forwarded@~0.1.2: 535 | version "0.1.2" 536 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 537 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 538 | 539 | fresh@0.5.2: 540 | version "0.5.2" 541 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 542 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 543 | 544 | fs.realpath@^1.0.0: 545 | version "1.0.0" 546 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 547 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 548 | 549 | glob@^7.1.1: 550 | version "7.1.3" 551 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 552 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 553 | dependencies: 554 | fs.realpath "^1.0.0" 555 | inflight "^1.0.4" 556 | inherits "2" 557 | minimatch "^3.0.4" 558 | once "^1.3.0" 559 | path-is-absolute "^1.0.0" 560 | 561 | has-flag@^3.0.0: 562 | version "3.0.0" 563 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 564 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 565 | 566 | http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 567 | version "1.6.3" 568 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 569 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 570 | dependencies: 571 | depd "~1.1.2" 572 | inherits "2.0.3" 573 | setprototypeof "1.1.0" 574 | statuses ">= 1.4.0 < 2" 575 | 576 | http-errors@1.7.2: 577 | version "1.7.2" 578 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 579 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 580 | dependencies: 581 | depd "~1.1.2" 582 | inherits "2.0.3" 583 | setprototypeof "1.1.1" 584 | statuses ">= 1.5.0 < 2" 585 | toidentifier "1.0.0" 586 | 587 | iconv-lite@0.4.23: 588 | version "0.4.23" 589 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 590 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 591 | dependencies: 592 | safer-buffer ">= 2.1.2 < 3" 593 | 594 | iconv-lite@0.4.24: 595 | version "0.4.24" 596 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 597 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 598 | dependencies: 599 | safer-buffer ">= 2.1.2 < 3" 600 | 601 | inflight@^1.0.4: 602 | version "1.0.6" 603 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 604 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 605 | dependencies: 606 | once "^1.3.0" 607 | wrappy "1" 608 | 609 | inherits@2, inherits@2.0.3, inherits@~2.0.3: 610 | version "2.0.3" 611 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 612 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 613 | 614 | ipaddr.js@1.9.0: 615 | version "1.9.0" 616 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" 617 | integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== 618 | 619 | isarray@~1.0.0: 620 | version "1.0.0" 621 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 622 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 623 | 624 | js-tokens@^4.0.0: 625 | version "4.0.0" 626 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 627 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 628 | 629 | js-yaml@^3.13.0: 630 | version "3.13.1" 631 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 632 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 633 | dependencies: 634 | argparse "^1.0.7" 635 | esprima "^4.0.0" 636 | 637 | kareem@2.3.0: 638 | version "2.3.0" 639 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.0.tgz#ef33c42e9024dce511eeaf440cd684f3af1fc769" 640 | integrity sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg== 641 | 642 | lodash@^4.15.0, lodash@^4.17.10: 643 | version "4.17.11" 644 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 645 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 646 | 647 | media-typer@0.3.0: 648 | version "0.3.0" 649 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 650 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 651 | 652 | memory-pager@^1.0.2: 653 | version "1.5.0" 654 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 655 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 656 | 657 | merge-descriptors@1.0.1: 658 | version "1.0.1" 659 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 660 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 661 | 662 | method-override@^2.3.6: 663 | version "2.3.10" 664 | resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.10.tgz#e3daf8d5dee10dd2dce7d4ae88d62bbee77476b4" 665 | integrity sha1-49r41d7hDdLc59SuiNYrvud0drQ= 666 | dependencies: 667 | debug "2.6.9" 668 | methods "~1.1.2" 669 | parseurl "~1.3.2" 670 | vary "~1.1.2" 671 | 672 | methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: 673 | version "1.1.2" 674 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 675 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 676 | 677 | mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": 678 | version "1.40.0" 679 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 680 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 681 | 682 | mime-types@^2.1.12, mime-types@~2.1.24: 683 | version "2.1.24" 684 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 685 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 686 | dependencies: 687 | mime-db "1.40.0" 688 | 689 | mime@1.4.1: 690 | version "1.4.1" 691 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 692 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 693 | 694 | mime@^1.4.1: 695 | version "1.6.0" 696 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 697 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 698 | 699 | minimatch@^3.0.4: 700 | version "3.0.4" 701 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 702 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 703 | dependencies: 704 | brace-expansion "^1.1.7" 705 | 706 | minimist@0.0.8: 707 | version "0.0.8" 708 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 709 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 710 | 711 | mkdirp@^0.5.1: 712 | version "0.5.1" 713 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 714 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 715 | dependencies: 716 | minimist "0.0.8" 717 | 718 | mongodb-core@3.2.3, mongodb-core@^3.2.3: 719 | version "3.2.3" 720 | resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.2.3.tgz#eb9bcb876f169f5843fd135f7f7686dbac0e9e34" 721 | integrity sha512-UyI0rmvPPkjOJV8XGWa9VCTq7R4hBVipimhnAXeSXnuAPjuTqbyfA5Ec9RcYJ1Hhu+ISnc8bJ1KfGZd4ZkYARQ== 722 | dependencies: 723 | bson "^1.1.1" 724 | require_optional "^1.0.1" 725 | safe-buffer "^5.1.2" 726 | optionalDependencies: 727 | saslprep "^1.0.0" 728 | 729 | mongodb@3.2.3: 730 | version "3.2.3" 731 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.2.3.tgz#4610ee33d300caa74329c2dd03e137210723cd91" 732 | integrity sha512-jw8UyPsq4QleZ9z+t/pIVy3L++51vKdaJ2Q/XXeYxk/3cnKioAH8H6f5tkkDivrQL4PUgUOHe9uZzkpRFH1XtQ== 733 | dependencies: 734 | mongodb-core "^3.2.3" 735 | safe-buffer "^5.1.2" 736 | 737 | mongoose-legacy-pluralize@1.0.2: 738 | version "1.0.2" 739 | resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" 740 | integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== 741 | 742 | mongoose@^5.2.5: 743 | version "5.5.5" 744 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.5.5.tgz#d04b97a1ad0740671deeeee09ded5149fa47fe56" 745 | integrity sha512-rov43FpXDMoE22q8/iUoeSdg6zBtyTE/ZIIKRpQomASl0JOyD0479Weu9w5g0GjmP8fHmNjsWneoLIbnyGcnDQ== 746 | dependencies: 747 | async "2.6.1" 748 | bson "~1.1.1" 749 | kareem "2.3.0" 750 | mongodb "3.2.3" 751 | mongodb-core "3.2.3" 752 | mongoose-legacy-pluralize "1.0.2" 753 | mpath "0.5.2" 754 | mquery "3.2.0" 755 | ms "2.1.1" 756 | regexp-clone "0.0.1" 757 | safe-buffer "5.1.2" 758 | sift "7.0.1" 759 | sliced "1.0.1" 760 | 761 | mpath@0.5.2: 762 | version "0.5.2" 763 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.5.2.tgz#b1eac586dffb5175d2f51ca9aacba35d9940dd41" 764 | integrity sha512-NOeCoW6AYc3hLi30npe7uzbD9b4FQZKH40YKABUCCvaKKL5agj6YzvHoNx8jQpDMNPgIa5bvSZQbQpWBAVD0Kw== 765 | 766 | mquery@3.2.0: 767 | version "3.2.0" 768 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.0.tgz#e276472abd5109686a15eb2a8e0761db813c81cc" 769 | integrity sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg== 770 | dependencies: 771 | bluebird "3.5.1" 772 | debug "3.1.0" 773 | regexp-clone "0.0.1" 774 | safe-buffer "5.1.2" 775 | sliced "1.0.1" 776 | 777 | ms@2.0.0: 778 | version "2.0.0" 779 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 780 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 781 | 782 | ms@2.1.1, ms@^2.1.1: 783 | version "2.1.1" 784 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 785 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 786 | 787 | negotiator@0.6.2: 788 | version "0.6.2" 789 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 790 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 791 | 792 | on-finished@~2.3.0: 793 | version "2.3.0" 794 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 795 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 796 | dependencies: 797 | ee-first "1.1.1" 798 | 799 | on-headers@~1.0.2: 800 | version "1.0.2" 801 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 802 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 803 | 804 | once@^1.3.0: 805 | version "1.4.0" 806 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 807 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 808 | dependencies: 809 | wrappy "1" 810 | 811 | parseurl@~1.3.2: 812 | version "1.3.3" 813 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 814 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 815 | 816 | path-is-absolute@^1.0.0: 817 | version "1.0.1" 818 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 819 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 820 | 821 | path-parse@^1.0.6: 822 | version "1.0.6" 823 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 824 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 825 | 826 | path-to-regexp@0.1.7: 827 | version "0.1.7" 828 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 829 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 830 | 831 | process-nextick-args@~2.0.0: 832 | version "2.0.0" 833 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 834 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 835 | 836 | proxy-addr@~2.0.4: 837 | version "2.0.5" 838 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" 839 | integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== 840 | dependencies: 841 | forwarded "~0.1.2" 842 | ipaddr.js "1.9.0" 843 | 844 | qs@6.5.2: 845 | version "6.5.2" 846 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 847 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 848 | 849 | qs@6.7.0, qs@^6.5.1: 850 | version "6.7.0" 851 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 852 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 853 | 854 | range-parser@~1.2.0: 855 | version "1.2.0" 856 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 857 | integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= 858 | 859 | raw-body@2.3.3: 860 | version "2.3.3" 861 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 862 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 863 | dependencies: 864 | bytes "3.0.0" 865 | http-errors "1.6.3" 866 | iconv-lite "0.4.23" 867 | unpipe "1.0.0" 868 | 869 | raw-body@2.4.0: 870 | version "2.4.0" 871 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 872 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 873 | dependencies: 874 | bytes "3.1.0" 875 | http-errors "1.7.2" 876 | iconv-lite "0.4.24" 877 | unpipe "1.0.0" 878 | 879 | readable-stream@^2.3.5: 880 | version "2.3.6" 881 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 882 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 883 | dependencies: 884 | core-util-is "~1.0.0" 885 | inherits "~2.0.3" 886 | isarray "~1.0.0" 887 | process-nextick-args "~2.0.0" 888 | safe-buffer "~5.1.1" 889 | string_decoder "~1.1.1" 890 | util-deprecate "~1.0.1" 891 | 892 | regexp-clone@0.0.1: 893 | version "0.0.1" 894 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" 895 | integrity sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk= 896 | 897 | require_optional@^1.0.1: 898 | version "1.0.1" 899 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" 900 | integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== 901 | dependencies: 902 | resolve-from "^2.0.0" 903 | semver "^5.1.0" 904 | 905 | resolve-from@^2.0.0: 906 | version "2.0.0" 907 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 908 | integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= 909 | 910 | resolve@^1.3.2: 911 | version "1.10.1" 912 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" 913 | integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== 914 | dependencies: 915 | path-parse "^1.0.6" 916 | 917 | safe-buffer@5.1.2, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 918 | version "5.1.2" 919 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 920 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 921 | 922 | "safer-buffer@>= 2.1.2 < 3": 923 | version "2.1.2" 924 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 925 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 926 | 927 | saslprep@^1.0.0: 928 | version "1.0.3" 929 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 930 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 931 | dependencies: 932 | sparse-bitfield "^3.0.3" 933 | 934 | semver@^5.1.0, semver@^5.3.0: 935 | version "5.7.0" 936 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 937 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 938 | 939 | send@0.16.2: 940 | version "0.16.2" 941 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 942 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 943 | dependencies: 944 | debug "2.6.9" 945 | depd "~1.1.2" 946 | destroy "~1.0.4" 947 | encodeurl "~1.0.2" 948 | escape-html "~1.0.3" 949 | etag "~1.8.1" 950 | fresh "0.5.2" 951 | http-errors "~1.6.2" 952 | mime "1.4.1" 953 | ms "2.0.0" 954 | on-finished "~2.3.0" 955 | range-parser "~1.2.0" 956 | statuses "~1.4.0" 957 | 958 | serve-static@1.13.2: 959 | version "1.13.2" 960 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 961 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 962 | dependencies: 963 | encodeurl "~1.0.2" 964 | escape-html "~1.0.3" 965 | parseurl "~1.3.2" 966 | send "0.16.2" 967 | 968 | setprototypeof@1.1.0: 969 | version "1.1.0" 970 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 971 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 972 | 973 | setprototypeof@1.1.1: 974 | version "1.1.1" 975 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 976 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 977 | 978 | sift@7.0.1: 979 | version "7.0.1" 980 | resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" 981 | integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g== 982 | 983 | sliced@1.0.1: 984 | version "1.0.1" 985 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 986 | integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= 987 | 988 | sparse-bitfield@^3.0.3: 989 | version "3.0.3" 990 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 991 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 992 | dependencies: 993 | memory-pager "^1.0.2" 994 | 995 | sprintf-js@~1.0.2: 996 | version "1.0.3" 997 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 998 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 999 | 1000 | "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": 1001 | version "1.5.0" 1002 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1003 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1004 | 1005 | statuses@~1.4.0: 1006 | version "1.4.0" 1007 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 1008 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 1009 | 1010 | string_decoder@~1.1.1: 1011 | version "1.1.1" 1012 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1013 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1014 | dependencies: 1015 | safe-buffer "~5.1.0" 1016 | 1017 | superagent@^3.8.3: 1018 | version "3.8.3" 1019 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" 1020 | integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== 1021 | dependencies: 1022 | component-emitter "^1.2.0" 1023 | cookiejar "^2.1.0" 1024 | debug "^3.1.0" 1025 | extend "^3.0.0" 1026 | form-data "^2.3.1" 1027 | formidable "^1.2.0" 1028 | methods "^1.1.1" 1029 | mime "^1.4.1" 1030 | qs "^6.5.1" 1031 | readable-stream "^2.3.5" 1032 | 1033 | supertest-as-promised@^4.0.2: 1034 | version "4.0.2" 1035 | resolved "https://registry.yarnpkg.com/supertest-as-promised/-/supertest-as-promised-4.0.2.tgz#0464f2bd256568d4a59bce84269c0548f6879f1a" 1036 | integrity sha1-BGTyvSVlaNSlm86EJpwFSPaHnxo= 1037 | dependencies: 1038 | bluebird "^3.3.1" 1039 | methods "^1.1.1" 1040 | 1041 | supertest@^3.0.0: 1042 | version "3.4.2" 1043 | resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.4.2.tgz#bad7de2e43d60d27c8caeb8ab34a67c8a5f71aad" 1044 | integrity sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA== 1045 | dependencies: 1046 | methods "^1.1.2" 1047 | superagent "^3.8.3" 1048 | 1049 | supports-color@^5.3.0: 1050 | version "5.5.0" 1051 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1052 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1053 | dependencies: 1054 | has-flag "^3.0.0" 1055 | 1056 | toidentifier@1.0.0: 1057 | version "1.0.0" 1058 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1059 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1060 | 1061 | tslib@^1.8.0, tslib@^1.8.1: 1062 | version "1.9.3" 1063 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1064 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 1065 | 1066 | tslint-microsoft-contrib@^6.1.1: 1067 | version "6.1.1" 1068 | resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.1.1.tgz#1de9b5c2867f6cec762bab9d8e1619f2b8eb59fc" 1069 | integrity sha512-u6tK+tgt8Z1YRJxe4kpWWEx/6FTFxdga50+osnANifsfC7BMzh8c/t/XbNntTRiwMfpHkQ9xtUjizCDLxN1Yeg== 1070 | dependencies: 1071 | tsutils "^2.27.2 <2.29.0" 1072 | 1073 | tslint@^5.16.0: 1074 | version "5.16.0" 1075 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67" 1076 | integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA== 1077 | dependencies: 1078 | "@babel/code-frame" "^7.0.0" 1079 | builtin-modules "^1.1.1" 1080 | chalk "^2.3.0" 1081 | commander "^2.12.1" 1082 | diff "^3.2.0" 1083 | glob "^7.1.1" 1084 | js-yaml "^3.13.0" 1085 | minimatch "^3.0.4" 1086 | mkdirp "^0.5.1" 1087 | resolve "^1.3.2" 1088 | semver "^5.3.0" 1089 | tslib "^1.8.0" 1090 | tsutils "^2.29.0" 1091 | 1092 | "tsutils@^2.27.2 <2.29.0": 1093 | version "2.28.0" 1094 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" 1095 | integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA== 1096 | dependencies: 1097 | tslib "^1.8.1" 1098 | 1099 | tsutils@^2.29.0: 1100 | version "2.29.0" 1101 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 1102 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 1103 | dependencies: 1104 | tslib "^1.8.1" 1105 | 1106 | type-detect@0.1.1: 1107 | version "0.1.1" 1108 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 1109 | integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= 1110 | 1111 | type-detect@^1.0.0: 1112 | version "1.0.0" 1113 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 1114 | integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= 1115 | 1116 | type-is@~1.6.16, type-is@~1.6.17: 1117 | version "1.6.18" 1118 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1119 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1120 | dependencies: 1121 | media-typer "0.3.0" 1122 | mime-types "~2.1.24" 1123 | 1124 | typescript@^3.4.5: 1125 | version "3.4.5" 1126 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" 1127 | integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== 1128 | 1129 | unpipe@1.0.0, unpipe@~1.0.0: 1130 | version "1.0.0" 1131 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1132 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1133 | 1134 | util-deprecate@~1.0.1: 1135 | version "1.0.2" 1136 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1137 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1138 | 1139 | utils-merge@1.0.1: 1140 | version "1.0.1" 1141 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1142 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1143 | 1144 | vary@~1.1.2: 1145 | version "1.1.2" 1146 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1147 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1148 | 1149 | wrappy@1: 1150 | version "1.0.2" 1151 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1152 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1153 | --------------------------------------------------------------------------------