├── README.md ├── index.html ├── package-lock.json ├── package.json ├── server.js └── spec ├── server.spec.js └── support └── jasmine.json /README.md: -------------------------------------------------------------------------------- 1 | # simple-chat 2 | A simple chat application in nodejs and mongodb 3 | 4 | Read 5 | https://medium.com/@amkurian/simple-chat-application-in-node-js-using-express-mongoose-and-socket-io-ee62d94f5804 6 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | My First Node App 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |

Send Message

16 |
17 | 18 |
19 | 20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo-chat-app", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/component-emitter": { 8 | "version": "1.2.11", 9 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", 10 | "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" 11 | }, 12 | "@types/cookie": { 13 | "version": "0.4.1", 14 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", 15 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" 16 | }, 17 | "@types/cors": { 18 | "version": "2.8.12", 19 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", 20 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" 21 | }, 22 | "@types/node": { 23 | "version": "17.0.32", 24 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.32.tgz", 25 | "integrity": "sha512-eAIcfAvhf/BkHcf4pkLJ7ECpBAhh9kcxRBpip9cTiO+hf+aJrsxYxBeS6OXvOd9WqNAJmavXVpZvY1rBjNsXmw==" 26 | }, 27 | "accepts": { 28 | "version": "1.3.5", 29 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 30 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 31 | "requires": { 32 | "mime-types": "~2.1.18", 33 | "negotiator": "0.6.1" 34 | } 35 | }, 36 | "ajv": { 37 | "version": "5.5.2", 38 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 39 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 40 | "dev": true, 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 | "array-flatten": { 49 | "version": "1.1.1", 50 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 51 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 52 | }, 53 | "asn1": { 54 | "version": "0.2.3", 55 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 56 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", 57 | "dev": true 58 | }, 59 | "assert-plus": { 60 | "version": "1.0.0", 61 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 62 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 63 | "dev": true 64 | }, 65 | "asynckit": { 66 | "version": "0.4.0", 67 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 68 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 69 | "dev": true 70 | }, 71 | "aws-sign2": { 72 | "version": "0.7.0", 73 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 74 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 75 | "dev": true 76 | }, 77 | "aws4": { 78 | "version": "1.7.0", 79 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 80 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", 81 | "dev": true 82 | }, 83 | "balanced-match": { 84 | "version": "1.0.0", 85 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 86 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 87 | "dev": true 88 | }, 89 | "bcrypt-pbkdf": { 90 | "version": "1.0.2", 91 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 92 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 93 | "dev": true, 94 | "optional": true, 95 | "requires": { 96 | "tweetnacl": "^0.14.3" 97 | } 98 | }, 99 | "bluebird": { 100 | "version": "3.5.1", 101 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 102 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 103 | }, 104 | "body-parser": { 105 | "version": "1.18.3", 106 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 107 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 108 | "requires": { 109 | "bytes": "3.0.0", 110 | "content-type": "~1.0.4", 111 | "debug": "2.6.9", 112 | "depd": "~1.1.2", 113 | "http-errors": "~1.6.3", 114 | "iconv-lite": "0.4.23", 115 | "on-finished": "~2.3.0", 116 | "qs": "6.5.2", 117 | "raw-body": "2.3.3", 118 | "type-is": "~1.6.16" 119 | }, 120 | "dependencies": { 121 | "qs": { 122 | "version": "6.5.2", 123 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 124 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 125 | } 126 | } 127 | }, 128 | "brace-expansion": { 129 | "version": "1.1.11", 130 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 131 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 132 | "dev": true, 133 | "requires": { 134 | "balanced-match": "^1.0.0", 135 | "concat-map": "0.0.1" 136 | } 137 | }, 138 | "bson": { 139 | "version": "1.1.3", 140 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", 141 | "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" 142 | }, 143 | "bytes": { 144 | "version": "3.0.0", 145 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 146 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 147 | }, 148 | "caseless": { 149 | "version": "0.12.0", 150 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 151 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 152 | "dev": true 153 | }, 154 | "co": { 155 | "version": "4.6.0", 156 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 157 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 158 | "dev": true 159 | }, 160 | "combined-stream": { 161 | "version": "1.0.6", 162 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 163 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 164 | "dev": true, 165 | "requires": { 166 | "delayed-stream": "~1.0.0" 167 | } 168 | }, 169 | "component-emitter": { 170 | "version": "1.3.0", 171 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 172 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 173 | }, 174 | "concat-map": { 175 | "version": "0.0.1", 176 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 177 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 178 | "dev": true 179 | }, 180 | "content-disposition": { 181 | "version": "0.5.2", 182 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 183 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 184 | }, 185 | "content-type": { 186 | "version": "1.0.4", 187 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 188 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 189 | }, 190 | "cookie": { 191 | "version": "0.3.1", 192 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 193 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 194 | }, 195 | "cookie-signature": { 196 | "version": "1.0.6", 197 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 198 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 199 | }, 200 | "core-util-is": { 201 | "version": "1.0.2", 202 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 203 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 204 | "dev": true 205 | }, 206 | "cors": { 207 | "version": "2.8.5", 208 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 209 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 210 | "requires": { 211 | "object-assign": "^4", 212 | "vary": "^1" 213 | } 214 | }, 215 | "dashdash": { 216 | "version": "1.14.1", 217 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 218 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 219 | "dev": true, 220 | "requires": { 221 | "assert-plus": "^1.0.0" 222 | } 223 | }, 224 | "debug": { 225 | "version": "2.6.9", 226 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 227 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 228 | "requires": { 229 | "ms": "2.0.0" 230 | } 231 | }, 232 | "delayed-stream": { 233 | "version": "1.0.0", 234 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 235 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 236 | "dev": true 237 | }, 238 | "depd": { 239 | "version": "1.1.2", 240 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 241 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 242 | }, 243 | "destroy": { 244 | "version": "1.0.4", 245 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 246 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 247 | }, 248 | "ecc-jsbn": { 249 | "version": "0.1.1", 250 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 251 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 252 | "dev": true, 253 | "optional": true, 254 | "requires": { 255 | "jsbn": "~0.1.0" 256 | } 257 | }, 258 | "ee-first": { 259 | "version": "1.1.1", 260 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 261 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 262 | }, 263 | "encodeurl": { 264 | "version": "1.0.2", 265 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 266 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 267 | }, 268 | "engine.io": { 269 | "version": "6.2.0", 270 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", 271 | "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", 272 | "requires": { 273 | "@types/cookie": "^0.4.1", 274 | "@types/cors": "^2.8.12", 275 | "@types/node": ">=10.0.0", 276 | "accepts": "~1.3.4", 277 | "base64id": "2.0.0", 278 | "cookie": "~0.4.1", 279 | "cors": "~2.8.5", 280 | "debug": "~4.3.1", 281 | "engine.io-parser": "~5.0.3", 282 | "ws": "~8.2.3" 283 | }, 284 | "dependencies": { 285 | "base64id": { 286 | "version": "2.0.0", 287 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 288 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" 289 | }, 290 | "cookie": { 291 | "version": "0.4.2", 292 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 293 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" 294 | }, 295 | "debug": { 296 | "version": "4.3.4", 297 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 298 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 299 | "requires": { 300 | "ms": "2.1.2" 301 | } 302 | }, 303 | "ms": { 304 | "version": "2.1.2", 305 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 306 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 307 | } 308 | } 309 | }, 310 | "engine.io-parser": { 311 | "version": "5.0.4", 312 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", 313 | "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==" 314 | }, 315 | "escape-html": { 316 | "version": "1.0.3", 317 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 318 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 319 | }, 320 | "etag": { 321 | "version": "1.8.1", 322 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 323 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 324 | }, 325 | "express": { 326 | "version": "4.16.3", 327 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 328 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 329 | "requires": { 330 | "accepts": "~1.3.5", 331 | "array-flatten": "1.1.1", 332 | "body-parser": "1.18.2", 333 | "content-disposition": "0.5.2", 334 | "content-type": "~1.0.4", 335 | "cookie": "0.3.1", 336 | "cookie-signature": "1.0.6", 337 | "debug": "2.6.9", 338 | "depd": "~1.1.2", 339 | "encodeurl": "~1.0.2", 340 | "escape-html": "~1.0.3", 341 | "etag": "~1.8.1", 342 | "finalhandler": "1.1.1", 343 | "fresh": "0.5.2", 344 | "merge-descriptors": "1.0.1", 345 | "methods": "~1.1.2", 346 | "on-finished": "~2.3.0", 347 | "parseurl": "~1.3.2", 348 | "path-to-regexp": "0.1.7", 349 | "proxy-addr": "~2.0.3", 350 | "qs": "6.5.1", 351 | "range-parser": "~1.2.0", 352 | "safe-buffer": "5.1.1", 353 | "send": "0.16.2", 354 | "serve-static": "1.13.2", 355 | "setprototypeof": "1.1.0", 356 | "statuses": "~1.4.0", 357 | "type-is": "~1.6.16", 358 | "utils-merge": "1.0.1", 359 | "vary": "~1.1.2" 360 | }, 361 | "dependencies": { 362 | "body-parser": { 363 | "version": "1.18.2", 364 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 365 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 366 | "requires": { 367 | "bytes": "3.0.0", 368 | "content-type": "~1.0.4", 369 | "debug": "2.6.9", 370 | "depd": "~1.1.1", 371 | "http-errors": "~1.6.2", 372 | "iconv-lite": "0.4.19", 373 | "on-finished": "~2.3.0", 374 | "qs": "6.5.1", 375 | "raw-body": "2.3.2", 376 | "type-is": "~1.6.15" 377 | } 378 | }, 379 | "iconv-lite": { 380 | "version": "0.4.19", 381 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 382 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 383 | }, 384 | "raw-body": { 385 | "version": "2.3.2", 386 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 387 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 388 | "requires": { 389 | "bytes": "3.0.0", 390 | "http-errors": "1.6.2", 391 | "iconv-lite": "0.4.19", 392 | "unpipe": "1.0.0" 393 | }, 394 | "dependencies": { 395 | "depd": { 396 | "version": "1.1.1", 397 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 398 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 399 | }, 400 | "http-errors": { 401 | "version": "1.6.2", 402 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 403 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 404 | "requires": { 405 | "depd": "1.1.1", 406 | "inherits": "2.0.3", 407 | "setprototypeof": "1.0.3", 408 | "statuses": ">= 1.3.1 < 2" 409 | } 410 | }, 411 | "setprototypeof": { 412 | "version": "1.0.3", 413 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 414 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 415 | } 416 | } 417 | } 418 | } 419 | }, 420 | "extend": { 421 | "version": "3.0.2", 422 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 423 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 424 | "dev": true 425 | }, 426 | "extsprintf": { 427 | "version": "1.3.0", 428 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 429 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 430 | "dev": true 431 | }, 432 | "fast-deep-equal": { 433 | "version": "1.1.0", 434 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 435 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 436 | "dev": true 437 | }, 438 | "fast-json-stable-stringify": { 439 | "version": "2.0.0", 440 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 441 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 442 | "dev": true 443 | }, 444 | "finalhandler": { 445 | "version": "1.1.1", 446 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 447 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 448 | "requires": { 449 | "debug": "2.6.9", 450 | "encodeurl": "~1.0.2", 451 | "escape-html": "~1.0.3", 452 | "on-finished": "~2.3.0", 453 | "parseurl": "~1.3.2", 454 | "statuses": "~1.4.0", 455 | "unpipe": "~1.0.0" 456 | } 457 | }, 458 | "forever-agent": { 459 | "version": "0.6.1", 460 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 461 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 462 | "dev": true 463 | }, 464 | "form-data": { 465 | "version": "2.3.2", 466 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 467 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 468 | "dev": true, 469 | "requires": { 470 | "asynckit": "^0.4.0", 471 | "combined-stream": "1.0.6", 472 | "mime-types": "^2.1.12" 473 | } 474 | }, 475 | "forwarded": { 476 | "version": "0.1.2", 477 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 478 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 479 | }, 480 | "fresh": { 481 | "version": "0.5.2", 482 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 483 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 484 | }, 485 | "fs.realpath": { 486 | "version": "1.0.0", 487 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 488 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 489 | "dev": true 490 | }, 491 | "getpass": { 492 | "version": "0.1.7", 493 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 494 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 495 | "dev": true, 496 | "requires": { 497 | "assert-plus": "^1.0.0" 498 | } 499 | }, 500 | "glob": { 501 | "version": "7.1.2", 502 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 503 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 504 | "dev": true, 505 | "requires": { 506 | "fs.realpath": "^1.0.0", 507 | "inflight": "^1.0.4", 508 | "inherits": "2", 509 | "minimatch": "^3.0.4", 510 | "once": "^1.3.0", 511 | "path-is-absolute": "^1.0.0" 512 | } 513 | }, 514 | "har-schema": { 515 | "version": "2.0.0", 516 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 517 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 518 | "dev": true 519 | }, 520 | "har-validator": { 521 | "version": "5.0.3", 522 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 523 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 524 | "dev": true, 525 | "requires": { 526 | "ajv": "^5.1.0", 527 | "har-schema": "^2.0.0" 528 | } 529 | }, 530 | "http-errors": { 531 | "version": "1.6.3", 532 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 533 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 534 | "requires": { 535 | "depd": "~1.1.2", 536 | "inherits": "2.0.3", 537 | "setprototypeof": "1.1.0", 538 | "statuses": ">= 1.4.0 < 2" 539 | } 540 | }, 541 | "http-signature": { 542 | "version": "1.2.0", 543 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 544 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 545 | "dev": true, 546 | "requires": { 547 | "assert-plus": "^1.0.0", 548 | "jsprim": "^1.2.2", 549 | "sshpk": "^1.7.0" 550 | } 551 | }, 552 | "iconv-lite": { 553 | "version": "0.4.23", 554 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 555 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 556 | "requires": { 557 | "safer-buffer": ">= 2.1.2 < 3" 558 | } 559 | }, 560 | "inflight": { 561 | "version": "1.0.6", 562 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 563 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 564 | "dev": true, 565 | "requires": { 566 | "once": "^1.3.0", 567 | "wrappy": "1" 568 | } 569 | }, 570 | "inherits": { 571 | "version": "2.0.3", 572 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 573 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 574 | }, 575 | "ipaddr.js": { 576 | "version": "1.8.0", 577 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 578 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 579 | }, 580 | "is-typedarray": { 581 | "version": "1.0.0", 582 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 583 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 584 | "dev": true 585 | }, 586 | "isstream": { 587 | "version": "0.1.2", 588 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 589 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 590 | "dev": true 591 | }, 592 | "jasmine": { 593 | "version": "3.1.0", 594 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.1.0.tgz", 595 | "integrity": "sha1-K9Wf1+xuwOistk4J9Fpo7SrRlSo=", 596 | "dev": true, 597 | "requires": { 598 | "glob": "^7.0.6", 599 | "jasmine-core": "~3.1.0" 600 | } 601 | }, 602 | "jasmine-core": { 603 | "version": "3.1.0", 604 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.1.0.tgz", 605 | "integrity": "sha1-pHheE11d9lAk38kiSVPfWFvSdmw=", 606 | "dev": true 607 | }, 608 | "jsbn": { 609 | "version": "0.1.1", 610 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 611 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 612 | "dev": true, 613 | "optional": true 614 | }, 615 | "json-schema": { 616 | "version": "0.2.3", 617 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 618 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 619 | "dev": true 620 | }, 621 | "json-schema-traverse": { 622 | "version": "0.3.1", 623 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 624 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 625 | "dev": true 626 | }, 627 | "json-stringify-safe": { 628 | "version": "5.0.1", 629 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 630 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 631 | "dev": true 632 | }, 633 | "jsprim": { 634 | "version": "1.4.1", 635 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 636 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 637 | "dev": true, 638 | "requires": { 639 | "assert-plus": "1.0.0", 640 | "extsprintf": "1.3.0", 641 | "json-schema": "0.2.3", 642 | "verror": "1.10.0" 643 | } 644 | }, 645 | "kareem": { 646 | "version": "2.3.1", 647 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 648 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 649 | }, 650 | "media-typer": { 651 | "version": "0.3.0", 652 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 653 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 654 | }, 655 | "merge-descriptors": { 656 | "version": "1.0.1", 657 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 658 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 659 | }, 660 | "methods": { 661 | "version": "1.1.2", 662 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 663 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 664 | }, 665 | "mime": { 666 | "version": "1.4.1", 667 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 668 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 669 | }, 670 | "mime-db": { 671 | "version": "1.35.0", 672 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", 673 | "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" 674 | }, 675 | "mime-types": { 676 | "version": "2.1.19", 677 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", 678 | "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", 679 | "requires": { 680 | "mime-db": "~1.35.0" 681 | } 682 | }, 683 | "minimatch": { 684 | "version": "3.0.4", 685 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 686 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 687 | "dev": true, 688 | "requires": { 689 | "brace-expansion": "^1.1.7" 690 | } 691 | }, 692 | "mongodb": { 693 | "version": "3.3.2", 694 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz", 695 | "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==", 696 | "requires": { 697 | "bson": "^1.1.1", 698 | "require_optional": "^1.0.1", 699 | "safe-buffer": "^5.1.2" 700 | }, 701 | "dependencies": { 702 | "safe-buffer": { 703 | "version": "5.2.0", 704 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 705 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 706 | } 707 | } 708 | }, 709 | "mongoose": { 710 | "version": "5.7.5", 711 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.5.tgz", 712 | "integrity": "sha512-BZ4FxtnbTurc/wcm/hLltLdI4IDxo4nsE0D9q58YymTdZwreNzwO62CcjVtaHhmr8HmJtOInp2W/T12FZaMf8g==", 713 | "requires": { 714 | "bson": "~1.1.1", 715 | "kareem": "2.3.1", 716 | "mongodb": "3.3.2", 717 | "mongoose-legacy-pluralize": "1.0.2", 718 | "mpath": "0.6.0", 719 | "mquery": "3.2.2", 720 | "ms": "2.1.2", 721 | "regexp-clone": "1.0.0", 722 | "safe-buffer": "5.1.2", 723 | "sift": "7.0.1", 724 | "sliced": "1.0.1" 725 | }, 726 | "dependencies": { 727 | "ms": { 728 | "version": "2.1.2", 729 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 730 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 731 | }, 732 | "safe-buffer": { 733 | "version": "5.1.2", 734 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 735 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 736 | } 737 | } 738 | }, 739 | "mongoose-legacy-pluralize": { 740 | "version": "1.0.2", 741 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 742 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 743 | }, 744 | "mpath": { 745 | "version": "0.6.0", 746 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", 747 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" 748 | }, 749 | "mquery": { 750 | "version": "3.2.2", 751 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 752 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 753 | "requires": { 754 | "bluebird": "3.5.1", 755 | "debug": "3.1.0", 756 | "regexp-clone": "^1.0.0", 757 | "safe-buffer": "5.1.2", 758 | "sliced": "1.0.1" 759 | }, 760 | "dependencies": { 761 | "debug": { 762 | "version": "3.1.0", 763 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 764 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 765 | "requires": { 766 | "ms": "2.0.0" 767 | } 768 | }, 769 | "safe-buffer": { 770 | "version": "5.1.2", 771 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 772 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 773 | } 774 | } 775 | }, 776 | "ms": { 777 | "version": "2.0.0", 778 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 779 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 780 | }, 781 | "negotiator": { 782 | "version": "0.6.1", 783 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 784 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 785 | }, 786 | "oauth-sign": { 787 | "version": "0.8.2", 788 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 789 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", 790 | "dev": true 791 | }, 792 | "object-assign": { 793 | "version": "4.1.1", 794 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 795 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 796 | }, 797 | "on-finished": { 798 | "version": "2.3.0", 799 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 800 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 801 | "requires": { 802 | "ee-first": "1.1.1" 803 | } 804 | }, 805 | "once": { 806 | "version": "1.4.0", 807 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 808 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 809 | "dev": true, 810 | "requires": { 811 | "wrappy": "1" 812 | } 813 | }, 814 | "parseurl": { 815 | "version": "1.3.2", 816 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 817 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 818 | }, 819 | "path-is-absolute": { 820 | "version": "1.0.1", 821 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 822 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 823 | "dev": true 824 | }, 825 | "path-to-regexp": { 826 | "version": "0.1.7", 827 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 828 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 829 | }, 830 | "performance-now": { 831 | "version": "2.1.0", 832 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 833 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 834 | "dev": true 835 | }, 836 | "proxy-addr": { 837 | "version": "2.0.4", 838 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 839 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 840 | "requires": { 841 | "forwarded": "~0.1.2", 842 | "ipaddr.js": "1.8.0" 843 | } 844 | }, 845 | "punycode": { 846 | "version": "1.4.1", 847 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 848 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 849 | "dev": true 850 | }, 851 | "qs": { 852 | "version": "6.5.1", 853 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 854 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 855 | }, 856 | "range-parser": { 857 | "version": "1.2.0", 858 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 859 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 860 | }, 861 | "raw-body": { 862 | "version": "2.3.3", 863 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 864 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 865 | "requires": { 866 | "bytes": "3.0.0", 867 | "http-errors": "1.6.3", 868 | "iconv-lite": "0.4.23", 869 | "unpipe": "1.0.0" 870 | } 871 | }, 872 | "regexp-clone": { 873 | "version": "1.0.0", 874 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 875 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 876 | }, 877 | "request": { 878 | "version": "2.87.0", 879 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", 880 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", 881 | "dev": true, 882 | "requires": { 883 | "aws-sign2": "~0.7.0", 884 | "aws4": "^1.6.0", 885 | "caseless": "~0.12.0", 886 | "combined-stream": "~1.0.5", 887 | "extend": "~3.0.1", 888 | "forever-agent": "~0.6.1", 889 | "form-data": "~2.3.1", 890 | "har-validator": "~5.0.3", 891 | "http-signature": "~1.2.0", 892 | "is-typedarray": "~1.0.0", 893 | "isstream": "~0.1.2", 894 | "json-stringify-safe": "~5.0.1", 895 | "mime-types": "~2.1.17", 896 | "oauth-sign": "~0.8.2", 897 | "performance-now": "^2.1.0", 898 | "qs": "~6.5.1", 899 | "safe-buffer": "^5.1.1", 900 | "tough-cookie": "~2.3.3", 901 | "tunnel-agent": "^0.6.0", 902 | "uuid": "^3.1.0" 903 | } 904 | }, 905 | "require_optional": { 906 | "version": "1.0.1", 907 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 908 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 909 | "requires": { 910 | "resolve-from": "^2.0.0", 911 | "semver": "^5.1.0" 912 | } 913 | }, 914 | "resolve-from": { 915 | "version": "2.0.0", 916 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 917 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 918 | }, 919 | "safe-buffer": { 920 | "version": "5.1.1", 921 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 922 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 923 | }, 924 | "safer-buffer": { 925 | "version": "2.1.2", 926 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 927 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 928 | }, 929 | "semver": { 930 | "version": "5.7.1", 931 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 932 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 933 | }, 934 | "send": { 935 | "version": "0.16.2", 936 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 937 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 938 | "requires": { 939 | "debug": "2.6.9", 940 | "depd": "~1.1.2", 941 | "destroy": "~1.0.4", 942 | "encodeurl": "~1.0.2", 943 | "escape-html": "~1.0.3", 944 | "etag": "~1.8.1", 945 | "fresh": "0.5.2", 946 | "http-errors": "~1.6.2", 947 | "mime": "1.4.1", 948 | "ms": "2.0.0", 949 | "on-finished": "~2.3.0", 950 | "range-parser": "~1.2.0", 951 | "statuses": "~1.4.0" 952 | } 953 | }, 954 | "serve-static": { 955 | "version": "1.13.2", 956 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 957 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 958 | "requires": { 959 | "encodeurl": "~1.0.2", 960 | "escape-html": "~1.0.3", 961 | "parseurl": "~1.3.2", 962 | "send": "0.16.2" 963 | } 964 | }, 965 | "setprototypeof": { 966 | "version": "1.1.0", 967 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 968 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 969 | }, 970 | "sift": { 971 | "version": "7.0.1", 972 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 973 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 974 | }, 975 | "sliced": { 976 | "version": "1.0.1", 977 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 978 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 979 | }, 980 | "socket.io": { 981 | "version": "4.5.0", 982 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", 983 | "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", 984 | "requires": { 985 | "accepts": "~1.3.4", 986 | "base64id": "~2.0.0", 987 | "debug": "~4.3.2", 988 | "engine.io": "~6.2.0", 989 | "socket.io-adapter": "~2.4.0", 990 | "socket.io-parser": "~4.0.4" 991 | }, 992 | "dependencies": { 993 | "base64id": { 994 | "version": "2.0.0", 995 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 996 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" 997 | }, 998 | "debug": { 999 | "version": "4.3.4", 1000 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1001 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1002 | "requires": { 1003 | "ms": "2.1.2" 1004 | } 1005 | }, 1006 | "ms": { 1007 | "version": "2.1.2", 1008 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1009 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1010 | } 1011 | } 1012 | }, 1013 | "socket.io-adapter": { 1014 | "version": "2.4.0", 1015 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", 1016 | "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" 1017 | }, 1018 | "socket.io-parser": { 1019 | "version": "4.0.4", 1020 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", 1021 | "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", 1022 | "requires": { 1023 | "@types/component-emitter": "^1.2.10", 1024 | "component-emitter": "~1.3.0", 1025 | "debug": "~4.3.1" 1026 | }, 1027 | "dependencies": { 1028 | "debug": { 1029 | "version": "4.3.4", 1030 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1031 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1032 | "requires": { 1033 | "ms": "2.1.2" 1034 | } 1035 | }, 1036 | "ms": { 1037 | "version": "2.1.2", 1038 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1039 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1040 | } 1041 | } 1042 | }, 1043 | "sshpk": { 1044 | "version": "1.14.2", 1045 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 1046 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 1047 | "dev": true, 1048 | "requires": { 1049 | "asn1": "~0.2.3", 1050 | "assert-plus": "^1.0.0", 1051 | "bcrypt-pbkdf": "^1.0.0", 1052 | "dashdash": "^1.12.0", 1053 | "ecc-jsbn": "~0.1.1", 1054 | "getpass": "^0.1.1", 1055 | "jsbn": "~0.1.0", 1056 | "safer-buffer": "^2.0.2", 1057 | "tweetnacl": "~0.14.0" 1058 | } 1059 | }, 1060 | "statuses": { 1061 | "version": "1.4.0", 1062 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1063 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1064 | }, 1065 | "tough-cookie": { 1066 | "version": "2.3.4", 1067 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 1068 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 1069 | "dev": true, 1070 | "requires": { 1071 | "punycode": "^1.4.1" 1072 | } 1073 | }, 1074 | "tunnel-agent": { 1075 | "version": "0.6.0", 1076 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1077 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1078 | "dev": true, 1079 | "requires": { 1080 | "safe-buffer": "^5.0.1" 1081 | } 1082 | }, 1083 | "tweetnacl": { 1084 | "version": "0.14.5", 1085 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1086 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1087 | "dev": true, 1088 | "optional": true 1089 | }, 1090 | "type-is": { 1091 | "version": "1.6.16", 1092 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 1093 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 1094 | "requires": { 1095 | "media-typer": "0.3.0", 1096 | "mime-types": "~2.1.18" 1097 | } 1098 | }, 1099 | "unpipe": { 1100 | "version": "1.0.0", 1101 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1102 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1103 | }, 1104 | "utils-merge": { 1105 | "version": "1.0.1", 1106 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1107 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1108 | }, 1109 | "uuid": { 1110 | "version": "3.3.2", 1111 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1112 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1113 | "dev": true 1114 | }, 1115 | "vary": { 1116 | "version": "1.1.2", 1117 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1118 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1119 | }, 1120 | "verror": { 1121 | "version": "1.10.0", 1122 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1123 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1124 | "dev": true, 1125 | "requires": { 1126 | "assert-plus": "^1.0.0", 1127 | "core-util-is": "1.0.2", 1128 | "extsprintf": "^1.2.0" 1129 | } 1130 | }, 1131 | "wrappy": { 1132 | "version": "1.0.2", 1133 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1134 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1135 | "dev": true 1136 | }, 1137 | "ws": { 1138 | "version": "8.2.3", 1139 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", 1140 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" 1141 | } 1142 | } 1143 | } 1144 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo-chat-app", 3 | "version": "1.0.0", 4 | "description": "demo chat app", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jasmine" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.18.3", 13 | "express": "^4.16.3", 14 | "mongoose": "^6.3.3", 15 | "socket.io": "^4.5.0" 16 | }, 17 | "devDependencies": { 18 | "jasmine": "^3.1.0", 19 | "request": "^2.87.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var bodyParser = require('body-parser') 3 | var app = express(); 4 | var http = require('http').Server(app); 5 | var io = require('socket.io')(http); 6 | var mongoose = require('mongoose'); 7 | 8 | app.use(express.static(__dirname)); 9 | app.use(bodyParser.json()); 10 | app.use(bodyParser.urlencoded({extended: false})) 11 | 12 | var Message = mongoose.model('Message',{ 13 | name : String, 14 | message : String 15 | }) 16 | 17 | var dbUrl = 'mongodb://amkurian:amkurian1@ds257981.mlab.com:57981/simple-chat' 18 | 19 | app.get('/messages', (req, res) => { 20 | Message.find({},(err, messages)=> { 21 | res.send(messages); 22 | }) 23 | }) 24 | 25 | 26 | app.get('/messages/:user', (req, res) => { 27 | var user = req.params.user 28 | Message.find({name: user},(err, messages)=> { 29 | res.send(messages); 30 | }) 31 | }) 32 | 33 | 34 | app.post('/messages', async (req, res) => { 35 | try{ 36 | var message = new Message(req.body); 37 | 38 | var savedMessage = await message.save() 39 | console.log('saved'); 40 | 41 | var censored = await Message.findOne({message:'badword'}); 42 | if(censored) 43 | await Message.remove({_id: censored.id}) 44 | else 45 | io.emit('message', req.body); 46 | res.sendStatus(200); 47 | } 48 | catch (error){ 49 | res.sendStatus(500); 50 | return console.log('error',error); 51 | } 52 | finally{ 53 | console.log('Message Posted') 54 | } 55 | 56 | }) 57 | 58 | 59 | 60 | io.on('connection', () =>{ 61 | console.log('a user is connected') 62 | }) 63 | 64 | mongoose.connect(dbUrl ,{useMongoClient : false} ,(err) => { 65 | console.log('mongodb connected',err); 66 | }) 67 | 68 | var server = http.listen(3000, () => { 69 | console.log('server is running on port', server.address().port); 70 | }); 71 | -------------------------------------------------------------------------------- /spec/server.spec.js: -------------------------------------------------------------------------------- 1 | var request = require('request') 2 | 3 | 4 | describe('get messages', () => { 5 | it('should return 200 Ok', (done) => { 6 | request.get('http://localhost:3000/messages', (err, res) => { 7 | expect(res.statusCode).toEqual(200) 8 | done() 9 | }) 10 | }) 11 | it('should return a list, thats not empty', (done) => { 12 | request.get('http://localhost:3000/messages', (err, res) => { 13 | expect(JSON.parse(res.body).length).toBeGreaterThan(0) 14 | done() 15 | }) 16 | }) 17 | }) 18 | 19 | 20 | describe('get messages from particular user', () => { 21 | it('should return 200 Ok', (done) => { 22 | request.get('http://localhost:3000/messages/Arun', (err, res) => { 23 | expect(res.statusCode).toEqual(200) 24 | done() 25 | }) 26 | }) 27 | it('should return the message of the user', (done) => { 28 | request.get('http://localhost:3000/messages/Arun', (err, res) => { 29 | expect(JSON.parse(res.body)[0].name).toEqual('Arun') 30 | done() 31 | }) 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /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": true 11 | } 12 | --------------------------------------------------------------------------------