├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── _config.yml ├── app.js ├── dataaccess └── RepoDao.js ├── it └── posts-IT.js ├── package-lock.json ├── package.json ├── public └── swagger-ui │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── index.html │ ├── oauth2-redirect.html │ ├── swagger-ui-bundle.js │ ├── swagger-ui-bundle.js.map │ ├── swagger-ui-standalone-preset.js │ ├── swagger-ui-standalone-preset.js.map │ ├── swagger-ui.css │ ├── swagger-ui.css.map │ ├── swagger-ui.js │ └── swagger-ui.js.map ├── routes ├── api.js ├── posts.js └── repo │ ├── images.js │ └── repo.js ├── services ├── PostsService.js └── RepoService.js ├── spec ├── app_test.js ├── helpers │ ├── common.js │ └── reporter.js ├── routes │ ├── posts-spec.js │ └── repo │ │ ├── images-spec.js │ │ └── repo-spec.js └── support │ ├── jasmine-integ.json │ └── jasmine.json ├── utils └── Logger.js └── views └── error.hbs /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # Intellij Idea directory 61 | .idea/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | install: 2 | - npm install -g node-inspector@1.1.1 3 | - npm install 4 | script: 5 | - npm test 6 | - npm run integtest 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2014 - 2017 Ashish Desai 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Why expressjs-microservice boilerplate? 2 | Easy to use opinionated ExpressJS based micro-service boilerplate. This boilerplate provides a solid pattern that developers can use to scaffold and start devleop a ExpressJS (NodeJS) based microservice within seconds. The boilerplate demonstrates several key design patterns that include: 3 | 4 | - Creating complex routes with route nesting 5 | - Use of most popular tools that are must have for any NodeJS based API project. 6 | - Use of Sinon for stubbing, mocking and spying on unit tests. 7 | - Use of supertest to unit and integration test HTTP endpoints and API endpoints. 8 | - Testing promises with Jasmine, Sinon, Supertest and Chai. 9 | - Separation of concerns through use of service classes for business logic, data access classes for database operations and pure routes for API endpoints. 10 | - Exception handling and exception propagation 11 | 12 | ## What does it provide 13 | This boilerplate provides pre-configured: 14 | 15 | 1. ExpressJS REST API template 16 | 2. Swagger documentation and Swagger UI 17 | 3. Jasmine, Sinon, Chai, Supertest configuration for Unit and integration tests. 18 | 4. Pre-configured jasmine spec reporter 19 | 5. Jasmine Node Debug for debugging unit tests. 20 | 6. Fully configured istanbul test coverage 21 | 7. Winston logger for logging to file and console with daily rotating log file module. 22 | 23 | ## How to install? 24 | Getting started with this boilerplate is easy. There are two ways to install and use it 25 | 26 | ### Installing manually 27 | Clone this repo on your workstation 28 | 29 | git clone https://github.com/doomsbuster/expressjs-microservice.git YOUR_PROJ_NAME 30 | 31 | ### Installing as node module 32 | Boilerplate is also available as module from NPM and Yarn registry. 33 | 34 | npm install expressjs-microservice 35 | 36 | Once you have installed the module, copy the expressjs-microservice to your project directory. 37 | 38 | cp -R ./node_modules/expressjs-microservice/* . 39 | 40 | ## Getting started 41 | Once you have installed the boilerplate, running it is easy: 42 | 43 | Run 44 | 45 | npm install 46 | 47 | Start the application using 48 | 49 | npm start 50 | 51 | Point your browser at `http://localhost:3000`, you should see the swagger documentation for the boilerplate API. 52 | 53 | > 54 | > The base API is available at the route `/api` e.g. `http://localhost:3000/api/posts`. 55 | > 56 | 57 | #### Running unit tests 58 | You can trigger unit tests that have full coverage using `istanbul` and spec reporting using `jasmine-spec-reporter` using the following command 59 | 60 | npm test 61 | 62 | #### Running integration tests 63 | All intgration tests whose names end in `-IT.js` for example `it/posts-IT.js` created under the `expressjs-microservice/it` directory will be executed as a part of the integration test command described below. 64 | 65 | The name of the file must match the globbing pattern `**/*-IT.js`. 66 | 67 | - `posts-IT.js` - Matched 68 | - `posts-it.js` - Not matched 69 | 70 | You can customize this behavior by updating the `spec/support/jasmine-integ.json` file. 71 | 72 | Run your integration test using the command: 73 | 74 | npm run integtest 75 | 76 | ## What does it not provide? 77 | This project does come with test coverage for all files as they are expected to be removed or different for your projects. Samples are for demonstration of the concept and the pattern only. 78 | 79 | ## Contributing 80 | Fork the repo and submit a pull request. 81 | 82 | ## License 83 | Mr. Doomsbuster doesn't care about attribution. All source code is license under [Do What The Fuck You Want To (WTFPL)](https://ashishdesai.com/license.txt) public license. -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var bodyParser = require('body-parser'); 6 | const log = require('./utils/Logger'); 7 | 8 | var apiEndpoint = require('./routes/api'); 9 | 10 | log.info('Starting the express app'); 11 | var app = express(); 12 | 13 | // view engine setup 14 | app.set('view engine', 'hbs'); 15 | app.set('views', path.join(__dirname, 'views')); 16 | 17 | app.use(bodyParser.json()); 18 | app.use(bodyParser.urlencoded({ 19 | extended: false 20 | })); 21 | 22 | app.use(cookieParser()); 23 | 24 | app.use('/', express.static(path.join(__dirname, 'public/swagger-ui'))); 25 | app.use('/api', apiEndpoint); 26 | 27 | app.use(function(req, res, next) { 28 | var err = new Error('Not Found'); 29 | err.status = 404; 30 | next(err); 31 | }); 32 | 33 | if (app.get('env') === 'development') { 34 | app.use(function(err, req, res, next) { 35 | res.status(err.status || 500); 36 | res.render('error', { 37 | message: err.message, 38 | error: err 39 | }); 40 | }); 41 | } 42 | 43 | app.use(function(err, req, res, next) { 44 | res.status(err.status || 500); 45 | res.render('error', { 46 | message: err.message, 47 | error: {} 48 | }); 49 | }); 50 | 51 | app.listen(process.env.PORT || 3000, function () { 52 | log.info('Started the express microservice.'); 53 | }); 54 | 55 | module.exports = app; -------------------------------------------------------------------------------- /dataaccess/RepoDao.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports.getAllRepos = function() { 4 | // Make database calls and other database queries here. 5 | return 'db.query()'; 6 | } -------------------------------------------------------------------------------- /it/posts-IT.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var express = require('express'); 4 | var request = require('supertest'); 5 | var service = require('../services/PostsService'); 6 | var helper = require('../spec/helpers/common'); 7 | 8 | describe('GET /posts', function() { 9 | 10 | it('should return 200', function(done) { 11 | request(require('../app')) 12 | .get('/api/posts') 13 | .expect(200) 14 | .end(function(err, res) { 15 | helper.end(err, res, done); 16 | }); 17 | }); 18 | 19 | it('/post should return 200', function(done) { 20 | request(require('../app')) 21 | .get('/api/posts/post?postId=1') 22 | .expect(200) 23 | .end(function(err, res) { 24 | helper.end(err, res, done); 25 | }); 26 | }); 27 | 28 | it('/:postId should return 200', function(done) { 29 | request(require('../app')) 30 | .get('/api/posts/5') 31 | .expect(200) 32 | .end(function(err, res) { 33 | helper.end(err, res, done); 34 | }); 35 | }); 36 | }) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "expressjs-microservice", 3 | "version": "0.0.12", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.0.9", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 10 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 11 | "dev": true 12 | }, 13 | "accepts": { 14 | "version": "1.3.4", 15 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", 16 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", 17 | "requires": { 18 | "mime-types": "~2.1.16", 19 | "negotiator": "0.6.1" 20 | }, 21 | "dependencies": { 22 | "mime-db": { 23 | "version": "1.30.0", 24 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 25 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 26 | }, 27 | "mime-types": { 28 | "version": "2.1.17", 29 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 30 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 31 | "requires": { 32 | "mime-db": "~1.30.0" 33 | } 34 | } 35 | } 36 | }, 37 | "ajv": { 38 | "version": "5.5.2", 39 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 40 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 41 | "requires": { 42 | "co": "^4.6.0", 43 | "fast-deep-equal": "^1.0.0", 44 | "fast-json-stable-stringify": "^2.0.0", 45 | "json-schema-traverse": "^0.3.0" 46 | } 47 | }, 48 | "align-text": { 49 | "version": "0.1.4", 50 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 51 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 52 | "requires": { 53 | "kind-of": "^3.0.2", 54 | "longest": "^1.0.1", 55 | "repeat-string": "^1.5.2" 56 | } 57 | }, 58 | "amdefine": { 59 | "version": "1.0.1", 60 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 61 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 62 | }, 63 | "anymatch": { 64 | "version": "1.3.2", 65 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 66 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 67 | "requires": { 68 | "micromatch": "^2.1.5", 69 | "normalize-path": "^2.0.0" 70 | } 71 | }, 72 | "argparse": { 73 | "version": "1.0.9", 74 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 75 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 76 | "requires": { 77 | "sprintf-js": "~1.0.2" 78 | } 79 | }, 80 | "arr-diff": { 81 | "version": "2.0.0", 82 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 83 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 84 | "requires": { 85 | "arr-flatten": "^1.0.1" 86 | } 87 | }, 88 | "arr-flatten": { 89 | "version": "1.1.0", 90 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 91 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 92 | }, 93 | "array-flatten": { 94 | "version": "1.1.1", 95 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 96 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 97 | }, 98 | "array-unique": { 99 | "version": "0.2.1", 100 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 101 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" 102 | }, 103 | "asn1": { 104 | "version": "0.2.3", 105 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 106 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 107 | }, 108 | "assert-plus": { 109 | "version": "1.0.0", 110 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 111 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 112 | }, 113 | "assertion-error": { 114 | "version": "1.0.2", 115 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 116 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 117 | "dev": true 118 | }, 119 | "async": { 120 | "version": "1.5.2", 121 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 122 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 123 | }, 124 | "async-each": { 125 | "version": "1.0.1", 126 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 127 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" 128 | }, 129 | "asynckit": { 130 | "version": "0.4.0", 131 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 132 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 133 | }, 134 | "aws-sign2": { 135 | "version": "0.7.0", 136 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 137 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 138 | }, 139 | "aws4": { 140 | "version": "1.7.0", 141 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 142 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" 143 | }, 144 | "balanced-match": { 145 | "version": "1.0.0", 146 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 147 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 148 | }, 149 | "bcrypt-pbkdf": { 150 | "version": "1.0.1", 151 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 152 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 153 | "optional": true, 154 | "requires": { 155 | "tweetnacl": "^0.14.3" 156 | } 157 | }, 158 | "binary-extensions": { 159 | "version": "1.11.0", 160 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", 161 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" 162 | }, 163 | "body-parser": { 164 | "version": "1.10.2", 165 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.10.2.tgz", 166 | "integrity": "sha1-QF1GX808zw6oo1rb8QVfbpgxa9E=", 167 | "requires": { 168 | "bytes": "1.0.0", 169 | "depd": "~1.0.0", 170 | "iconv-lite": "0.4.6", 171 | "media-typer": "0.3.0", 172 | "on-finished": "~2.2.0", 173 | "qs": "2.3.3", 174 | "raw-body": "1.3.2", 175 | "type-is": "~1.5.5" 176 | } 177 | }, 178 | "brace-expansion": { 179 | "version": "1.1.8", 180 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 181 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 182 | "requires": { 183 | "balanced-match": "^1.0.0", 184 | "concat-map": "0.0.1" 185 | } 186 | }, 187 | "braces": { 188 | "version": "1.8.5", 189 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 190 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 191 | "requires": { 192 | "expand-range": "^1.8.1", 193 | "preserve": "^0.2.0", 194 | "repeat-element": "^1.1.2" 195 | } 196 | }, 197 | "bytes": { 198 | "version": "1.0.0", 199 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", 200 | "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" 201 | }, 202 | "call-me-maybe": { 203 | "version": "1.0.1", 204 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", 205 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" 206 | }, 207 | "camelcase": { 208 | "version": "1.2.1", 209 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 210 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 211 | "optional": true 212 | }, 213 | "caseless": { 214 | "version": "0.12.0", 215 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 216 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 217 | }, 218 | "center-align": { 219 | "version": "0.1.3", 220 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 221 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 222 | "optional": true, 223 | "requires": { 224 | "align-text": "^0.1.3", 225 | "lazy-cache": "^1.0.3" 226 | } 227 | }, 228 | "chai": { 229 | "version": "4.1.2", 230 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 231 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 232 | "dev": true, 233 | "requires": { 234 | "assertion-error": "^1.0.1", 235 | "check-error": "^1.0.1", 236 | "deep-eql": "^3.0.0", 237 | "get-func-name": "^2.0.0", 238 | "pathval": "^1.0.0", 239 | "type-detect": "^4.0.0" 240 | } 241 | }, 242 | "check-error": { 243 | "version": "1.0.2", 244 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 245 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 246 | "dev": true 247 | }, 248 | "chokidar": { 249 | "version": "1.7.0", 250 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 251 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 252 | "requires": { 253 | "anymatch": "^1.3.0", 254 | "async-each": "^1.0.0", 255 | "fsevents": "^1.0.0", 256 | "glob-parent": "^2.0.0", 257 | "inherits": "^2.0.1", 258 | "is-binary-path": "^1.0.0", 259 | "is-glob": "^2.0.0", 260 | "path-is-absolute": "^1.0.0", 261 | "readdirp": "^2.0.0" 262 | } 263 | }, 264 | "cliui": { 265 | "version": "2.1.0", 266 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 267 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 268 | "optional": true, 269 | "requires": { 270 | "center-align": "^0.1.1", 271 | "right-align": "^0.1.1", 272 | "wordwrap": "0.0.2" 273 | }, 274 | "dependencies": { 275 | "wordwrap": { 276 | "version": "0.0.2", 277 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 278 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 279 | "optional": true 280 | } 281 | } 282 | }, 283 | "co": { 284 | "version": "4.6.0", 285 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 286 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 287 | }, 288 | "colors": { 289 | "version": "1.0.3", 290 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 291 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 292 | }, 293 | "combined-stream": { 294 | "version": "1.0.5", 295 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 296 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 297 | "requires": { 298 | "delayed-stream": "~1.0.0" 299 | } 300 | }, 301 | "commander": { 302 | "version": "2.12.2", 303 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", 304 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" 305 | }, 306 | "component-emitter": { 307 | "version": "1.2.1", 308 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 309 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", 310 | "dev": true 311 | }, 312 | "concat-map": { 313 | "version": "0.0.1", 314 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 315 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 316 | }, 317 | "content-disposition": { 318 | "version": "0.5.2", 319 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 320 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 321 | }, 322 | "content-type": { 323 | "version": "1.0.4", 324 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 325 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 326 | }, 327 | "cookie": { 328 | "version": "0.1.3", 329 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", 330 | "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=" 331 | }, 332 | "cookie-parser": { 333 | "version": "1.3.5", 334 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", 335 | "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", 336 | "requires": { 337 | "cookie": "0.1.3", 338 | "cookie-signature": "1.0.6" 339 | } 340 | }, 341 | "cookie-signature": { 342 | "version": "1.0.6", 343 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 344 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 345 | }, 346 | "cookiejar": { 347 | "version": "2.1.1", 348 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", 349 | "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", 350 | "dev": true 351 | }, 352 | "core-util-is": { 353 | "version": "1.0.2", 354 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 355 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 356 | }, 357 | "cross-env": { 358 | "version": "5.1.3", 359 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", 360 | "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", 361 | "dev": true, 362 | "requires": { 363 | "cross-spawn": "^5.1.0", 364 | "is-windows": "^1.0.0" 365 | } 366 | }, 367 | "cross-spawn": { 368 | "version": "5.1.0", 369 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 370 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 371 | "dev": true, 372 | "requires": { 373 | "lru-cache": "^4.0.1", 374 | "shebang-command": "^1.2.0", 375 | "which": "^1.2.9" 376 | } 377 | }, 378 | "cycle": { 379 | "version": "1.0.3", 380 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 381 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 382 | }, 383 | "dashdash": { 384 | "version": "1.14.1", 385 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 386 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 387 | "requires": { 388 | "assert-plus": "^1.0.0" 389 | } 390 | }, 391 | "decamelize": { 392 | "version": "1.2.0", 393 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 394 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 395 | "optional": true 396 | }, 397 | "deep-eql": { 398 | "version": "3.0.1", 399 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 400 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 401 | "dev": true, 402 | "requires": { 403 | "type-detect": "^4.0.0" 404 | } 405 | }, 406 | "deep-is": { 407 | "version": "0.1.3", 408 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 409 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 410 | "dev": true 411 | }, 412 | "delayed-stream": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 415 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 416 | }, 417 | "depd": { 418 | "version": "1.0.1", 419 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", 420 | "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" 421 | }, 422 | "destroy": { 423 | "version": "1.0.4", 424 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 425 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 426 | }, 427 | "diff": { 428 | "version": "3.4.0", 429 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", 430 | "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" 431 | }, 432 | "doctrine": { 433 | "version": "2.0.2", 434 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", 435 | "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", 436 | "requires": { 437 | "esutils": "^2.0.2" 438 | } 439 | }, 440 | "ecc-jsbn": { 441 | "version": "0.1.1", 442 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 443 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 444 | "optional": true, 445 | "requires": { 446 | "jsbn": "~0.1.0" 447 | } 448 | }, 449 | "ee-first": { 450 | "version": "1.1.0", 451 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", 452 | "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=" 453 | }, 454 | "encodeurl": { 455 | "version": "1.0.1", 456 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 457 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" 458 | }, 459 | "es6-promise": { 460 | "version": "4.2.2", 461 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz", 462 | "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==" 463 | }, 464 | "escape-html": { 465 | "version": "1.0.3", 466 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 467 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 468 | }, 469 | "escodegen": { 470 | "version": "1.8.1", 471 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 472 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 473 | "dev": true, 474 | "requires": { 475 | "esprima": "^2.7.1", 476 | "estraverse": "^1.9.1", 477 | "esutils": "^2.0.2", 478 | "optionator": "^0.8.1", 479 | "source-map": "~0.2.0" 480 | }, 481 | "dependencies": { 482 | "esprima": { 483 | "version": "2.7.3", 484 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 485 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 486 | "dev": true 487 | }, 488 | "source-map": { 489 | "version": "0.2.0", 490 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 491 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 492 | "dev": true, 493 | "optional": true, 494 | "requires": { 495 | "amdefine": ">=0.0.4" 496 | } 497 | } 498 | } 499 | }, 500 | "esprima": { 501 | "version": "4.0.0", 502 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 503 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" 504 | }, 505 | "estraverse": { 506 | "version": "1.9.3", 507 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 508 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 509 | "dev": true 510 | }, 511 | "esutils": { 512 | "version": "2.0.2", 513 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 514 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 515 | }, 516 | "etag": { 517 | "version": "1.8.1", 518 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 519 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 520 | }, 521 | "exit": { 522 | "version": "0.1.2", 523 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 524 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 525 | "dev": true 526 | }, 527 | "expand-brackets": { 528 | "version": "0.1.5", 529 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 530 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 531 | "requires": { 532 | "is-posix-bracket": "^0.1.0" 533 | } 534 | }, 535 | "expand-range": { 536 | "version": "1.8.2", 537 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 538 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 539 | "requires": { 540 | "fill-range": "^2.1.0" 541 | } 542 | }, 543 | "express": { 544 | "version": "4.16.2", 545 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", 546 | "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", 547 | "requires": { 548 | "accepts": "~1.3.4", 549 | "array-flatten": "1.1.1", 550 | "body-parser": "1.18.2", 551 | "content-disposition": "0.5.2", 552 | "content-type": "~1.0.4", 553 | "cookie": "0.3.1", 554 | "cookie-signature": "1.0.6", 555 | "debug": "2.6.9", 556 | "depd": "~1.1.1", 557 | "encodeurl": "~1.0.1", 558 | "escape-html": "~1.0.3", 559 | "etag": "~1.8.1", 560 | "finalhandler": "1.1.0", 561 | "fresh": "0.5.2", 562 | "merge-descriptors": "1.0.1", 563 | "methods": "~1.1.2", 564 | "on-finished": "~2.3.0", 565 | "parseurl": "~1.3.2", 566 | "path-to-regexp": "0.1.7", 567 | "proxy-addr": "~2.0.2", 568 | "qs": "6.5.1", 569 | "range-parser": "~1.2.0", 570 | "safe-buffer": "5.1.1", 571 | "send": "0.16.1", 572 | "serve-static": "1.13.1", 573 | "setprototypeof": "1.1.0", 574 | "statuses": "~1.3.1", 575 | "type-is": "~1.6.15", 576 | "utils-merge": "1.0.1", 577 | "vary": "~1.1.2" 578 | }, 579 | "dependencies": { 580 | "body-parser": { 581 | "version": "1.18.2", 582 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 583 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 584 | "requires": { 585 | "bytes": "3.0.0", 586 | "content-type": "~1.0.4", 587 | "debug": "2.6.9", 588 | "depd": "~1.1.1", 589 | "http-errors": "~1.6.2", 590 | "iconv-lite": "0.4.19", 591 | "on-finished": "~2.3.0", 592 | "qs": "6.5.1", 593 | "raw-body": "2.3.2", 594 | "type-is": "~1.6.15" 595 | } 596 | }, 597 | "bytes": { 598 | "version": "3.0.0", 599 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 600 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 601 | }, 602 | "cookie": { 603 | "version": "0.3.1", 604 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 605 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 606 | }, 607 | "debug": { 608 | "version": "2.6.9", 609 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 610 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 611 | "requires": { 612 | "ms": "2.0.0" 613 | } 614 | }, 615 | "depd": { 616 | "version": "1.1.1", 617 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 618 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 619 | }, 620 | "ee-first": { 621 | "version": "1.1.1", 622 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 623 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 624 | }, 625 | "fresh": { 626 | "version": "0.5.2", 627 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 628 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 629 | }, 630 | "iconv-lite": { 631 | "version": "0.4.19", 632 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 633 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 634 | }, 635 | "mime-db": { 636 | "version": "1.30.0", 637 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 638 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 639 | }, 640 | "mime-types": { 641 | "version": "2.1.17", 642 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 643 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 644 | "requires": { 645 | "mime-db": "~1.30.0" 646 | } 647 | }, 648 | "ms": { 649 | "version": "2.0.0", 650 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 651 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 652 | }, 653 | "on-finished": { 654 | "version": "2.3.0", 655 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 656 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 657 | "requires": { 658 | "ee-first": "1.1.1" 659 | } 660 | }, 661 | "qs": { 662 | "version": "6.5.1", 663 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 664 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 665 | }, 666 | "raw-body": { 667 | "version": "2.3.2", 668 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 669 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 670 | "requires": { 671 | "bytes": "3.0.0", 672 | "http-errors": "1.6.2", 673 | "iconv-lite": "0.4.19", 674 | "unpipe": "1.0.0" 675 | } 676 | }, 677 | "type-is": { 678 | "version": "1.6.15", 679 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 680 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 681 | "requires": { 682 | "media-typer": "0.3.0", 683 | "mime-types": "~2.1.15" 684 | } 685 | } 686 | } 687 | }, 688 | "extend": { 689 | "version": "3.0.1", 690 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 691 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 692 | }, 693 | "extglob": { 694 | "version": "0.3.2", 695 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 696 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 697 | "requires": { 698 | "is-extglob": "^1.0.0" 699 | } 700 | }, 701 | "extsprintf": { 702 | "version": "1.3.0", 703 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 704 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 705 | }, 706 | "eyes": { 707 | "version": "0.1.8", 708 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 709 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 710 | }, 711 | "fast-deep-equal": { 712 | "version": "1.1.0", 713 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 714 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 715 | }, 716 | "fast-json-stable-stringify": { 717 | "version": "2.0.0", 718 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 719 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 720 | }, 721 | "fast-levenshtein": { 722 | "version": "2.0.6", 723 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 724 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 725 | "dev": true 726 | }, 727 | "filename-regex": { 728 | "version": "2.0.1", 729 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 730 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" 731 | }, 732 | "fill-range": { 733 | "version": "2.2.4", 734 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 735 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 736 | "requires": { 737 | "is-number": "^2.1.0", 738 | "isobject": "^2.0.0", 739 | "randomatic": "^3.0.0", 740 | "repeat-element": "^1.1.2", 741 | "repeat-string": "^1.5.2" 742 | }, 743 | "dependencies": { 744 | "kind-of": { 745 | "version": "6.0.2", 746 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 747 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 748 | }, 749 | "randomatic": { 750 | "version": "3.0.0", 751 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", 752 | "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", 753 | "requires": { 754 | "is-number": "^4.0.0", 755 | "kind-of": "^6.0.0", 756 | "math-random": "^1.0.1" 757 | }, 758 | "dependencies": { 759 | "is-number": { 760 | "version": "4.0.0", 761 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 762 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" 763 | } 764 | } 765 | } 766 | } 767 | }, 768 | "finalhandler": { 769 | "version": "1.1.0", 770 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 771 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", 772 | "requires": { 773 | "debug": "2.6.9", 774 | "encodeurl": "~1.0.1", 775 | "escape-html": "~1.0.3", 776 | "on-finished": "~2.3.0", 777 | "parseurl": "~1.3.2", 778 | "statuses": "~1.3.1", 779 | "unpipe": "~1.0.0" 780 | }, 781 | "dependencies": { 782 | "debug": { 783 | "version": "2.6.9", 784 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 785 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 786 | "requires": { 787 | "ms": "2.0.0" 788 | } 789 | }, 790 | "ee-first": { 791 | "version": "1.1.1", 792 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 793 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 794 | }, 795 | "ms": { 796 | "version": "2.0.0", 797 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 798 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 799 | }, 800 | "on-finished": { 801 | "version": "2.3.0", 802 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 803 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 804 | "requires": { 805 | "ee-first": "1.1.1" 806 | } 807 | } 808 | } 809 | }, 810 | "for-in": { 811 | "version": "1.0.2", 812 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 813 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 814 | }, 815 | "for-own": { 816 | "version": "0.1.5", 817 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 818 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 819 | "requires": { 820 | "for-in": "^1.0.1" 821 | } 822 | }, 823 | "foreachasync": { 824 | "version": "3.0.0", 825 | "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", 826 | "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" 827 | }, 828 | "forever-agent": { 829 | "version": "0.6.1", 830 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 831 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 832 | }, 833 | "form-data": { 834 | "version": "2.3.1", 835 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", 836 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", 837 | "requires": { 838 | "asynckit": "^0.4.0", 839 | "combined-stream": "^1.0.5", 840 | "mime-types": "^2.1.12" 841 | }, 842 | "dependencies": { 843 | "mime-db": { 844 | "version": "1.30.0", 845 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 846 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 847 | }, 848 | "mime-types": { 849 | "version": "2.1.17", 850 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 851 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 852 | "requires": { 853 | "mime-db": "~1.30.0" 854 | } 855 | } 856 | } 857 | }, 858 | "format-util": { 859 | "version": "1.0.3", 860 | "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.3.tgz", 861 | "integrity": "sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU=" 862 | }, 863 | "formatio": { 864 | "version": "1.2.0", 865 | "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", 866 | "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", 867 | "requires": { 868 | "samsam": "1.x" 869 | } 870 | }, 871 | "formidable": { 872 | "version": "1.1.1", 873 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", 874 | "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", 875 | "dev": true 876 | }, 877 | "forwarded": { 878 | "version": "0.1.2", 879 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 880 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 881 | }, 882 | "fresh": { 883 | "version": "0.5.2", 884 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 885 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 886 | }, 887 | "fs.realpath": { 888 | "version": "1.0.0", 889 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 890 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 891 | }, 892 | "fsevents": { 893 | "version": "1.2.4", 894 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", 895 | "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", 896 | "optional": true, 897 | "requires": { 898 | "nan": "^2.9.2", 899 | "node-pre-gyp": "^0.10.0" 900 | }, 901 | "dependencies": { 902 | "abbrev": { 903 | "version": "1.1.1", 904 | "bundled": true, 905 | "optional": true 906 | }, 907 | "ansi-regex": { 908 | "version": "2.1.1", 909 | "bundled": true 910 | }, 911 | "aproba": { 912 | "version": "1.2.0", 913 | "bundled": true, 914 | "optional": true 915 | }, 916 | "are-we-there-yet": { 917 | "version": "1.1.4", 918 | "bundled": true, 919 | "optional": true, 920 | "requires": { 921 | "delegates": "^1.0.0", 922 | "readable-stream": "^2.0.6" 923 | } 924 | }, 925 | "balanced-match": { 926 | "version": "1.0.0", 927 | "bundled": true 928 | }, 929 | "brace-expansion": { 930 | "version": "1.1.11", 931 | "bundled": true, 932 | "requires": { 933 | "balanced-match": "^1.0.0", 934 | "concat-map": "0.0.1" 935 | } 936 | }, 937 | "chownr": { 938 | "version": "1.0.1", 939 | "bundled": true, 940 | "optional": true 941 | }, 942 | "code-point-at": { 943 | "version": "1.1.0", 944 | "bundled": true 945 | }, 946 | "concat-map": { 947 | "version": "0.0.1", 948 | "bundled": true 949 | }, 950 | "console-control-strings": { 951 | "version": "1.1.0", 952 | "bundled": true 953 | }, 954 | "core-util-is": { 955 | "version": "1.0.2", 956 | "bundled": true, 957 | "optional": true 958 | }, 959 | "debug": { 960 | "version": "2.6.9", 961 | "bundled": true, 962 | "optional": true, 963 | "requires": { 964 | "ms": "2.0.0" 965 | } 966 | }, 967 | "deep-extend": { 968 | "version": "0.5.1", 969 | "bundled": true, 970 | "optional": true 971 | }, 972 | "delegates": { 973 | "version": "1.0.0", 974 | "bundled": true, 975 | "optional": true 976 | }, 977 | "detect-libc": { 978 | "version": "1.0.3", 979 | "bundled": true, 980 | "optional": true 981 | }, 982 | "fs-minipass": { 983 | "version": "1.2.5", 984 | "bundled": true, 985 | "optional": true, 986 | "requires": { 987 | "minipass": "^2.2.1" 988 | } 989 | }, 990 | "fs.realpath": { 991 | "version": "1.0.0", 992 | "bundled": true, 993 | "optional": true 994 | }, 995 | "gauge": { 996 | "version": "2.7.4", 997 | "bundled": true, 998 | "optional": true, 999 | "requires": { 1000 | "aproba": "^1.0.3", 1001 | "console-control-strings": "^1.0.0", 1002 | "has-unicode": "^2.0.0", 1003 | "object-assign": "^4.1.0", 1004 | "signal-exit": "^3.0.0", 1005 | "string-width": "^1.0.1", 1006 | "strip-ansi": "^3.0.1", 1007 | "wide-align": "^1.1.0" 1008 | } 1009 | }, 1010 | "glob": { 1011 | "version": "7.1.2", 1012 | "bundled": true, 1013 | "optional": true, 1014 | "requires": { 1015 | "fs.realpath": "^1.0.0", 1016 | "inflight": "^1.0.4", 1017 | "inherits": "2", 1018 | "minimatch": "^3.0.4", 1019 | "once": "^1.3.0", 1020 | "path-is-absolute": "^1.0.0" 1021 | } 1022 | }, 1023 | "has-unicode": { 1024 | "version": "2.0.1", 1025 | "bundled": true, 1026 | "optional": true 1027 | }, 1028 | "iconv-lite": { 1029 | "version": "0.4.21", 1030 | "bundled": true, 1031 | "optional": true, 1032 | "requires": { 1033 | "safer-buffer": "^2.1.0" 1034 | } 1035 | }, 1036 | "ignore-walk": { 1037 | "version": "3.0.1", 1038 | "bundled": true, 1039 | "optional": true, 1040 | "requires": { 1041 | "minimatch": "^3.0.4" 1042 | } 1043 | }, 1044 | "inflight": { 1045 | "version": "1.0.6", 1046 | "bundled": true, 1047 | "optional": true, 1048 | "requires": { 1049 | "once": "^1.3.0", 1050 | "wrappy": "1" 1051 | } 1052 | }, 1053 | "inherits": { 1054 | "version": "2.0.3", 1055 | "bundled": true 1056 | }, 1057 | "ini": { 1058 | "version": "1.3.5", 1059 | "bundled": true, 1060 | "optional": true 1061 | }, 1062 | "is-fullwidth-code-point": { 1063 | "version": "1.0.0", 1064 | "bundled": true, 1065 | "requires": { 1066 | "number-is-nan": "^1.0.0" 1067 | } 1068 | }, 1069 | "isarray": { 1070 | "version": "1.0.0", 1071 | "bundled": true, 1072 | "optional": true 1073 | }, 1074 | "minimatch": { 1075 | "version": "3.0.4", 1076 | "bundled": true, 1077 | "requires": { 1078 | "brace-expansion": "^1.1.7" 1079 | } 1080 | }, 1081 | "minimist": { 1082 | "version": "0.0.8", 1083 | "bundled": true 1084 | }, 1085 | "minipass": { 1086 | "version": "2.2.4", 1087 | "bundled": true, 1088 | "requires": { 1089 | "safe-buffer": "^5.1.1", 1090 | "yallist": "^3.0.0" 1091 | } 1092 | }, 1093 | "minizlib": { 1094 | "version": "1.1.0", 1095 | "bundled": true, 1096 | "optional": true, 1097 | "requires": { 1098 | "minipass": "^2.2.1" 1099 | } 1100 | }, 1101 | "mkdirp": { 1102 | "version": "0.5.1", 1103 | "bundled": true, 1104 | "requires": { 1105 | "minimist": "0.0.8" 1106 | } 1107 | }, 1108 | "ms": { 1109 | "version": "2.0.0", 1110 | "bundled": true, 1111 | "optional": true 1112 | }, 1113 | "nan": { 1114 | "version": "2.10.0", 1115 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 1116 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 1117 | "optional": true 1118 | }, 1119 | "needle": { 1120 | "version": "2.2.0", 1121 | "bundled": true, 1122 | "optional": true, 1123 | "requires": { 1124 | "debug": "^2.1.2", 1125 | "iconv-lite": "^0.4.4", 1126 | "sax": "^1.2.4" 1127 | } 1128 | }, 1129 | "node-pre-gyp": { 1130 | "version": "0.10.0", 1131 | "bundled": true, 1132 | "optional": true, 1133 | "requires": { 1134 | "detect-libc": "^1.0.2", 1135 | "mkdirp": "^0.5.1", 1136 | "needle": "^2.2.0", 1137 | "nopt": "^4.0.1", 1138 | "npm-packlist": "^1.1.6", 1139 | "npmlog": "^4.0.2", 1140 | "rc": "^1.1.7", 1141 | "rimraf": "^2.6.1", 1142 | "semver": "^5.3.0", 1143 | "tar": "^4" 1144 | } 1145 | }, 1146 | "nopt": { 1147 | "version": "4.0.1", 1148 | "bundled": true, 1149 | "optional": true, 1150 | "requires": { 1151 | "abbrev": "1", 1152 | "osenv": "^0.1.4" 1153 | } 1154 | }, 1155 | "npm-bundled": { 1156 | "version": "1.0.3", 1157 | "bundled": true, 1158 | "optional": true 1159 | }, 1160 | "npm-packlist": { 1161 | "version": "1.1.10", 1162 | "bundled": true, 1163 | "optional": true, 1164 | "requires": { 1165 | "ignore-walk": "^3.0.1", 1166 | "npm-bundled": "^1.0.1" 1167 | } 1168 | }, 1169 | "npmlog": { 1170 | "version": "4.1.2", 1171 | "bundled": true, 1172 | "optional": true, 1173 | "requires": { 1174 | "are-we-there-yet": "~1.1.2", 1175 | "console-control-strings": "~1.1.0", 1176 | "gauge": "~2.7.3", 1177 | "set-blocking": "~2.0.0" 1178 | } 1179 | }, 1180 | "number-is-nan": { 1181 | "version": "1.0.1", 1182 | "bundled": true 1183 | }, 1184 | "object-assign": { 1185 | "version": "4.1.1", 1186 | "bundled": true, 1187 | "optional": true 1188 | }, 1189 | "once": { 1190 | "version": "1.4.0", 1191 | "bundled": true, 1192 | "requires": { 1193 | "wrappy": "1" 1194 | } 1195 | }, 1196 | "os-homedir": { 1197 | "version": "1.0.2", 1198 | "bundled": true, 1199 | "optional": true 1200 | }, 1201 | "os-tmpdir": { 1202 | "version": "1.0.2", 1203 | "bundled": true, 1204 | "optional": true 1205 | }, 1206 | "osenv": { 1207 | "version": "0.1.5", 1208 | "bundled": true, 1209 | "optional": true, 1210 | "requires": { 1211 | "os-homedir": "^1.0.0", 1212 | "os-tmpdir": "^1.0.0" 1213 | } 1214 | }, 1215 | "path-is-absolute": { 1216 | "version": "1.0.1", 1217 | "bundled": true, 1218 | "optional": true 1219 | }, 1220 | "process-nextick-args": { 1221 | "version": "2.0.0", 1222 | "bundled": true, 1223 | "optional": true 1224 | }, 1225 | "rc": { 1226 | "version": "1.2.7", 1227 | "bundled": true, 1228 | "optional": true, 1229 | "requires": { 1230 | "deep-extend": "^0.5.1", 1231 | "ini": "~1.3.0", 1232 | "minimist": "^1.2.0", 1233 | "strip-json-comments": "~2.0.1" 1234 | }, 1235 | "dependencies": { 1236 | "minimist": { 1237 | "version": "1.2.0", 1238 | "bundled": true, 1239 | "optional": true 1240 | } 1241 | } 1242 | }, 1243 | "readable-stream": { 1244 | "version": "2.3.6", 1245 | "bundled": true, 1246 | "optional": true, 1247 | "requires": { 1248 | "core-util-is": "~1.0.0", 1249 | "inherits": "~2.0.3", 1250 | "isarray": "~1.0.0", 1251 | "process-nextick-args": "~2.0.0", 1252 | "safe-buffer": "~5.1.1", 1253 | "string_decoder": "~1.1.1", 1254 | "util-deprecate": "~1.0.1" 1255 | } 1256 | }, 1257 | "rimraf": { 1258 | "version": "2.6.2", 1259 | "bundled": true, 1260 | "optional": true, 1261 | "requires": { 1262 | "glob": "^7.0.5" 1263 | } 1264 | }, 1265 | "safe-buffer": { 1266 | "version": "5.1.1", 1267 | "bundled": true 1268 | }, 1269 | "safer-buffer": { 1270 | "version": "2.1.2", 1271 | "bundled": true, 1272 | "optional": true 1273 | }, 1274 | "sax": { 1275 | "version": "1.2.4", 1276 | "bundled": true, 1277 | "optional": true 1278 | }, 1279 | "semver": { 1280 | "version": "5.5.0", 1281 | "bundled": true, 1282 | "optional": true 1283 | }, 1284 | "set-blocking": { 1285 | "version": "2.0.0", 1286 | "bundled": true, 1287 | "optional": true 1288 | }, 1289 | "signal-exit": { 1290 | "version": "3.0.2", 1291 | "bundled": true, 1292 | "optional": true 1293 | }, 1294 | "string-width": { 1295 | "version": "1.0.2", 1296 | "bundled": true, 1297 | "requires": { 1298 | "code-point-at": "^1.0.0", 1299 | "is-fullwidth-code-point": "^1.0.0", 1300 | "strip-ansi": "^3.0.0" 1301 | } 1302 | }, 1303 | "string_decoder": { 1304 | "version": "1.1.1", 1305 | "bundled": true, 1306 | "optional": true, 1307 | "requires": { 1308 | "safe-buffer": "~5.1.0" 1309 | } 1310 | }, 1311 | "strip-ansi": { 1312 | "version": "3.0.1", 1313 | "bundled": true, 1314 | "requires": { 1315 | "ansi-regex": "^2.0.0" 1316 | } 1317 | }, 1318 | "strip-json-comments": { 1319 | "version": "2.0.1", 1320 | "bundled": true, 1321 | "optional": true 1322 | }, 1323 | "tar": { 1324 | "version": "4.4.1", 1325 | "bundled": true, 1326 | "optional": true, 1327 | "requires": { 1328 | "chownr": "^1.0.1", 1329 | "fs-minipass": "^1.2.5", 1330 | "minipass": "^2.2.4", 1331 | "minizlib": "^1.1.0", 1332 | "mkdirp": "^0.5.0", 1333 | "safe-buffer": "^5.1.1", 1334 | "yallist": "^3.0.2" 1335 | } 1336 | }, 1337 | "util-deprecate": { 1338 | "version": "1.0.2", 1339 | "bundled": true, 1340 | "optional": true 1341 | }, 1342 | "wide-align": { 1343 | "version": "1.1.2", 1344 | "bundled": true, 1345 | "optional": true, 1346 | "requires": { 1347 | "string-width": "^1.0.2" 1348 | } 1349 | }, 1350 | "wrappy": { 1351 | "version": "1.0.2", 1352 | "bundled": true 1353 | }, 1354 | "yallist": { 1355 | "version": "3.0.2", 1356 | "bundled": true 1357 | } 1358 | } 1359 | }, 1360 | "get-func-name": { 1361 | "version": "2.0.0", 1362 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1363 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 1364 | "dev": true 1365 | }, 1366 | "getpass": { 1367 | "version": "0.1.7", 1368 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1369 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1370 | "requires": { 1371 | "assert-plus": "^1.0.0" 1372 | } 1373 | }, 1374 | "glob": { 1375 | "version": "7.1.2", 1376 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1377 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1378 | "requires": { 1379 | "fs.realpath": "^1.0.0", 1380 | "inflight": "^1.0.4", 1381 | "inherits": "2", 1382 | "minimatch": "^3.0.4", 1383 | "once": "^1.3.0", 1384 | "path-is-absolute": "^1.0.0" 1385 | } 1386 | }, 1387 | "glob-base": { 1388 | "version": "0.3.0", 1389 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1390 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1391 | "requires": { 1392 | "glob-parent": "^2.0.0", 1393 | "is-glob": "^2.0.0" 1394 | } 1395 | }, 1396 | "glob-parent": { 1397 | "version": "2.0.0", 1398 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1399 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1400 | "requires": { 1401 | "is-glob": "^2.0.0" 1402 | } 1403 | }, 1404 | "graceful-fs": { 1405 | "version": "4.1.11", 1406 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1407 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1408 | }, 1409 | "handlebars": { 1410 | "version": "4.0.5", 1411 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", 1412 | "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", 1413 | "requires": { 1414 | "async": "^1.4.0", 1415 | "optimist": "^0.6.1", 1416 | "source-map": "^0.4.4", 1417 | "uglify-js": "^2.6" 1418 | } 1419 | }, 1420 | "har-schema": { 1421 | "version": "2.0.0", 1422 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1423 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1424 | }, 1425 | "har-validator": { 1426 | "version": "5.0.3", 1427 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 1428 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 1429 | "requires": { 1430 | "ajv": "^5.1.0", 1431 | "har-schema": "^2.0.0" 1432 | } 1433 | }, 1434 | "has-flag": { 1435 | "version": "2.0.0", 1436 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1437 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" 1438 | }, 1439 | "hbs": { 1440 | "version": "4.0.1", 1441 | "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.0.1.tgz", 1442 | "integrity": "sha1-S/2YZQ3IydrESzyprfnAmOi8M7Y=", 1443 | "requires": { 1444 | "handlebars": "4.0.5", 1445 | "walk": "2.3.9" 1446 | } 1447 | }, 1448 | "http-errors": { 1449 | "version": "1.6.2", 1450 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 1451 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 1452 | "requires": { 1453 | "depd": "1.1.1", 1454 | "inherits": "2.0.3", 1455 | "setprototypeof": "1.0.3", 1456 | "statuses": ">= 1.3.1 < 2" 1457 | }, 1458 | "dependencies": { 1459 | "depd": { 1460 | "version": "1.1.1", 1461 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 1462 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 1463 | }, 1464 | "setprototypeof": { 1465 | "version": "1.0.3", 1466 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 1467 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 1468 | } 1469 | } 1470 | }, 1471 | "http-signature": { 1472 | "version": "1.2.0", 1473 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1474 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1475 | "requires": { 1476 | "assert-plus": "^1.0.0", 1477 | "jsprim": "^1.2.2", 1478 | "sshpk": "^1.7.0" 1479 | } 1480 | }, 1481 | "iconv-lite": { 1482 | "version": "0.4.6", 1483 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.6.tgz", 1484 | "integrity": "sha1-45xoJhCnkfPu3Cc4L/SeJj+R+gk=" 1485 | }, 1486 | "inflight": { 1487 | "version": "1.0.6", 1488 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1489 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1490 | "requires": { 1491 | "once": "^1.3.0", 1492 | "wrappy": "1" 1493 | } 1494 | }, 1495 | "inherits": { 1496 | "version": "2.0.3", 1497 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1498 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1499 | }, 1500 | "ipaddr.js": { 1501 | "version": "1.5.2", 1502 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", 1503 | "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" 1504 | }, 1505 | "is-binary-path": { 1506 | "version": "1.0.1", 1507 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1508 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1509 | "requires": { 1510 | "binary-extensions": "^1.0.0" 1511 | } 1512 | }, 1513 | "is-buffer": { 1514 | "version": "1.1.6", 1515 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1516 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1517 | }, 1518 | "is-dotfile": { 1519 | "version": "1.0.3", 1520 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1521 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" 1522 | }, 1523 | "is-equal-shallow": { 1524 | "version": "0.1.3", 1525 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1526 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1527 | "requires": { 1528 | "is-primitive": "^2.0.0" 1529 | } 1530 | }, 1531 | "is-extendable": { 1532 | "version": "0.1.1", 1533 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1534 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1535 | }, 1536 | "is-extglob": { 1537 | "version": "1.0.0", 1538 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1539 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" 1540 | }, 1541 | "is-glob": { 1542 | "version": "2.0.1", 1543 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1544 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1545 | "requires": { 1546 | "is-extglob": "^1.0.0" 1547 | } 1548 | }, 1549 | "is-number": { 1550 | "version": "2.1.0", 1551 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1552 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1553 | "requires": { 1554 | "kind-of": "^3.0.2" 1555 | } 1556 | }, 1557 | "is-posix-bracket": { 1558 | "version": "0.1.1", 1559 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1560 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" 1561 | }, 1562 | "is-primitive": { 1563 | "version": "2.0.0", 1564 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1565 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" 1566 | }, 1567 | "is-typedarray": { 1568 | "version": "1.0.0", 1569 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1570 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1571 | }, 1572 | "is-windows": { 1573 | "version": "1.0.1", 1574 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", 1575 | "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", 1576 | "dev": true 1577 | }, 1578 | "isarray": { 1579 | "version": "0.0.1", 1580 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1581 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1582 | }, 1583 | "isexe": { 1584 | "version": "2.0.0", 1585 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1586 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1587 | "dev": true 1588 | }, 1589 | "isobject": { 1590 | "version": "2.1.0", 1591 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1592 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1593 | "requires": { 1594 | "isarray": "1.0.0" 1595 | }, 1596 | "dependencies": { 1597 | "isarray": { 1598 | "version": "1.0.0", 1599 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1600 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1601 | } 1602 | } 1603 | }, 1604 | "isstream": { 1605 | "version": "0.1.2", 1606 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1607 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1608 | }, 1609 | "istanbul": { 1610 | "version": "0.4.5", 1611 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 1612 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 1613 | "dev": true, 1614 | "requires": { 1615 | "abbrev": "1.0.x", 1616 | "async": "1.x", 1617 | "escodegen": "1.8.x", 1618 | "esprima": "2.7.x", 1619 | "glob": "^5.0.15", 1620 | "handlebars": "^4.0.1", 1621 | "js-yaml": "3.x", 1622 | "mkdirp": "0.5.x", 1623 | "nopt": "3.x", 1624 | "once": "1.x", 1625 | "resolve": "1.1.x", 1626 | "supports-color": "^3.1.0", 1627 | "which": "^1.1.1", 1628 | "wordwrap": "^1.0.0" 1629 | }, 1630 | "dependencies": { 1631 | "esprima": { 1632 | "version": "2.7.3", 1633 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1634 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1635 | "dev": true 1636 | }, 1637 | "glob": { 1638 | "version": "5.0.15", 1639 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1640 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1641 | "dev": true, 1642 | "requires": { 1643 | "inflight": "^1.0.4", 1644 | "inherits": "2", 1645 | "minimatch": "2 || 3", 1646 | "once": "^1.3.0", 1647 | "path-is-absolute": "^1.0.0" 1648 | } 1649 | }, 1650 | "has-flag": { 1651 | "version": "1.0.0", 1652 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1653 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1654 | "dev": true 1655 | }, 1656 | "supports-color": { 1657 | "version": "3.2.3", 1658 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 1659 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 1660 | "dev": true, 1661 | "requires": { 1662 | "has-flag": "^1.0.0" 1663 | } 1664 | }, 1665 | "wordwrap": { 1666 | "version": "1.0.0", 1667 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1668 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1669 | "dev": true 1670 | } 1671 | } 1672 | }, 1673 | "jasmine": { 1674 | "version": "2.8.0", 1675 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", 1676 | "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", 1677 | "dev": true, 1678 | "requires": { 1679 | "exit": "^0.1.2", 1680 | "glob": "^7.0.6", 1681 | "jasmine-core": "~2.8.0" 1682 | } 1683 | }, 1684 | "jasmine-core": { 1685 | "version": "2.8.0", 1686 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", 1687 | "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", 1688 | "dev": true 1689 | }, 1690 | "jasmine-spec-reporter": { 1691 | "version": "4.2.1", 1692 | "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", 1693 | "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", 1694 | "dev": true, 1695 | "requires": { 1696 | "colors": "1.1.2" 1697 | }, 1698 | "dependencies": { 1699 | "colors": { 1700 | "version": "1.1.2", 1701 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 1702 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 1703 | "dev": true 1704 | } 1705 | } 1706 | }, 1707 | "js-yaml": { 1708 | "version": "3.10.0", 1709 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 1710 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 1711 | "requires": { 1712 | "argparse": "^1.0.7", 1713 | "esprima": "^4.0.0" 1714 | } 1715 | }, 1716 | "jsbn": { 1717 | "version": "0.1.1", 1718 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1719 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1720 | "optional": true 1721 | }, 1722 | "json-schema": { 1723 | "version": "0.2.3", 1724 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1725 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1726 | }, 1727 | "json-schema-ref-parser": { 1728 | "version": "1.4.1", 1729 | "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz", 1730 | "integrity": "sha1-wMLkOL8HlnI7AkUbrovH3Qs3/tA=", 1731 | "requires": { 1732 | "call-me-maybe": "^1.0.1", 1733 | "debug": "^2.2.0", 1734 | "es6-promise": "^3.0.2", 1735 | "js-yaml": "^3.4.6", 1736 | "ono": "^2.0.1" 1737 | }, 1738 | "dependencies": { 1739 | "debug": { 1740 | "version": "2.6.9", 1741 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1742 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1743 | "requires": { 1744 | "ms": "2.0.0" 1745 | } 1746 | }, 1747 | "es6-promise": { 1748 | "version": "3.3.1", 1749 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 1750 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" 1751 | }, 1752 | "ms": { 1753 | "version": "2.0.0", 1754 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1755 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1756 | }, 1757 | "ono": { 1758 | "version": "2.2.5", 1759 | "resolved": "https://registry.npmjs.org/ono/-/ono-2.2.5.tgz", 1760 | "integrity": "sha1-2vCUiLURdNp6fkJ136sxtDj/oOM=" 1761 | } 1762 | } 1763 | }, 1764 | "json-schema-traverse": { 1765 | "version": "0.3.1", 1766 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1767 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 1768 | }, 1769 | "json-stringify-safe": { 1770 | "version": "5.0.1", 1771 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1772 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1773 | }, 1774 | "jsprim": { 1775 | "version": "1.4.1", 1776 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1777 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1778 | "requires": { 1779 | "assert-plus": "1.0.0", 1780 | "extsprintf": "1.3.0", 1781 | "json-schema": "0.2.3", 1782 | "verror": "1.10.0" 1783 | } 1784 | }, 1785 | "just-extend": { 1786 | "version": "1.1.27", 1787 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", 1788 | "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==" 1789 | }, 1790 | "kind-of": { 1791 | "version": "3.2.2", 1792 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1793 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1794 | "requires": { 1795 | "is-buffer": "^1.1.5" 1796 | } 1797 | }, 1798 | "lazy-cache": { 1799 | "version": "1.0.4", 1800 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1801 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1802 | "optional": true 1803 | }, 1804 | "levn": { 1805 | "version": "0.3.0", 1806 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1807 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1808 | "dev": true, 1809 | "requires": { 1810 | "prelude-ls": "~1.1.2", 1811 | "type-check": "~0.3.2" 1812 | } 1813 | }, 1814 | "lodash": { 1815 | "version": "4.17.10", 1816 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 1817 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 1818 | }, 1819 | "lodash.get": { 1820 | "version": "4.4.2", 1821 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 1822 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 1823 | }, 1824 | "lodash.isequal": { 1825 | "version": "4.5.0", 1826 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1827 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" 1828 | }, 1829 | "lolex": { 1830 | "version": "2.3.1", 1831 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.1.tgz", 1832 | "integrity": "sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw==" 1833 | }, 1834 | "longest": { 1835 | "version": "1.0.1", 1836 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1837 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 1838 | }, 1839 | "lru-cache": { 1840 | "version": "4.1.1", 1841 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 1842 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 1843 | "dev": true, 1844 | "requires": { 1845 | "pseudomap": "^1.0.2", 1846 | "yallist": "^2.1.2" 1847 | } 1848 | }, 1849 | "math-random": { 1850 | "version": "1.0.1", 1851 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 1852 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" 1853 | }, 1854 | "media-typer": { 1855 | "version": "0.3.0", 1856 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1857 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1858 | }, 1859 | "merge-descriptors": { 1860 | "version": "1.0.1", 1861 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1862 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1863 | }, 1864 | "methods": { 1865 | "version": "1.1.2", 1866 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1867 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1868 | }, 1869 | "micromatch": { 1870 | "version": "2.3.11", 1871 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1872 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1873 | "requires": { 1874 | "arr-diff": "^2.0.0", 1875 | "array-unique": "^0.2.1", 1876 | "braces": "^1.8.2", 1877 | "expand-brackets": "^0.1.4", 1878 | "extglob": "^0.3.1", 1879 | "filename-regex": "^2.0.0", 1880 | "is-extglob": "^1.0.0", 1881 | "is-glob": "^2.0.1", 1882 | "kind-of": "^3.0.2", 1883 | "normalize-path": "^2.0.1", 1884 | "object.omit": "^2.0.0", 1885 | "parse-glob": "^3.0.4", 1886 | "regex-cache": "^0.4.2" 1887 | } 1888 | }, 1889 | "mime": { 1890 | "version": "1.4.1", 1891 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1892 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 1893 | }, 1894 | "mime-db": { 1895 | "version": "1.12.0", 1896 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", 1897 | "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" 1898 | }, 1899 | "mime-types": { 1900 | "version": "2.0.14", 1901 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", 1902 | "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", 1903 | "requires": { 1904 | "mime-db": "~1.12.0" 1905 | } 1906 | }, 1907 | "minimatch": { 1908 | "version": "3.0.4", 1909 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1910 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1911 | "requires": { 1912 | "brace-expansion": "^1.1.7" 1913 | } 1914 | }, 1915 | "minimist": { 1916 | "version": "0.0.10", 1917 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1918 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 1919 | }, 1920 | "mkdirp": { 1921 | "version": "0.5.1", 1922 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1923 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1924 | "requires": { 1925 | "minimist": "0.0.8" 1926 | }, 1927 | "dependencies": { 1928 | "minimist": { 1929 | "version": "0.0.8", 1930 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1931 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1932 | } 1933 | } 1934 | }, 1935 | "negotiator": { 1936 | "version": "0.6.1", 1937 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1938 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1939 | }, 1940 | "nise": { 1941 | "version": "1.2.0", 1942 | "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz", 1943 | "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", 1944 | "requires": { 1945 | "formatio": "^1.2.0", 1946 | "just-extend": "^1.1.26", 1947 | "lolex": "^1.6.0", 1948 | "path-to-regexp": "^1.7.0", 1949 | "text-encoding": "^0.6.4" 1950 | }, 1951 | "dependencies": { 1952 | "lolex": { 1953 | "version": "1.6.0", 1954 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", 1955 | "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=" 1956 | }, 1957 | "path-to-regexp": { 1958 | "version": "1.7.0", 1959 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", 1960 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", 1961 | "requires": { 1962 | "isarray": "0.0.1" 1963 | } 1964 | } 1965 | } 1966 | }, 1967 | "nopt": { 1968 | "version": "3.0.6", 1969 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1970 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1971 | "dev": true, 1972 | "requires": { 1973 | "abbrev": "1" 1974 | } 1975 | }, 1976 | "normalize-path": { 1977 | "version": "2.1.1", 1978 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1979 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1980 | "requires": { 1981 | "remove-trailing-separator": "^1.0.1" 1982 | } 1983 | }, 1984 | "oauth-sign": { 1985 | "version": "0.8.2", 1986 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1987 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1988 | }, 1989 | "object.omit": { 1990 | "version": "2.0.1", 1991 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1992 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1993 | "requires": { 1994 | "for-own": "^0.1.4", 1995 | "is-extendable": "^0.1.1" 1996 | } 1997 | }, 1998 | "on-finished": { 1999 | "version": "2.2.1", 2000 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz", 2001 | "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=", 2002 | "requires": { 2003 | "ee-first": "1.1.0" 2004 | } 2005 | }, 2006 | "once": { 2007 | "version": "1.4.0", 2008 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2009 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2010 | "requires": { 2011 | "wrappy": "1" 2012 | } 2013 | }, 2014 | "ono": { 2015 | "version": "4.0.2", 2016 | "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.2.tgz", 2017 | "integrity": "sha512-EFXJFoeF+KkZW4lwmcPMKHp2ZU7o6CM+ccX2nPbEJKiJIdyqbIcS1v6pmNgeNJ6x4/vEYn0/8oz66qXSPnnmSQ==", 2018 | "requires": { 2019 | "format-util": "^1.0.3" 2020 | } 2021 | }, 2022 | "optimist": { 2023 | "version": "0.6.1", 2024 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 2025 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 2026 | "requires": { 2027 | "minimist": "~0.0.1", 2028 | "wordwrap": "~0.0.2" 2029 | } 2030 | }, 2031 | "optionator": { 2032 | "version": "0.8.2", 2033 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 2034 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2035 | "dev": true, 2036 | "requires": { 2037 | "deep-is": "~0.1.3", 2038 | "fast-levenshtein": "~2.0.4", 2039 | "levn": "~0.3.0", 2040 | "prelude-ls": "~1.1.2", 2041 | "type-check": "~0.3.2", 2042 | "wordwrap": "~1.0.0" 2043 | }, 2044 | "dependencies": { 2045 | "wordwrap": { 2046 | "version": "1.0.0", 2047 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2048 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2049 | "dev": true 2050 | } 2051 | } 2052 | }, 2053 | "parse-glob": { 2054 | "version": "3.0.4", 2055 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 2056 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 2057 | "requires": { 2058 | "glob-base": "^0.3.0", 2059 | "is-dotfile": "^1.0.0", 2060 | "is-extglob": "^1.0.0", 2061 | "is-glob": "^2.0.0" 2062 | } 2063 | }, 2064 | "parseurl": { 2065 | "version": "1.3.2", 2066 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2067 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2068 | }, 2069 | "path-is-absolute": { 2070 | "version": "1.0.1", 2071 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2072 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2073 | }, 2074 | "path-to-regexp": { 2075 | "version": "0.1.7", 2076 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2077 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2078 | }, 2079 | "pathval": { 2080 | "version": "1.1.0", 2081 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 2082 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 2083 | "dev": true 2084 | }, 2085 | "performance-now": { 2086 | "version": "2.1.0", 2087 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2088 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2089 | }, 2090 | "prelude-ls": { 2091 | "version": "1.1.2", 2092 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2093 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2094 | "dev": true 2095 | }, 2096 | "preserve": { 2097 | "version": "0.2.0", 2098 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 2099 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" 2100 | }, 2101 | "process-nextick-args": { 2102 | "version": "1.0.7", 2103 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2104 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 2105 | }, 2106 | "proxy-addr": { 2107 | "version": "2.0.2", 2108 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", 2109 | "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", 2110 | "requires": { 2111 | "forwarded": "~0.1.2", 2112 | "ipaddr.js": "1.5.2" 2113 | } 2114 | }, 2115 | "pseudomap": { 2116 | "version": "1.0.2", 2117 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2118 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 2119 | "dev": true 2120 | }, 2121 | "punycode": { 2122 | "version": "1.4.1", 2123 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2124 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 2125 | }, 2126 | "qs": { 2127 | "version": "2.3.3", 2128 | "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", 2129 | "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=" 2130 | }, 2131 | "range-parser": { 2132 | "version": "1.2.0", 2133 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2134 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2135 | }, 2136 | "raw-body": { 2137 | "version": "1.3.2", 2138 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.2.tgz", 2139 | "integrity": "sha1-DhhvJ8X7/jJtizBid0gEVkoOz5M=", 2140 | "requires": { 2141 | "bytes": "1.0.0", 2142 | "iconv-lite": "0.4.6" 2143 | } 2144 | }, 2145 | "readable-stream": { 2146 | "version": "2.3.3", 2147 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 2148 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 2149 | "requires": { 2150 | "core-util-is": "~1.0.0", 2151 | "inherits": "~2.0.3", 2152 | "isarray": "~1.0.0", 2153 | "process-nextick-args": "~1.0.6", 2154 | "safe-buffer": "~5.1.1", 2155 | "string_decoder": "~1.0.3", 2156 | "util-deprecate": "~1.0.1" 2157 | }, 2158 | "dependencies": { 2159 | "isarray": { 2160 | "version": "1.0.0", 2161 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2162 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2163 | } 2164 | } 2165 | }, 2166 | "readdirp": { 2167 | "version": "2.1.0", 2168 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 2169 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 2170 | "requires": { 2171 | "graceful-fs": "^4.1.2", 2172 | "minimatch": "^3.0.2", 2173 | "readable-stream": "^2.0.2", 2174 | "set-immediate-shim": "^1.0.1" 2175 | } 2176 | }, 2177 | "recursive-iterator": { 2178 | "version": "2.0.3", 2179 | "resolved": "https://registry.npmjs.org/recursive-iterator/-/recursive-iterator-2.0.3.tgz", 2180 | "integrity": "sha1-0ODSx+eoMQnXMJHPBD/FCeWnbcM=" 2181 | }, 2182 | "regex-cache": { 2183 | "version": "0.4.4", 2184 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 2185 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 2186 | "requires": { 2187 | "is-equal-shallow": "^0.1.3" 2188 | } 2189 | }, 2190 | "remove-trailing-separator": { 2191 | "version": "1.1.0", 2192 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2193 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 2194 | }, 2195 | "repeat-element": { 2196 | "version": "1.1.2", 2197 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 2198 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" 2199 | }, 2200 | "repeat-string": { 2201 | "version": "1.6.1", 2202 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2203 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2204 | }, 2205 | "request": { 2206 | "version": "2.87.0", 2207 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", 2208 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", 2209 | "requires": { 2210 | "aws-sign2": "~0.7.0", 2211 | "aws4": "^1.6.0", 2212 | "caseless": "~0.12.0", 2213 | "combined-stream": "~1.0.5", 2214 | "extend": "~3.0.1", 2215 | "forever-agent": "~0.6.1", 2216 | "form-data": "~2.3.1", 2217 | "har-validator": "~5.0.3", 2218 | "http-signature": "~1.2.0", 2219 | "is-typedarray": "~1.0.0", 2220 | "isstream": "~0.1.2", 2221 | "json-stringify-safe": "~5.0.1", 2222 | "mime-types": "~2.1.17", 2223 | "oauth-sign": "~0.8.2", 2224 | "performance-now": "^2.1.0", 2225 | "qs": "~6.5.1", 2226 | "safe-buffer": "^5.1.1", 2227 | "tough-cookie": "~2.3.3", 2228 | "tunnel-agent": "^0.6.0", 2229 | "uuid": "^3.1.0" 2230 | }, 2231 | "dependencies": { 2232 | "mime-db": { 2233 | "version": "1.33.0", 2234 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 2235 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 2236 | }, 2237 | "mime-types": { 2238 | "version": "2.1.18", 2239 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 2240 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 2241 | "requires": { 2242 | "mime-db": "~1.33.0" 2243 | } 2244 | }, 2245 | "qs": { 2246 | "version": "6.5.2", 2247 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2248 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2249 | } 2250 | } 2251 | }, 2252 | "request-promise-core": { 2253 | "version": "1.1.1", 2254 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 2255 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", 2256 | "requires": { 2257 | "lodash": "^4.13.1" 2258 | } 2259 | }, 2260 | "request-promise-native": { 2261 | "version": "1.0.5", 2262 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", 2263 | "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", 2264 | "requires": { 2265 | "request-promise-core": "1.1.1", 2266 | "stealthy-require": "^1.1.0", 2267 | "tough-cookie": ">=2.3.3" 2268 | } 2269 | }, 2270 | "resolve": { 2271 | "version": "1.1.7", 2272 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 2273 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 2274 | "dev": true 2275 | }, 2276 | "right-align": { 2277 | "version": "0.1.3", 2278 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 2279 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 2280 | "optional": true, 2281 | "requires": { 2282 | "align-text": "^0.1.1" 2283 | } 2284 | }, 2285 | "safe-buffer": { 2286 | "version": "5.1.1", 2287 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2288 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 2289 | }, 2290 | "samsam": { 2291 | "version": "1.3.0", 2292 | "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", 2293 | "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==" 2294 | }, 2295 | "send": { 2296 | "version": "0.16.1", 2297 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", 2298 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", 2299 | "requires": { 2300 | "debug": "2.6.9", 2301 | "depd": "~1.1.1", 2302 | "destroy": "~1.0.4", 2303 | "encodeurl": "~1.0.1", 2304 | "escape-html": "~1.0.3", 2305 | "etag": "~1.8.1", 2306 | "fresh": "0.5.2", 2307 | "http-errors": "~1.6.2", 2308 | "mime": "1.4.1", 2309 | "ms": "2.0.0", 2310 | "on-finished": "~2.3.0", 2311 | "range-parser": "~1.2.0", 2312 | "statuses": "~1.3.1" 2313 | }, 2314 | "dependencies": { 2315 | "debug": { 2316 | "version": "2.6.9", 2317 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2318 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2319 | "requires": { 2320 | "ms": "2.0.0" 2321 | } 2322 | }, 2323 | "depd": { 2324 | "version": "1.1.1", 2325 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 2326 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 2327 | }, 2328 | "ee-first": { 2329 | "version": "1.1.1", 2330 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 2331 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 2332 | }, 2333 | "fresh": { 2334 | "version": "0.5.2", 2335 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2336 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 2337 | }, 2338 | "ms": { 2339 | "version": "2.0.0", 2340 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2341 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2342 | }, 2343 | "on-finished": { 2344 | "version": "2.3.0", 2345 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2346 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2347 | "requires": { 2348 | "ee-first": "1.1.1" 2349 | } 2350 | } 2351 | } 2352 | }, 2353 | "serve-favicon": { 2354 | "version": "2.4.5", 2355 | "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", 2356 | "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", 2357 | "requires": { 2358 | "etag": "~1.8.1", 2359 | "fresh": "0.5.2", 2360 | "ms": "2.0.0", 2361 | "parseurl": "~1.3.2", 2362 | "safe-buffer": "5.1.1" 2363 | }, 2364 | "dependencies": { 2365 | "ms": { 2366 | "version": "2.0.0", 2367 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2368 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2369 | } 2370 | } 2371 | }, 2372 | "serve-static": { 2373 | "version": "1.13.1", 2374 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", 2375 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", 2376 | "requires": { 2377 | "encodeurl": "~1.0.1", 2378 | "escape-html": "~1.0.3", 2379 | "parseurl": "~1.3.2", 2380 | "send": "0.16.1" 2381 | } 2382 | }, 2383 | "set-immediate-shim": { 2384 | "version": "1.0.1", 2385 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 2386 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" 2387 | }, 2388 | "setprototypeof": { 2389 | "version": "1.1.0", 2390 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2391 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 2392 | }, 2393 | "shebang-command": { 2394 | "version": "1.2.0", 2395 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2396 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2397 | "dev": true, 2398 | "requires": { 2399 | "shebang-regex": "^1.0.0" 2400 | } 2401 | }, 2402 | "shebang-regex": { 2403 | "version": "1.0.0", 2404 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2405 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2406 | "dev": true 2407 | }, 2408 | "sinon": { 2409 | "version": "4.1.3", 2410 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.3.tgz", 2411 | "integrity": "sha512-c7u0ZuvBRX1eXuB4jN3BRCAOGiUTlM8SE3TxbJHrNiHUKL7wonujMOB6Fi1gQc00U91IscFORQHDga/eccqpbw==", 2412 | "requires": { 2413 | "diff": "^3.1.0", 2414 | "formatio": "1.2.0", 2415 | "lodash.get": "^4.4.2", 2416 | "lolex": "^2.2.0", 2417 | "nise": "^1.2.0", 2418 | "supports-color": "^4.4.0", 2419 | "type-detect": "^4.0.5" 2420 | } 2421 | }, 2422 | "source-map": { 2423 | "version": "0.4.4", 2424 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 2425 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 2426 | "requires": { 2427 | "amdefine": ">=0.0.4" 2428 | } 2429 | }, 2430 | "sprintf-js": { 2431 | "version": "1.0.3", 2432 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2433 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 2434 | }, 2435 | "sshpk": { 2436 | "version": "1.14.1", 2437 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", 2438 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", 2439 | "requires": { 2440 | "asn1": "~0.2.3", 2441 | "assert-plus": "^1.0.0", 2442 | "bcrypt-pbkdf": "^1.0.0", 2443 | "dashdash": "^1.12.0", 2444 | "ecc-jsbn": "~0.1.1", 2445 | "getpass": "^0.1.1", 2446 | "jsbn": "~0.1.0", 2447 | "tweetnacl": "~0.14.0" 2448 | } 2449 | }, 2450 | "stack-trace": { 2451 | "version": "0.0.10", 2452 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 2453 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 2454 | }, 2455 | "statuses": { 2456 | "version": "1.3.1", 2457 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 2458 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 2459 | }, 2460 | "stealthy-require": { 2461 | "version": "1.1.1", 2462 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 2463 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 2464 | }, 2465 | "string_decoder": { 2466 | "version": "1.0.3", 2467 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2468 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2469 | "requires": { 2470 | "safe-buffer": "~5.1.0" 2471 | } 2472 | }, 2473 | "superagent": { 2474 | "version": "3.8.2", 2475 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", 2476 | "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", 2477 | "dev": true, 2478 | "requires": { 2479 | "component-emitter": "^1.2.0", 2480 | "cookiejar": "^2.1.0", 2481 | "debug": "^3.1.0", 2482 | "extend": "^3.0.0", 2483 | "form-data": "^2.3.1", 2484 | "formidable": "^1.1.1", 2485 | "methods": "^1.1.1", 2486 | "mime": "^1.4.1", 2487 | "qs": "^6.5.1", 2488 | "readable-stream": "^2.0.5" 2489 | }, 2490 | "dependencies": { 2491 | "debug": { 2492 | "version": "3.1.0", 2493 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2494 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2495 | "dev": true, 2496 | "requires": { 2497 | "ms": "2.0.0" 2498 | } 2499 | }, 2500 | "mime": { 2501 | "version": "1.6.0", 2502 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2503 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2504 | "dev": true 2505 | }, 2506 | "ms": { 2507 | "version": "2.0.0", 2508 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2509 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2510 | "dev": true 2511 | }, 2512 | "qs": { 2513 | "version": "6.5.1", 2514 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 2515 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", 2516 | "dev": true 2517 | } 2518 | } 2519 | }, 2520 | "supertest": { 2521 | "version": "3.0.0", 2522 | "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", 2523 | "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", 2524 | "dev": true, 2525 | "requires": { 2526 | "methods": "~1.1.2", 2527 | "superagent": "^3.0.0" 2528 | } 2529 | }, 2530 | "supports-color": { 2531 | "version": "4.5.0", 2532 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 2533 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 2534 | "requires": { 2535 | "has-flag": "^2.0.0" 2536 | } 2537 | }, 2538 | "swagger-jsdoc": { 2539 | "version": "1.9.7", 2540 | "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz", 2541 | "integrity": "sha1-enYdTX70pUv0V86lxn7DFruC+Lk=", 2542 | "requires": { 2543 | "chokidar": "^1.7.0", 2544 | "commander": "^2.11.0", 2545 | "doctrine": "^2.0.0", 2546 | "glob": "^7.1.2", 2547 | "js-yaml": "^3.8.4", 2548 | "recursive-iterator": "^2.0.3", 2549 | "swagger-parser": "^3.4.1" 2550 | } 2551 | }, 2552 | "swagger-methods": { 2553 | "version": "1.0.4", 2554 | "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.4.tgz", 2555 | "integrity": "sha512-xrKFLbrZ6VxRsg+M3uJozJtsEpNI/aPfZsOkoEjXw8vhAqdMIqwTYGj1f4dmUgvJvCdZhV5iArgtqXgs403ltg==" 2556 | }, 2557 | "swagger-parser": { 2558 | "version": "3.4.2", 2559 | "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-3.4.2.tgz", 2560 | "integrity": "sha512-himpIkA50AjTvrgtz0PPbzwWoTjj3F3ye/y1PcW/514YEp1A3IhAcJFkkEu7b1zHnSIthnzxC8aTy+XZG0D+iA==", 2561 | "requires": { 2562 | "call-me-maybe": "^1.0.1", 2563 | "debug": "^3.0.0", 2564 | "es6-promise": "^4.1.1", 2565 | "json-schema-ref-parser": "^1.4.1", 2566 | "ono": "^4.0.2", 2567 | "swagger-methods": "^1.0.0", 2568 | "swagger-schema-official": "2.0.0-bab6bed", 2569 | "z-schema": "^3.16.1" 2570 | }, 2571 | "dependencies": { 2572 | "debug": { 2573 | "version": "3.1.0", 2574 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2575 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2576 | "requires": { 2577 | "ms": "2.0.0" 2578 | } 2579 | }, 2580 | "ms": { 2581 | "version": "2.0.0", 2582 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2583 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2584 | } 2585 | } 2586 | }, 2587 | "swagger-schema-official": { 2588 | "version": "2.0.0-bab6bed", 2589 | "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", 2590 | "integrity": "sha1-cAcEaNbSl3ylI3suUZyn0Gouo/0=" 2591 | }, 2592 | "text-encoding": { 2593 | "version": "0.6.4", 2594 | "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", 2595 | "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" 2596 | }, 2597 | "tough-cookie": { 2598 | "version": "2.3.3", 2599 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 2600 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 2601 | "requires": { 2602 | "punycode": "^1.4.1" 2603 | } 2604 | }, 2605 | "tunnel-agent": { 2606 | "version": "0.6.0", 2607 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2608 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2609 | "requires": { 2610 | "safe-buffer": "^5.0.1" 2611 | } 2612 | }, 2613 | "tweetnacl": { 2614 | "version": "0.14.5", 2615 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2616 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2617 | "optional": true 2618 | }, 2619 | "type-check": { 2620 | "version": "0.3.2", 2621 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2622 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2623 | "dev": true, 2624 | "requires": { 2625 | "prelude-ls": "~1.1.2" 2626 | } 2627 | }, 2628 | "type-detect": { 2629 | "version": "4.0.5", 2630 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", 2631 | "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==" 2632 | }, 2633 | "type-is": { 2634 | "version": "1.5.7", 2635 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", 2636 | "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=", 2637 | "requires": { 2638 | "media-typer": "0.3.0", 2639 | "mime-types": "~2.0.9" 2640 | } 2641 | }, 2642 | "uglify-js": { 2643 | "version": "2.8.29", 2644 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 2645 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 2646 | "optional": true, 2647 | "requires": { 2648 | "source-map": "~0.5.1", 2649 | "uglify-to-browserify": "~1.0.0", 2650 | "yargs": "~3.10.0" 2651 | }, 2652 | "dependencies": { 2653 | "source-map": { 2654 | "version": "0.5.7", 2655 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2656 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2657 | "optional": true 2658 | } 2659 | } 2660 | }, 2661 | "uglify-to-browserify": { 2662 | "version": "1.0.2", 2663 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 2664 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 2665 | "optional": true 2666 | }, 2667 | "unpipe": { 2668 | "version": "1.0.0", 2669 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2670 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2671 | }, 2672 | "util-deprecate": { 2673 | "version": "1.0.2", 2674 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2675 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2676 | }, 2677 | "utils-merge": { 2678 | "version": "1.0.1", 2679 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2680 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2681 | }, 2682 | "uuid": { 2683 | "version": "3.2.1", 2684 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 2685 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 2686 | }, 2687 | "validator": { 2688 | "version": "9.2.0", 2689 | "resolved": "https://registry.npmjs.org/validator/-/validator-9.2.0.tgz", 2690 | "integrity": "sha512-6Ij4Eo0KM4LkR0d0IegOwluG5453uqT5QyF5SV5Ezvm8/zmkKI/L4eoraafZGlZPC9guLkwKzgypcw8VGWWnGA==" 2691 | }, 2692 | "vary": { 2693 | "version": "1.1.2", 2694 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2695 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2696 | }, 2697 | "verror": { 2698 | "version": "1.10.0", 2699 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2700 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2701 | "requires": { 2702 | "assert-plus": "^1.0.0", 2703 | "core-util-is": "1.0.2", 2704 | "extsprintf": "^1.2.0" 2705 | } 2706 | }, 2707 | "walk": { 2708 | "version": "2.3.9", 2709 | "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.9.tgz", 2710 | "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", 2711 | "requires": { 2712 | "foreachasync": "^3.0.0" 2713 | } 2714 | }, 2715 | "which": { 2716 | "version": "1.3.0", 2717 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 2718 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 2719 | "dev": true, 2720 | "requires": { 2721 | "isexe": "^2.0.0" 2722 | } 2723 | }, 2724 | "window-size": { 2725 | "version": "0.1.0", 2726 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 2727 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 2728 | "optional": true 2729 | }, 2730 | "winston": { 2731 | "version": "2.4.0", 2732 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz", 2733 | "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=", 2734 | "requires": { 2735 | "async": "~1.0.0", 2736 | "colors": "1.0.x", 2737 | "cycle": "1.0.x", 2738 | "eyes": "0.1.x", 2739 | "isstream": "0.1.x", 2740 | "stack-trace": "0.0.x" 2741 | }, 2742 | "dependencies": { 2743 | "async": { 2744 | "version": "1.0.0", 2745 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 2746 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 2747 | } 2748 | } 2749 | }, 2750 | "winston-daily-rotate-file": { 2751 | "version": "1.7.2", 2752 | "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-1.7.2.tgz", 2753 | "integrity": "sha1-ZQK/opeCT9mC2l5WR8dThXjS+aA=", 2754 | "requires": { 2755 | "mkdirp": "0.5.1" 2756 | } 2757 | }, 2758 | "wordwrap": { 2759 | "version": "0.0.3", 2760 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2761 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 2762 | }, 2763 | "wrappy": { 2764 | "version": "1.0.2", 2765 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2766 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2767 | }, 2768 | "yallist": { 2769 | "version": "2.1.2", 2770 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2771 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2772 | "dev": true 2773 | }, 2774 | "yargs": { 2775 | "version": "3.10.0", 2776 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 2777 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 2778 | "optional": true, 2779 | "requires": { 2780 | "camelcase": "^1.0.2", 2781 | "cliui": "^2.1.0", 2782 | "decamelize": "^1.0.0", 2783 | "window-size": "0.1.0" 2784 | } 2785 | }, 2786 | "z-schema": { 2787 | "version": "3.19.0", 2788 | "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.19.0.tgz", 2789 | "integrity": "sha512-V94f3ODuluBS4kQLLjNhwoMek0dyIXCsvNu/A17dAyJ6sMhT5KkJQwSn07R0naByLIXJWMDk+ruMfI/3G3hS4Q==", 2790 | "requires": { 2791 | "commander": "^2.7.1", 2792 | "lodash.get": "^4.0.0", 2793 | "lodash.isequal": "^4.0.0", 2794 | "validator": "^9.0.0" 2795 | } 2796 | } 2797 | } 2798 | } 2799 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "expressjs-microservice", 3 | "version": "0.0.13", 4 | "author": "Mr. Doomsbuster", 5 | "main": "app.js", 6 | "description": "An opinionated minimalist boilerplate for expressjs based microservices.", 7 | "license": "WTFPL", 8 | "homepage": "https://ashishdesai.com", 9 | "keywords": [ 10 | "expressjs", 11 | "microservices", 12 | "boilerplate", 13 | "expressjs-boilerplate", 14 | "api gateway", 15 | "api", 16 | "rest", 17 | "expressjs microservice", 18 | "express microservice" 19 | ], 20 | "scripts": { 21 | "start": "cross-env NODE_ENV=production node app.js", 22 | "test": "cross-env NODE_ENV=test istanbul cover -x **/spec/** --print detail ./node_modules/.bin/jasmine JASMINE_CONFIG_PATH=./spec/support/jasmine.json", 23 | "debugtest": "cross-env NODE_ENV=test istanbul cover -x **/spec/** --print detail ./node_modules/.bin/jasmine-node-debug JASMINE_CONFIG_PATH=./spec/support/jasmine.json", 24 | "integtest": "cross-env NODE_ENV=test ./node_modules/.bin/jasmine JASMINE_CONFIG_PATH=./spec/support/jasmine-integ.json", 25 | "dev": "cross-env NODE_ENV=development node app.js" 26 | }, 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/doomsbuster/expressjs-microservice.git" 30 | }, 31 | "dependencies": { 32 | "body-parser": "~1.10.1", 33 | "cookie-parser": "~1.3.3", 34 | "express": "^4.16.2", 35 | "hbs": "^4.0.1", 36 | "request": "^2.87.0", 37 | "request-promise-native": "^1.0.5", 38 | "serve-favicon": "^2.4.5", 39 | "sinon": "^4.1.3", 40 | "swagger-jsdoc": "^1.9.7", 41 | "winston": "^2.4.0", 42 | "winston-daily-rotate-file": "^1.7.2" 43 | }, 44 | "devDependencies": { 45 | "chai": "^4.1.2", 46 | "cross-env": "^5.1.3", 47 | "istanbul": "^0.4.5", 48 | "jasmine": "^2.8.0", 49 | "jasmine-spec-reporter": "^4.2.1", 50 | "supertest": "^3.0.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /public/swagger-ui/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doomsbuster/expressjs-microservice/c50cb8e705d3cee8c2dcf6b0a3ead9bf2411cd99/public/swagger-ui/favicon-16x16.png -------------------------------------------------------------------------------- /public/swagger-ui/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doomsbuster/expressjs-microservice/c50cb8e705d3cee8c2dcf6b0a3ead9bf2411cd99/public/swagger-ui/favicon-32x32.png -------------------------------------------------------------------------------- /public/swagger-ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Swagger UI 7 | 8 | 9 | 10 | 11 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 |
69 | 70 | 71 | 72 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /public/swagger-ui/oauth2-redirect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 58 | -------------------------------------------------------------------------------- /public/swagger-ui/swagger-ui-bundle.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;AAsnMA;;;;;;AAm5DA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0kUA;;;;;;;;;;;;;;AAq4JA;AA4/iBA;;;;;;;;;AA+vIA;;;;;AAk8QA;;;;;AAynBA;AAo0CA;;;;;;AAuqxBA;AAixYA;;;;;;AA6gbA","sourceRoot":""} -------------------------------------------------------------------------------- /public/swagger-ui/swagger-ui-standalone-preset.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"swagger-ui-standalone-preset.js","sources":["webpack:///swagger-ui-standalone-preset.js"],"mappings":"AAAA;;;;;AA6mCA;;;;;;AA41FA","sourceRoot":""} -------------------------------------------------------------------------------- /public/swagger-ui/swagger-ui.css: -------------------------------------------------------------------------------- 1 | .swagger-ui{font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px}.swagger-ui .opblock-tag-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .opblock-tag{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:10px 20px 10px 10px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .opblock-tag svg{-webkit-transition:all .4s;transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameter__type{font-size:12px;padding:5px 0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;-webkit-transition:all .5s;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;-webkit-box-shadow:0 0 3px rgba(0,0,0,.19);box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock .tab-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .opblock .tab-header .tab-item{padding:0 40px;cursor:pointer}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{position:absolute;bottom:-15px;left:50%;width:120%;height:4px;content:"";-webkit-transform:translateX(-50%);transform:translateX(-50%);background:#888}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{padding:8px 20px;min-height:50px;background:hsla(0,0%,100%,.8);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header,.swagger-ui .opblock .opblock-section-header label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-section-header label{font-size:12px;font-weight:700;margin:0;margin-left:auto;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header label span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 3 auto;flex:0 3 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;word-break:break-all;padding:0 10px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .opblock .opblock-summary-operation-id .view-line-link,.swagger-ui .opblock .opblock-summary-path .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;-webkit-transition:all .5s;transition:all .5s}.swagger-ui .opblock .opblock-summary-operation-id:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{font-size:13px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:5px;cursor:pointer}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{width:100%;margin:20px 0;padding:10px;border:2px solid #d8dde7}.swagger-ui .tab{display:-webkit-box;display:-ms-flexbox;display:flex;margin:20px 0 10px;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:100px;min-width:90px;padding:0;cursor:pointer;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:"";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{font-size:12px;margin:0 0 5px;padding:15px 20px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:Source Code Pro,monospace;font-weight:600;color:#999}.swagger-ui .response-col_links{padding-left:2em;max-width:40em;font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_links .response-undocumented{font-size:11px;font-family:Source Code Pro,monospace;font-weight:600;color:#999}.swagger-ui .response-col_description__inner div.markdown,.swagger-ui .response-col_description__inner div.renderedMarkdown{font-size:12px;font-style:italic;display:block;margin:0;padding:10px;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .response-col_description__inner div.markdown p,.swagger-ui .response-col_description__inner div.renderedMarkdown p{margin:0}.swagger-ui .response-col_description__inner div.markdown a,.swagger-ui .response-col_description__inner div.renderedMarkdown a{font-family:Source Code Pro,monospace;font-weight:600;color:#89bf04;text-decoration:underline}.swagger-ui .response-col_description__inner div.markdown a:hover,.swagger-ui .response-col_description__inner div.renderedMarkdown a:hover{color:#81b10c}.swagger-ui .opblock-body pre{font-size:12px;margin:0;padding:10px;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;border-radius:4px;background:#41444e;overflow-wrap:break-word;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre span{color:#fff!important}.swagger-ui .opblock-body pre .headerline{display:block}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.15);box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:-20px 15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .server-container{margin:0 0 20px;padding:30px 0;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.15);box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .server-container .computed-url{margin:2em 0}.swagger-ui .server-container .computed-url code{color:grey;display:inline-block;padding:4px;font-size:16px;margin:0 1em;font-style:italic}.swagger-ui .server-container .servers{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .server-container .servers .servers-title{margin-right:1em}.swagger-ui .server-container .servers>label{font-size:12px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:-20px 15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .server-container .servers>label select{min-width:130px}.swagger-ui .server-container .servers table tr{width:30em}.swagger-ui .server-container .servers table td{display:inline-block;max-width:15em;vertical-align:middle;padding-top:10px;padding-bottom:10px}.swagger-ui .server-container .servers table td:first-of-type{padding-right:2em}.swagger-ui .server-container .servers table td input{width:100%;height:100%}.swagger-ui .loading-container{padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:"loading";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:"";-webkit-animation:rotation 1s infinite linear,opacity .5s;animation:rotation 1s infinite linear,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.swagger-ui .renderedMarkdown p{font-family:Open Sans,sans-serif;color:#3b4151;margin-top:0;margin-bottom:0}.swagger-ui .response-content-type{padding-top:1em}.swagger-ui .response-content-type.controls-accept-header select{border-color:green}.swagger-ui .response-content-type.controls-accept-header small{color:green;font-size:.7em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui section h3{font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{text-decoration:inherit;color:inherit;cursor:pointer}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;-webkit-transition:all .3s;transition:all .3s;border:2px solid #888;border-radius:4px;background:transparent;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1);box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;font-family:Titillium Web,sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{-webkit-animation:swagger-ui-pulse 2s infinite;animation:swagger-ui-pulse 2s infinite;color:#fff;border-color:#4990e2}@-webkit-keyframes swagger-ui-pulse{0%{color:#fff;background:#4990e2;-webkit-box-shadow:0 0 0 0 rgba(73,144,226,.8);box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{-webkit-box-shadow:0 0 0 5px rgba(73,144,226,0);box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;-webkit-box-shadow:0 0 0 0 rgba(73,144,226,0);box-shadow:0 0 0 0 rgba(73,144,226,0)}}@keyframes swagger-ui-pulse{0%{color:#fff;background:#4990e2;-webkit-box-shadow:0 0 0 0 rgba(73,144,226,.8);box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{-webkit-box-shadow:0 0 0 5px rgba(73,144,226,0);box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;-webkit-box-shadow:0 0 0 0 rgba(73,144,226,0);box-shadow:0 0 0 0 rgba(73,144,226,0)}}.swagger-ui .btn-group{display:-webkit-box;display:-ms-flexbox;display:flex;padding:30px}.swagger-ui .btn-group .btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#444}.swagger-ui .expand-methods svg{-webkit-transition:all .3s;transition:all .3s;fill:#777}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat;background-size:20px;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.25);box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:Titillium Web,sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui .opblock-body select{min-width:230px}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;-webkit-transition:opacity .5s;transition:opacity .5s;color:#333}.swagger-ui .checkbox label{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;-webkit-box-shadow:0 0 0 2px #e8e8e8;box-shadow:0 0 0 2px #e8e8e8;-webkit-box-flex:0;-ms-flex:none;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;-webkit-box-shadow:0 10px 30px 0 rgba(0,0,0,.2);box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#aaa!important}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui .model p{margin:0 0 1em}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models h4{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:10px 20px 10px 10px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;font-family:Titillium Web,sans-serif;color:#777;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui section.models h4 svg{-webkit-transition:all .4s;transition:all .4s}.swagger-ui section.models h4 span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:Titillium Web,sans-serif;color:#777}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;-webkit-transition:all .5s;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{font-size:16px;font-family:Titillium Web,sans-serif;color:#555}.swagger-ui .model-deprecated-warning{font-size:16px;font-weight:600;margin-right:1em;font-family:Titillium Web,sans-serif;color:#f93e3e}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em;width:8em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#999}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:124px;padding:0 0 0 2em}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{max-width:20%;min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:"required";color:rgba(255,0,0,.6)}.swagger-ui .parameter__in{color:#888}.swagger-ui .parameter__deprecated,.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:Source Code Pro,monospace;font-weight:600}.swagger-ui .parameter__deprecated{color:red}.swagger-ui .table-container{padding:20px}.swagger-ui .topbar{padding:8px 30px;background-color:#89bf04}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:300px;text-decoration:none;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:3;-ms-flex:3;flex:3;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{width:100%;min-width:350px;margin:0;border:2px solid #547f00;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .select-label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;max-width:600px;margin:0}.swagger-ui .topbar .download-url-wrapper .select-label span{font-size:16px;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{-webkit-box-flex:2;-ms-flex:2;flex:2;width:100%;border:2px solid #547f00;outline:none;-webkit-box-shadow:none;box-shadow:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 40px;border:none;border-radius:0 4px 4px 0;background:#547f00;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info code{padding:3px 5px;border-radius:4px;background:rgba(0,0,0,.05);font-family:Source Code Pro,monospace;font-weight:600;color:#9012fe}.swagger-ui .info a{font-size:14px;-webkit-transition:all .4s;transition:all .4s;font-family:Open Sans,sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.swagger-ui .auth-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper .errors small{color:#666}.swagger-ui .errors-wrapper hgroup{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.swagger-ui .Resizer.vertical.disabled{display:none} 2 | /*# sourceMappingURL=swagger-ui.css.map*/ -------------------------------------------------------------------------------- /public/swagger-ui/swagger-ui.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"swagger-ui.css","sources":[],"mappings":"","sourceRoot":""} -------------------------------------------------------------------------------- /public/swagger-ui/swagger-ui.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AAs9eA","sourceRoot":""} -------------------------------------------------------------------------------- /routes/api.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require('express'); 4 | var postsEndpoint = require('./posts'); 5 | var repoEndpoint = require('./repo/repo'); 6 | 7 | var router = express.Router(); 8 | 9 | //--------------------------------------------------------------- 10 | // API Route specification 11 | //--------------------------------------------------------------- 12 | router.use('/posts', postsEndpoint); 13 | router.use('/repo', repoEndpoint); 14 | 15 | //--------------------------------------------------------------- 16 | // Swagger API Specification - swagger-jsdoc 17 | //--------------------------------------------------------------- 18 | var swaggerJSDoc = require('swagger-jsdoc'); 19 | 20 | var options = { 21 | swaggerDefinition: { 22 | info: { 23 | title: 'ExpressJS Boilerplate API', 24 | description: 'Boilerplate API for ExpressJS based microservices', 25 | version: '0.0.1', 26 | contact: { 27 | email: 'administrator@ashishdesai.com', 28 | name: 'Mr. Doomsbuster' 29 | }, 30 | license: { 31 | name: 'Do what the fuck you want to (WTFPL)', 32 | url: 'https://ashishdesai.com/license.txt' 33 | } 34 | }, 35 | schemes: [ 36 | 'http', 37 | 'https' 38 | ], 39 | basePath: '/api', 40 | tags: [{ 41 | name: 'Posts', 42 | description: 'Get details of posts' 43 | }, { 44 | name: 'Repo', 45 | description: 'Get details about repositories' 46 | }, { 47 | name: 'Images', 48 | description: 'Get details about images' 49 | }], 50 | externalDocs: { 51 | description: 'More information', 52 | url: 'https://mrdoomsbuster.com' 53 | } 54 | }, 55 | apis: ['routes/api.js', 'routes/posts.js', 'routes/repo/repo.js', 'routes/repo/images.js'], 56 | }; 57 | 58 | var swaggerSpec = swaggerJSDoc(options); 59 | 60 | //--------------------------------------------------------------- 61 | // Expose swagger.json at /api/swagger.json 62 | //--------------------------------------------------------------- 63 | router.get('/swagger.json', function(req, res) { 64 | res.setHeader('Content-Type', 'application/json'); 65 | res.send(swaggerSpec); 66 | }); 67 | 68 | module.exports = router; -------------------------------------------------------------------------------- /routes/posts.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require('express'); 4 | var postService = require('../services/PostsService'); 5 | var log = require('../utils/Logger'); 6 | 7 | let router = express.Router(); 8 | let sampleError = { 9 | type: 'ErrorType', 10 | message: 'Error occured', 11 | messageCode: 1052 // Optional message code (numeric) 12 | }; 13 | 14 | /** 15 | * @swagger 16 | * /posts: 17 | * get: 18 | * summary: Get all posts 19 | * description: Returns all posts with details 20 | * tags: 21 | * - Posts 22 | * produces: 23 | * - application/json 24 | * responses: 25 | * 200: 26 | * description: Successful 27 | * 500: 28 | * description: Server Error 29 | */ 30 | router.get('/', function(req, res) { 31 | try { 32 | var promise = postService.getAllPosts(); 33 | 34 | promise.then(function(data) { 35 | // Do something (if required) with the data, then send it to the client 36 | res.status(200).send(data); 37 | }); 38 | 39 | promise.catch(function(error) { 40 | // Never send stack traces to the client. 41 | log.error('Failed') 42 | res.status(500).send(sampleError); 43 | }); 44 | } catch (e) { 45 | // Use a good logging framework for logging to file 46 | log.error('Route /posts/ failed with error', e); 47 | res.status(500).send(sampleError); 48 | } 49 | }); 50 | 51 | /** 52 | * @swagger 53 | * /posts/post: 54 | * get: 55 | * summary: Get details of a post 56 | * description: Returns details of a single post 57 | * tags: 58 | * - Posts 59 | * produces: 60 | * - application/json 61 | * parameters: 62 | * - name: postId 63 | * description: ID of the post to fetch 64 | * in: query 65 | * required: true 66 | * type: string 67 | * example: 1 68 | * responses: 69 | * 200: 70 | * description: Successful 71 | * 500: 72 | * description: Server Error 73 | */ 74 | router.get('/post', function(req, res) { 75 | // This route needs to be ordered before /:postId since express will match '/post' to be path param as well 76 | var promise; 77 | try { 78 | promise = postService.getPost(req.query.postId); 79 | 80 | promise.then(function(data) { 81 | // Do something (if required) with the data, then send it to the client 82 | res.status(200).send(data); 83 | }); 84 | 85 | promise.catch(function(error) { 86 | // Never send stack traces to the client. 87 | res.status(500).send(sampleError); 88 | }); 89 | } catch (e) { 90 | // Use a good logging framework for logging to file 91 | res.status(500).send(sampleError); 92 | } 93 | }); 94 | 95 | /** 96 | * @swagger 97 | * /posts/{postId}: 98 | * get: 99 | * summary: Get details of a post 100 | * description: Returns details of a single post 101 | * tags: 102 | * - Posts 103 | * produces: 104 | * - application/json 105 | * parameters: 106 | * - name: postId 107 | * description: ID of the post to fetch 108 | * in: path 109 | * required: true 110 | * type: integer 111 | * example: 1 112 | * responses: 113 | * 200: 114 | * description: Successful 115 | * 500: 116 | * description: Server Error 117 | */ 118 | router.get('/:postId', function(req, res) { 119 | try { 120 | var promise = postService.getPost(req.params.postId); 121 | 122 | promise.then(function(data) { 123 | // Do something (if required) with the data, then send it to the client 124 | res.status(200).send(data); 125 | }); 126 | 127 | promise.catch(function(error) { 128 | // Never send stack traces to the client. 129 | console.log('/posts/' + postId + ' failed with error', error); 130 | res.status(500).send(sampleError); 131 | }) 132 | 133 | } catch (e) { 134 | // Use a good logging framework for logging to file 135 | res.status(500).send(sampleError); 136 | } 137 | }); 138 | 139 | module.exports = router; -------------------------------------------------------------------------------- /routes/repo/images.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require('express'); 4 | var router = express.Router(); 5 | 6 | /** 7 | * @swagger 8 | * /repo/images: 9 | * get: 10 | * summary: Get a list of images 11 | * description: Returns a list of all images 12 | * tags: 13 | * - Images 14 | * produces: 15 | * - application/json 16 | * responses: 17 | * 200: 18 | * description: Successful 19 | * 500: 20 | * description: Server Error 21 | */ 22 | router.use('/', function (req, res) { 23 | res.status(200).send({ 24 | 'data': '/repo/images/' 25 | }); 26 | }); 27 | 28 | /** 29 | * @swagger 30 | * /repo/images/{imageid}: 31 | * get: 32 | * summary: Get the details about an image 33 | * description: Returns details of a single image 34 | * tags: 35 | * - Images 36 | * produces: 37 | * - application/json 38 | * parameters: 39 | * - name: imageid 40 | * description: ID of the post to fetch 41 | * in: path 42 | * required: true 43 | * type: string 44 | * example: IMG_1234 45 | * responses: 46 | * 200: 47 | * description: Successful 48 | * 500: 49 | * description: Server Error 50 | */ 51 | router.use('/:imageid', function (req, res) { 52 | res.status(200).send({ 53 | 'data': '/repo/images/'+ req.params.imageid 54 | }); 55 | }); 56 | 57 | module.exports = router; -------------------------------------------------------------------------------- /routes/repo/repo.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require('express'); 4 | var imagesEndpoint = require('./images'); 5 | var router = express.Router(); 6 | 7 | router.use('/images', imagesEndpoint); 8 | 9 | /** 10 | * @swagger 11 | * /repo: 12 | * get: 13 | * summary: Get list of all repositories 14 | * description: Returns a list of all repositories 15 | * tags: 16 | * - Repo 17 | * produces: 18 | * - application/json 19 | * responses: 20 | * 200: 21 | * description: Successful 22 | * 500: 23 | * description: Server Error 24 | */ 25 | router.use('/', function (req, res) { 26 | res.status(200).send({ 27 | data: '/repo' 28 | }) 29 | }); 30 | 31 | module.exports = router; -------------------------------------------------------------------------------- /services/PostsService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var request = require('request-promise-native'); 3 | 4 | module.exports = { 5 | getAllPosts: function() { 6 | let options = { 7 | url: 'https://jsonplaceholder.typicode.com/posts' 8 | } 9 | return request.get(options); 10 | }, 11 | getPost: function(postId) { 12 | console.log('PostService::getPost()' + postId); 13 | let options = { 14 | url: 'https://jsonplaceholder.typicode.com/posts/' + postId 15 | } 16 | return request.get(options); 17 | } 18 | } -------------------------------------------------------------------------------- /services/RepoService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var repoDAO = require('../dataaccess/RepoDao'); 3 | 4 | module.exports = { 5 | getAllRepos: function() { 6 | let repos = repoDAO.getAllRepos(); 7 | } 8 | } -------------------------------------------------------------------------------- /spec/app_test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var stub; 3 | var app; 4 | const request = require('supertest'); 5 | const sinon = require('sinon'); 6 | let service = require('../services/SampleService'); 7 | const helper = require('./helpers/common'); 8 | const chai = require('chai'); 9 | 10 | describe('Application Route', function() { 11 | describe('GET /', function() { 12 | it('should return http status 200', function(done) { 13 | // Make note that because we want express app to be required after all stubbing, we inline it into super test. 14 | request(require('../app')) 15 | .get('/') 16 | .expect(200) 17 | .end(function(err, res) { 18 | helper.end(err, res, done); 19 | }); 20 | }); 21 | }); 22 | 23 | describe('GET /api/retrieve', function() { 24 | beforeEach(function() { 25 | stub = sinon.stub(service, 'mySampleGetService').throws(); 26 | }); 27 | 28 | it('should return 500 if service call fails', function(done) { 29 | request(require('../app')) 30 | .get('/api/retrieve') 31 | .expect(500) 32 | .end(function(err, res) { 33 | helper.end(err, res, done); 34 | }); 35 | }); 36 | 37 | afterEach(function() { 38 | stub.restore(); 39 | }); 40 | }) 41 | 42 | describe("GET /api/retrieve", function() { 43 | 44 | it('should return http status 200', function(done) { 45 | request(require('../app')) 46 | .get('/api/retrieve') 47 | .expect(200) 48 | .end(function(err, res) { 49 | helper.end(err, res, done); 50 | }); 51 | }); 52 | 53 | it('should call service method', function(done) { 54 | request(require('../app')) 55 | .get('/api/retrieve') 56 | .expect(200) 57 | .end(function(err, res) { 58 | helper.end(err, res, done); 59 | }); 60 | }); 61 | 62 | it('should return body', function(done) { 63 | request(require('../app')) 64 | .get('/api/retrieve') 65 | .expect(200) 66 | .expect(function(res) { 67 | // Cases where response needs to be validated, use chai with advanced assertions. 68 | chai.expect(res.text).to.equal('respond with a resource'); 69 | }) 70 | .end(function(err, res) { 71 | helper.end(err, res, done) 72 | }); 73 | }); 74 | 75 | }); 76 | 77 | describe('GET /api/go', () => { 78 | it('should return http status 404', function(done) { 79 | request(require('../app')) 80 | .get('/api/go') 81 | .expect(404) 82 | .end(function(err, res) { 83 | helper.end(err, res, done); 84 | }); 85 | }); 86 | }); 87 | }); -------------------------------------------------------------------------------- /spec/helpers/common.js: -------------------------------------------------------------------------------- 1 | exports.end = function(err, res, done) { 2 | if (err) { 3 | done.fail(err); 4 | } 5 | else { 6 | done(); 7 | } 8 | } -------------------------------------------------------------------------------- /spec/helpers/reporter.js: -------------------------------------------------------------------------------- 1 | const SpecReporter = require('jasmine-spec-reporter').SpecReporter; 2 | 3 | jasmine.getEnv().clearReporters(); 4 | jasmine.getEnv().addReporter(new SpecReporter({ 5 | spec: { 6 | displayPending: true 7 | } 8 | })); -------------------------------------------------------------------------------- /spec/routes/posts-spec.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var sinon = require('sinon'); 4 | var express = require('express'); 5 | var request = require('supertest'); 6 | var service = require('../../services/PostsService'); 7 | var helper = require('../helpers/common'); 8 | var stub; 9 | 10 | describe('Route /posts', function() { 11 | 12 | describe('GET /', function() { 13 | 14 | it('should return 200', function(done) { 15 | stub = sinon.stub(service, 'getAllPosts').resolves({ 16 | "message": "post" 17 | }); 18 | request(require('../../app')) 19 | .get('/api/posts') 20 | .expect(200) 21 | .end(function(err, res) { 22 | helper.end(err, res, done); 23 | }); 24 | }); 25 | 26 | it('should return 500', function() { 27 | // When rejecting a promise do not pass the done callback. FIXES issue #3. 28 | stub = sinon.stub(service, 'getAllPosts').rejects(); 29 | request(require('../../app')) 30 | .get('/api/posts') 31 | .expect(500) 32 | .end(function(err, res) { 33 | helper.end(err, res); 34 | }); 35 | }); 36 | 37 | afterEach(function () { 38 | stub.restore(); 39 | }) 40 | 41 | }); 42 | }) -------------------------------------------------------------------------------- /spec/routes/repo/images-spec.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doomsbuster/expressjs-microservice/c50cb8e705d3cee8c2dcf6b0a3ead9bf2411cd99/spec/routes/repo/images-spec.js -------------------------------------------------------------------------------- /spec/routes/repo/repo-spec.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doomsbuster/expressjs-microservice/c50cb8e705d3cee8c2dcf6b0a3ead9bf2411cd99/spec/routes/repo/repo-spec.js -------------------------------------------------------------------------------- /spec/support/jasmine-integ.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "it", 3 | "spec_files": [ 4 | "**/*-IT.js" 5 | ], 6 | "helpers": [ 7 | "helpers/**/*.js" 8 | ], 9 | "stopSpecOnExpectationFailure": false, 10 | "random": false 11 | } 12 | -------------------------------------------------------------------------------- /spec/support/jasmine.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "spec", 3 | "spec_files": [ 4 | "**/*[sS]pec.js" 5 | ], 6 | "helpers": [ 7 | "helpers/**/*.js" 8 | ], 9 | "stopSpecOnExpectationFailure": false, 10 | "random": false 11 | } 12 | -------------------------------------------------------------------------------- /utils/Logger.js: -------------------------------------------------------------------------------- 1 | var winston = require('winston'); 2 | var rotateLog = require('winston-daily-rotate-file'); 3 | var fs = require('fs'); 4 | const LOG_DIR = 'logs'; 5 | 6 | // Create the log directory if it does not exist 7 | if (!fs.existsSync(LOG_DIR)) { 8 | fs.mkdirSync(LOG_DIR); 9 | } 10 | 11 | const log = new (winston.Logger)({ 12 | transports: [ 13 | new(winston.transports.Console)({ 14 | colorize: true 15 | }), 16 | new(rotateLog)({ 17 | filename: './logs/app.log', 18 | prepend: true 19 | }) 20 | ], 21 | level: 'info', 22 | }); 23 | 24 | module.exports = log; -------------------------------------------------------------------------------- /views/error.hbs: -------------------------------------------------------------------------------- 1 |

{{message}}

2 |

{{error.status}}

3 |
{{error.stack}}
4 | --------------------------------------------------------------------------------