├── .editorconfig ├── .gitignore ├── README.md ├── package-lock.json ├── package.json └── src ├── database ├── ads.js └── mongo.js └── index.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.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 | # webstorm 61 | .idea/ 62 | *.iml 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Node.js and Express Tutorial: Building and Securing RESTful APIs 2 | 3 | In this article, you will learn how to develop RESTful APIs with Node.js, Express, and Auth0. You will start from scratch, scaffolding a new Node.js project, then you will go through all the steps needed to build a secure API. 4 | 5 | Read more at: https://auth0.com/blog/node-js-and-express-tutorial-building-and-securing-restful-apis/ 6 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-ads-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/runtime": { 8 | "version": "7.3.1", 9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", 10 | "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", 11 | "requires": { 12 | "regenerator-runtime": "^0.12.0" 13 | } 14 | }, 15 | "@types/body-parser": { 16 | "version": "1.17.0", 17 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", 18 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", 19 | "requires": { 20 | "@types/connect": "*", 21 | "@types/node": "*" 22 | } 23 | }, 24 | "@types/connect": { 25 | "version": "3.4.32", 26 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", 27 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", 28 | "requires": { 29 | "@types/node": "*" 30 | } 31 | }, 32 | "@types/express": { 33 | "version": "4.16.1", 34 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", 35 | "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", 36 | "requires": { 37 | "@types/body-parser": "*", 38 | "@types/express-serve-static-core": "*", 39 | "@types/serve-static": "*" 40 | } 41 | }, 42 | "@types/express-jwt": { 43 | "version": "0.0.34", 44 | "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.34.tgz", 45 | "integrity": "sha1-/b7kxq9cCiRu8qkz9VGZc8dxfwI=", 46 | "requires": { 47 | "@types/express": "*", 48 | "@types/express-unless": "*" 49 | } 50 | }, 51 | "@types/express-serve-static-core": { 52 | "version": "4.16.1", 53 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", 54 | "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", 55 | "requires": { 56 | "@types/node": "*", 57 | "@types/range-parser": "*" 58 | } 59 | }, 60 | "@types/express-unless": { 61 | "version": "0.5.1", 62 | "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz", 63 | "integrity": "sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw==", 64 | "requires": { 65 | "@types/express": "*" 66 | } 67 | }, 68 | "@types/mime": { 69 | "version": "2.0.1", 70 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 71 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" 72 | }, 73 | "@types/node": { 74 | "version": "11.9.5", 75 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.5.tgz", 76 | "integrity": "sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q==" 77 | }, 78 | "@types/range-parser": { 79 | "version": "1.2.3", 80 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 81 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 82 | }, 83 | "@types/serve-static": { 84 | "version": "1.13.2", 85 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", 86 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", 87 | "requires": { 88 | "@types/express-serve-static-core": "*", 89 | "@types/mime": "*" 90 | } 91 | }, 92 | "accepts": { 93 | "version": "1.3.5", 94 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 95 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 96 | "requires": { 97 | "mime-types": "~2.1.18", 98 | "negotiator": "0.6.1" 99 | } 100 | }, 101 | "agent-base": { 102 | "version": "4.2.1", 103 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", 104 | "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", 105 | "requires": { 106 | "es6-promisify": "^5.0.0" 107 | } 108 | }, 109 | "ajv": { 110 | "version": "6.9.2", 111 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", 112 | "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", 113 | "requires": { 114 | "fast-deep-equal": "^2.0.1", 115 | "fast-json-stable-stringify": "^2.0.0", 116 | "json-schema-traverse": "^0.4.1", 117 | "uri-js": "^4.2.2" 118 | } 119 | }, 120 | "array-flatten": { 121 | "version": "1.1.1", 122 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 123 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 124 | }, 125 | "asn1": { 126 | "version": "0.2.4", 127 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 128 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 129 | "requires": { 130 | "safer-buffer": "~2.1.0" 131 | } 132 | }, 133 | "assert-plus": { 134 | "version": "1.0.0", 135 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 136 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 137 | }, 138 | "async": { 139 | "version": "2.6.1", 140 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 141 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 142 | "requires": { 143 | "lodash": "^4.17.10" 144 | } 145 | }, 146 | "asynckit": { 147 | "version": "0.4.0", 148 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 149 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 150 | }, 151 | "aws-sign2": { 152 | "version": "0.7.0", 153 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 154 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 155 | }, 156 | "aws4": { 157 | "version": "1.8.0", 158 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 159 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 160 | }, 161 | "base64-js": { 162 | "version": "1.3.0", 163 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 164 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 165 | }, 166 | "basic-auth": { 167 | "version": "2.0.1", 168 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 169 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 170 | "requires": { 171 | "safe-buffer": "5.1.2" 172 | } 173 | }, 174 | "bcrypt-pbkdf": { 175 | "version": "1.0.2", 176 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 177 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 178 | "requires": { 179 | "tweetnacl": "^0.14.3" 180 | } 181 | }, 182 | "bl": { 183 | "version": "1.2.2", 184 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 185 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 186 | "requires": { 187 | "readable-stream": "^2.3.5", 188 | "safe-buffer": "^5.1.1" 189 | } 190 | }, 191 | "body-parser": { 192 | "version": "1.18.3", 193 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 194 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 195 | "requires": { 196 | "bytes": "3.0.0", 197 | "content-type": "~1.0.4", 198 | "debug": "2.6.9", 199 | "depd": "~1.1.2", 200 | "http-errors": "~1.6.3", 201 | "iconv-lite": "0.4.23", 202 | "on-finished": "~2.3.0", 203 | "qs": "6.5.2", 204 | "raw-body": "2.3.3", 205 | "type-is": "~1.6.16" 206 | } 207 | }, 208 | "bson": { 209 | "version": "1.1.0", 210 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", 211 | "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" 212 | }, 213 | "buffer": { 214 | "version": "5.2.1", 215 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", 216 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", 217 | "requires": { 218 | "base64-js": "^1.0.2", 219 | "ieee754": "^1.1.4" 220 | } 221 | }, 222 | "buffer-alloc": { 223 | "version": "1.2.0", 224 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 225 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 226 | "requires": { 227 | "buffer-alloc-unsafe": "^1.1.0", 228 | "buffer-fill": "^1.0.0" 229 | } 230 | }, 231 | "buffer-alloc-unsafe": { 232 | "version": "1.1.0", 233 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 234 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 235 | }, 236 | "buffer-crc32": { 237 | "version": "0.2.13", 238 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 239 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 240 | }, 241 | "buffer-equal-constant-time": { 242 | "version": "1.0.1", 243 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 244 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 245 | }, 246 | "buffer-fill": { 247 | "version": "1.0.0", 248 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 249 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 250 | }, 251 | "bytes": { 252 | "version": "3.0.0", 253 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 254 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 255 | }, 256 | "camelize": { 257 | "version": "1.0.0", 258 | "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", 259 | "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" 260 | }, 261 | "caseless": { 262 | "version": "0.12.0", 263 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 264 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 265 | }, 266 | "combined-stream": { 267 | "version": "1.0.7", 268 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 269 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 270 | "requires": { 271 | "delayed-stream": "~1.0.0" 272 | } 273 | }, 274 | "commander": { 275 | "version": "2.8.1", 276 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 277 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 278 | "requires": { 279 | "graceful-readlink": ">= 1.0.0" 280 | } 281 | }, 282 | "commondir": { 283 | "version": "1.0.1", 284 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 285 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" 286 | }, 287 | "content-disposition": { 288 | "version": "0.5.2", 289 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 290 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 291 | }, 292 | "content-security-policy-builder": { 293 | "version": "2.0.0", 294 | "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz", 295 | "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==" 296 | }, 297 | "content-type": { 298 | "version": "1.0.4", 299 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 300 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 301 | }, 302 | "cookie": { 303 | "version": "0.3.1", 304 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 305 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 306 | }, 307 | "cookie-signature": { 308 | "version": "1.0.6", 309 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 310 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 311 | }, 312 | "core-util-is": { 313 | "version": "1.0.2", 314 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 315 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 316 | }, 317 | "cors": { 318 | "version": "2.8.5", 319 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 320 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 321 | "requires": { 322 | "object-assign": "^4", 323 | "vary": "^1" 324 | } 325 | }, 326 | "dashdash": { 327 | "version": "1.14.1", 328 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 329 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 330 | "requires": { 331 | "assert-plus": "^1.0.0" 332 | } 333 | }, 334 | "dasherize": { 335 | "version": "2.0.0", 336 | "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", 337 | "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" 338 | }, 339 | "debug": { 340 | "version": "2.6.9", 341 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 342 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 343 | "requires": { 344 | "ms": "2.0.0" 345 | } 346 | }, 347 | "decompress": { 348 | "version": "4.2.0", 349 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", 350 | "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", 351 | "requires": { 352 | "decompress-tar": "^4.0.0", 353 | "decompress-tarbz2": "^4.0.0", 354 | "decompress-targz": "^4.0.0", 355 | "decompress-unzip": "^4.0.1", 356 | "graceful-fs": "^4.1.10", 357 | "make-dir": "^1.0.0", 358 | "pify": "^2.3.0", 359 | "strip-dirs": "^2.0.0" 360 | } 361 | }, 362 | "decompress-tar": { 363 | "version": "4.1.1", 364 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 365 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 366 | "requires": { 367 | "file-type": "^5.2.0", 368 | "is-stream": "^1.1.0", 369 | "tar-stream": "^1.5.2" 370 | } 371 | }, 372 | "decompress-tarbz2": { 373 | "version": "4.1.1", 374 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 375 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 376 | "requires": { 377 | "decompress-tar": "^4.1.0", 378 | "file-type": "^6.1.0", 379 | "is-stream": "^1.1.0", 380 | "seek-bzip": "^1.0.5", 381 | "unbzip2-stream": "^1.0.9" 382 | }, 383 | "dependencies": { 384 | "file-type": { 385 | "version": "6.2.0", 386 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 387 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" 388 | } 389 | } 390 | }, 391 | "decompress-targz": { 392 | "version": "4.1.1", 393 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 394 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 395 | "requires": { 396 | "decompress-tar": "^4.1.1", 397 | "file-type": "^5.2.0", 398 | "is-stream": "^1.1.0" 399 | } 400 | }, 401 | "decompress-unzip": { 402 | "version": "4.0.1", 403 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 404 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", 405 | "requires": { 406 | "file-type": "^3.8.0", 407 | "get-stream": "^2.2.0", 408 | "pify": "^2.3.0", 409 | "yauzl": "^2.4.2" 410 | }, 411 | "dependencies": { 412 | "file-type": { 413 | "version": "3.9.0", 414 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 415 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" 416 | } 417 | } 418 | }, 419 | "dedent": { 420 | "version": "0.7.0", 421 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 422 | "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" 423 | }, 424 | "delayed-stream": { 425 | "version": "1.0.0", 426 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 427 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 428 | }, 429 | "depd": { 430 | "version": "1.1.2", 431 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 432 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 433 | }, 434 | "destroy": { 435 | "version": "1.0.4", 436 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 437 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 438 | }, 439 | "dns-prefetch-control": { 440 | "version": "0.1.0", 441 | "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", 442 | "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" 443 | }, 444 | "dont-sniff-mimetype": { 445 | "version": "1.0.0", 446 | "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", 447 | "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" 448 | }, 449 | "ecc-jsbn": { 450 | "version": "0.1.2", 451 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 452 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 453 | "requires": { 454 | "jsbn": "~0.1.0", 455 | "safer-buffer": "^2.1.0" 456 | } 457 | }, 458 | "ecdsa-sig-formatter": { 459 | "version": "1.0.11", 460 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 461 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 462 | "requires": { 463 | "safe-buffer": "^5.0.1" 464 | } 465 | }, 466 | "ee-first": { 467 | "version": "1.1.1", 468 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 469 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 470 | }, 471 | "encodeurl": { 472 | "version": "1.0.2", 473 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 474 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 475 | }, 476 | "end-of-stream": { 477 | "version": "1.4.1", 478 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 479 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 480 | "requires": { 481 | "once": "^1.4.0" 482 | } 483 | }, 484 | "es6-promise": { 485 | "version": "4.2.6", 486 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", 487 | "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" 488 | }, 489 | "es6-promisify": { 490 | "version": "5.0.0", 491 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 492 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 493 | "requires": { 494 | "es6-promise": "^4.0.3" 495 | } 496 | }, 497 | "escape-html": { 498 | "version": "1.0.3", 499 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 500 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 501 | }, 502 | "etag": { 503 | "version": "1.8.1", 504 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 505 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 506 | }, 507 | "expect-ct": { 508 | "version": "0.1.1", 509 | "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz", 510 | "integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg==" 511 | }, 512 | "express": { 513 | "version": "4.16.4", 514 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 515 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 516 | "requires": { 517 | "accepts": "~1.3.5", 518 | "array-flatten": "1.1.1", 519 | "body-parser": "1.18.3", 520 | "content-disposition": "0.5.2", 521 | "content-type": "~1.0.4", 522 | "cookie": "0.3.1", 523 | "cookie-signature": "1.0.6", 524 | "debug": "2.6.9", 525 | "depd": "~1.1.2", 526 | "encodeurl": "~1.0.2", 527 | "escape-html": "~1.0.3", 528 | "etag": "~1.8.1", 529 | "finalhandler": "1.1.1", 530 | "fresh": "0.5.2", 531 | "merge-descriptors": "1.0.1", 532 | "methods": "~1.1.2", 533 | "on-finished": "~2.3.0", 534 | "parseurl": "~1.3.2", 535 | "path-to-regexp": "0.1.7", 536 | "proxy-addr": "~2.0.4", 537 | "qs": "6.5.2", 538 | "range-parser": "~1.2.0", 539 | "safe-buffer": "5.1.2", 540 | "send": "0.16.2", 541 | "serve-static": "1.13.2", 542 | "setprototypeof": "1.1.0", 543 | "statuses": "~1.4.0", 544 | "type-is": "~1.6.16", 545 | "utils-merge": "1.0.1", 546 | "vary": "~1.1.2" 547 | }, 548 | "dependencies": { 549 | "statuses": { 550 | "version": "1.4.0", 551 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 552 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 553 | } 554 | } 555 | }, 556 | "express-jwt": { 557 | "version": "5.3.1", 558 | "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz", 559 | "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==", 560 | "requires": { 561 | "async": "^1.5.0", 562 | "express-unless": "^0.3.0", 563 | "jsonwebtoken": "^8.1.0", 564 | "lodash.set": "^4.0.0" 565 | }, 566 | "dependencies": { 567 | "async": { 568 | "version": "1.5.2", 569 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 570 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 571 | } 572 | } 573 | }, 574 | "express-unless": { 575 | "version": "0.3.1", 576 | "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", 577 | "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" 578 | }, 579 | "extend": { 580 | "version": "3.0.2", 581 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 582 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 583 | }, 584 | "extsprintf": { 585 | "version": "1.3.0", 586 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 587 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 588 | }, 589 | "fast-deep-equal": { 590 | "version": "2.0.1", 591 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 592 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 593 | }, 594 | "fast-json-stable-stringify": { 595 | "version": "2.0.0", 596 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 597 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 598 | }, 599 | "fd-slicer": { 600 | "version": "1.1.0", 601 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 602 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 603 | "requires": { 604 | "pend": "~1.2.0" 605 | } 606 | }, 607 | "feature-policy": { 608 | "version": "0.2.0", 609 | "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.2.0.tgz", 610 | "integrity": "sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw==" 611 | }, 612 | "file-type": { 613 | "version": "5.2.0", 614 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 615 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" 616 | }, 617 | "finalhandler": { 618 | "version": "1.1.1", 619 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 620 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 621 | "requires": { 622 | "debug": "2.6.9", 623 | "encodeurl": "~1.0.2", 624 | "escape-html": "~1.0.3", 625 | "on-finished": "~2.3.0", 626 | "parseurl": "~1.3.2", 627 | "statuses": "~1.4.0", 628 | "unpipe": "~1.0.0" 629 | }, 630 | "dependencies": { 631 | "statuses": { 632 | "version": "1.4.0", 633 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 634 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 635 | } 636 | } 637 | }, 638 | "find-cache-dir": { 639 | "version": "2.0.0", 640 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", 641 | "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", 642 | "requires": { 643 | "commondir": "^1.0.1", 644 | "make-dir": "^1.0.0", 645 | "pkg-dir": "^3.0.0" 646 | } 647 | }, 648 | "find-up": { 649 | "version": "3.0.0", 650 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 651 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 652 | "requires": { 653 | "locate-path": "^3.0.0" 654 | } 655 | }, 656 | "forever-agent": { 657 | "version": "0.6.1", 658 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 659 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 660 | }, 661 | "form-data": { 662 | "version": "2.3.3", 663 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 664 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 665 | "requires": { 666 | "asynckit": "^0.4.0", 667 | "combined-stream": "^1.0.6", 668 | "mime-types": "^2.1.12" 669 | } 670 | }, 671 | "forwarded": { 672 | "version": "0.1.2", 673 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 674 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 675 | }, 676 | "frameguard": { 677 | "version": "3.0.0", 678 | "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", 679 | "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" 680 | }, 681 | "fresh": { 682 | "version": "0.5.2", 683 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 684 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 685 | }, 686 | "fs-constants": { 687 | "version": "1.0.0", 688 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 689 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 690 | }, 691 | "get-port": { 692 | "version": "4.1.0", 693 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.1.0.tgz", 694 | "integrity": "sha512-4/fqAYrzrzOiqDrdeZRKXGdTGgbkfTEumGlNQPeP6Jy8w0PzN9mzeNQ3XgHaTNie8pQ3hOUkrwlZt2Fzk5H9mA==" 695 | }, 696 | "get-stream": { 697 | "version": "2.3.1", 698 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 699 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", 700 | "requires": { 701 | "object-assign": "^4.0.1", 702 | "pinkie-promise": "^2.0.0" 703 | } 704 | }, 705 | "getos": { 706 | "version": "3.1.1", 707 | "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.1.tgz", 708 | "integrity": "sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg==", 709 | "requires": { 710 | "async": "2.6.1" 711 | } 712 | }, 713 | "getpass": { 714 | "version": "0.1.7", 715 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 716 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 717 | "requires": { 718 | "assert-plus": "^1.0.0" 719 | } 720 | }, 721 | "graceful-fs": { 722 | "version": "4.1.15", 723 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 724 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 725 | }, 726 | "graceful-readlink": { 727 | "version": "1.0.1", 728 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 729 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 730 | }, 731 | "har-schema": { 732 | "version": "2.0.0", 733 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 734 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 735 | }, 736 | "har-validator": { 737 | "version": "5.1.3", 738 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 739 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 740 | "requires": { 741 | "ajv": "^6.5.5", 742 | "har-schema": "^2.0.0" 743 | } 744 | }, 745 | "helmet": { 746 | "version": "3.15.1", 747 | "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.15.1.tgz", 748 | "integrity": "sha512-hgoNe/sjKlKNvJ3g9Gz149H14BjMMWOCmW/DTXl7IfyKGtIK37GePwZrHNfr4aPXdKVyXcTj26RgRFbPKDy9lw==", 749 | "requires": { 750 | "depd": "2.0.0", 751 | "dns-prefetch-control": "0.1.0", 752 | "dont-sniff-mimetype": "1.0.0", 753 | "expect-ct": "0.1.1", 754 | "feature-policy": "0.2.0", 755 | "frameguard": "3.0.0", 756 | "helmet-crossdomain": "0.3.0", 757 | "helmet-csp": "2.7.1", 758 | "hide-powered-by": "1.0.0", 759 | "hpkp": "2.0.0", 760 | "hsts": "2.1.0", 761 | "ienoopen": "1.0.0", 762 | "nocache": "2.0.0", 763 | "referrer-policy": "1.1.0", 764 | "x-xss-protection": "1.1.0" 765 | }, 766 | "dependencies": { 767 | "depd": { 768 | "version": "2.0.0", 769 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 770 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 771 | } 772 | } 773 | }, 774 | "helmet-crossdomain": { 775 | "version": "0.3.0", 776 | "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz", 777 | "integrity": "sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg==" 778 | }, 779 | "helmet-csp": { 780 | "version": "2.7.1", 781 | "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.1.tgz", 782 | "integrity": "sha512-sCHwywg4daQ2mY0YYwXSZRsgcCeerUwxMwNixGA7aMLkVmPTYBl7gJoZDHOZyXkqPrtuDT3s2B1A+RLI7WxSdQ==", 783 | "requires": { 784 | "camelize": "1.0.0", 785 | "content-security-policy-builder": "2.0.0", 786 | "dasherize": "2.0.0", 787 | "platform": "1.3.5" 788 | } 789 | }, 790 | "hide-powered-by": { 791 | "version": "1.0.0", 792 | "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", 793 | "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" 794 | }, 795 | "hpkp": { 796 | "version": "2.0.0", 797 | "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", 798 | "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" 799 | }, 800 | "hsts": { 801 | "version": "2.1.0", 802 | "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", 803 | "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" 804 | }, 805 | "http-errors": { 806 | "version": "1.6.3", 807 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 808 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 809 | "requires": { 810 | "depd": "~1.1.2", 811 | "inherits": "2.0.3", 812 | "setprototypeof": "1.1.0", 813 | "statuses": ">= 1.4.0 < 2" 814 | } 815 | }, 816 | "http-signature": { 817 | "version": "1.2.0", 818 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 819 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 820 | "requires": { 821 | "assert-plus": "^1.0.0", 822 | "jsprim": "^1.2.2", 823 | "sshpk": "^1.7.0" 824 | } 825 | }, 826 | "https-proxy-agent": { 827 | "version": "2.2.1", 828 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 829 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 830 | "requires": { 831 | "agent-base": "^4.1.0", 832 | "debug": "^3.1.0" 833 | }, 834 | "dependencies": { 835 | "debug": { 836 | "version": "3.2.6", 837 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 838 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 839 | "requires": { 840 | "ms": "^2.1.1" 841 | } 842 | }, 843 | "ms": { 844 | "version": "2.1.1", 845 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 846 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 847 | } 848 | } 849 | }, 850 | "iconv-lite": { 851 | "version": "0.4.23", 852 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 853 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 854 | "requires": { 855 | "safer-buffer": ">= 2.1.2 < 3" 856 | } 857 | }, 858 | "ieee754": { 859 | "version": "1.1.12", 860 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", 861 | "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" 862 | }, 863 | "ienoopen": { 864 | "version": "1.0.0", 865 | "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", 866 | "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" 867 | }, 868 | "inherits": { 869 | "version": "2.0.3", 870 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 871 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 872 | }, 873 | "ipaddr.js": { 874 | "version": "1.8.0", 875 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 876 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 877 | }, 878 | "is-natural-number": { 879 | "version": "4.0.1", 880 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 881 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" 882 | }, 883 | "is-stream": { 884 | "version": "1.1.0", 885 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 886 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 887 | }, 888 | "is-typedarray": { 889 | "version": "1.0.0", 890 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 891 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 892 | }, 893 | "isarray": { 894 | "version": "1.0.0", 895 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 896 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 897 | }, 898 | "isstream": { 899 | "version": "0.1.2", 900 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 901 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 902 | }, 903 | "jsbn": { 904 | "version": "0.1.1", 905 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 906 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 907 | }, 908 | "json-schema": { 909 | "version": "0.2.3", 910 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 911 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 912 | }, 913 | "json-schema-traverse": { 914 | "version": "0.4.1", 915 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 916 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 917 | }, 918 | "json-stringify-safe": { 919 | "version": "5.0.1", 920 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 921 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 922 | }, 923 | "jsonwebtoken": { 924 | "version": "8.5.0", 925 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", 926 | "integrity": "sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA==", 927 | "requires": { 928 | "jws": "^3.2.1", 929 | "lodash.includes": "^4.3.0", 930 | "lodash.isboolean": "^3.0.3", 931 | "lodash.isinteger": "^4.0.4", 932 | "lodash.isnumber": "^3.0.3", 933 | "lodash.isplainobject": "^4.0.6", 934 | "lodash.isstring": "^4.0.1", 935 | "lodash.once": "^4.0.0", 936 | "ms": "^2.1.1", 937 | "semver": "^5.6.0" 938 | }, 939 | "dependencies": { 940 | "ms": { 941 | "version": "2.1.1", 942 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 943 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 944 | } 945 | } 946 | }, 947 | "jsprim": { 948 | "version": "1.4.1", 949 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 950 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 951 | "requires": { 952 | "assert-plus": "1.0.0", 953 | "extsprintf": "1.3.0", 954 | "json-schema": "0.2.3", 955 | "verror": "1.10.0" 956 | } 957 | }, 958 | "jwa": { 959 | "version": "1.3.0", 960 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.3.0.tgz", 961 | "integrity": "sha512-SxObIyzv9a6MYuZYaSN6DhSm9j3+qkokwvCB0/OTSV5ylPq1wUQiygZQcHT5Qlux0I5kmISx3J86TxKhuefItg==", 962 | "requires": { 963 | "buffer-equal-constant-time": "1.0.1", 964 | "ecdsa-sig-formatter": "1.0.11", 965 | "safe-buffer": "^5.0.1" 966 | } 967 | }, 968 | "jwks-rsa": { 969 | "version": "1.4.0", 970 | "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.4.0.tgz", 971 | "integrity": "sha512-6aUc+oTuqsLwIarfq3A0FqoD5LFSgveW5JO1uX2s0J8TJuOEcDc4NIMZAmVHO8tMHDw7CwOPzXF/9QhfOpOElA==", 972 | "requires": { 973 | "@types/express-jwt": "0.0.34", 974 | "debug": "^2.2.0", 975 | "limiter": "^1.1.0", 976 | "lru-memoizer": "^1.6.0", 977 | "ms": "^2.0.0", 978 | "request": "^2.73.0" 979 | } 980 | }, 981 | "jws": { 982 | "version": "3.2.1", 983 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz", 984 | "integrity": "sha512-bGA2omSrFUkd72dhh05bIAN832znP4wOU3lfuXtRBuGTbsmNmDXMQg28f0Vsxaxgk4myF5YkKQpz6qeRpMgX9g==", 985 | "requires": { 986 | "jwa": "^1.2.0", 987 | "safe-buffer": "^5.0.1" 988 | } 989 | }, 990 | "limiter": { 991 | "version": "1.1.4", 992 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", 993 | "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==" 994 | }, 995 | "locate-path": { 996 | "version": "3.0.0", 997 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 998 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 999 | "requires": { 1000 | "p-locate": "^3.0.0", 1001 | "path-exists": "^3.0.0" 1002 | } 1003 | }, 1004 | "lock": { 1005 | "version": "0.1.4", 1006 | "resolved": "https://registry.npmjs.org/lock/-/lock-0.1.4.tgz", 1007 | "integrity": "sha1-/sfervF+fDoKVeHaBCgD4l2RdF0=" 1008 | }, 1009 | "lockfile": { 1010 | "version": "1.0.4", 1011 | "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", 1012 | "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", 1013 | "requires": { 1014 | "signal-exit": "^3.0.2" 1015 | } 1016 | }, 1017 | "lodash": { 1018 | "version": "4.17.11", 1019 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1020 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1021 | }, 1022 | "lodash.includes": { 1023 | "version": "4.3.0", 1024 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1025 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1026 | }, 1027 | "lodash.isboolean": { 1028 | "version": "3.0.3", 1029 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1030 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1031 | }, 1032 | "lodash.isinteger": { 1033 | "version": "4.0.4", 1034 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1035 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1036 | }, 1037 | "lodash.isnumber": { 1038 | "version": "3.0.3", 1039 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1040 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1041 | }, 1042 | "lodash.isplainobject": { 1043 | "version": "4.0.6", 1044 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1045 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1046 | }, 1047 | "lodash.isstring": { 1048 | "version": "4.0.1", 1049 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1050 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1051 | }, 1052 | "lodash.once": { 1053 | "version": "4.1.1", 1054 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1055 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1056 | }, 1057 | "lodash.set": { 1058 | "version": "4.3.2", 1059 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 1060 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" 1061 | }, 1062 | "lru-cache": { 1063 | "version": "4.0.2", 1064 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", 1065 | "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", 1066 | "requires": { 1067 | "pseudomap": "^1.0.1", 1068 | "yallist": "^2.0.0" 1069 | } 1070 | }, 1071 | "lru-memoizer": { 1072 | "version": "1.12.0", 1073 | "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-1.12.0.tgz", 1074 | "integrity": "sha1-7+ZXBsyKnMZT+A8NWm6jitlQ41I=", 1075 | "requires": { 1076 | "lock": "~0.1.2", 1077 | "lodash": "^4.17.4", 1078 | "lru-cache": "~4.0.0", 1079 | "very-fast-args": "^1.1.0" 1080 | } 1081 | }, 1082 | "make-dir": { 1083 | "version": "1.3.0", 1084 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1085 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1086 | "requires": { 1087 | "pify": "^3.0.0" 1088 | }, 1089 | "dependencies": { 1090 | "pify": { 1091 | "version": "3.0.0", 1092 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1093 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1094 | } 1095 | } 1096 | }, 1097 | "md5-file": { 1098 | "version": "4.0.0", 1099 | "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz", 1100 | "integrity": "sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==" 1101 | }, 1102 | "media-typer": { 1103 | "version": "0.3.0", 1104 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1105 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1106 | }, 1107 | "memory-pager": { 1108 | "version": "1.5.0", 1109 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 1110 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 1111 | "optional": true 1112 | }, 1113 | "merge-descriptors": { 1114 | "version": "1.0.1", 1115 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1116 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1117 | }, 1118 | "methods": { 1119 | "version": "1.1.2", 1120 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1121 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1122 | }, 1123 | "mime": { 1124 | "version": "1.4.1", 1125 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1126 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 1127 | }, 1128 | "mime-db": { 1129 | "version": "1.38.0", 1130 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 1131 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 1132 | }, 1133 | "mime-types": { 1134 | "version": "2.1.22", 1135 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 1136 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 1137 | "requires": { 1138 | "mime-db": "~1.38.0" 1139 | } 1140 | }, 1141 | "minimist": { 1142 | "version": "0.0.8", 1143 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1144 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1145 | }, 1146 | "mkdirp": { 1147 | "version": "0.5.1", 1148 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1149 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1150 | "requires": { 1151 | "minimist": "0.0.8" 1152 | } 1153 | }, 1154 | "mongodb": { 1155 | "version": "3.1.13", 1156 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.13.tgz", 1157 | "integrity": "sha512-sz2dhvBZQWf3LRNDhbd30KHVzdjZx9IKC0L+kSZ/gzYquCF5zPOgGqRz6sSCqYZtKP2ekB4nfLxhGtzGHnIKxA==", 1158 | "requires": { 1159 | "mongodb-core": "3.1.11", 1160 | "safe-buffer": "^5.1.2" 1161 | } 1162 | }, 1163 | "mongodb-core": { 1164 | "version": "3.1.11", 1165 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.11.tgz", 1166 | "integrity": "sha512-rD2US2s5qk/ckbiiGFHeu+yKYDXdJ1G87F6CG3YdaZpzdOm5zpoAZd/EKbPmFO6cQZ+XVXBXBJ660sSI0gc6qg==", 1167 | "requires": { 1168 | "bson": "^1.1.0", 1169 | "require_optional": "^1.0.1", 1170 | "safe-buffer": "^5.1.2", 1171 | "saslprep": "^1.0.0" 1172 | } 1173 | }, 1174 | "mongodb-memory-server": { 1175 | "version": "3.1.1", 1176 | "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-3.1.1.tgz", 1177 | "integrity": "sha512-sOkqhOMUBjZlMU68GbAPrSr97aYy2veOZqy8j3UYLWks1DQXS3Almmz/GGDmp0E8I6MaPacar66wRBwWdBqY9w==", 1178 | "requires": { 1179 | "@babel/runtime": "^7.2.0", 1180 | "debug": "^4.1.1", 1181 | "decompress": "^4.2.0", 1182 | "dedent": "^0.7.0", 1183 | "find-cache-dir": "^2.0.0", 1184 | "get-port": "^4.1.0", 1185 | "getos": "^3.1.1", 1186 | "https-proxy-agent": "^2.2.1", 1187 | "lockfile": "^1.0.4", 1188 | "md5-file": "^4.0.0", 1189 | "mkdirp": "^0.5.1", 1190 | "tmp": "^0.0.33", 1191 | "uuid": "^3.2.1" 1192 | }, 1193 | "dependencies": { 1194 | "debug": { 1195 | "version": "4.1.1", 1196 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1197 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1198 | "requires": { 1199 | "ms": "^2.1.1" 1200 | } 1201 | }, 1202 | "ms": { 1203 | "version": "2.1.1", 1204 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1205 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1206 | } 1207 | } 1208 | }, 1209 | "morgan": { 1210 | "version": "1.9.1", 1211 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1212 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1213 | "requires": { 1214 | "basic-auth": "~2.0.0", 1215 | "debug": "2.6.9", 1216 | "depd": "~1.1.2", 1217 | "on-finished": "~2.3.0", 1218 | "on-headers": "~1.0.1" 1219 | } 1220 | }, 1221 | "ms": { 1222 | "version": "2.0.0", 1223 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1224 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1225 | }, 1226 | "negotiator": { 1227 | "version": "0.6.1", 1228 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1229 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1230 | }, 1231 | "nocache": { 1232 | "version": "2.0.0", 1233 | "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", 1234 | "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" 1235 | }, 1236 | "oauth-sign": { 1237 | "version": "0.9.0", 1238 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1239 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1240 | }, 1241 | "object-assign": { 1242 | "version": "4.1.1", 1243 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1244 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1245 | }, 1246 | "on-finished": { 1247 | "version": "2.3.0", 1248 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1249 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1250 | "requires": { 1251 | "ee-first": "1.1.1" 1252 | } 1253 | }, 1254 | "on-headers": { 1255 | "version": "1.0.1", 1256 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 1257 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 1258 | }, 1259 | "once": { 1260 | "version": "1.4.0", 1261 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1262 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1263 | "requires": { 1264 | "wrappy": "1" 1265 | } 1266 | }, 1267 | "os-tmpdir": { 1268 | "version": "1.0.2", 1269 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1270 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1271 | }, 1272 | "p-limit": { 1273 | "version": "2.1.0", 1274 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", 1275 | "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", 1276 | "requires": { 1277 | "p-try": "^2.0.0" 1278 | } 1279 | }, 1280 | "p-locate": { 1281 | "version": "3.0.0", 1282 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1283 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1284 | "requires": { 1285 | "p-limit": "^2.0.0" 1286 | } 1287 | }, 1288 | "p-try": { 1289 | "version": "2.0.0", 1290 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", 1291 | "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" 1292 | }, 1293 | "parseurl": { 1294 | "version": "1.3.2", 1295 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 1296 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 1297 | }, 1298 | "path-exists": { 1299 | "version": "3.0.0", 1300 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1301 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1302 | }, 1303 | "path-to-regexp": { 1304 | "version": "0.1.7", 1305 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1306 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1307 | }, 1308 | "pend": { 1309 | "version": "1.2.0", 1310 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1311 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 1312 | }, 1313 | "performance-now": { 1314 | "version": "2.1.0", 1315 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1316 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1317 | }, 1318 | "pify": { 1319 | "version": "2.3.0", 1320 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1321 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1322 | }, 1323 | "pinkie": { 1324 | "version": "2.0.4", 1325 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1326 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1327 | }, 1328 | "pinkie-promise": { 1329 | "version": "2.0.1", 1330 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1331 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1332 | "requires": { 1333 | "pinkie": "^2.0.0" 1334 | } 1335 | }, 1336 | "pkg-dir": { 1337 | "version": "3.0.0", 1338 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", 1339 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", 1340 | "requires": { 1341 | "find-up": "^3.0.0" 1342 | } 1343 | }, 1344 | "platform": { 1345 | "version": "1.3.5", 1346 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", 1347 | "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==" 1348 | }, 1349 | "process-nextick-args": { 1350 | "version": "2.0.0", 1351 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1352 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1353 | }, 1354 | "proxy-addr": { 1355 | "version": "2.0.4", 1356 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 1357 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 1358 | "requires": { 1359 | "forwarded": "~0.1.2", 1360 | "ipaddr.js": "1.8.0" 1361 | } 1362 | }, 1363 | "pseudomap": { 1364 | "version": "1.0.2", 1365 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1366 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 1367 | }, 1368 | "psl": { 1369 | "version": "1.1.31", 1370 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 1371 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" 1372 | }, 1373 | "punycode": { 1374 | "version": "2.1.1", 1375 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1376 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1377 | }, 1378 | "qs": { 1379 | "version": "6.5.2", 1380 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1381 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1382 | }, 1383 | "range-parser": { 1384 | "version": "1.2.0", 1385 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 1386 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 1387 | }, 1388 | "raw-body": { 1389 | "version": "2.3.3", 1390 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 1391 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 1392 | "requires": { 1393 | "bytes": "3.0.0", 1394 | "http-errors": "1.6.3", 1395 | "iconv-lite": "0.4.23", 1396 | "unpipe": "1.0.0" 1397 | } 1398 | }, 1399 | "readable-stream": { 1400 | "version": "2.3.6", 1401 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1402 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1403 | "requires": { 1404 | "core-util-is": "~1.0.0", 1405 | "inherits": "~2.0.3", 1406 | "isarray": "~1.0.0", 1407 | "process-nextick-args": "~2.0.0", 1408 | "safe-buffer": "~5.1.1", 1409 | "string_decoder": "~1.1.1", 1410 | "util-deprecate": "~1.0.1" 1411 | } 1412 | }, 1413 | "referrer-policy": { 1414 | "version": "1.1.0", 1415 | "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", 1416 | "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" 1417 | }, 1418 | "regenerator-runtime": { 1419 | "version": "0.12.1", 1420 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", 1421 | "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" 1422 | }, 1423 | "request": { 1424 | "version": "2.88.0", 1425 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1426 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1427 | "requires": { 1428 | "aws-sign2": "~0.7.0", 1429 | "aws4": "^1.8.0", 1430 | "caseless": "~0.12.0", 1431 | "combined-stream": "~1.0.6", 1432 | "extend": "~3.0.2", 1433 | "forever-agent": "~0.6.1", 1434 | "form-data": "~2.3.2", 1435 | "har-validator": "~5.1.0", 1436 | "http-signature": "~1.2.0", 1437 | "is-typedarray": "~1.0.0", 1438 | "isstream": "~0.1.2", 1439 | "json-stringify-safe": "~5.0.1", 1440 | "mime-types": "~2.1.19", 1441 | "oauth-sign": "~0.9.0", 1442 | "performance-now": "^2.1.0", 1443 | "qs": "~6.5.2", 1444 | "safe-buffer": "^5.1.2", 1445 | "tough-cookie": "~2.4.3", 1446 | "tunnel-agent": "^0.6.0", 1447 | "uuid": "^3.3.2" 1448 | } 1449 | }, 1450 | "require_optional": { 1451 | "version": "1.0.1", 1452 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 1453 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 1454 | "requires": { 1455 | "resolve-from": "^2.0.0", 1456 | "semver": "^5.1.0" 1457 | } 1458 | }, 1459 | "resolve-from": { 1460 | "version": "2.0.0", 1461 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1462 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1463 | }, 1464 | "safe-buffer": { 1465 | "version": "5.1.2", 1466 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1467 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1468 | }, 1469 | "safer-buffer": { 1470 | "version": "2.1.2", 1471 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1472 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1473 | }, 1474 | "saslprep": { 1475 | "version": "1.0.2", 1476 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", 1477 | "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", 1478 | "optional": true, 1479 | "requires": { 1480 | "sparse-bitfield": "^3.0.3" 1481 | } 1482 | }, 1483 | "seek-bzip": { 1484 | "version": "1.0.5", 1485 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", 1486 | "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", 1487 | "requires": { 1488 | "commander": "~2.8.1" 1489 | } 1490 | }, 1491 | "semver": { 1492 | "version": "5.6.0", 1493 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1494 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 1495 | }, 1496 | "send": { 1497 | "version": "0.16.2", 1498 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1499 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1500 | "requires": { 1501 | "debug": "2.6.9", 1502 | "depd": "~1.1.2", 1503 | "destroy": "~1.0.4", 1504 | "encodeurl": "~1.0.2", 1505 | "escape-html": "~1.0.3", 1506 | "etag": "~1.8.1", 1507 | "fresh": "0.5.2", 1508 | "http-errors": "~1.6.2", 1509 | "mime": "1.4.1", 1510 | "ms": "2.0.0", 1511 | "on-finished": "~2.3.0", 1512 | "range-parser": "~1.2.0", 1513 | "statuses": "~1.4.0" 1514 | }, 1515 | "dependencies": { 1516 | "statuses": { 1517 | "version": "1.4.0", 1518 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1519 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1520 | } 1521 | } 1522 | }, 1523 | "serve-static": { 1524 | "version": "1.13.2", 1525 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1526 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1527 | "requires": { 1528 | "encodeurl": "~1.0.2", 1529 | "escape-html": "~1.0.3", 1530 | "parseurl": "~1.3.2", 1531 | "send": "0.16.2" 1532 | } 1533 | }, 1534 | "setprototypeof": { 1535 | "version": "1.1.0", 1536 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1537 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1538 | }, 1539 | "signal-exit": { 1540 | "version": "3.0.2", 1541 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1542 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1543 | }, 1544 | "sparse-bitfield": { 1545 | "version": "3.0.3", 1546 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1547 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1548 | "optional": true, 1549 | "requires": { 1550 | "memory-pager": "^1.0.2" 1551 | } 1552 | }, 1553 | "sshpk": { 1554 | "version": "1.16.1", 1555 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1556 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1557 | "requires": { 1558 | "asn1": "~0.2.3", 1559 | "assert-plus": "^1.0.0", 1560 | "bcrypt-pbkdf": "^1.0.0", 1561 | "dashdash": "^1.12.0", 1562 | "ecc-jsbn": "~0.1.1", 1563 | "getpass": "^0.1.1", 1564 | "jsbn": "~0.1.0", 1565 | "safer-buffer": "^2.0.2", 1566 | "tweetnacl": "~0.14.0" 1567 | } 1568 | }, 1569 | "statuses": { 1570 | "version": "1.5.0", 1571 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1572 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1573 | }, 1574 | "string_decoder": { 1575 | "version": "1.1.1", 1576 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1577 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1578 | "requires": { 1579 | "safe-buffer": "~5.1.0" 1580 | } 1581 | }, 1582 | "strip-dirs": { 1583 | "version": "2.1.0", 1584 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 1585 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 1586 | "requires": { 1587 | "is-natural-number": "^4.0.1" 1588 | } 1589 | }, 1590 | "tar-stream": { 1591 | "version": "1.6.2", 1592 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 1593 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 1594 | "requires": { 1595 | "bl": "^1.0.0", 1596 | "buffer-alloc": "^1.2.0", 1597 | "end-of-stream": "^1.0.0", 1598 | "fs-constants": "^1.0.0", 1599 | "readable-stream": "^2.3.0", 1600 | "to-buffer": "^1.1.1", 1601 | "xtend": "^4.0.0" 1602 | } 1603 | }, 1604 | "through": { 1605 | "version": "2.3.8", 1606 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1607 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1608 | }, 1609 | "tmp": { 1610 | "version": "0.0.33", 1611 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1612 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1613 | "requires": { 1614 | "os-tmpdir": "~1.0.2" 1615 | } 1616 | }, 1617 | "to-buffer": { 1618 | "version": "1.1.1", 1619 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 1620 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 1621 | }, 1622 | "tough-cookie": { 1623 | "version": "2.4.3", 1624 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1625 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1626 | "requires": { 1627 | "psl": "^1.1.24", 1628 | "punycode": "^1.4.1" 1629 | }, 1630 | "dependencies": { 1631 | "punycode": { 1632 | "version": "1.4.1", 1633 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1634 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1635 | } 1636 | } 1637 | }, 1638 | "tunnel-agent": { 1639 | "version": "0.6.0", 1640 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1641 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1642 | "requires": { 1643 | "safe-buffer": "^5.0.1" 1644 | } 1645 | }, 1646 | "tweetnacl": { 1647 | "version": "0.14.5", 1648 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1649 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1650 | }, 1651 | "type-is": { 1652 | "version": "1.6.16", 1653 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 1654 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 1655 | "requires": { 1656 | "media-typer": "0.3.0", 1657 | "mime-types": "~2.1.18" 1658 | } 1659 | }, 1660 | "unbzip2-stream": { 1661 | "version": "1.3.3", 1662 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", 1663 | "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", 1664 | "requires": { 1665 | "buffer": "^5.2.1", 1666 | "through": "^2.3.8" 1667 | } 1668 | }, 1669 | "unpipe": { 1670 | "version": "1.0.0", 1671 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1672 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1673 | }, 1674 | "uri-js": { 1675 | "version": "4.2.2", 1676 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1677 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1678 | "requires": { 1679 | "punycode": "^2.1.0" 1680 | } 1681 | }, 1682 | "util-deprecate": { 1683 | "version": "1.0.2", 1684 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1685 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1686 | }, 1687 | "utils-merge": { 1688 | "version": "1.0.1", 1689 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1690 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1691 | }, 1692 | "uuid": { 1693 | "version": "3.3.2", 1694 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1695 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1696 | }, 1697 | "vary": { 1698 | "version": "1.1.2", 1699 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1700 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1701 | }, 1702 | "verror": { 1703 | "version": "1.10.0", 1704 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1705 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1706 | "requires": { 1707 | "assert-plus": "^1.0.0", 1708 | "core-util-is": "1.0.2", 1709 | "extsprintf": "^1.2.0" 1710 | } 1711 | }, 1712 | "very-fast-args": { 1713 | "version": "1.1.0", 1714 | "resolved": "https://registry.npmjs.org/very-fast-args/-/very-fast-args-1.1.0.tgz", 1715 | "integrity": "sha1-4W0dH6+KbllqJGQh/ZCneWPQs5Y=" 1716 | }, 1717 | "wrappy": { 1718 | "version": "1.0.2", 1719 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1720 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1721 | }, 1722 | "x-xss-protection": { 1723 | "version": "1.1.0", 1724 | "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz", 1725 | "integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg==" 1726 | }, 1727 | "xtend": { 1728 | "version": "4.0.1", 1729 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1730 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1731 | }, 1732 | "yallist": { 1733 | "version": "2.1.2", 1734 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1735 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 1736 | }, 1737 | "yauzl": { 1738 | "version": "2.10.0", 1739 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1740 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1741 | "requires": { 1742 | "buffer-crc32": "~0.2.3", 1743 | "fd-slicer": "~1.1.0" 1744 | } 1745 | } 1746 | } 1747 | } 1748 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-ads-api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.18.3", 14 | "cors": "^2.8.5", 15 | "express": "^4.16.4", 16 | "express-jwt": "^5.3.1", 17 | "helmet": "^3.15.1", 18 | "jwks-rsa": "^1.4.0", 19 | "mongodb": "^3.1.13", 20 | "mongodb-memory-server": "^3.1.1", 21 | "morgan": "^1.9.1" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/database/ads.js: -------------------------------------------------------------------------------- 1 | const {getDatabase} = require('./mongo'); 2 | const {ObjectID} = require('mongodb'); 3 | 4 | const collectionName = 'ads'; 5 | 6 | async function insertAd(ad) { 7 | const database = await getDatabase(); 8 | const {insertedId} = await database.collection(collectionName).insertOne(ad); 9 | return insertedId; 10 | } 11 | 12 | async function getAds() { 13 | const database = await getDatabase(); 14 | return await database.collection(collectionName).find({}).toArray(); 15 | } 16 | 17 | async function deleteAd(id) { 18 | const database = await getDatabase(); 19 | await database.collection(collectionName).deleteOne({ 20 | _id: new ObjectID(id), 21 | }); 22 | } 23 | 24 | async function updateAd(id, ad) { 25 | const database = await getDatabase(); 26 | delete ad._id; 27 | await database.collection(collectionName).update( 28 | { _id: new ObjectID(id), }, 29 | { 30 | $set: { 31 | ...ad, 32 | }, 33 | }, 34 | ); 35 | } 36 | 37 | module.exports = { 38 | insertAd, 39 | getAds, 40 | deleteAd, 41 | updateAd, 42 | }; 43 | -------------------------------------------------------------------------------- /src/database/mongo.js: -------------------------------------------------------------------------------- 1 | const {MongoMemoryServer} = require('mongodb-memory-server'); 2 | const {MongoClient} = require('mongodb'); 3 | 4 | let database = null; 5 | 6 | async function startDatabase() { 7 | const mongo = new MongoMemoryServer(); 8 | const mongoDBURL = await mongo.getConnectionString(); 9 | const connection = await MongoClient.connect(mongoDBURL, {useNewUrlParser: true}); 10 | database = connection.db(); 11 | } 12 | 13 | async function getDatabase() { 14 | if (!database) await startDatabase(); 15 | return database; 16 | } 17 | 18 | module.exports = { 19 | getDatabase, 20 | startDatabase, 21 | }; 22 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // ./src/index.js 2 | 3 | //importing the dependencies 4 | const express = require('express'); 5 | const bodyParser = require('body-parser'); 6 | const cors = require('cors'); 7 | const helmet = require('helmet'); 8 | const morgan = require('morgan'); 9 | const {startDatabase} = require('./database/mongo'); 10 | const {insertAd, getAds} = require('./database/ads'); 11 | const {deleteAd, updateAd} = require('./database/ads'); 12 | const jwt = require('express-jwt'); 13 | const jwksRsa = require('jwks-rsa'); 14 | 15 | // defining the Express app 16 | const app = express(); 17 | 18 | // adding Helmet to enhance your API's security 19 | app.use(helmet()); 20 | 21 | // using bodyParser to parse JSON bodies into JS objects 22 | app.use(bodyParser.json()); 23 | 24 | // enabling CORS for all requests (not very secure) 25 | app.use(cors()); 26 | 27 | // adding morgan to log HTTP requests 28 | app.use(morgan('combined')); 29 | 30 | // endpoint to return all ads 31 | app.get('/', async (req, res) => { 32 | res.send(await getAds()); 33 | }); 34 | 35 | const checkJwt = jwt({ 36 | secret: jwksRsa.expressJwtSecret({ 37 | cache: true, 38 | rateLimit: true, 39 | jwksRequestsPerMinute: 5, 40 | jwksUri: `https://blog-samples.auth0.com/.well-known/jwks.json` 41 | }), 42 | 43 | // Validate the audience and the issuer. 44 | audience: 'https://ads-api', 45 | issuer: `https://blog-samples.auth0.com/`, 46 | algorithms: ['RS256'] 47 | }); 48 | 49 | app.use(checkJwt); 50 | 51 | app.post('/', async (req, res) => { 52 | const newAd = req.body; 53 | await insertAd(newAd); 54 | res.send({ message: 'New ad inserted.' }); 55 | }); 56 | 57 | // endpoint to delete an ad 58 | app.delete('/:id', async (req, res) => { 59 | await deleteAd(req.params.id); 60 | res.send({ message: 'Ad removed.' }); 61 | }); 62 | 63 | // endpoint to update an ad 64 | app.put('/:id', async (req, res) => { 65 | const updatedAd = req.body; 66 | await updateAd(req.params.id, updatedAd); 67 | res.send({ message: 'Ad updated.' }); 68 | }); 69 | 70 | // start the in-memory MongoDB instance 71 | startDatabase().then(async () => { 72 | await insertAd({title: 'Hello, now from the in-memory database!'}); 73 | 74 | // start the server 75 | app.listen(3001, async () => { 76 | console.log('listening on port 3001'); 77 | }); 78 | }); 79 | --------------------------------------------------------------------------------