├── .gitignore ├── README.md ├── logs └── all-logs.log ├── package-lock.json ├── package.json ├── server.js └── src ├── db └── models │ ├── comment │ └── index.js │ ├── event │ └── index.js │ ├── post │ └── index.js │ └── user │ └── index.js ├── modules ├── controllers │ ├── auth.controller.js │ ├── comment.controller.js │ ├── event.controller.js │ ├── login.controller.js │ ├── post.controller.js │ └── user.controller.js └── routes │ └── routes.js ├── services ├── cloudinary.js ├── helpers.js ├── httpLogger.js ├── logger.js └── passport.js └── validators ├── editDataValidation.js ├── loginValidation.js └── registrationValidation.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ 3 | .env 4 | .vscode -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Exceed-Inside-Backend -------------------------------------------------------------------------------- /logs/all-logs.log: -------------------------------------------------------------------------------- 1 | 2019-12-17 13:52:11:5211 info: POST /api/user 200 442.426 ms - 457 2 | 2019-12-17 13:52:43:5243 info: POST /api/login 200 225.536 ms - 201 3 | 2019-12-17 13:53:33:5333 info: POST /api/post/ 200 2495.005 ms - 606 4 | 2019-12-17 13:57:21:5721 info: POST /api/post/5df8b3abbef2a36417182d45/comment 200 963.058 ms - 325 5 | 2019-12-17 13:58:11:5811 info: POST /api/post/5df8b3abbef2a36417182d45/comment 200 954.375 ms - 632 6 | 2019-12-17 13:58:19:5819 info: POST /api/post/5df8b3abbef2a36417182d45/comment 200 895.123 ms - 948 7 | 2019-12-17 13:58:49:5849 info: GET /api/user/5df8b35bbef2a36417182d44 200 293.206 ms - 457 8 | 2019-12-17 13:59:47:5947 info: PUT /api/user/5df8b35bbef2a36417182d46 403 146.235 ms - 11 9 | 2019-12-17 13:59:53:5953 info: PUT /api/user/5df8b35bbef2a36417182d44 200 442.344 ms - 482 10 | 2019-12-17 14:19:27:1927 info: POST /api/post/ 200 1502.817 ms - 604 11 | 2019-12-17 14:19:44:1944 info: POST /api/post/ 401 869.003 ms - 27 12 | 2019-12-17 14:20:19:2019 info: POST /api/post/ 401 633.575 ms - 27 13 | 2019-12-17 14:20:25:2025 info: POST /api/post/ 401 664.721 ms - 27 14 | 2019-12-17 14:31:45:3145 info: POST /api/post/ - - ms - - 15 | 2019-12-17 14:31:57:3157 info: POST /api/post/ 401 2738.856 ms - 27 16 | 2019-12-17 14:34:11:3411 info: POST /api/post/ 200 2242.730 ms - 475 17 | 2019-12-17 14:34:50:3450 info: PUT /api/post/5df8bd31b0a48c7b602d6386 200 2261.457 ms - 347 18 | 2019-12-17 14:35:08:358 info: PUT /api/post/5df8bd31b0a48c7b602d6386 200 442.116 ms - 347 19 | 2019-12-17 14:35:26:3526 info: PUT /api/post/5df8bd31b0a48c7b602d6386 200 1101.038 ms - 219 20 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "exceed-inside", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@casl/ability": { 8 | "version": "3.3.0", 9 | "resolved": "https://registry.npmjs.org/@casl/ability/-/ability-3.3.0.tgz", 10 | "integrity": "sha512-+BxRsYHoclMwwCCSBATwkJce9gnuF/1GGoondVvDanG4JeGIVeZkVEoI/b5cyAqwhOVbyV7X468/Q1yb8/8NTA==", 11 | "requires": { 12 | "sift": "^9.0.1" 13 | }, 14 | "dependencies": { 15 | "sift": { 16 | "version": "9.0.4", 17 | "resolved": "https://registry.npmjs.org/sift/-/sift-9.0.4.tgz", 18 | "integrity": "sha512-mXYg5X7rMxBRG7CTOKVigbKMUzidLy2T95LwsYKTqn+BfYFxBzdyrMhKWWwiEcJViVZr2TiI6JyaSlNUVsGUfQ==" 19 | } 20 | } 21 | }, 22 | "@casl/mongoose": { 23 | "version": "2.3.2", 24 | "resolved": "https://registry.npmjs.org/@casl/mongoose/-/mongoose-2.3.2.tgz", 25 | "integrity": "sha512-bEqx+IjNTDp1CevM11wcY7v01Mk4i5odcreHXJS/yQ9Cj0XbDyNON3CwZ3wOGxfMU+0Nu4XY6x2o4peneBXHkQ==" 26 | }, 27 | "abbrev": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 30 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 31 | }, 32 | "accepts": { 33 | "version": "1.3.7", 34 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 35 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 36 | "requires": { 37 | "mime-types": "~2.1.24", 38 | "negotiator": "0.6.2" 39 | } 40 | }, 41 | "ansi-align": { 42 | "version": "2.0.0", 43 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 44 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 45 | "requires": { 46 | "string-width": "^2.0.0" 47 | }, 48 | "dependencies": { 49 | "ansi-regex": { 50 | "version": "3.0.0", 51 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 52 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 53 | }, 54 | "is-fullwidth-code-point": { 55 | "version": "2.0.0", 56 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 57 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 58 | }, 59 | "string-width": { 60 | "version": "2.1.1", 61 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 62 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 63 | "requires": { 64 | "is-fullwidth-code-point": "^2.0.0", 65 | "strip-ansi": "^4.0.0" 66 | } 67 | }, 68 | "strip-ansi": { 69 | "version": "4.0.0", 70 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 71 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 72 | "requires": { 73 | "ansi-regex": "^3.0.0" 74 | } 75 | } 76 | } 77 | }, 78 | "ansi-styles": { 79 | "version": "3.2.1", 80 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 81 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 82 | "requires": { 83 | "color-convert": "^1.9.0" 84 | } 85 | }, 86 | "array-flatten": { 87 | "version": "1.1.1", 88 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 89 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 90 | }, 91 | "async": { 92 | "version": "2.6.3", 93 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 94 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 95 | "requires": { 96 | "lodash": "^4.17.14" 97 | } 98 | }, 99 | "axios": { 100 | "version": "0.19.0", 101 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", 102 | "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", 103 | "requires": { 104 | "follow-redirects": "1.5.10", 105 | "is-buffer": "^2.0.2" 106 | } 107 | }, 108 | "balanced-match": { 109 | "version": "1.0.0", 110 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 111 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 112 | }, 113 | "basic-auth": { 114 | "version": "2.0.1", 115 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 116 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 117 | "requires": { 118 | "safe-buffer": "5.1.2" 119 | } 120 | }, 121 | "bcryptjs": { 122 | "version": "2.4.3", 123 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", 124 | "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" 125 | }, 126 | "bluebird": { 127 | "version": "3.5.1", 128 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 129 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 130 | }, 131 | "body-parser": { 132 | "version": "1.19.0", 133 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 134 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 135 | "requires": { 136 | "bytes": "3.1.0", 137 | "content-type": "~1.0.4", 138 | "debug": "2.6.9", 139 | "depd": "~1.1.2", 140 | "http-errors": "1.7.2", 141 | "iconv-lite": "0.4.24", 142 | "on-finished": "~2.3.0", 143 | "qs": "6.7.0", 144 | "raw-body": "2.4.0", 145 | "type-is": "~1.6.17" 146 | } 147 | }, 148 | "boxen": { 149 | "version": "1.3.0", 150 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", 151 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", 152 | "requires": { 153 | "ansi-align": "^2.0.0", 154 | "camelcase": "^4.0.0", 155 | "chalk": "^2.0.1", 156 | "cli-boxes": "^1.0.0", 157 | "string-width": "^2.0.0", 158 | "term-size": "^1.2.0", 159 | "widest-line": "^2.0.0" 160 | }, 161 | "dependencies": { 162 | "ansi-regex": { 163 | "version": "3.0.0", 164 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 165 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 166 | }, 167 | "camelcase": { 168 | "version": "4.1.0", 169 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 170 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 171 | }, 172 | "is-fullwidth-code-point": { 173 | "version": "2.0.0", 174 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 175 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 176 | }, 177 | "string-width": { 178 | "version": "2.1.1", 179 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 180 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 181 | "requires": { 182 | "is-fullwidth-code-point": "^2.0.0", 183 | "strip-ansi": "^4.0.0" 184 | } 185 | }, 186 | "strip-ansi": { 187 | "version": "4.0.0", 188 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 189 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 190 | "requires": { 191 | "ansi-regex": "^3.0.0" 192 | } 193 | } 194 | } 195 | }, 196 | "brace-expansion": { 197 | "version": "1.1.11", 198 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 199 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 200 | "requires": { 201 | "balanced-match": "^1.0.0", 202 | "concat-map": "0.0.1" 203 | } 204 | }, 205 | "bson": { 206 | "version": "1.1.3", 207 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", 208 | "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" 209 | }, 210 | "buffer-equal-constant-time": { 211 | "version": "1.0.1", 212 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 213 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 214 | }, 215 | "bytes": { 216 | "version": "3.1.0", 217 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 218 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 219 | }, 220 | "capture-stack-trace": { 221 | "version": "1.0.1", 222 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 223 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" 224 | }, 225 | "chalk": { 226 | "version": "2.4.2", 227 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 228 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 229 | "requires": { 230 | "ansi-styles": "^3.2.1", 231 | "escape-string-regexp": "^1.0.5", 232 | "supports-color": "^5.3.0" 233 | } 234 | }, 235 | "cli-boxes": { 236 | "version": "1.0.0", 237 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 238 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" 239 | }, 240 | "cloudinary": { 241 | "version": "1.17.0", 242 | "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.17.0.tgz", 243 | "integrity": "sha512-04kneY1ehHYXpnR5WasA8kyJdJyq6gvuYyeH/g/dAWVZxO9yeEwIyNqAL+cpM6fXYvEWkifos3Iqj6GME6giwg==", 244 | "requires": { 245 | "lodash": "^4.17.11", 246 | "q": "^1.5.1", 247 | "typescript": "^2.9.2" 248 | } 249 | }, 250 | "color": { 251 | "version": "3.0.0", 252 | "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 253 | "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", 254 | "requires": { 255 | "color-convert": "^1.9.1", 256 | "color-string": "^1.5.2" 257 | } 258 | }, 259 | "color-convert": { 260 | "version": "1.9.3", 261 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 262 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 263 | "requires": { 264 | "color-name": "1.1.3" 265 | } 266 | }, 267 | "color-name": { 268 | "version": "1.1.3", 269 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 270 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 271 | }, 272 | "color-string": { 273 | "version": "1.5.3", 274 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", 275 | "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", 276 | "requires": { 277 | "color-name": "^1.0.0", 278 | "simple-swizzle": "^0.2.2" 279 | } 280 | }, 281 | "colornames": { 282 | "version": "1.1.1", 283 | "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", 284 | "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" 285 | }, 286 | "colors": { 287 | "version": "1.4.0", 288 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 289 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 290 | }, 291 | "colorspace": { 292 | "version": "1.1.2", 293 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", 294 | "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", 295 | "requires": { 296 | "color": "3.0.x", 297 | "text-hex": "1.0.x" 298 | } 299 | }, 300 | "concat-map": { 301 | "version": "0.0.1", 302 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 303 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 304 | }, 305 | "configstore": { 306 | "version": "3.1.2", 307 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 308 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 309 | "requires": { 310 | "dot-prop": "^4.1.0", 311 | "graceful-fs": "^4.1.2", 312 | "make-dir": "^1.0.0", 313 | "unique-string": "^1.0.0", 314 | "write-file-atomic": "^2.0.0", 315 | "xdg-basedir": "^3.0.0" 316 | }, 317 | "dependencies": { 318 | "make-dir": { 319 | "version": "1.3.0", 320 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 321 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 322 | "requires": { 323 | "pify": "^3.0.0" 324 | } 325 | } 326 | } 327 | }, 328 | "content-disposition": { 329 | "version": "0.5.3", 330 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 331 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 332 | "requires": { 333 | "safe-buffer": "5.1.2" 334 | } 335 | }, 336 | "content-type": { 337 | "version": "1.0.4", 338 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 339 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 340 | }, 341 | "cookie": { 342 | "version": "0.4.0", 343 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 344 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 345 | }, 346 | "cookie-signature": { 347 | "version": "1.0.6", 348 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 349 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 350 | }, 351 | "core-util-is": { 352 | "version": "1.0.2", 353 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 354 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 355 | }, 356 | "cors": { 357 | "version": "2.8.5", 358 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 359 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 360 | "requires": { 361 | "object-assign": "^4", 362 | "vary": "^1" 363 | } 364 | }, 365 | "create-error-class": { 366 | "version": "3.0.2", 367 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 368 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 369 | "requires": { 370 | "capture-stack-trace": "^1.0.0" 371 | } 372 | }, 373 | "crypto-random-string": { 374 | "version": "1.0.0", 375 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 376 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 377 | }, 378 | "debug": { 379 | "version": "2.6.9", 380 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 381 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 382 | "requires": { 383 | "ms": "2.0.0" 384 | } 385 | }, 386 | "deep-extend": { 387 | "version": "0.6.0", 388 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 389 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 390 | }, 391 | "depd": { 392 | "version": "1.1.2", 393 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 394 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 395 | }, 396 | "destroy": { 397 | "version": "1.0.4", 398 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 399 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 400 | }, 401 | "diagnostics": { 402 | "version": "1.1.1", 403 | "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", 404 | "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", 405 | "requires": { 406 | "colorspace": "1.1.x", 407 | "enabled": "1.0.x", 408 | "kuler": "1.0.x" 409 | } 410 | }, 411 | "dot-prop": { 412 | "version": "4.2.0", 413 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 414 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 415 | "requires": { 416 | "is-obj": "^1.0.0" 417 | } 418 | }, 419 | "dotenv": { 420 | "version": "8.2.0", 421 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 422 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 423 | }, 424 | "duplexer3": { 425 | "version": "0.1.4", 426 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 427 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 428 | }, 429 | "ecdsa-sig-formatter": { 430 | "version": "1.0.11", 431 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 432 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 433 | "requires": { 434 | "safe-buffer": "^5.0.1" 435 | } 436 | }, 437 | "ee-first": { 438 | "version": "1.1.1", 439 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 440 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 441 | }, 442 | "enabled": { 443 | "version": "1.0.2", 444 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", 445 | "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", 446 | "requires": { 447 | "env-variable": "0.0.x" 448 | } 449 | }, 450 | "encodeurl": { 451 | "version": "1.0.2", 452 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 453 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 454 | }, 455 | "env-variable": { 456 | "version": "0.0.5", 457 | "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", 458 | "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" 459 | }, 460 | "escape-html": { 461 | "version": "1.0.3", 462 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 463 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 464 | }, 465 | "escape-string-regexp": { 466 | "version": "1.0.5", 467 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 468 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 469 | }, 470 | "etag": { 471 | "version": "1.8.1", 472 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 473 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 474 | }, 475 | "express": { 476 | "version": "4.17.1", 477 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 478 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 479 | "requires": { 480 | "accepts": "~1.3.7", 481 | "array-flatten": "1.1.1", 482 | "body-parser": "1.19.0", 483 | "content-disposition": "0.5.3", 484 | "content-type": "~1.0.4", 485 | "cookie": "0.4.0", 486 | "cookie-signature": "1.0.6", 487 | "debug": "2.6.9", 488 | "depd": "~1.1.2", 489 | "encodeurl": "~1.0.2", 490 | "escape-html": "~1.0.3", 491 | "etag": "~1.8.1", 492 | "finalhandler": "~1.1.2", 493 | "fresh": "0.5.2", 494 | "merge-descriptors": "1.0.1", 495 | "methods": "~1.1.2", 496 | "on-finished": "~2.3.0", 497 | "parseurl": "~1.3.3", 498 | "path-to-regexp": "0.1.7", 499 | "proxy-addr": "~2.0.5", 500 | "qs": "6.7.0", 501 | "range-parser": "~1.2.1", 502 | "safe-buffer": "5.1.2", 503 | "send": "0.17.1", 504 | "serve-static": "1.14.1", 505 | "setprototypeof": "1.1.1", 506 | "statuses": "~1.5.0", 507 | "type-is": "~1.6.18", 508 | "utils-merge": "1.0.1", 509 | "vary": "~1.1.2" 510 | } 511 | }, 512 | "express-jwt": { 513 | "version": "5.3.1", 514 | "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz", 515 | "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==", 516 | "requires": { 517 | "async": "^1.5.0", 518 | "express-unless": "^0.3.0", 519 | "jsonwebtoken": "^8.1.0", 520 | "lodash.set": "^4.0.0" 521 | }, 522 | "dependencies": { 523 | "async": { 524 | "version": "1.5.2", 525 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 526 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 527 | } 528 | } 529 | }, 530 | "express-unless": { 531 | "version": "0.3.1", 532 | "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", 533 | "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" 534 | }, 535 | "fast-safe-stringify": { 536 | "version": "2.0.7", 537 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 538 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" 539 | }, 540 | "fecha": { 541 | "version": "2.3.3", 542 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", 543 | "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" 544 | }, 545 | "finalhandler": { 546 | "version": "1.1.2", 547 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 548 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 549 | "requires": { 550 | "debug": "2.6.9", 551 | "encodeurl": "~1.0.2", 552 | "escape-html": "~1.0.3", 553 | "on-finished": "~2.3.0", 554 | "parseurl": "~1.3.3", 555 | "statuses": "~1.5.0", 556 | "unpipe": "~1.0.0" 557 | } 558 | }, 559 | "follow-redirects": { 560 | "version": "1.5.10", 561 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 562 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 563 | "requires": { 564 | "debug": "=3.1.0" 565 | }, 566 | "dependencies": { 567 | "debug": { 568 | "version": "3.1.0", 569 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 570 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 571 | "requires": { 572 | "ms": "2.0.0" 573 | } 574 | } 575 | } 576 | }, 577 | "forwarded": { 578 | "version": "0.1.2", 579 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 580 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 581 | }, 582 | "fresh": { 583 | "version": "0.5.2", 584 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 585 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 586 | }, 587 | "glob-parent": { 588 | "version": "5.1.0", 589 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 590 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 591 | "requires": { 592 | "is-glob": "^4.0.1" 593 | } 594 | }, 595 | "global-dirs": { 596 | "version": "0.1.1", 597 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 598 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 599 | "requires": { 600 | "ini": "^1.3.4" 601 | } 602 | }, 603 | "got": { 604 | "version": "6.7.1", 605 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 606 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 607 | "requires": { 608 | "create-error-class": "^3.0.0", 609 | "duplexer3": "^0.1.4", 610 | "get-stream": "^3.0.0", 611 | "is-redirect": "^1.0.0", 612 | "is-retry-allowed": "^1.0.0", 613 | "is-stream": "^1.0.0", 614 | "lowercase-keys": "^1.0.0", 615 | "safe-buffer": "^5.0.1", 616 | "timed-out": "^4.0.0", 617 | "unzip-response": "^2.0.1", 618 | "url-parse-lax": "^1.0.0" 619 | }, 620 | "dependencies": { 621 | "get-stream": { 622 | "version": "3.0.0", 623 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 624 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 625 | } 626 | } 627 | }, 628 | "graceful-fs": { 629 | "version": "4.2.3", 630 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 631 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 632 | }, 633 | "has-flag": { 634 | "version": "3.0.0", 635 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 636 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 637 | }, 638 | "http-errors": { 639 | "version": "1.7.2", 640 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 641 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 642 | "requires": { 643 | "depd": "~1.1.2", 644 | "inherits": "2.0.3", 645 | "setprototypeof": "1.1.1", 646 | "statuses": ">= 1.5.0 < 2", 647 | "toidentifier": "1.0.0" 648 | } 649 | }, 650 | "iconv-lite": { 651 | "version": "0.4.24", 652 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 653 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 654 | "requires": { 655 | "safer-buffer": ">= 2.1.2 < 3" 656 | } 657 | }, 658 | "ignore-by-default": { 659 | "version": "1.0.1", 660 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 661 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" 662 | }, 663 | "import-lazy": { 664 | "version": "2.1.0", 665 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 666 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 667 | }, 668 | "imurmurhash": { 669 | "version": "0.1.4", 670 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 671 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 672 | }, 673 | "inherits": { 674 | "version": "2.0.3", 675 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 676 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 677 | }, 678 | "ini": { 679 | "version": "1.3.5", 680 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 681 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 682 | }, 683 | "ipaddr.js": { 684 | "version": "1.9.0", 685 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 686 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 687 | }, 688 | "is-arrayish": { 689 | "version": "0.3.2", 690 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 691 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 692 | }, 693 | "is-buffer": { 694 | "version": "2.0.4", 695 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 696 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 697 | }, 698 | "is-empty": { 699 | "version": "1.2.0", 700 | "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", 701 | "integrity": "sha1-3pu1snhzigWgsJpX4ftNSjQan2s=" 702 | }, 703 | "is-extglob": { 704 | "version": "2.1.1", 705 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 706 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 707 | }, 708 | "is-glob": { 709 | "version": "4.0.1", 710 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 711 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 712 | "requires": { 713 | "is-extglob": "^2.1.1" 714 | } 715 | }, 716 | "is-installed-globally": { 717 | "version": "0.1.0", 718 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 719 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 720 | "requires": { 721 | "global-dirs": "^0.1.0", 722 | "is-path-inside": "^1.0.0" 723 | } 724 | }, 725 | "is-npm": { 726 | "version": "1.0.0", 727 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 728 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" 729 | }, 730 | "is-obj": { 731 | "version": "1.0.1", 732 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 733 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 734 | }, 735 | "is-path-inside": { 736 | "version": "1.0.1", 737 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 738 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 739 | "requires": { 740 | "path-is-inside": "^1.0.1" 741 | } 742 | }, 743 | "is-redirect": { 744 | "version": "1.0.0", 745 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 746 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" 747 | }, 748 | "is-retry-allowed": { 749 | "version": "1.2.0", 750 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 751 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" 752 | }, 753 | "is-stream": { 754 | "version": "1.1.0", 755 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 756 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 757 | }, 758 | "isarray": { 759 | "version": "1.0.0", 760 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 761 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 762 | }, 763 | "isexe": { 764 | "version": "2.0.0", 765 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 766 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 767 | }, 768 | "js-tokens": { 769 | "version": "4.0.0", 770 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 771 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 772 | }, 773 | "jsonwebtoken": { 774 | "version": "8.5.1", 775 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 776 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 777 | "requires": { 778 | "jws": "^3.2.2", 779 | "lodash.includes": "^4.3.0", 780 | "lodash.isboolean": "^3.0.3", 781 | "lodash.isinteger": "^4.0.4", 782 | "lodash.isnumber": "^3.0.3", 783 | "lodash.isplainobject": "^4.0.6", 784 | "lodash.isstring": "^4.0.1", 785 | "lodash.once": "^4.0.0", 786 | "ms": "^2.1.1", 787 | "semver": "^5.6.0" 788 | }, 789 | "dependencies": { 790 | "ms": { 791 | "version": "2.1.2", 792 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 793 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 794 | } 795 | } 796 | }, 797 | "jwa": { 798 | "version": "1.4.1", 799 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 800 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 801 | "requires": { 802 | "buffer-equal-constant-time": "1.0.1", 803 | "ecdsa-sig-formatter": "1.0.11", 804 | "safe-buffer": "^5.0.1" 805 | } 806 | }, 807 | "jws": { 808 | "version": "3.2.2", 809 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 810 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 811 | "requires": { 812 | "jwa": "^1.4.1", 813 | "safe-buffer": "^5.0.1" 814 | } 815 | }, 816 | "jwt-decode": { 817 | "version": "2.2.0", 818 | "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", 819 | "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" 820 | }, 821 | "kareem": { 822 | "version": "2.3.1", 823 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 824 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 825 | }, 826 | "kuler": { 827 | "version": "1.0.1", 828 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", 829 | "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", 830 | "requires": { 831 | "colornames": "^1.1.1" 832 | } 833 | }, 834 | "latest-version": { 835 | "version": "3.1.0", 836 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 837 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 838 | "requires": { 839 | "package-json": "^4.0.0" 840 | } 841 | }, 842 | "lodash": { 843 | "version": "4.17.15", 844 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 845 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 846 | }, 847 | "lodash.includes": { 848 | "version": "4.3.0", 849 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 850 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 851 | }, 852 | "lodash.isboolean": { 853 | "version": "3.0.3", 854 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 855 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 856 | }, 857 | "lodash.isinteger": { 858 | "version": "4.0.4", 859 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 860 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 861 | }, 862 | "lodash.isnumber": { 863 | "version": "3.0.3", 864 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 865 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 866 | }, 867 | "lodash.isplainobject": { 868 | "version": "4.0.6", 869 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 870 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 871 | }, 872 | "lodash.isstring": { 873 | "version": "4.0.1", 874 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 875 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 876 | }, 877 | "lodash.once": { 878 | "version": "4.1.1", 879 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 880 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 881 | }, 882 | "lodash.set": { 883 | "version": "4.3.2", 884 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 885 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" 886 | }, 887 | "logform": { 888 | "version": "2.1.2", 889 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", 890 | "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", 891 | "requires": { 892 | "colors": "^1.2.1", 893 | "fast-safe-stringify": "^2.0.4", 894 | "fecha": "^2.3.3", 895 | "ms": "^2.1.1", 896 | "triple-beam": "^1.3.0" 897 | }, 898 | "dependencies": { 899 | "ms": { 900 | "version": "2.1.2", 901 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 902 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 903 | } 904 | } 905 | }, 906 | "loose-envify": { 907 | "version": "1.4.0", 908 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 909 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 910 | "requires": { 911 | "js-tokens": "^3.0.0 || ^4.0.0" 912 | } 913 | }, 914 | "lowercase-keys": { 915 | "version": "1.0.1", 916 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 917 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 918 | }, 919 | "media-typer": { 920 | "version": "0.3.0", 921 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 922 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 923 | }, 924 | "memory-pager": { 925 | "version": "1.5.0", 926 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 927 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 928 | "optional": true 929 | }, 930 | "merge-descriptors": { 931 | "version": "1.0.1", 932 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 933 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 934 | }, 935 | "methods": { 936 | "version": "1.1.2", 937 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 938 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 939 | }, 940 | "mime": { 941 | "version": "1.6.0", 942 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 943 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 944 | }, 945 | "mime-db": { 946 | "version": "1.42.0", 947 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", 948 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" 949 | }, 950 | "mime-types": { 951 | "version": "2.1.25", 952 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", 953 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", 954 | "requires": { 955 | "mime-db": "1.42.0" 956 | } 957 | }, 958 | "minimatch": { 959 | "version": "3.0.4", 960 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 961 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 962 | "requires": { 963 | "brace-expansion": "^1.1.7" 964 | } 965 | }, 966 | "minimist": { 967 | "version": "1.2.0", 968 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 969 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 970 | }, 971 | "mongodb": { 972 | "version": "3.3.5", 973 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.5.tgz", 974 | "integrity": "sha512-6NAv5gTFdwRyVfCz+O+KDszvjpyxmZw+VlmqmqKR2GmpkeKrKFRv/ZslgTtZba2dc9JYixIf99T5Gih7TIWv7Q==", 975 | "requires": { 976 | "bson": "^1.1.1", 977 | "require_optional": "^1.0.1", 978 | "safe-buffer": "^5.1.2", 979 | "saslprep": "^1.0.0" 980 | } 981 | }, 982 | "mongoose": { 983 | "version": "5.7.13", 984 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.13.tgz", 985 | "integrity": "sha512-MoTCETTIfXU1PqIYc+YAkhSB3uzK5xseh6ysAUnoOowkqS66OjBJtsL/bcgAKi6XfMYkFU6M1abKyuL7k//xeg==", 986 | "requires": { 987 | "bson": "~1.1.1", 988 | "kareem": "2.3.1", 989 | "mongodb": "3.3.5", 990 | "mongoose-legacy-pluralize": "1.0.2", 991 | "mpath": "0.6.0", 992 | "mquery": "3.2.2", 993 | "ms": "2.1.2", 994 | "regexp-clone": "1.0.0", 995 | "safe-buffer": "5.1.2", 996 | "sift": "7.0.1", 997 | "sliced": "1.0.1" 998 | }, 999 | "dependencies": { 1000 | "ms": { 1001 | "version": "2.1.2", 1002 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1003 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1004 | } 1005 | } 1006 | }, 1007 | "mongoose-legacy-pluralize": { 1008 | "version": "1.0.2", 1009 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 1010 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 1011 | }, 1012 | "morgan": { 1013 | "version": "1.9.1", 1014 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1015 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1016 | "requires": { 1017 | "basic-auth": "~2.0.0", 1018 | "debug": "2.6.9", 1019 | "depd": "~1.1.2", 1020 | "on-finished": "~2.3.0", 1021 | "on-headers": "~1.0.1" 1022 | } 1023 | }, 1024 | "mpath": { 1025 | "version": "0.6.0", 1026 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", 1027 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" 1028 | }, 1029 | "mquery": { 1030 | "version": "3.2.2", 1031 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 1032 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 1033 | "requires": { 1034 | "bluebird": "3.5.1", 1035 | "debug": "3.1.0", 1036 | "regexp-clone": "^1.0.0", 1037 | "safe-buffer": "5.1.2", 1038 | "sliced": "1.0.1" 1039 | }, 1040 | "dependencies": { 1041 | "debug": { 1042 | "version": "3.1.0", 1043 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1044 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1045 | "requires": { 1046 | "ms": "2.0.0" 1047 | } 1048 | } 1049 | } 1050 | }, 1051 | "ms": { 1052 | "version": "2.0.0", 1053 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1054 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1055 | }, 1056 | "negotiator": { 1057 | "version": "0.6.2", 1058 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1059 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1060 | }, 1061 | "nodemon": { 1062 | "version": "2.0.1", 1063 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.1.tgz", 1064 | "integrity": "sha512-UC6FVhNLXjbbV4UzaXA3wUdbEkUZzLGgMGzmxvWAex5nzib/jhcSHVFlQODdbuUHq8SnnZ4/EABBAbC3RplvPg==", 1065 | "requires": { 1066 | "chokidar": "^3.2.2", 1067 | "debug": "^3.2.6", 1068 | "ignore-by-default": "^1.0.1", 1069 | "minimatch": "^3.0.4", 1070 | "pstree.remy": "^1.1.7", 1071 | "semver": "^5.7.1", 1072 | "supports-color": "^5.5.0", 1073 | "touch": "^3.1.0", 1074 | "undefsafe": "^2.0.2", 1075 | "update-notifier": "^2.5.0" 1076 | }, 1077 | "dependencies": { 1078 | "anymatch": { 1079 | "version": "3.1.1", 1080 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 1081 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 1082 | "requires": { 1083 | "normalize-path": "^3.0.0", 1084 | "picomatch": "^2.0.4" 1085 | } 1086 | }, 1087 | "binary-extensions": { 1088 | "version": "2.0.0", 1089 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 1090 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" 1091 | }, 1092 | "braces": { 1093 | "version": "3.0.2", 1094 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1095 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1096 | "requires": { 1097 | "fill-range": "^7.0.1" 1098 | } 1099 | }, 1100 | "chokidar": { 1101 | "version": "3.3.0", 1102 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 1103 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 1104 | "requires": { 1105 | "anymatch": "~3.1.1", 1106 | "braces": "~3.0.2", 1107 | "fsevents": "~2.1.1", 1108 | "glob-parent": "~5.1.0", 1109 | "is-binary-path": "~2.1.0", 1110 | "is-glob": "~4.0.1", 1111 | "normalize-path": "~3.0.0", 1112 | "readdirp": "~3.2.0" 1113 | } 1114 | }, 1115 | "debug": { 1116 | "version": "3.2.6", 1117 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1118 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1119 | "requires": { 1120 | "ms": "^2.1.1" 1121 | } 1122 | }, 1123 | "fill-range": { 1124 | "version": "7.0.1", 1125 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1126 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1127 | "requires": { 1128 | "to-regex-range": "^5.0.1" 1129 | } 1130 | }, 1131 | "fsevents": { 1132 | "version": "2.1.2", 1133 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", 1134 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", 1135 | "optional": true 1136 | }, 1137 | "is-binary-path": { 1138 | "version": "2.1.0", 1139 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1140 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1141 | "requires": { 1142 | "binary-extensions": "^2.0.0" 1143 | } 1144 | }, 1145 | "is-number": { 1146 | "version": "7.0.0", 1147 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1148 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1149 | }, 1150 | "ms": { 1151 | "version": "2.1.2", 1152 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1153 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1154 | }, 1155 | "normalize-path": { 1156 | "version": "3.0.0", 1157 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1158 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1159 | }, 1160 | "readdirp": { 1161 | "version": "3.2.0", 1162 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 1163 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 1164 | "requires": { 1165 | "picomatch": "^2.0.4" 1166 | } 1167 | }, 1168 | "to-regex-range": { 1169 | "version": "5.0.1", 1170 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1171 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1172 | "requires": { 1173 | "is-number": "^7.0.0" 1174 | } 1175 | } 1176 | } 1177 | }, 1178 | "nopt": { 1179 | "version": "1.0.10", 1180 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1181 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1182 | "requires": { 1183 | "abbrev": "1" 1184 | } 1185 | }, 1186 | "npm": { 1187 | "version": "6.13.2", 1188 | "resolved": "https://registry.npmjs.org/npm/-/npm-6.13.2.tgz", 1189 | "integrity": "sha512-TG7AFkKpjBNJh8OVJYcGaAbW0PZxEkjew51Lc6TRdhQpNjSSEnAOEpidApqEuciB7cs09C8mxbo8NbuPs4QDzg==", 1190 | "requires": { 1191 | "JSONStream": "^1.3.5", 1192 | "abbrev": "~1.1.1", 1193 | "ansicolors": "~0.3.2", 1194 | "ansistyles": "~0.1.3", 1195 | "aproba": "^2.0.0", 1196 | "archy": "~1.0.0", 1197 | "bin-links": "^1.1.3", 1198 | "bluebird": "^3.5.5", 1199 | "byte-size": "^5.0.1", 1200 | "cacache": "^12.0.3", 1201 | "call-limit": "^1.1.1", 1202 | "chownr": "^1.1.3", 1203 | "ci-info": "^2.0.0", 1204 | "cli-columns": "^3.1.2", 1205 | "cli-table3": "^0.5.1", 1206 | "cmd-shim": "^3.0.3", 1207 | "columnify": "~1.5.4", 1208 | "config-chain": "^1.1.12", 1209 | "debuglog": "*", 1210 | "detect-indent": "~5.0.0", 1211 | "detect-newline": "^2.1.0", 1212 | "dezalgo": "~1.0.3", 1213 | "editor": "~1.0.0", 1214 | "figgy-pudding": "^3.5.1", 1215 | "find-npm-prefix": "^1.0.2", 1216 | "fs-vacuum": "~1.2.10", 1217 | "fs-write-stream-atomic": "~1.0.10", 1218 | "gentle-fs": "^2.2.1", 1219 | "glob": "^7.1.4", 1220 | "graceful-fs": "^4.2.3", 1221 | "has-unicode": "~2.0.1", 1222 | "hosted-git-info": "^2.8.5", 1223 | "iferr": "^1.0.2", 1224 | "imurmurhash": "*", 1225 | "infer-owner": "^1.0.4", 1226 | "inflight": "~1.0.6", 1227 | "inherits": "^2.0.4", 1228 | "ini": "^1.3.5", 1229 | "init-package-json": "^1.10.3", 1230 | "is-cidr": "^3.0.0", 1231 | "json-parse-better-errors": "^1.0.2", 1232 | "lazy-property": "~1.0.0", 1233 | "libcipm": "^4.0.7", 1234 | "libnpm": "^3.0.1", 1235 | "libnpmaccess": "^3.0.2", 1236 | "libnpmhook": "^5.0.3", 1237 | "libnpmorg": "^1.0.1", 1238 | "libnpmsearch": "^2.0.2", 1239 | "libnpmteam": "^1.0.2", 1240 | "libnpx": "^10.2.0", 1241 | "lock-verify": "^2.1.0", 1242 | "lockfile": "^1.0.4", 1243 | "lodash._baseindexof": "*", 1244 | "lodash._baseuniq": "~4.6.0", 1245 | "lodash._bindcallback": "*", 1246 | "lodash._cacheindexof": "*", 1247 | "lodash._createcache": "*", 1248 | "lodash._getnative": "*", 1249 | "lodash.clonedeep": "~4.5.0", 1250 | "lodash.restparam": "*", 1251 | "lodash.union": "~4.6.0", 1252 | "lodash.uniq": "~4.5.0", 1253 | "lodash.without": "~4.4.0", 1254 | "lru-cache": "^5.1.1", 1255 | "meant": "~1.0.1", 1256 | "mississippi": "^3.0.0", 1257 | "mkdirp": "~0.5.1", 1258 | "move-concurrently": "^1.0.1", 1259 | "node-gyp": "^5.0.5", 1260 | "nopt": "~4.0.1", 1261 | "normalize-package-data": "^2.5.0", 1262 | "npm-audit-report": "^1.3.2", 1263 | "npm-cache-filename": "~1.0.2", 1264 | "npm-install-checks": "^3.0.2", 1265 | "npm-lifecycle": "^3.1.4", 1266 | "npm-package-arg": "^6.1.1", 1267 | "npm-packlist": "^1.4.6", 1268 | "npm-pick-manifest": "^3.0.2", 1269 | "npm-profile": "^4.0.2", 1270 | "npm-registry-fetch": "^4.0.2", 1271 | "npm-user-validate": "~1.0.0", 1272 | "npmlog": "~4.1.2", 1273 | "once": "~1.4.0", 1274 | "opener": "^1.5.1", 1275 | "osenv": "^0.1.5", 1276 | "pacote": "^9.5.9", 1277 | "path-is-inside": "~1.0.2", 1278 | "promise-inflight": "~1.0.1", 1279 | "qrcode-terminal": "^0.12.0", 1280 | "query-string": "^6.8.2", 1281 | "qw": "~1.0.1", 1282 | "read": "~1.0.7", 1283 | "read-cmd-shim": "^1.0.5", 1284 | "read-installed": "~4.0.3", 1285 | "read-package-json": "^2.1.0", 1286 | "read-package-tree": "^5.3.1", 1287 | "readable-stream": "^3.4.0", 1288 | "readdir-scoped-modules": "^1.1.0", 1289 | "request": "^2.88.0", 1290 | "retry": "^0.12.0", 1291 | "rimraf": "^2.6.3", 1292 | "safe-buffer": "^5.1.2", 1293 | "semver": "^5.7.1", 1294 | "sha": "^3.0.0", 1295 | "slide": "~1.1.6", 1296 | "sorted-object": "~2.0.1", 1297 | "sorted-union-stream": "~2.1.3", 1298 | "ssri": "^6.0.1", 1299 | "stringify-package": "^1.0.1", 1300 | "tar": "^4.4.13", 1301 | "text-table": "~0.2.0", 1302 | "tiny-relative-date": "^1.3.0", 1303 | "uid-number": "0.0.6", 1304 | "umask": "~1.1.0", 1305 | "unique-filename": "^1.1.1", 1306 | "unpipe": "~1.0.0", 1307 | "update-notifier": "^2.5.0", 1308 | "uuid": "^3.3.3", 1309 | "validate-npm-package-license": "^3.0.4", 1310 | "validate-npm-package-name": "~3.0.0", 1311 | "which": "^1.3.1", 1312 | "worker-farm": "^1.7.0", 1313 | "write-file-atomic": "^2.4.3" 1314 | }, 1315 | "dependencies": { 1316 | "JSONStream": { 1317 | "version": "1.3.5", 1318 | "bundled": true, 1319 | "requires": { 1320 | "jsonparse": "^1.2.0", 1321 | "through": ">=2.2.7 <3" 1322 | } 1323 | }, 1324 | "abbrev": { 1325 | "version": "1.1.1", 1326 | "bundled": true 1327 | }, 1328 | "agent-base": { 1329 | "version": "4.3.0", 1330 | "bundled": true, 1331 | "requires": { 1332 | "es6-promisify": "^5.0.0" 1333 | } 1334 | }, 1335 | "agentkeepalive": { 1336 | "version": "3.5.2", 1337 | "bundled": true, 1338 | "requires": { 1339 | "humanize-ms": "^1.2.1" 1340 | } 1341 | }, 1342 | "ajv": { 1343 | "version": "5.5.2", 1344 | "bundled": true, 1345 | "requires": { 1346 | "co": "^4.6.0", 1347 | "fast-deep-equal": "^1.0.0", 1348 | "fast-json-stable-stringify": "^2.0.0", 1349 | "json-schema-traverse": "^0.3.0" 1350 | } 1351 | }, 1352 | "ansi-align": { 1353 | "version": "2.0.0", 1354 | "bundled": true, 1355 | "requires": { 1356 | "string-width": "^2.0.0" 1357 | } 1358 | }, 1359 | "ansi-regex": { 1360 | "version": "2.1.1", 1361 | "bundled": true 1362 | }, 1363 | "ansi-styles": { 1364 | "version": "3.2.1", 1365 | "bundled": true, 1366 | "requires": { 1367 | "color-convert": "^1.9.0" 1368 | } 1369 | }, 1370 | "ansicolors": { 1371 | "version": "0.3.2", 1372 | "bundled": true 1373 | }, 1374 | "ansistyles": { 1375 | "version": "0.1.3", 1376 | "bundled": true 1377 | }, 1378 | "aproba": { 1379 | "version": "2.0.0", 1380 | "bundled": true 1381 | }, 1382 | "archy": { 1383 | "version": "1.0.0", 1384 | "bundled": true 1385 | }, 1386 | "are-we-there-yet": { 1387 | "version": "1.1.4", 1388 | "bundled": true, 1389 | "requires": { 1390 | "delegates": "^1.0.0", 1391 | "readable-stream": "^2.0.6" 1392 | }, 1393 | "dependencies": { 1394 | "readable-stream": { 1395 | "version": "2.3.6", 1396 | "bundled": true, 1397 | "requires": { 1398 | "core-util-is": "~1.0.0", 1399 | "inherits": "~2.0.3", 1400 | "isarray": "~1.0.0", 1401 | "process-nextick-args": "~2.0.0", 1402 | "safe-buffer": "~5.1.1", 1403 | "string_decoder": "~1.1.1", 1404 | "util-deprecate": "~1.0.1" 1405 | } 1406 | }, 1407 | "string_decoder": { 1408 | "version": "1.1.1", 1409 | "bundled": true, 1410 | "requires": { 1411 | "safe-buffer": "~5.1.0" 1412 | } 1413 | } 1414 | } 1415 | }, 1416 | "asap": { 1417 | "version": "2.0.6", 1418 | "bundled": true 1419 | }, 1420 | "asn1": { 1421 | "version": "0.2.4", 1422 | "bundled": true, 1423 | "requires": { 1424 | "safer-buffer": "~2.1.0" 1425 | } 1426 | }, 1427 | "assert-plus": { 1428 | "version": "1.0.0", 1429 | "bundled": true 1430 | }, 1431 | "asynckit": { 1432 | "version": "0.4.0", 1433 | "bundled": true 1434 | }, 1435 | "aws-sign2": { 1436 | "version": "0.7.0", 1437 | "bundled": true 1438 | }, 1439 | "aws4": { 1440 | "version": "1.8.0", 1441 | "bundled": true 1442 | }, 1443 | "balanced-match": { 1444 | "version": "1.0.0", 1445 | "bundled": true 1446 | }, 1447 | "bcrypt-pbkdf": { 1448 | "version": "1.0.2", 1449 | "bundled": true, 1450 | "optional": true, 1451 | "requires": { 1452 | "tweetnacl": "^0.14.3" 1453 | } 1454 | }, 1455 | "bin-links": { 1456 | "version": "1.1.3", 1457 | "bundled": true, 1458 | "requires": { 1459 | "bluebird": "^3.5.3", 1460 | "cmd-shim": "^3.0.0", 1461 | "gentle-fs": "^2.0.1", 1462 | "graceful-fs": "^4.1.15", 1463 | "write-file-atomic": "^2.3.0" 1464 | } 1465 | }, 1466 | "bluebird": { 1467 | "version": "3.5.5", 1468 | "bundled": true 1469 | }, 1470 | "boxen": { 1471 | "version": "1.3.0", 1472 | "bundled": true, 1473 | "requires": { 1474 | "ansi-align": "^2.0.0", 1475 | "camelcase": "^4.0.0", 1476 | "chalk": "^2.0.1", 1477 | "cli-boxes": "^1.0.0", 1478 | "string-width": "^2.0.0", 1479 | "term-size": "^1.2.0", 1480 | "widest-line": "^2.0.0" 1481 | } 1482 | }, 1483 | "brace-expansion": { 1484 | "version": "1.1.11", 1485 | "bundled": true, 1486 | "requires": { 1487 | "balanced-match": "^1.0.0", 1488 | "concat-map": "0.0.1" 1489 | } 1490 | }, 1491 | "buffer-from": { 1492 | "version": "1.0.0", 1493 | "bundled": true 1494 | }, 1495 | "builtins": { 1496 | "version": "1.0.3", 1497 | "bundled": true 1498 | }, 1499 | "byline": { 1500 | "version": "5.0.0", 1501 | "bundled": true 1502 | }, 1503 | "byte-size": { 1504 | "version": "5.0.1", 1505 | "bundled": true 1506 | }, 1507 | "cacache": { 1508 | "version": "12.0.3", 1509 | "bundled": true, 1510 | "requires": { 1511 | "bluebird": "^3.5.5", 1512 | "chownr": "^1.1.1", 1513 | "figgy-pudding": "^3.5.1", 1514 | "glob": "^7.1.4", 1515 | "graceful-fs": "^4.1.15", 1516 | "infer-owner": "^1.0.3", 1517 | "lru-cache": "^5.1.1", 1518 | "mississippi": "^3.0.0", 1519 | "mkdirp": "^0.5.1", 1520 | "move-concurrently": "^1.0.1", 1521 | "promise-inflight": "^1.0.1", 1522 | "rimraf": "^2.6.3", 1523 | "ssri": "^6.0.1", 1524 | "unique-filename": "^1.1.1", 1525 | "y18n": "^4.0.0" 1526 | } 1527 | }, 1528 | "call-limit": { 1529 | "version": "1.1.1", 1530 | "bundled": true 1531 | }, 1532 | "camelcase": { 1533 | "version": "4.1.0", 1534 | "bundled": true 1535 | }, 1536 | "capture-stack-trace": { 1537 | "version": "1.0.0", 1538 | "bundled": true 1539 | }, 1540 | "caseless": { 1541 | "version": "0.12.0", 1542 | "bundled": true 1543 | }, 1544 | "chalk": { 1545 | "version": "2.4.1", 1546 | "bundled": true, 1547 | "requires": { 1548 | "ansi-styles": "^3.2.1", 1549 | "escape-string-regexp": "^1.0.5", 1550 | "supports-color": "^5.3.0" 1551 | } 1552 | }, 1553 | "chownr": { 1554 | "version": "1.1.3", 1555 | "bundled": true 1556 | }, 1557 | "ci-info": { 1558 | "version": "2.0.0", 1559 | "bundled": true 1560 | }, 1561 | "cidr-regex": { 1562 | "version": "2.0.10", 1563 | "bundled": true, 1564 | "requires": { 1565 | "ip-regex": "^2.1.0" 1566 | } 1567 | }, 1568 | "cli-boxes": { 1569 | "version": "1.0.0", 1570 | "bundled": true 1571 | }, 1572 | "cli-columns": { 1573 | "version": "3.1.2", 1574 | "bundled": true, 1575 | "requires": { 1576 | "string-width": "^2.0.0", 1577 | "strip-ansi": "^3.0.1" 1578 | } 1579 | }, 1580 | "cli-table3": { 1581 | "version": "0.5.1", 1582 | "bundled": true, 1583 | "requires": { 1584 | "colors": "^1.1.2", 1585 | "object-assign": "^4.1.0", 1586 | "string-width": "^2.1.1" 1587 | } 1588 | }, 1589 | "cliui": { 1590 | "version": "4.1.0", 1591 | "bundled": true, 1592 | "requires": { 1593 | "string-width": "^2.1.1", 1594 | "strip-ansi": "^4.0.0", 1595 | "wrap-ansi": "^2.0.0" 1596 | }, 1597 | "dependencies": { 1598 | "ansi-regex": { 1599 | "version": "3.0.0", 1600 | "bundled": true 1601 | }, 1602 | "strip-ansi": { 1603 | "version": "4.0.0", 1604 | "bundled": true, 1605 | "requires": { 1606 | "ansi-regex": "^3.0.0" 1607 | } 1608 | } 1609 | } 1610 | }, 1611 | "clone": { 1612 | "version": "1.0.4", 1613 | "bundled": true 1614 | }, 1615 | "cmd-shim": { 1616 | "version": "3.0.3", 1617 | "bundled": true, 1618 | "requires": { 1619 | "graceful-fs": "^4.1.2", 1620 | "mkdirp": "~0.5.0" 1621 | } 1622 | }, 1623 | "co": { 1624 | "version": "4.6.0", 1625 | "bundled": true 1626 | }, 1627 | "code-point-at": { 1628 | "version": "1.1.0", 1629 | "bundled": true 1630 | }, 1631 | "color-convert": { 1632 | "version": "1.9.1", 1633 | "bundled": true, 1634 | "requires": { 1635 | "color-name": "^1.1.1" 1636 | } 1637 | }, 1638 | "color-name": { 1639 | "version": "1.1.3", 1640 | "bundled": true 1641 | }, 1642 | "colors": { 1643 | "version": "1.3.3", 1644 | "bundled": true, 1645 | "optional": true 1646 | }, 1647 | "columnify": { 1648 | "version": "1.5.4", 1649 | "bundled": true, 1650 | "requires": { 1651 | "strip-ansi": "^3.0.0", 1652 | "wcwidth": "^1.0.0" 1653 | } 1654 | }, 1655 | "combined-stream": { 1656 | "version": "1.0.6", 1657 | "bundled": true, 1658 | "requires": { 1659 | "delayed-stream": "~1.0.0" 1660 | } 1661 | }, 1662 | "concat-map": { 1663 | "version": "0.0.1", 1664 | "bundled": true 1665 | }, 1666 | "concat-stream": { 1667 | "version": "1.6.2", 1668 | "bundled": true, 1669 | "requires": { 1670 | "buffer-from": "^1.0.0", 1671 | "inherits": "^2.0.3", 1672 | "readable-stream": "^2.2.2", 1673 | "typedarray": "^0.0.6" 1674 | }, 1675 | "dependencies": { 1676 | "readable-stream": { 1677 | "version": "2.3.6", 1678 | "bundled": true, 1679 | "requires": { 1680 | "core-util-is": "~1.0.0", 1681 | "inherits": "~2.0.3", 1682 | "isarray": "~1.0.0", 1683 | "process-nextick-args": "~2.0.0", 1684 | "safe-buffer": "~5.1.1", 1685 | "string_decoder": "~1.1.1", 1686 | "util-deprecate": "~1.0.1" 1687 | } 1688 | }, 1689 | "string_decoder": { 1690 | "version": "1.1.1", 1691 | "bundled": true, 1692 | "requires": { 1693 | "safe-buffer": "~5.1.0" 1694 | } 1695 | } 1696 | } 1697 | }, 1698 | "config-chain": { 1699 | "version": "1.1.12", 1700 | "bundled": true, 1701 | "requires": { 1702 | "ini": "^1.3.4", 1703 | "proto-list": "~1.2.1" 1704 | } 1705 | }, 1706 | "configstore": { 1707 | "version": "3.1.2", 1708 | "bundled": true, 1709 | "requires": { 1710 | "dot-prop": "^4.1.0", 1711 | "graceful-fs": "^4.1.2", 1712 | "make-dir": "^1.0.0", 1713 | "unique-string": "^1.0.0", 1714 | "write-file-atomic": "^2.0.0", 1715 | "xdg-basedir": "^3.0.0" 1716 | } 1717 | }, 1718 | "console-control-strings": { 1719 | "version": "1.1.0", 1720 | "bundled": true 1721 | }, 1722 | "copy-concurrently": { 1723 | "version": "1.0.5", 1724 | "bundled": true, 1725 | "requires": { 1726 | "aproba": "^1.1.1", 1727 | "fs-write-stream-atomic": "^1.0.8", 1728 | "iferr": "^0.1.5", 1729 | "mkdirp": "^0.5.1", 1730 | "rimraf": "^2.5.4", 1731 | "run-queue": "^1.0.0" 1732 | }, 1733 | "dependencies": { 1734 | "aproba": { 1735 | "version": "1.2.0", 1736 | "bundled": true 1737 | }, 1738 | "iferr": { 1739 | "version": "0.1.5", 1740 | "bundled": true 1741 | } 1742 | } 1743 | }, 1744 | "core-util-is": { 1745 | "version": "1.0.2", 1746 | "bundled": true 1747 | }, 1748 | "create-error-class": { 1749 | "version": "3.0.2", 1750 | "bundled": true, 1751 | "requires": { 1752 | "capture-stack-trace": "^1.0.0" 1753 | } 1754 | }, 1755 | "cross-spawn": { 1756 | "version": "5.1.0", 1757 | "bundled": true, 1758 | "requires": { 1759 | "lru-cache": "^4.0.1", 1760 | "shebang-command": "^1.2.0", 1761 | "which": "^1.2.9" 1762 | }, 1763 | "dependencies": { 1764 | "lru-cache": { 1765 | "version": "4.1.5", 1766 | "bundled": true, 1767 | "requires": { 1768 | "pseudomap": "^1.0.2", 1769 | "yallist": "^2.1.2" 1770 | } 1771 | }, 1772 | "yallist": { 1773 | "version": "2.1.2", 1774 | "bundled": true 1775 | } 1776 | } 1777 | }, 1778 | "crypto-random-string": { 1779 | "version": "1.0.0", 1780 | "bundled": true 1781 | }, 1782 | "cyclist": { 1783 | "version": "0.2.2", 1784 | "bundled": true 1785 | }, 1786 | "dashdash": { 1787 | "version": "1.14.1", 1788 | "bundled": true, 1789 | "requires": { 1790 | "assert-plus": "^1.0.0" 1791 | } 1792 | }, 1793 | "debug": { 1794 | "version": "3.1.0", 1795 | "bundled": true, 1796 | "requires": { 1797 | "ms": "2.0.0" 1798 | }, 1799 | "dependencies": { 1800 | "ms": { 1801 | "version": "2.0.0", 1802 | "bundled": true 1803 | } 1804 | } 1805 | }, 1806 | "debuglog": { 1807 | "version": "1.0.1", 1808 | "bundled": true 1809 | }, 1810 | "decamelize": { 1811 | "version": "1.2.0", 1812 | "bundled": true 1813 | }, 1814 | "decode-uri-component": { 1815 | "version": "0.2.0", 1816 | "bundled": true 1817 | }, 1818 | "deep-extend": { 1819 | "version": "0.5.1", 1820 | "bundled": true 1821 | }, 1822 | "defaults": { 1823 | "version": "1.0.3", 1824 | "bundled": true, 1825 | "requires": { 1826 | "clone": "^1.0.2" 1827 | } 1828 | }, 1829 | "define-properties": { 1830 | "version": "1.1.3", 1831 | "bundled": true, 1832 | "requires": { 1833 | "object-keys": "^1.0.12" 1834 | } 1835 | }, 1836 | "delayed-stream": { 1837 | "version": "1.0.0", 1838 | "bundled": true 1839 | }, 1840 | "delegates": { 1841 | "version": "1.0.0", 1842 | "bundled": true 1843 | }, 1844 | "detect-indent": { 1845 | "version": "5.0.0", 1846 | "bundled": true 1847 | }, 1848 | "detect-newline": { 1849 | "version": "2.1.0", 1850 | "bundled": true 1851 | }, 1852 | "dezalgo": { 1853 | "version": "1.0.3", 1854 | "bundled": true, 1855 | "requires": { 1856 | "asap": "^2.0.0", 1857 | "wrappy": "1" 1858 | } 1859 | }, 1860 | "dot-prop": { 1861 | "version": "4.2.0", 1862 | "bundled": true, 1863 | "requires": { 1864 | "is-obj": "^1.0.0" 1865 | } 1866 | }, 1867 | "dotenv": { 1868 | "version": "5.0.1", 1869 | "bundled": true 1870 | }, 1871 | "duplexer3": { 1872 | "version": "0.1.4", 1873 | "bundled": true 1874 | }, 1875 | "duplexify": { 1876 | "version": "3.6.0", 1877 | "bundled": true, 1878 | "requires": { 1879 | "end-of-stream": "^1.0.0", 1880 | "inherits": "^2.0.1", 1881 | "readable-stream": "^2.0.0", 1882 | "stream-shift": "^1.0.0" 1883 | }, 1884 | "dependencies": { 1885 | "readable-stream": { 1886 | "version": "2.3.6", 1887 | "bundled": true, 1888 | "requires": { 1889 | "core-util-is": "~1.0.0", 1890 | "inherits": "~2.0.3", 1891 | "isarray": "~1.0.0", 1892 | "process-nextick-args": "~2.0.0", 1893 | "safe-buffer": "~5.1.1", 1894 | "string_decoder": "~1.1.1", 1895 | "util-deprecate": "~1.0.1" 1896 | } 1897 | }, 1898 | "string_decoder": { 1899 | "version": "1.1.1", 1900 | "bundled": true, 1901 | "requires": { 1902 | "safe-buffer": "~5.1.0" 1903 | } 1904 | } 1905 | } 1906 | }, 1907 | "ecc-jsbn": { 1908 | "version": "0.1.2", 1909 | "bundled": true, 1910 | "optional": true, 1911 | "requires": { 1912 | "jsbn": "~0.1.0", 1913 | "safer-buffer": "^2.1.0" 1914 | } 1915 | }, 1916 | "editor": { 1917 | "version": "1.0.0", 1918 | "bundled": true 1919 | }, 1920 | "encoding": { 1921 | "version": "0.1.12", 1922 | "bundled": true, 1923 | "requires": { 1924 | "iconv-lite": "~0.4.13" 1925 | } 1926 | }, 1927 | "end-of-stream": { 1928 | "version": "1.4.1", 1929 | "bundled": true, 1930 | "requires": { 1931 | "once": "^1.4.0" 1932 | } 1933 | }, 1934 | "env-paths": { 1935 | "version": "1.0.0", 1936 | "bundled": true 1937 | }, 1938 | "err-code": { 1939 | "version": "1.1.2", 1940 | "bundled": true 1941 | }, 1942 | "errno": { 1943 | "version": "0.1.7", 1944 | "bundled": true, 1945 | "requires": { 1946 | "prr": "~1.0.1" 1947 | } 1948 | }, 1949 | "es-abstract": { 1950 | "version": "1.12.0", 1951 | "bundled": true, 1952 | "requires": { 1953 | "es-to-primitive": "^1.1.1", 1954 | "function-bind": "^1.1.1", 1955 | "has": "^1.0.1", 1956 | "is-callable": "^1.1.3", 1957 | "is-regex": "^1.0.4" 1958 | } 1959 | }, 1960 | "es-to-primitive": { 1961 | "version": "1.2.0", 1962 | "bundled": true, 1963 | "requires": { 1964 | "is-callable": "^1.1.4", 1965 | "is-date-object": "^1.0.1", 1966 | "is-symbol": "^1.0.2" 1967 | } 1968 | }, 1969 | "es6-promise": { 1970 | "version": "4.2.8", 1971 | "bundled": true 1972 | }, 1973 | "es6-promisify": { 1974 | "version": "5.0.0", 1975 | "bundled": true, 1976 | "requires": { 1977 | "es6-promise": "^4.0.3" 1978 | } 1979 | }, 1980 | "escape-string-regexp": { 1981 | "version": "1.0.5", 1982 | "bundled": true 1983 | }, 1984 | "execa": { 1985 | "version": "0.7.0", 1986 | "bundled": true, 1987 | "requires": { 1988 | "cross-spawn": "^5.0.1", 1989 | "get-stream": "^3.0.0", 1990 | "is-stream": "^1.1.0", 1991 | "npm-run-path": "^2.0.0", 1992 | "p-finally": "^1.0.0", 1993 | "signal-exit": "^3.0.0", 1994 | "strip-eof": "^1.0.0" 1995 | }, 1996 | "dependencies": { 1997 | "get-stream": { 1998 | "version": "3.0.0", 1999 | "bundled": true 2000 | } 2001 | } 2002 | }, 2003 | "extend": { 2004 | "version": "3.0.2", 2005 | "bundled": true 2006 | }, 2007 | "extsprintf": { 2008 | "version": "1.3.0", 2009 | "bundled": true 2010 | }, 2011 | "fast-deep-equal": { 2012 | "version": "1.1.0", 2013 | "bundled": true 2014 | }, 2015 | "fast-json-stable-stringify": { 2016 | "version": "2.0.0", 2017 | "bundled": true 2018 | }, 2019 | "figgy-pudding": { 2020 | "version": "3.5.1", 2021 | "bundled": true 2022 | }, 2023 | "find-npm-prefix": { 2024 | "version": "1.0.2", 2025 | "bundled": true 2026 | }, 2027 | "find-up": { 2028 | "version": "2.1.0", 2029 | "bundled": true, 2030 | "requires": { 2031 | "locate-path": "^2.0.0" 2032 | } 2033 | }, 2034 | "flush-write-stream": { 2035 | "version": "1.0.3", 2036 | "bundled": true, 2037 | "requires": { 2038 | "inherits": "^2.0.1", 2039 | "readable-stream": "^2.0.4" 2040 | }, 2041 | "dependencies": { 2042 | "readable-stream": { 2043 | "version": "2.3.6", 2044 | "bundled": true, 2045 | "requires": { 2046 | "core-util-is": "~1.0.0", 2047 | "inherits": "~2.0.3", 2048 | "isarray": "~1.0.0", 2049 | "process-nextick-args": "~2.0.0", 2050 | "safe-buffer": "~5.1.1", 2051 | "string_decoder": "~1.1.1", 2052 | "util-deprecate": "~1.0.1" 2053 | } 2054 | }, 2055 | "string_decoder": { 2056 | "version": "1.1.1", 2057 | "bundled": true, 2058 | "requires": { 2059 | "safe-buffer": "~5.1.0" 2060 | } 2061 | } 2062 | } 2063 | }, 2064 | "forever-agent": { 2065 | "version": "0.6.1", 2066 | "bundled": true 2067 | }, 2068 | "form-data": { 2069 | "version": "2.3.2", 2070 | "bundled": true, 2071 | "requires": { 2072 | "asynckit": "^0.4.0", 2073 | "combined-stream": "1.0.6", 2074 | "mime-types": "^2.1.12" 2075 | } 2076 | }, 2077 | "from2": { 2078 | "version": "2.3.0", 2079 | "bundled": true, 2080 | "requires": { 2081 | "inherits": "^2.0.1", 2082 | "readable-stream": "^2.0.0" 2083 | }, 2084 | "dependencies": { 2085 | "readable-stream": { 2086 | "version": "2.3.6", 2087 | "bundled": true, 2088 | "requires": { 2089 | "core-util-is": "~1.0.0", 2090 | "inherits": "~2.0.3", 2091 | "isarray": "~1.0.0", 2092 | "process-nextick-args": "~2.0.0", 2093 | "safe-buffer": "~5.1.1", 2094 | "string_decoder": "~1.1.1", 2095 | "util-deprecate": "~1.0.1" 2096 | } 2097 | }, 2098 | "string_decoder": { 2099 | "version": "1.1.1", 2100 | "bundled": true, 2101 | "requires": { 2102 | "safe-buffer": "~5.1.0" 2103 | } 2104 | } 2105 | } 2106 | }, 2107 | "fs-minipass": { 2108 | "version": "1.2.7", 2109 | "bundled": true, 2110 | "requires": { 2111 | "minipass": "^2.6.0" 2112 | }, 2113 | "dependencies": { 2114 | "minipass": { 2115 | "version": "2.9.0", 2116 | "bundled": true, 2117 | "requires": { 2118 | "safe-buffer": "^5.1.2", 2119 | "yallist": "^3.0.0" 2120 | } 2121 | } 2122 | } 2123 | }, 2124 | "fs-vacuum": { 2125 | "version": "1.2.10", 2126 | "bundled": true, 2127 | "requires": { 2128 | "graceful-fs": "^4.1.2", 2129 | "path-is-inside": "^1.0.1", 2130 | "rimraf": "^2.5.2" 2131 | } 2132 | }, 2133 | "fs-write-stream-atomic": { 2134 | "version": "1.0.10", 2135 | "bundled": true, 2136 | "requires": { 2137 | "graceful-fs": "^4.1.2", 2138 | "iferr": "^0.1.5", 2139 | "imurmurhash": "^0.1.4", 2140 | "readable-stream": "1 || 2" 2141 | }, 2142 | "dependencies": { 2143 | "iferr": { 2144 | "version": "0.1.5", 2145 | "bundled": true 2146 | }, 2147 | "readable-stream": { 2148 | "version": "2.3.6", 2149 | "bundled": true, 2150 | "requires": { 2151 | "core-util-is": "~1.0.0", 2152 | "inherits": "~2.0.3", 2153 | "isarray": "~1.0.0", 2154 | "process-nextick-args": "~2.0.0", 2155 | "safe-buffer": "~5.1.1", 2156 | "string_decoder": "~1.1.1", 2157 | "util-deprecate": "~1.0.1" 2158 | } 2159 | }, 2160 | "string_decoder": { 2161 | "version": "1.1.1", 2162 | "bundled": true, 2163 | "requires": { 2164 | "safe-buffer": "~5.1.0" 2165 | } 2166 | } 2167 | } 2168 | }, 2169 | "fs.realpath": { 2170 | "version": "1.0.0", 2171 | "bundled": true 2172 | }, 2173 | "function-bind": { 2174 | "version": "1.1.1", 2175 | "bundled": true 2176 | }, 2177 | "gauge": { 2178 | "version": "2.7.4", 2179 | "bundled": true, 2180 | "requires": { 2181 | "aproba": "^1.0.3", 2182 | "console-control-strings": "^1.0.0", 2183 | "has-unicode": "^2.0.0", 2184 | "object-assign": "^4.1.0", 2185 | "signal-exit": "^3.0.0", 2186 | "string-width": "^1.0.1", 2187 | "strip-ansi": "^3.0.1", 2188 | "wide-align": "^1.1.0" 2189 | }, 2190 | "dependencies": { 2191 | "aproba": { 2192 | "version": "1.2.0", 2193 | "bundled": true 2194 | }, 2195 | "string-width": { 2196 | "version": "1.0.2", 2197 | "bundled": true, 2198 | "requires": { 2199 | "code-point-at": "^1.0.0", 2200 | "is-fullwidth-code-point": "^1.0.0", 2201 | "strip-ansi": "^3.0.0" 2202 | } 2203 | } 2204 | } 2205 | }, 2206 | "genfun": { 2207 | "version": "5.0.0", 2208 | "bundled": true 2209 | }, 2210 | "gentle-fs": { 2211 | "version": "2.2.1", 2212 | "bundled": true, 2213 | "requires": { 2214 | "aproba": "^1.1.2", 2215 | "chownr": "^1.1.2", 2216 | "fs-vacuum": "^1.2.10", 2217 | "graceful-fs": "^4.1.11", 2218 | "iferr": "^0.1.5", 2219 | "infer-owner": "^1.0.4", 2220 | "mkdirp": "^0.5.1", 2221 | "path-is-inside": "^1.0.2", 2222 | "read-cmd-shim": "^1.0.1", 2223 | "slide": "^1.1.6" 2224 | }, 2225 | "dependencies": { 2226 | "aproba": { 2227 | "version": "1.2.0", 2228 | "bundled": true 2229 | }, 2230 | "iferr": { 2231 | "version": "0.1.5", 2232 | "bundled": true 2233 | } 2234 | } 2235 | }, 2236 | "get-caller-file": { 2237 | "version": "1.0.2", 2238 | "bundled": true 2239 | }, 2240 | "get-stream": { 2241 | "version": "4.1.0", 2242 | "bundled": true, 2243 | "requires": { 2244 | "pump": "^3.0.0" 2245 | } 2246 | }, 2247 | "getpass": { 2248 | "version": "0.1.7", 2249 | "bundled": true, 2250 | "requires": { 2251 | "assert-plus": "^1.0.0" 2252 | } 2253 | }, 2254 | "glob": { 2255 | "version": "7.1.4", 2256 | "bundled": true, 2257 | "requires": { 2258 | "fs.realpath": "^1.0.0", 2259 | "inflight": "^1.0.4", 2260 | "inherits": "2", 2261 | "minimatch": "^3.0.4", 2262 | "once": "^1.3.0", 2263 | "path-is-absolute": "^1.0.0" 2264 | } 2265 | }, 2266 | "global-dirs": { 2267 | "version": "0.1.1", 2268 | "bundled": true, 2269 | "requires": { 2270 | "ini": "^1.3.4" 2271 | } 2272 | }, 2273 | "got": { 2274 | "version": "6.7.1", 2275 | "bundled": true, 2276 | "requires": { 2277 | "create-error-class": "^3.0.0", 2278 | "duplexer3": "^0.1.4", 2279 | "get-stream": "^3.0.0", 2280 | "is-redirect": "^1.0.0", 2281 | "is-retry-allowed": "^1.0.0", 2282 | "is-stream": "^1.0.0", 2283 | "lowercase-keys": "^1.0.0", 2284 | "safe-buffer": "^5.0.1", 2285 | "timed-out": "^4.0.0", 2286 | "unzip-response": "^2.0.1", 2287 | "url-parse-lax": "^1.0.0" 2288 | }, 2289 | "dependencies": { 2290 | "get-stream": { 2291 | "version": "3.0.0", 2292 | "bundled": true 2293 | } 2294 | } 2295 | }, 2296 | "graceful-fs": { 2297 | "version": "4.2.3", 2298 | "bundled": true 2299 | }, 2300 | "har-schema": { 2301 | "version": "2.0.0", 2302 | "bundled": true 2303 | }, 2304 | "har-validator": { 2305 | "version": "5.1.0", 2306 | "bundled": true, 2307 | "requires": { 2308 | "ajv": "^5.3.0", 2309 | "har-schema": "^2.0.0" 2310 | } 2311 | }, 2312 | "has": { 2313 | "version": "1.0.3", 2314 | "bundled": true, 2315 | "requires": { 2316 | "function-bind": "^1.1.1" 2317 | } 2318 | }, 2319 | "has-flag": { 2320 | "version": "3.0.0", 2321 | "bundled": true 2322 | }, 2323 | "has-symbols": { 2324 | "version": "1.0.0", 2325 | "bundled": true 2326 | }, 2327 | "has-unicode": { 2328 | "version": "2.0.1", 2329 | "bundled": true 2330 | }, 2331 | "hosted-git-info": { 2332 | "version": "2.8.5", 2333 | "bundled": true 2334 | }, 2335 | "http-cache-semantics": { 2336 | "version": "3.8.1", 2337 | "bundled": true 2338 | }, 2339 | "http-proxy-agent": { 2340 | "version": "2.1.0", 2341 | "bundled": true, 2342 | "requires": { 2343 | "agent-base": "4", 2344 | "debug": "3.1.0" 2345 | } 2346 | }, 2347 | "http-signature": { 2348 | "version": "1.2.0", 2349 | "bundled": true, 2350 | "requires": { 2351 | "assert-plus": "^1.0.0", 2352 | "jsprim": "^1.2.2", 2353 | "sshpk": "^1.7.0" 2354 | } 2355 | }, 2356 | "https-proxy-agent": { 2357 | "version": "2.2.4", 2358 | "bundled": true, 2359 | "requires": { 2360 | "agent-base": "^4.3.0", 2361 | "debug": "^3.1.0" 2362 | } 2363 | }, 2364 | "humanize-ms": { 2365 | "version": "1.2.1", 2366 | "bundled": true, 2367 | "requires": { 2368 | "ms": "^2.0.0" 2369 | } 2370 | }, 2371 | "iconv-lite": { 2372 | "version": "0.4.23", 2373 | "bundled": true, 2374 | "requires": { 2375 | "safer-buffer": ">= 2.1.2 < 3" 2376 | } 2377 | }, 2378 | "iferr": { 2379 | "version": "1.0.2", 2380 | "bundled": true 2381 | }, 2382 | "ignore-walk": { 2383 | "version": "3.0.3", 2384 | "bundled": true, 2385 | "requires": { 2386 | "minimatch": "^3.0.4" 2387 | } 2388 | }, 2389 | "import-lazy": { 2390 | "version": "2.1.0", 2391 | "bundled": true 2392 | }, 2393 | "imurmurhash": { 2394 | "version": "0.1.4", 2395 | "bundled": true 2396 | }, 2397 | "infer-owner": { 2398 | "version": "1.0.4", 2399 | "bundled": true 2400 | }, 2401 | "inflight": { 2402 | "version": "1.0.6", 2403 | "bundled": true, 2404 | "requires": { 2405 | "once": "^1.3.0", 2406 | "wrappy": "1" 2407 | } 2408 | }, 2409 | "inherits": { 2410 | "version": "2.0.4", 2411 | "bundled": true 2412 | }, 2413 | "ini": { 2414 | "version": "1.3.5", 2415 | "bundled": true 2416 | }, 2417 | "init-package-json": { 2418 | "version": "1.10.3", 2419 | "bundled": true, 2420 | "requires": { 2421 | "glob": "^7.1.1", 2422 | "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", 2423 | "promzard": "^0.3.0", 2424 | "read": "~1.0.1", 2425 | "read-package-json": "1 || 2", 2426 | "semver": "2.x || 3.x || 4 || 5", 2427 | "validate-npm-package-license": "^3.0.1", 2428 | "validate-npm-package-name": "^3.0.0" 2429 | } 2430 | }, 2431 | "invert-kv": { 2432 | "version": "1.0.0", 2433 | "bundled": true 2434 | }, 2435 | "ip": { 2436 | "version": "1.1.5", 2437 | "bundled": true 2438 | }, 2439 | "ip-regex": { 2440 | "version": "2.1.0", 2441 | "bundled": true 2442 | }, 2443 | "is-callable": { 2444 | "version": "1.1.4", 2445 | "bundled": true 2446 | }, 2447 | "is-ci": { 2448 | "version": "1.1.0", 2449 | "bundled": true, 2450 | "requires": { 2451 | "ci-info": "^1.0.0" 2452 | }, 2453 | "dependencies": { 2454 | "ci-info": { 2455 | "version": "1.6.0", 2456 | "bundled": true 2457 | } 2458 | } 2459 | }, 2460 | "is-cidr": { 2461 | "version": "3.0.0", 2462 | "bundled": true, 2463 | "requires": { 2464 | "cidr-regex": "^2.0.10" 2465 | } 2466 | }, 2467 | "is-date-object": { 2468 | "version": "1.0.1", 2469 | "bundled": true 2470 | }, 2471 | "is-fullwidth-code-point": { 2472 | "version": "1.0.0", 2473 | "bundled": true, 2474 | "requires": { 2475 | "number-is-nan": "^1.0.0" 2476 | } 2477 | }, 2478 | "is-installed-globally": { 2479 | "version": "0.1.0", 2480 | "bundled": true, 2481 | "requires": { 2482 | "global-dirs": "^0.1.0", 2483 | "is-path-inside": "^1.0.0" 2484 | } 2485 | }, 2486 | "is-npm": { 2487 | "version": "1.0.0", 2488 | "bundled": true 2489 | }, 2490 | "is-obj": { 2491 | "version": "1.0.1", 2492 | "bundled": true 2493 | }, 2494 | "is-path-inside": { 2495 | "version": "1.0.1", 2496 | "bundled": true, 2497 | "requires": { 2498 | "path-is-inside": "^1.0.1" 2499 | } 2500 | }, 2501 | "is-redirect": { 2502 | "version": "1.0.0", 2503 | "bundled": true 2504 | }, 2505 | "is-regex": { 2506 | "version": "1.0.4", 2507 | "bundled": true, 2508 | "requires": { 2509 | "has": "^1.0.1" 2510 | } 2511 | }, 2512 | "is-retry-allowed": { 2513 | "version": "1.1.0", 2514 | "bundled": true 2515 | }, 2516 | "is-stream": { 2517 | "version": "1.1.0", 2518 | "bundled": true 2519 | }, 2520 | "is-symbol": { 2521 | "version": "1.0.2", 2522 | "bundled": true, 2523 | "requires": { 2524 | "has-symbols": "^1.0.0" 2525 | } 2526 | }, 2527 | "is-typedarray": { 2528 | "version": "1.0.0", 2529 | "bundled": true 2530 | }, 2531 | "isarray": { 2532 | "version": "1.0.0", 2533 | "bundled": true 2534 | }, 2535 | "isexe": { 2536 | "version": "2.0.0", 2537 | "bundled": true 2538 | }, 2539 | "isstream": { 2540 | "version": "0.1.2", 2541 | "bundled": true 2542 | }, 2543 | "jsbn": { 2544 | "version": "0.1.1", 2545 | "bundled": true, 2546 | "optional": true 2547 | }, 2548 | "json-parse-better-errors": { 2549 | "version": "1.0.2", 2550 | "bundled": true 2551 | }, 2552 | "json-schema": { 2553 | "version": "0.2.3", 2554 | "bundled": true 2555 | }, 2556 | "json-schema-traverse": { 2557 | "version": "0.3.1", 2558 | "bundled": true 2559 | }, 2560 | "json-stringify-safe": { 2561 | "version": "5.0.1", 2562 | "bundled": true 2563 | }, 2564 | "jsonparse": { 2565 | "version": "1.3.1", 2566 | "bundled": true 2567 | }, 2568 | "jsprim": { 2569 | "version": "1.4.1", 2570 | "bundled": true, 2571 | "requires": { 2572 | "assert-plus": "1.0.0", 2573 | "extsprintf": "1.3.0", 2574 | "json-schema": "0.2.3", 2575 | "verror": "1.10.0" 2576 | } 2577 | }, 2578 | "latest-version": { 2579 | "version": "3.1.0", 2580 | "bundled": true, 2581 | "requires": { 2582 | "package-json": "^4.0.0" 2583 | } 2584 | }, 2585 | "lazy-property": { 2586 | "version": "1.0.0", 2587 | "bundled": true 2588 | }, 2589 | "lcid": { 2590 | "version": "1.0.0", 2591 | "bundled": true, 2592 | "requires": { 2593 | "invert-kv": "^1.0.0" 2594 | } 2595 | }, 2596 | "libcipm": { 2597 | "version": "4.0.7", 2598 | "bundled": true, 2599 | "requires": { 2600 | "bin-links": "^1.1.2", 2601 | "bluebird": "^3.5.1", 2602 | "figgy-pudding": "^3.5.1", 2603 | "find-npm-prefix": "^1.0.2", 2604 | "graceful-fs": "^4.1.11", 2605 | "ini": "^1.3.5", 2606 | "lock-verify": "^2.0.2", 2607 | "mkdirp": "^0.5.1", 2608 | "npm-lifecycle": "^3.0.0", 2609 | "npm-logical-tree": "^1.2.1", 2610 | "npm-package-arg": "^6.1.0", 2611 | "pacote": "^9.1.0", 2612 | "read-package-json": "^2.0.13", 2613 | "rimraf": "^2.6.2", 2614 | "worker-farm": "^1.6.0" 2615 | } 2616 | }, 2617 | "libnpm": { 2618 | "version": "3.0.1", 2619 | "bundled": true, 2620 | "requires": { 2621 | "bin-links": "^1.1.2", 2622 | "bluebird": "^3.5.3", 2623 | "find-npm-prefix": "^1.0.2", 2624 | "libnpmaccess": "^3.0.2", 2625 | "libnpmconfig": "^1.2.1", 2626 | "libnpmhook": "^5.0.3", 2627 | "libnpmorg": "^1.0.1", 2628 | "libnpmpublish": "^1.1.2", 2629 | "libnpmsearch": "^2.0.2", 2630 | "libnpmteam": "^1.0.2", 2631 | "lock-verify": "^2.0.2", 2632 | "npm-lifecycle": "^3.0.0", 2633 | "npm-logical-tree": "^1.2.1", 2634 | "npm-package-arg": "^6.1.0", 2635 | "npm-profile": "^4.0.2", 2636 | "npm-registry-fetch": "^4.0.0", 2637 | "npmlog": "^4.1.2", 2638 | "pacote": "^9.5.3", 2639 | "read-package-json": "^2.0.13", 2640 | "stringify-package": "^1.0.0" 2641 | } 2642 | }, 2643 | "libnpmaccess": { 2644 | "version": "3.0.2", 2645 | "bundled": true, 2646 | "requires": { 2647 | "aproba": "^2.0.0", 2648 | "get-stream": "^4.0.0", 2649 | "npm-package-arg": "^6.1.0", 2650 | "npm-registry-fetch": "^4.0.0" 2651 | } 2652 | }, 2653 | "libnpmconfig": { 2654 | "version": "1.2.1", 2655 | "bundled": true, 2656 | "requires": { 2657 | "figgy-pudding": "^3.5.1", 2658 | "find-up": "^3.0.0", 2659 | "ini": "^1.3.5" 2660 | }, 2661 | "dependencies": { 2662 | "find-up": { 2663 | "version": "3.0.0", 2664 | "bundled": true, 2665 | "requires": { 2666 | "locate-path": "^3.0.0" 2667 | } 2668 | }, 2669 | "locate-path": { 2670 | "version": "3.0.0", 2671 | "bundled": true, 2672 | "requires": { 2673 | "p-locate": "^3.0.0", 2674 | "path-exists": "^3.0.0" 2675 | } 2676 | }, 2677 | "p-limit": { 2678 | "version": "2.2.0", 2679 | "bundled": true, 2680 | "requires": { 2681 | "p-try": "^2.0.0" 2682 | } 2683 | }, 2684 | "p-locate": { 2685 | "version": "3.0.0", 2686 | "bundled": true, 2687 | "requires": { 2688 | "p-limit": "^2.0.0" 2689 | } 2690 | }, 2691 | "p-try": { 2692 | "version": "2.2.0", 2693 | "bundled": true 2694 | } 2695 | } 2696 | }, 2697 | "libnpmhook": { 2698 | "version": "5.0.3", 2699 | "bundled": true, 2700 | "requires": { 2701 | "aproba": "^2.0.0", 2702 | "figgy-pudding": "^3.4.1", 2703 | "get-stream": "^4.0.0", 2704 | "npm-registry-fetch": "^4.0.0" 2705 | } 2706 | }, 2707 | "libnpmorg": { 2708 | "version": "1.0.1", 2709 | "bundled": true, 2710 | "requires": { 2711 | "aproba": "^2.0.0", 2712 | "figgy-pudding": "^3.4.1", 2713 | "get-stream": "^4.0.0", 2714 | "npm-registry-fetch": "^4.0.0" 2715 | } 2716 | }, 2717 | "libnpmpublish": { 2718 | "version": "1.1.2", 2719 | "bundled": true, 2720 | "requires": { 2721 | "aproba": "^2.0.0", 2722 | "figgy-pudding": "^3.5.1", 2723 | "get-stream": "^4.0.0", 2724 | "lodash.clonedeep": "^4.5.0", 2725 | "normalize-package-data": "^2.4.0", 2726 | "npm-package-arg": "^6.1.0", 2727 | "npm-registry-fetch": "^4.0.0", 2728 | "semver": "^5.5.1", 2729 | "ssri": "^6.0.1" 2730 | } 2731 | }, 2732 | "libnpmsearch": { 2733 | "version": "2.0.2", 2734 | "bundled": true, 2735 | "requires": { 2736 | "figgy-pudding": "^3.5.1", 2737 | "get-stream": "^4.0.0", 2738 | "npm-registry-fetch": "^4.0.0" 2739 | } 2740 | }, 2741 | "libnpmteam": { 2742 | "version": "1.0.2", 2743 | "bundled": true, 2744 | "requires": { 2745 | "aproba": "^2.0.0", 2746 | "figgy-pudding": "^3.4.1", 2747 | "get-stream": "^4.0.0", 2748 | "npm-registry-fetch": "^4.0.0" 2749 | } 2750 | }, 2751 | "libnpx": { 2752 | "version": "10.2.0", 2753 | "bundled": true, 2754 | "requires": { 2755 | "dotenv": "^5.0.1", 2756 | "npm-package-arg": "^6.0.0", 2757 | "rimraf": "^2.6.2", 2758 | "safe-buffer": "^5.1.0", 2759 | "update-notifier": "^2.3.0", 2760 | "which": "^1.3.0", 2761 | "y18n": "^4.0.0", 2762 | "yargs": "^11.0.0" 2763 | } 2764 | }, 2765 | "locate-path": { 2766 | "version": "2.0.0", 2767 | "bundled": true, 2768 | "requires": { 2769 | "p-locate": "^2.0.0", 2770 | "path-exists": "^3.0.0" 2771 | } 2772 | }, 2773 | "lock-verify": { 2774 | "version": "2.1.0", 2775 | "bundled": true, 2776 | "requires": { 2777 | "npm-package-arg": "^6.1.0", 2778 | "semver": "^5.4.1" 2779 | } 2780 | }, 2781 | "lockfile": { 2782 | "version": "1.0.4", 2783 | "bundled": true, 2784 | "requires": { 2785 | "signal-exit": "^3.0.2" 2786 | } 2787 | }, 2788 | "lodash._baseindexof": { 2789 | "version": "3.1.0", 2790 | "bundled": true 2791 | }, 2792 | "lodash._baseuniq": { 2793 | "version": "4.6.0", 2794 | "bundled": true, 2795 | "requires": { 2796 | "lodash._createset": "~4.0.0", 2797 | "lodash._root": "~3.0.0" 2798 | } 2799 | }, 2800 | "lodash._bindcallback": { 2801 | "version": "3.0.1", 2802 | "bundled": true 2803 | }, 2804 | "lodash._cacheindexof": { 2805 | "version": "3.0.2", 2806 | "bundled": true 2807 | }, 2808 | "lodash._createcache": { 2809 | "version": "3.1.2", 2810 | "bundled": true, 2811 | "requires": { 2812 | "lodash._getnative": "^3.0.0" 2813 | } 2814 | }, 2815 | "lodash._createset": { 2816 | "version": "4.0.3", 2817 | "bundled": true 2818 | }, 2819 | "lodash._getnative": { 2820 | "version": "3.9.1", 2821 | "bundled": true 2822 | }, 2823 | "lodash._root": { 2824 | "version": "3.0.1", 2825 | "bundled": true 2826 | }, 2827 | "lodash.clonedeep": { 2828 | "version": "4.5.0", 2829 | "bundled": true 2830 | }, 2831 | "lodash.restparam": { 2832 | "version": "3.6.1", 2833 | "bundled": true 2834 | }, 2835 | "lodash.union": { 2836 | "version": "4.6.0", 2837 | "bundled": true 2838 | }, 2839 | "lodash.uniq": { 2840 | "version": "4.5.0", 2841 | "bundled": true 2842 | }, 2843 | "lodash.without": { 2844 | "version": "4.4.0", 2845 | "bundled": true 2846 | }, 2847 | "lowercase-keys": { 2848 | "version": "1.0.1", 2849 | "bundled": true 2850 | }, 2851 | "lru-cache": { 2852 | "version": "5.1.1", 2853 | "bundled": true, 2854 | "requires": { 2855 | "yallist": "^3.0.2" 2856 | } 2857 | }, 2858 | "make-dir": { 2859 | "version": "1.3.0", 2860 | "bundled": true, 2861 | "requires": { 2862 | "pify": "^3.0.0" 2863 | } 2864 | }, 2865 | "make-fetch-happen": { 2866 | "version": "5.0.2", 2867 | "bundled": true, 2868 | "requires": { 2869 | "agentkeepalive": "^3.4.1", 2870 | "cacache": "^12.0.0", 2871 | "http-cache-semantics": "^3.8.1", 2872 | "http-proxy-agent": "^2.1.0", 2873 | "https-proxy-agent": "^2.2.3", 2874 | "lru-cache": "^5.1.1", 2875 | "mississippi": "^3.0.0", 2876 | "node-fetch-npm": "^2.0.2", 2877 | "promise-retry": "^1.1.1", 2878 | "socks-proxy-agent": "^4.0.0", 2879 | "ssri": "^6.0.0" 2880 | } 2881 | }, 2882 | "meant": { 2883 | "version": "1.0.1", 2884 | "bundled": true 2885 | }, 2886 | "mem": { 2887 | "version": "1.1.0", 2888 | "bundled": true, 2889 | "requires": { 2890 | "mimic-fn": "^1.0.0" 2891 | } 2892 | }, 2893 | "mime-db": { 2894 | "version": "1.35.0", 2895 | "bundled": true 2896 | }, 2897 | "mime-types": { 2898 | "version": "2.1.19", 2899 | "bundled": true, 2900 | "requires": { 2901 | "mime-db": "~1.35.0" 2902 | } 2903 | }, 2904 | "mimic-fn": { 2905 | "version": "1.2.0", 2906 | "bundled": true 2907 | }, 2908 | "minimatch": { 2909 | "version": "3.0.4", 2910 | "bundled": true, 2911 | "requires": { 2912 | "brace-expansion": "^1.1.7" 2913 | } 2914 | }, 2915 | "minimist": { 2916 | "version": "0.0.8", 2917 | "bundled": true 2918 | }, 2919 | "minizlib": { 2920 | "version": "1.3.3", 2921 | "bundled": true, 2922 | "requires": { 2923 | "minipass": "^2.9.0" 2924 | }, 2925 | "dependencies": { 2926 | "minipass": { 2927 | "version": "2.9.0", 2928 | "bundled": true, 2929 | "requires": { 2930 | "safe-buffer": "^5.1.2", 2931 | "yallist": "^3.0.0" 2932 | } 2933 | } 2934 | } 2935 | }, 2936 | "mississippi": { 2937 | "version": "3.0.0", 2938 | "bundled": true, 2939 | "requires": { 2940 | "concat-stream": "^1.5.0", 2941 | "duplexify": "^3.4.2", 2942 | "end-of-stream": "^1.1.0", 2943 | "flush-write-stream": "^1.0.0", 2944 | "from2": "^2.1.0", 2945 | "parallel-transform": "^1.1.0", 2946 | "pump": "^3.0.0", 2947 | "pumpify": "^1.3.3", 2948 | "stream-each": "^1.1.0", 2949 | "through2": "^2.0.0" 2950 | } 2951 | }, 2952 | "mkdirp": { 2953 | "version": "0.5.1", 2954 | "bundled": true, 2955 | "requires": { 2956 | "minimist": "0.0.8" 2957 | } 2958 | }, 2959 | "move-concurrently": { 2960 | "version": "1.0.1", 2961 | "bundled": true, 2962 | "requires": { 2963 | "aproba": "^1.1.1", 2964 | "copy-concurrently": "^1.0.0", 2965 | "fs-write-stream-atomic": "^1.0.8", 2966 | "mkdirp": "^0.5.1", 2967 | "rimraf": "^2.5.4", 2968 | "run-queue": "^1.0.3" 2969 | }, 2970 | "dependencies": { 2971 | "aproba": { 2972 | "version": "1.2.0", 2973 | "bundled": true 2974 | } 2975 | } 2976 | }, 2977 | "ms": { 2978 | "version": "2.1.1", 2979 | "bundled": true 2980 | }, 2981 | "mute-stream": { 2982 | "version": "0.0.7", 2983 | "bundled": true 2984 | }, 2985 | "node-fetch-npm": { 2986 | "version": "2.0.2", 2987 | "bundled": true, 2988 | "requires": { 2989 | "encoding": "^0.1.11", 2990 | "json-parse-better-errors": "^1.0.0", 2991 | "safe-buffer": "^5.1.1" 2992 | } 2993 | }, 2994 | "node-gyp": { 2995 | "version": "5.0.5", 2996 | "bundled": true, 2997 | "requires": { 2998 | "env-paths": "^1.0.0", 2999 | "glob": "^7.0.3", 3000 | "graceful-fs": "^4.1.2", 3001 | "mkdirp": "^0.5.0", 3002 | "nopt": "2 || 3", 3003 | "npmlog": "0 || 1 || 2 || 3 || 4", 3004 | "request": "^2.87.0", 3005 | "rimraf": "2", 3006 | "semver": "~5.3.0", 3007 | "tar": "^4.4.12", 3008 | "which": "1" 3009 | }, 3010 | "dependencies": { 3011 | "nopt": { 3012 | "version": "3.0.6", 3013 | "bundled": true, 3014 | "requires": { 3015 | "abbrev": "1" 3016 | } 3017 | }, 3018 | "semver": { 3019 | "version": "5.3.0", 3020 | "bundled": true 3021 | } 3022 | } 3023 | }, 3024 | "nopt": { 3025 | "version": "4.0.1", 3026 | "bundled": true, 3027 | "requires": { 3028 | "abbrev": "1", 3029 | "osenv": "^0.1.4" 3030 | } 3031 | }, 3032 | "normalize-package-data": { 3033 | "version": "2.5.0", 3034 | "bundled": true, 3035 | "requires": { 3036 | "hosted-git-info": "^2.1.4", 3037 | "resolve": "^1.10.0", 3038 | "semver": "2 || 3 || 4 || 5", 3039 | "validate-npm-package-license": "^3.0.1" 3040 | }, 3041 | "dependencies": { 3042 | "resolve": { 3043 | "version": "1.10.0", 3044 | "bundled": true, 3045 | "requires": { 3046 | "path-parse": "^1.0.6" 3047 | } 3048 | } 3049 | } 3050 | }, 3051 | "npm-audit-report": { 3052 | "version": "1.3.2", 3053 | "bundled": true, 3054 | "requires": { 3055 | "cli-table3": "^0.5.0", 3056 | "console-control-strings": "^1.1.0" 3057 | } 3058 | }, 3059 | "npm-bundled": { 3060 | "version": "1.0.6", 3061 | "bundled": true 3062 | }, 3063 | "npm-cache-filename": { 3064 | "version": "1.0.2", 3065 | "bundled": true 3066 | }, 3067 | "npm-install-checks": { 3068 | "version": "3.0.2", 3069 | "bundled": true, 3070 | "requires": { 3071 | "semver": "^2.3.0 || 3.x || 4 || 5" 3072 | } 3073 | }, 3074 | "npm-lifecycle": { 3075 | "version": "3.1.4", 3076 | "bundled": true, 3077 | "requires": { 3078 | "byline": "^5.0.0", 3079 | "graceful-fs": "^4.1.15", 3080 | "node-gyp": "^5.0.2", 3081 | "resolve-from": "^4.0.0", 3082 | "slide": "^1.1.6", 3083 | "uid-number": "0.0.6", 3084 | "umask": "^1.1.0", 3085 | "which": "^1.3.1" 3086 | } 3087 | }, 3088 | "npm-logical-tree": { 3089 | "version": "1.2.1", 3090 | "bundled": true 3091 | }, 3092 | "npm-package-arg": { 3093 | "version": "6.1.1", 3094 | "bundled": true, 3095 | "requires": { 3096 | "hosted-git-info": "^2.7.1", 3097 | "osenv": "^0.1.5", 3098 | "semver": "^5.6.0", 3099 | "validate-npm-package-name": "^3.0.0" 3100 | } 3101 | }, 3102 | "npm-packlist": { 3103 | "version": "1.4.6", 3104 | "bundled": true, 3105 | "requires": { 3106 | "ignore-walk": "^3.0.1", 3107 | "npm-bundled": "^1.0.1" 3108 | } 3109 | }, 3110 | "npm-pick-manifest": { 3111 | "version": "3.0.2", 3112 | "bundled": true, 3113 | "requires": { 3114 | "figgy-pudding": "^3.5.1", 3115 | "npm-package-arg": "^6.0.0", 3116 | "semver": "^5.4.1" 3117 | } 3118 | }, 3119 | "npm-profile": { 3120 | "version": "4.0.2", 3121 | "bundled": true, 3122 | "requires": { 3123 | "aproba": "^1.1.2 || 2", 3124 | "figgy-pudding": "^3.4.1", 3125 | "npm-registry-fetch": "^4.0.0" 3126 | } 3127 | }, 3128 | "npm-registry-fetch": { 3129 | "version": "4.0.2", 3130 | "bundled": true, 3131 | "requires": { 3132 | "JSONStream": "^1.3.4", 3133 | "bluebird": "^3.5.1", 3134 | "figgy-pudding": "^3.4.1", 3135 | "lru-cache": "^5.1.1", 3136 | "make-fetch-happen": "^5.0.0", 3137 | "npm-package-arg": "^6.1.0", 3138 | "safe-buffer": "^5.2.0" 3139 | }, 3140 | "dependencies": { 3141 | "safe-buffer": { 3142 | "version": "5.2.0", 3143 | "bundled": true 3144 | } 3145 | } 3146 | }, 3147 | "npm-run-path": { 3148 | "version": "2.0.2", 3149 | "bundled": true, 3150 | "requires": { 3151 | "path-key": "^2.0.0" 3152 | } 3153 | }, 3154 | "npm-user-validate": { 3155 | "version": "1.0.0", 3156 | "bundled": true 3157 | }, 3158 | "npmlog": { 3159 | "version": "4.1.2", 3160 | "bundled": true, 3161 | "requires": { 3162 | "are-we-there-yet": "~1.1.2", 3163 | "console-control-strings": "~1.1.0", 3164 | "gauge": "~2.7.3", 3165 | "set-blocking": "~2.0.0" 3166 | } 3167 | }, 3168 | "number-is-nan": { 3169 | "version": "1.0.1", 3170 | "bundled": true 3171 | }, 3172 | "oauth-sign": { 3173 | "version": "0.9.0", 3174 | "bundled": true 3175 | }, 3176 | "object-assign": { 3177 | "version": "4.1.1", 3178 | "bundled": true 3179 | }, 3180 | "object-keys": { 3181 | "version": "1.0.12", 3182 | "bundled": true 3183 | }, 3184 | "object.getownpropertydescriptors": { 3185 | "version": "2.0.3", 3186 | "bundled": true, 3187 | "requires": { 3188 | "define-properties": "^1.1.2", 3189 | "es-abstract": "^1.5.1" 3190 | } 3191 | }, 3192 | "once": { 3193 | "version": "1.4.0", 3194 | "bundled": true, 3195 | "requires": { 3196 | "wrappy": "1" 3197 | } 3198 | }, 3199 | "opener": { 3200 | "version": "1.5.1", 3201 | "bundled": true 3202 | }, 3203 | "os-homedir": { 3204 | "version": "1.0.2", 3205 | "bundled": true 3206 | }, 3207 | "os-locale": { 3208 | "version": "2.1.0", 3209 | "bundled": true, 3210 | "requires": { 3211 | "execa": "^0.7.0", 3212 | "lcid": "^1.0.0", 3213 | "mem": "^1.1.0" 3214 | } 3215 | }, 3216 | "os-tmpdir": { 3217 | "version": "1.0.2", 3218 | "bundled": true 3219 | }, 3220 | "osenv": { 3221 | "version": "0.1.5", 3222 | "bundled": true, 3223 | "requires": { 3224 | "os-homedir": "^1.0.0", 3225 | "os-tmpdir": "^1.0.0" 3226 | } 3227 | }, 3228 | "p-finally": { 3229 | "version": "1.0.0", 3230 | "bundled": true 3231 | }, 3232 | "p-limit": { 3233 | "version": "1.2.0", 3234 | "bundled": true, 3235 | "requires": { 3236 | "p-try": "^1.0.0" 3237 | } 3238 | }, 3239 | "p-locate": { 3240 | "version": "2.0.0", 3241 | "bundled": true, 3242 | "requires": { 3243 | "p-limit": "^1.1.0" 3244 | } 3245 | }, 3246 | "p-try": { 3247 | "version": "1.0.0", 3248 | "bundled": true 3249 | }, 3250 | "package-json": { 3251 | "version": "4.0.1", 3252 | "bundled": true, 3253 | "requires": { 3254 | "got": "^6.7.1", 3255 | "registry-auth-token": "^3.0.1", 3256 | "registry-url": "^3.0.3", 3257 | "semver": "^5.1.0" 3258 | } 3259 | }, 3260 | "pacote": { 3261 | "version": "9.5.9", 3262 | "bundled": true, 3263 | "requires": { 3264 | "bluebird": "^3.5.3", 3265 | "cacache": "^12.0.2", 3266 | "chownr": "^1.1.2", 3267 | "figgy-pudding": "^3.5.1", 3268 | "get-stream": "^4.1.0", 3269 | "glob": "^7.1.3", 3270 | "infer-owner": "^1.0.4", 3271 | "lru-cache": "^5.1.1", 3272 | "make-fetch-happen": "^5.0.0", 3273 | "minimatch": "^3.0.4", 3274 | "minipass": "^2.3.5", 3275 | "mississippi": "^3.0.0", 3276 | "mkdirp": "^0.5.1", 3277 | "normalize-package-data": "^2.4.0", 3278 | "npm-package-arg": "^6.1.0", 3279 | "npm-packlist": "^1.1.12", 3280 | "npm-pick-manifest": "^3.0.0", 3281 | "npm-registry-fetch": "^4.0.0", 3282 | "osenv": "^0.1.5", 3283 | "promise-inflight": "^1.0.1", 3284 | "promise-retry": "^1.1.1", 3285 | "protoduck": "^5.0.1", 3286 | "rimraf": "^2.6.2", 3287 | "safe-buffer": "^5.1.2", 3288 | "semver": "^5.6.0", 3289 | "ssri": "^6.0.1", 3290 | "tar": "^4.4.10", 3291 | "unique-filename": "^1.1.1", 3292 | "which": "^1.3.1" 3293 | }, 3294 | "dependencies": { 3295 | "minipass": { 3296 | "version": "2.9.0", 3297 | "bundled": true, 3298 | "requires": { 3299 | "safe-buffer": "^5.1.2", 3300 | "yallist": "^3.0.0" 3301 | } 3302 | } 3303 | } 3304 | }, 3305 | "parallel-transform": { 3306 | "version": "1.1.0", 3307 | "bundled": true, 3308 | "requires": { 3309 | "cyclist": "~0.2.2", 3310 | "inherits": "^2.0.3", 3311 | "readable-stream": "^2.1.5" 3312 | }, 3313 | "dependencies": { 3314 | "readable-stream": { 3315 | "version": "2.3.6", 3316 | "bundled": true, 3317 | "requires": { 3318 | "core-util-is": "~1.0.0", 3319 | "inherits": "~2.0.3", 3320 | "isarray": "~1.0.0", 3321 | "process-nextick-args": "~2.0.0", 3322 | "safe-buffer": "~5.1.1", 3323 | "string_decoder": "~1.1.1", 3324 | "util-deprecate": "~1.0.1" 3325 | } 3326 | }, 3327 | "string_decoder": { 3328 | "version": "1.1.1", 3329 | "bundled": true, 3330 | "requires": { 3331 | "safe-buffer": "~5.1.0" 3332 | } 3333 | } 3334 | } 3335 | }, 3336 | "path-exists": { 3337 | "version": "3.0.0", 3338 | "bundled": true 3339 | }, 3340 | "path-is-absolute": { 3341 | "version": "1.0.1", 3342 | "bundled": true 3343 | }, 3344 | "path-is-inside": { 3345 | "version": "1.0.2", 3346 | "bundled": true 3347 | }, 3348 | "path-key": { 3349 | "version": "2.0.1", 3350 | "bundled": true 3351 | }, 3352 | "path-parse": { 3353 | "version": "1.0.6", 3354 | "bundled": true 3355 | }, 3356 | "performance-now": { 3357 | "version": "2.1.0", 3358 | "bundled": true 3359 | }, 3360 | "pify": { 3361 | "version": "3.0.0", 3362 | "bundled": true 3363 | }, 3364 | "prepend-http": { 3365 | "version": "1.0.4", 3366 | "bundled": true 3367 | }, 3368 | "process-nextick-args": { 3369 | "version": "2.0.0", 3370 | "bundled": true 3371 | }, 3372 | "promise-inflight": { 3373 | "version": "1.0.1", 3374 | "bundled": true 3375 | }, 3376 | "promise-retry": { 3377 | "version": "1.1.1", 3378 | "bundled": true, 3379 | "requires": { 3380 | "err-code": "^1.0.0", 3381 | "retry": "^0.10.0" 3382 | }, 3383 | "dependencies": { 3384 | "retry": { 3385 | "version": "0.10.1", 3386 | "bundled": true 3387 | } 3388 | } 3389 | }, 3390 | "promzard": { 3391 | "version": "0.3.0", 3392 | "bundled": true, 3393 | "requires": { 3394 | "read": "1" 3395 | } 3396 | }, 3397 | "proto-list": { 3398 | "version": "1.2.4", 3399 | "bundled": true 3400 | }, 3401 | "protoduck": { 3402 | "version": "5.0.1", 3403 | "bundled": true, 3404 | "requires": { 3405 | "genfun": "^5.0.0" 3406 | } 3407 | }, 3408 | "prr": { 3409 | "version": "1.0.1", 3410 | "bundled": true 3411 | }, 3412 | "pseudomap": { 3413 | "version": "1.0.2", 3414 | "bundled": true 3415 | }, 3416 | "psl": { 3417 | "version": "1.1.29", 3418 | "bundled": true 3419 | }, 3420 | "pump": { 3421 | "version": "3.0.0", 3422 | "bundled": true, 3423 | "requires": { 3424 | "end-of-stream": "^1.1.0", 3425 | "once": "^1.3.1" 3426 | } 3427 | }, 3428 | "pumpify": { 3429 | "version": "1.5.1", 3430 | "bundled": true, 3431 | "requires": { 3432 | "duplexify": "^3.6.0", 3433 | "inherits": "^2.0.3", 3434 | "pump": "^2.0.0" 3435 | }, 3436 | "dependencies": { 3437 | "pump": { 3438 | "version": "2.0.1", 3439 | "bundled": true, 3440 | "requires": { 3441 | "end-of-stream": "^1.1.0", 3442 | "once": "^1.3.1" 3443 | } 3444 | } 3445 | } 3446 | }, 3447 | "punycode": { 3448 | "version": "1.4.1", 3449 | "bundled": true 3450 | }, 3451 | "qrcode-terminal": { 3452 | "version": "0.12.0", 3453 | "bundled": true 3454 | }, 3455 | "qs": { 3456 | "version": "6.5.2", 3457 | "bundled": true 3458 | }, 3459 | "query-string": { 3460 | "version": "6.8.2", 3461 | "bundled": true, 3462 | "requires": { 3463 | "decode-uri-component": "^0.2.0", 3464 | "split-on-first": "^1.0.0", 3465 | "strict-uri-encode": "^2.0.0" 3466 | } 3467 | }, 3468 | "qw": { 3469 | "version": "1.0.1", 3470 | "bundled": true 3471 | }, 3472 | "rc": { 3473 | "version": "1.2.7", 3474 | "bundled": true, 3475 | "requires": { 3476 | "deep-extend": "^0.5.1", 3477 | "ini": "~1.3.0", 3478 | "minimist": "^1.2.0", 3479 | "strip-json-comments": "~2.0.1" 3480 | }, 3481 | "dependencies": { 3482 | "minimist": { 3483 | "version": "1.2.0", 3484 | "bundled": true 3485 | } 3486 | } 3487 | }, 3488 | "read": { 3489 | "version": "1.0.7", 3490 | "bundled": true, 3491 | "requires": { 3492 | "mute-stream": "~0.0.4" 3493 | } 3494 | }, 3495 | "read-cmd-shim": { 3496 | "version": "1.0.5", 3497 | "bundled": true, 3498 | "requires": { 3499 | "graceful-fs": "^4.1.2" 3500 | } 3501 | }, 3502 | "read-installed": { 3503 | "version": "4.0.3", 3504 | "bundled": true, 3505 | "requires": { 3506 | "debuglog": "^1.0.1", 3507 | "graceful-fs": "^4.1.2", 3508 | "read-package-json": "^2.0.0", 3509 | "readdir-scoped-modules": "^1.0.0", 3510 | "semver": "2 || 3 || 4 || 5", 3511 | "slide": "~1.1.3", 3512 | "util-extend": "^1.0.1" 3513 | } 3514 | }, 3515 | "read-package-json": { 3516 | "version": "2.1.0", 3517 | "bundled": true, 3518 | "requires": { 3519 | "glob": "^7.1.1", 3520 | "graceful-fs": "^4.1.2", 3521 | "json-parse-better-errors": "^1.0.1", 3522 | "normalize-package-data": "^2.0.0", 3523 | "slash": "^1.0.0" 3524 | } 3525 | }, 3526 | "read-package-tree": { 3527 | "version": "5.3.1", 3528 | "bundled": true, 3529 | "requires": { 3530 | "read-package-json": "^2.0.0", 3531 | "readdir-scoped-modules": "^1.0.0", 3532 | "util-promisify": "^2.1.0" 3533 | } 3534 | }, 3535 | "readable-stream": { 3536 | "version": "3.4.0", 3537 | "bundled": true, 3538 | "requires": { 3539 | "inherits": "^2.0.3", 3540 | "string_decoder": "^1.1.1", 3541 | "util-deprecate": "^1.0.1" 3542 | } 3543 | }, 3544 | "readdir-scoped-modules": { 3545 | "version": "1.1.0", 3546 | "bundled": true, 3547 | "requires": { 3548 | "debuglog": "^1.0.1", 3549 | "dezalgo": "^1.0.0", 3550 | "graceful-fs": "^4.1.2", 3551 | "once": "^1.3.0" 3552 | } 3553 | }, 3554 | "registry-auth-token": { 3555 | "version": "3.3.2", 3556 | "bundled": true, 3557 | "requires": { 3558 | "rc": "^1.1.6", 3559 | "safe-buffer": "^5.0.1" 3560 | } 3561 | }, 3562 | "registry-url": { 3563 | "version": "3.1.0", 3564 | "bundled": true, 3565 | "requires": { 3566 | "rc": "^1.0.1" 3567 | } 3568 | }, 3569 | "request": { 3570 | "version": "2.88.0", 3571 | "bundled": true, 3572 | "requires": { 3573 | "aws-sign2": "~0.7.0", 3574 | "aws4": "^1.8.0", 3575 | "caseless": "~0.12.0", 3576 | "combined-stream": "~1.0.6", 3577 | "extend": "~3.0.2", 3578 | "forever-agent": "~0.6.1", 3579 | "form-data": "~2.3.2", 3580 | "har-validator": "~5.1.0", 3581 | "http-signature": "~1.2.0", 3582 | "is-typedarray": "~1.0.0", 3583 | "isstream": "~0.1.2", 3584 | "json-stringify-safe": "~5.0.1", 3585 | "mime-types": "~2.1.19", 3586 | "oauth-sign": "~0.9.0", 3587 | "performance-now": "^2.1.0", 3588 | "qs": "~6.5.2", 3589 | "safe-buffer": "^5.1.2", 3590 | "tough-cookie": "~2.4.3", 3591 | "tunnel-agent": "^0.6.0", 3592 | "uuid": "^3.3.2" 3593 | } 3594 | }, 3595 | "require-directory": { 3596 | "version": "2.1.1", 3597 | "bundled": true 3598 | }, 3599 | "require-main-filename": { 3600 | "version": "1.0.1", 3601 | "bundled": true 3602 | }, 3603 | "resolve-from": { 3604 | "version": "4.0.0", 3605 | "bundled": true 3606 | }, 3607 | "retry": { 3608 | "version": "0.12.0", 3609 | "bundled": true 3610 | }, 3611 | "rimraf": { 3612 | "version": "2.6.3", 3613 | "bundled": true, 3614 | "requires": { 3615 | "glob": "^7.1.3" 3616 | } 3617 | }, 3618 | "run-queue": { 3619 | "version": "1.0.3", 3620 | "bundled": true, 3621 | "requires": { 3622 | "aproba": "^1.1.1" 3623 | }, 3624 | "dependencies": { 3625 | "aproba": { 3626 | "version": "1.2.0", 3627 | "bundled": true 3628 | } 3629 | } 3630 | }, 3631 | "safe-buffer": { 3632 | "version": "5.1.2", 3633 | "bundled": true 3634 | }, 3635 | "safer-buffer": { 3636 | "version": "2.1.2", 3637 | "bundled": true 3638 | }, 3639 | "semver": { 3640 | "version": "5.7.1", 3641 | "bundled": true 3642 | }, 3643 | "semver-diff": { 3644 | "version": "2.1.0", 3645 | "bundled": true, 3646 | "requires": { 3647 | "semver": "^5.0.3" 3648 | } 3649 | }, 3650 | "set-blocking": { 3651 | "version": "2.0.0", 3652 | "bundled": true 3653 | }, 3654 | "sha": { 3655 | "version": "3.0.0", 3656 | "bundled": true, 3657 | "requires": { 3658 | "graceful-fs": "^4.1.2" 3659 | } 3660 | }, 3661 | "shebang-command": { 3662 | "version": "1.2.0", 3663 | "bundled": true, 3664 | "requires": { 3665 | "shebang-regex": "^1.0.0" 3666 | } 3667 | }, 3668 | "shebang-regex": { 3669 | "version": "1.0.0", 3670 | "bundled": true 3671 | }, 3672 | "signal-exit": { 3673 | "version": "3.0.2", 3674 | "bundled": true 3675 | }, 3676 | "slash": { 3677 | "version": "1.0.0", 3678 | "bundled": true 3679 | }, 3680 | "slide": { 3681 | "version": "1.1.6", 3682 | "bundled": true 3683 | }, 3684 | "smart-buffer": { 3685 | "version": "4.1.0", 3686 | "bundled": true 3687 | }, 3688 | "socks": { 3689 | "version": "2.3.3", 3690 | "bundled": true, 3691 | "requires": { 3692 | "ip": "1.1.5", 3693 | "smart-buffer": "^4.1.0" 3694 | } 3695 | }, 3696 | "socks-proxy-agent": { 3697 | "version": "4.0.2", 3698 | "bundled": true, 3699 | "requires": { 3700 | "agent-base": "~4.2.1", 3701 | "socks": "~2.3.2" 3702 | }, 3703 | "dependencies": { 3704 | "agent-base": { 3705 | "version": "4.2.1", 3706 | "bundled": true, 3707 | "requires": { 3708 | "es6-promisify": "^5.0.0" 3709 | } 3710 | } 3711 | } 3712 | }, 3713 | "sorted-object": { 3714 | "version": "2.0.1", 3715 | "bundled": true 3716 | }, 3717 | "sorted-union-stream": { 3718 | "version": "2.1.3", 3719 | "bundled": true, 3720 | "requires": { 3721 | "from2": "^1.3.0", 3722 | "stream-iterate": "^1.1.0" 3723 | }, 3724 | "dependencies": { 3725 | "from2": { 3726 | "version": "1.3.0", 3727 | "bundled": true, 3728 | "requires": { 3729 | "inherits": "~2.0.1", 3730 | "readable-stream": "~1.1.10" 3731 | } 3732 | }, 3733 | "isarray": { 3734 | "version": "0.0.1", 3735 | "bundled": true 3736 | }, 3737 | "readable-stream": { 3738 | "version": "1.1.14", 3739 | "bundled": true, 3740 | "requires": { 3741 | "core-util-is": "~1.0.0", 3742 | "inherits": "~2.0.1", 3743 | "isarray": "0.0.1", 3744 | "string_decoder": "~0.10.x" 3745 | } 3746 | }, 3747 | "string_decoder": { 3748 | "version": "0.10.31", 3749 | "bundled": true 3750 | } 3751 | } 3752 | }, 3753 | "spdx-correct": { 3754 | "version": "3.0.0", 3755 | "bundled": true, 3756 | "requires": { 3757 | "spdx-expression-parse": "^3.0.0", 3758 | "spdx-license-ids": "^3.0.0" 3759 | } 3760 | }, 3761 | "spdx-exceptions": { 3762 | "version": "2.1.0", 3763 | "bundled": true 3764 | }, 3765 | "spdx-expression-parse": { 3766 | "version": "3.0.0", 3767 | "bundled": true, 3768 | "requires": { 3769 | "spdx-exceptions": "^2.1.0", 3770 | "spdx-license-ids": "^3.0.0" 3771 | } 3772 | }, 3773 | "spdx-license-ids": { 3774 | "version": "3.0.3", 3775 | "bundled": true 3776 | }, 3777 | "split-on-first": { 3778 | "version": "1.1.0", 3779 | "bundled": true 3780 | }, 3781 | "sshpk": { 3782 | "version": "1.14.2", 3783 | "bundled": true, 3784 | "requires": { 3785 | "asn1": "~0.2.3", 3786 | "assert-plus": "^1.0.0", 3787 | "bcrypt-pbkdf": "^1.0.0", 3788 | "dashdash": "^1.12.0", 3789 | "ecc-jsbn": "~0.1.1", 3790 | "getpass": "^0.1.1", 3791 | "jsbn": "~0.1.0", 3792 | "safer-buffer": "^2.0.2", 3793 | "tweetnacl": "~0.14.0" 3794 | } 3795 | }, 3796 | "ssri": { 3797 | "version": "6.0.1", 3798 | "bundled": true, 3799 | "requires": { 3800 | "figgy-pudding": "^3.5.1" 3801 | } 3802 | }, 3803 | "stream-each": { 3804 | "version": "1.2.2", 3805 | "bundled": true, 3806 | "requires": { 3807 | "end-of-stream": "^1.1.0", 3808 | "stream-shift": "^1.0.0" 3809 | } 3810 | }, 3811 | "stream-iterate": { 3812 | "version": "1.2.0", 3813 | "bundled": true, 3814 | "requires": { 3815 | "readable-stream": "^2.1.5", 3816 | "stream-shift": "^1.0.0" 3817 | }, 3818 | "dependencies": { 3819 | "readable-stream": { 3820 | "version": "2.3.6", 3821 | "bundled": true, 3822 | "requires": { 3823 | "core-util-is": "~1.0.0", 3824 | "inherits": "~2.0.3", 3825 | "isarray": "~1.0.0", 3826 | "process-nextick-args": "~2.0.0", 3827 | "safe-buffer": "~5.1.1", 3828 | "string_decoder": "~1.1.1", 3829 | "util-deprecate": "~1.0.1" 3830 | } 3831 | }, 3832 | "string_decoder": { 3833 | "version": "1.1.1", 3834 | "bundled": true, 3835 | "requires": { 3836 | "safe-buffer": "~5.1.0" 3837 | } 3838 | } 3839 | } 3840 | }, 3841 | "stream-shift": { 3842 | "version": "1.0.0", 3843 | "bundled": true 3844 | }, 3845 | "strict-uri-encode": { 3846 | "version": "2.0.0", 3847 | "bundled": true 3848 | }, 3849 | "string-width": { 3850 | "version": "2.1.1", 3851 | "bundled": true, 3852 | "requires": { 3853 | "is-fullwidth-code-point": "^2.0.0", 3854 | "strip-ansi": "^4.0.0" 3855 | }, 3856 | "dependencies": { 3857 | "ansi-regex": { 3858 | "version": "3.0.0", 3859 | "bundled": true 3860 | }, 3861 | "is-fullwidth-code-point": { 3862 | "version": "2.0.0", 3863 | "bundled": true 3864 | }, 3865 | "strip-ansi": { 3866 | "version": "4.0.0", 3867 | "bundled": true, 3868 | "requires": { 3869 | "ansi-regex": "^3.0.0" 3870 | } 3871 | } 3872 | } 3873 | }, 3874 | "string_decoder": { 3875 | "version": "1.2.0", 3876 | "bundled": true, 3877 | "requires": { 3878 | "safe-buffer": "~5.1.0" 3879 | } 3880 | }, 3881 | "stringify-package": { 3882 | "version": "1.0.1", 3883 | "bundled": true 3884 | }, 3885 | "strip-ansi": { 3886 | "version": "3.0.1", 3887 | "bundled": true, 3888 | "requires": { 3889 | "ansi-regex": "^2.0.0" 3890 | } 3891 | }, 3892 | "strip-eof": { 3893 | "version": "1.0.0", 3894 | "bundled": true 3895 | }, 3896 | "strip-json-comments": { 3897 | "version": "2.0.1", 3898 | "bundled": true 3899 | }, 3900 | "supports-color": { 3901 | "version": "5.4.0", 3902 | "bundled": true, 3903 | "requires": { 3904 | "has-flag": "^3.0.0" 3905 | } 3906 | }, 3907 | "tar": { 3908 | "version": "4.4.13", 3909 | "bundled": true, 3910 | "requires": { 3911 | "chownr": "^1.1.1", 3912 | "fs-minipass": "^1.2.5", 3913 | "minipass": "^2.8.6", 3914 | "minizlib": "^1.2.1", 3915 | "mkdirp": "^0.5.0", 3916 | "safe-buffer": "^5.1.2", 3917 | "yallist": "^3.0.3" 3918 | }, 3919 | "dependencies": { 3920 | "minipass": { 3921 | "version": "2.9.0", 3922 | "bundled": true, 3923 | "requires": { 3924 | "safe-buffer": "^5.1.2", 3925 | "yallist": "^3.0.0" 3926 | } 3927 | } 3928 | } 3929 | }, 3930 | "term-size": { 3931 | "version": "1.2.0", 3932 | "bundled": true, 3933 | "requires": { 3934 | "execa": "^0.7.0" 3935 | } 3936 | }, 3937 | "text-table": { 3938 | "version": "0.2.0", 3939 | "bundled": true 3940 | }, 3941 | "through": { 3942 | "version": "2.3.8", 3943 | "bundled": true 3944 | }, 3945 | "through2": { 3946 | "version": "2.0.3", 3947 | "bundled": true, 3948 | "requires": { 3949 | "readable-stream": "^2.1.5", 3950 | "xtend": "~4.0.1" 3951 | }, 3952 | "dependencies": { 3953 | "readable-stream": { 3954 | "version": "2.3.6", 3955 | "bundled": true, 3956 | "requires": { 3957 | "core-util-is": "~1.0.0", 3958 | "inherits": "~2.0.3", 3959 | "isarray": "~1.0.0", 3960 | "process-nextick-args": "~2.0.0", 3961 | "safe-buffer": "~5.1.1", 3962 | "string_decoder": "~1.1.1", 3963 | "util-deprecate": "~1.0.1" 3964 | } 3965 | }, 3966 | "string_decoder": { 3967 | "version": "1.1.1", 3968 | "bundled": true, 3969 | "requires": { 3970 | "safe-buffer": "~5.1.0" 3971 | } 3972 | } 3973 | } 3974 | }, 3975 | "timed-out": { 3976 | "version": "4.0.1", 3977 | "bundled": true 3978 | }, 3979 | "tiny-relative-date": { 3980 | "version": "1.3.0", 3981 | "bundled": true 3982 | }, 3983 | "tough-cookie": { 3984 | "version": "2.4.3", 3985 | "bundled": true, 3986 | "requires": { 3987 | "psl": "^1.1.24", 3988 | "punycode": "^1.4.1" 3989 | } 3990 | }, 3991 | "tunnel-agent": { 3992 | "version": "0.6.0", 3993 | "bundled": true, 3994 | "requires": { 3995 | "safe-buffer": "^5.0.1" 3996 | } 3997 | }, 3998 | "tweetnacl": { 3999 | "version": "0.14.5", 4000 | "bundled": true, 4001 | "optional": true 4002 | }, 4003 | "typedarray": { 4004 | "version": "0.0.6", 4005 | "bundled": true 4006 | }, 4007 | "uid-number": { 4008 | "version": "0.0.6", 4009 | "bundled": true 4010 | }, 4011 | "umask": { 4012 | "version": "1.1.0", 4013 | "bundled": true 4014 | }, 4015 | "unique-filename": { 4016 | "version": "1.1.1", 4017 | "bundled": true, 4018 | "requires": { 4019 | "unique-slug": "^2.0.0" 4020 | } 4021 | }, 4022 | "unique-slug": { 4023 | "version": "2.0.0", 4024 | "bundled": true, 4025 | "requires": { 4026 | "imurmurhash": "^0.1.4" 4027 | } 4028 | }, 4029 | "unique-string": { 4030 | "version": "1.0.0", 4031 | "bundled": true, 4032 | "requires": { 4033 | "crypto-random-string": "^1.0.0" 4034 | } 4035 | }, 4036 | "unpipe": { 4037 | "version": "1.0.0", 4038 | "bundled": true 4039 | }, 4040 | "unzip-response": { 4041 | "version": "2.0.1", 4042 | "bundled": true 4043 | }, 4044 | "update-notifier": { 4045 | "version": "2.5.0", 4046 | "bundled": true, 4047 | "requires": { 4048 | "boxen": "^1.2.1", 4049 | "chalk": "^2.0.1", 4050 | "configstore": "^3.0.0", 4051 | "import-lazy": "^2.1.0", 4052 | "is-ci": "^1.0.10", 4053 | "is-installed-globally": "^0.1.0", 4054 | "is-npm": "^1.0.0", 4055 | "latest-version": "^3.0.0", 4056 | "semver-diff": "^2.0.0", 4057 | "xdg-basedir": "^3.0.0" 4058 | } 4059 | }, 4060 | "url-parse-lax": { 4061 | "version": "1.0.0", 4062 | "bundled": true, 4063 | "requires": { 4064 | "prepend-http": "^1.0.1" 4065 | } 4066 | }, 4067 | "util-deprecate": { 4068 | "version": "1.0.2", 4069 | "bundled": true 4070 | }, 4071 | "util-extend": { 4072 | "version": "1.0.3", 4073 | "bundled": true 4074 | }, 4075 | "util-promisify": { 4076 | "version": "2.1.0", 4077 | "bundled": true, 4078 | "requires": { 4079 | "object.getownpropertydescriptors": "^2.0.3" 4080 | } 4081 | }, 4082 | "uuid": { 4083 | "version": "3.3.3", 4084 | "bundled": true 4085 | }, 4086 | "validate-npm-package-license": { 4087 | "version": "3.0.4", 4088 | "bundled": true, 4089 | "requires": { 4090 | "spdx-correct": "^3.0.0", 4091 | "spdx-expression-parse": "^3.0.0" 4092 | } 4093 | }, 4094 | "validate-npm-package-name": { 4095 | "version": "3.0.0", 4096 | "bundled": true, 4097 | "requires": { 4098 | "builtins": "^1.0.3" 4099 | } 4100 | }, 4101 | "verror": { 4102 | "version": "1.10.0", 4103 | "bundled": true, 4104 | "requires": { 4105 | "assert-plus": "^1.0.0", 4106 | "core-util-is": "1.0.2", 4107 | "extsprintf": "^1.2.0" 4108 | } 4109 | }, 4110 | "wcwidth": { 4111 | "version": "1.0.1", 4112 | "bundled": true, 4113 | "requires": { 4114 | "defaults": "^1.0.3" 4115 | } 4116 | }, 4117 | "which": { 4118 | "version": "1.3.1", 4119 | "bundled": true, 4120 | "requires": { 4121 | "isexe": "^2.0.0" 4122 | } 4123 | }, 4124 | "which-module": { 4125 | "version": "2.0.0", 4126 | "bundled": true 4127 | }, 4128 | "wide-align": { 4129 | "version": "1.1.2", 4130 | "bundled": true, 4131 | "requires": { 4132 | "string-width": "^1.0.2" 4133 | }, 4134 | "dependencies": { 4135 | "string-width": { 4136 | "version": "1.0.2", 4137 | "bundled": true, 4138 | "requires": { 4139 | "code-point-at": "^1.0.0", 4140 | "is-fullwidth-code-point": "^1.0.0", 4141 | "strip-ansi": "^3.0.0" 4142 | } 4143 | } 4144 | } 4145 | }, 4146 | "widest-line": { 4147 | "version": "2.0.0", 4148 | "bundled": true, 4149 | "requires": { 4150 | "string-width": "^2.1.1" 4151 | } 4152 | }, 4153 | "worker-farm": { 4154 | "version": "1.7.0", 4155 | "bundled": true, 4156 | "requires": { 4157 | "errno": "~0.1.7" 4158 | } 4159 | }, 4160 | "wrap-ansi": { 4161 | "version": "2.1.0", 4162 | "bundled": true, 4163 | "requires": { 4164 | "string-width": "^1.0.1", 4165 | "strip-ansi": "^3.0.1" 4166 | }, 4167 | "dependencies": { 4168 | "string-width": { 4169 | "version": "1.0.2", 4170 | "bundled": true, 4171 | "requires": { 4172 | "code-point-at": "^1.0.0", 4173 | "is-fullwidth-code-point": "^1.0.0", 4174 | "strip-ansi": "^3.0.0" 4175 | } 4176 | } 4177 | } 4178 | }, 4179 | "wrappy": { 4180 | "version": "1.0.2", 4181 | "bundled": true 4182 | }, 4183 | "write-file-atomic": { 4184 | "version": "2.4.3", 4185 | "bundled": true, 4186 | "requires": { 4187 | "graceful-fs": "^4.1.11", 4188 | "imurmurhash": "^0.1.4", 4189 | "signal-exit": "^3.0.2" 4190 | } 4191 | }, 4192 | "xdg-basedir": { 4193 | "version": "3.0.0", 4194 | "bundled": true 4195 | }, 4196 | "xtend": { 4197 | "version": "4.0.1", 4198 | "bundled": true 4199 | }, 4200 | "y18n": { 4201 | "version": "4.0.0", 4202 | "bundled": true 4203 | }, 4204 | "yallist": { 4205 | "version": "3.0.3", 4206 | "bundled": true 4207 | }, 4208 | "yargs": { 4209 | "version": "11.0.0", 4210 | "bundled": true, 4211 | "requires": { 4212 | "cliui": "^4.0.0", 4213 | "decamelize": "^1.1.1", 4214 | "find-up": "^2.1.0", 4215 | "get-caller-file": "^1.0.1", 4216 | "os-locale": "^2.0.0", 4217 | "require-directory": "^2.1.1", 4218 | "require-main-filename": "^1.0.1", 4219 | "set-blocking": "^2.0.0", 4220 | "string-width": "^2.0.0", 4221 | "which-module": "^2.0.0", 4222 | "y18n": "^3.2.1", 4223 | "yargs-parser": "^9.0.2" 4224 | }, 4225 | "dependencies": { 4226 | "y18n": { 4227 | "version": "3.2.1", 4228 | "bundled": true 4229 | } 4230 | } 4231 | }, 4232 | "yargs-parser": { 4233 | "version": "9.0.2", 4234 | "bundled": true, 4235 | "requires": { 4236 | "camelcase": "^4.1.0" 4237 | } 4238 | } 4239 | } 4240 | }, 4241 | "npm-run-path": { 4242 | "version": "2.0.2", 4243 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 4244 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 4245 | "requires": { 4246 | "path-key": "^2.0.0" 4247 | } 4248 | }, 4249 | "object-assign": { 4250 | "version": "4.1.1", 4251 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 4252 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 4253 | }, 4254 | "on-finished": { 4255 | "version": "2.3.0", 4256 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 4257 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 4258 | "requires": { 4259 | "ee-first": "1.1.1" 4260 | } 4261 | }, 4262 | "on-headers": { 4263 | "version": "1.0.2", 4264 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 4265 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 4266 | }, 4267 | "one-time": { 4268 | "version": "0.0.4", 4269 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", 4270 | "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" 4271 | }, 4272 | "p-finally": { 4273 | "version": "1.0.0", 4274 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 4275 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 4276 | }, 4277 | "package-json": { 4278 | "version": "4.0.1", 4279 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 4280 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 4281 | "requires": { 4282 | "got": "^6.7.1", 4283 | "registry-auth-token": "^3.0.1", 4284 | "registry-url": "^3.0.3", 4285 | "semver": "^5.1.0" 4286 | } 4287 | }, 4288 | "parseurl": { 4289 | "version": "1.3.3", 4290 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 4291 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 4292 | }, 4293 | "passport": { 4294 | "version": "0.4.0", 4295 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", 4296 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", 4297 | "requires": { 4298 | "passport-strategy": "1.x.x", 4299 | "pause": "0.0.1" 4300 | } 4301 | }, 4302 | "passport-jwt": { 4303 | "version": "4.0.0", 4304 | "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", 4305 | "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", 4306 | "requires": { 4307 | "jsonwebtoken": "^8.2.0", 4308 | "passport-strategy": "^1.0.0" 4309 | } 4310 | }, 4311 | "passport-strategy": { 4312 | "version": "1.0.0", 4313 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 4314 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" 4315 | }, 4316 | "path-is-inside": { 4317 | "version": "1.0.2", 4318 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 4319 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 4320 | }, 4321 | "path-key": { 4322 | "version": "2.0.1", 4323 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 4324 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 4325 | }, 4326 | "path-to-regexp": { 4327 | "version": "0.1.7", 4328 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 4329 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 4330 | }, 4331 | "pause": { 4332 | "version": "0.0.1", 4333 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 4334 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" 4335 | }, 4336 | "picomatch": { 4337 | "version": "2.1.1", 4338 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", 4339 | "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" 4340 | }, 4341 | "pify": { 4342 | "version": "3.0.0", 4343 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 4344 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 4345 | }, 4346 | "prepend-http": { 4347 | "version": "1.0.4", 4348 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 4349 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" 4350 | }, 4351 | "process-nextick-args": { 4352 | "version": "2.0.1", 4353 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 4354 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 4355 | }, 4356 | "prop-types": { 4357 | "version": "15.7.2", 4358 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 4359 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 4360 | "requires": { 4361 | "loose-envify": "^1.4.0", 4362 | "object-assign": "^4.1.1", 4363 | "react-is": "^16.8.1" 4364 | } 4365 | }, 4366 | "proxy-addr": { 4367 | "version": "2.0.5", 4368 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 4369 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 4370 | "requires": { 4371 | "forwarded": "~0.1.2", 4372 | "ipaddr.js": "1.9.0" 4373 | } 4374 | }, 4375 | "pseudomap": { 4376 | "version": "1.0.2", 4377 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 4378 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 4379 | }, 4380 | "pstree.remy": { 4381 | "version": "1.1.7", 4382 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", 4383 | "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" 4384 | }, 4385 | "q": { 4386 | "version": "1.5.1", 4387 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 4388 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 4389 | }, 4390 | "qs": { 4391 | "version": "6.7.0", 4392 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 4393 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 4394 | }, 4395 | "range-parser": { 4396 | "version": "1.2.1", 4397 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 4398 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 4399 | }, 4400 | "raw-body": { 4401 | "version": "2.4.0", 4402 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 4403 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 4404 | "requires": { 4405 | "bytes": "3.1.0", 4406 | "http-errors": "1.7.2", 4407 | "iconv-lite": "0.4.24", 4408 | "unpipe": "1.0.0" 4409 | } 4410 | }, 4411 | "rc": { 4412 | "version": "1.2.8", 4413 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 4414 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 4415 | "requires": { 4416 | "deep-extend": "^0.6.0", 4417 | "ini": "~1.3.0", 4418 | "minimist": "^1.2.0", 4419 | "strip-json-comments": "~2.0.1" 4420 | }, 4421 | "dependencies": { 4422 | "strip-json-comments": { 4423 | "version": "2.0.1", 4424 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 4425 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 4426 | } 4427 | } 4428 | }, 4429 | "react": { 4430 | "version": "16.12.0", 4431 | "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", 4432 | "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", 4433 | "requires": { 4434 | "loose-envify": "^1.1.0", 4435 | "object-assign": "^4.1.1", 4436 | "prop-types": "^15.6.2" 4437 | } 4438 | }, 4439 | "react-dom": { 4440 | "version": "16.12.0", 4441 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", 4442 | "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", 4443 | "requires": { 4444 | "loose-envify": "^1.1.0", 4445 | "object-assign": "^4.1.1", 4446 | "prop-types": "^15.6.2", 4447 | "scheduler": "^0.18.0" 4448 | } 4449 | }, 4450 | "react-is": { 4451 | "version": "16.12.0", 4452 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", 4453 | "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" 4454 | }, 4455 | "readable-stream": { 4456 | "version": "3.4.0", 4457 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 4458 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 4459 | "requires": { 4460 | "inherits": "^2.0.3", 4461 | "string_decoder": "^1.1.1", 4462 | "util-deprecate": "^1.0.1" 4463 | } 4464 | }, 4465 | "regexp-clone": { 4466 | "version": "1.0.0", 4467 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 4468 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 4469 | }, 4470 | "registry-auth-token": { 4471 | "version": "3.4.0", 4472 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", 4473 | "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", 4474 | "requires": { 4475 | "rc": "^1.1.6", 4476 | "safe-buffer": "^5.0.1" 4477 | } 4478 | }, 4479 | "registry-url": { 4480 | "version": "3.1.0", 4481 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 4482 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 4483 | "requires": { 4484 | "rc": "^1.0.1" 4485 | } 4486 | }, 4487 | "require_optional": { 4488 | "version": "1.0.1", 4489 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 4490 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 4491 | "requires": { 4492 | "resolve-from": "^2.0.0", 4493 | "semver": "^5.1.0" 4494 | } 4495 | }, 4496 | "resolve-from": { 4497 | "version": "2.0.0", 4498 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 4499 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 4500 | }, 4501 | "safe-buffer": { 4502 | "version": "5.1.2", 4503 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 4504 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 4505 | }, 4506 | "safer-buffer": { 4507 | "version": "2.1.2", 4508 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 4509 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 4510 | }, 4511 | "saslprep": { 4512 | "version": "1.0.3", 4513 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 4514 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 4515 | "optional": true, 4516 | "requires": { 4517 | "sparse-bitfield": "^3.0.3" 4518 | } 4519 | }, 4520 | "scheduler": { 4521 | "version": "0.18.0", 4522 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", 4523 | "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", 4524 | "requires": { 4525 | "loose-envify": "^1.1.0", 4526 | "object-assign": "^4.1.1" 4527 | } 4528 | }, 4529 | "semver": { 4530 | "version": "5.7.1", 4531 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 4532 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 4533 | }, 4534 | "semver-diff": { 4535 | "version": "2.1.0", 4536 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 4537 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 4538 | "requires": { 4539 | "semver": "^5.0.3" 4540 | } 4541 | }, 4542 | "send": { 4543 | "version": "0.17.1", 4544 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 4545 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 4546 | "requires": { 4547 | "debug": "2.6.9", 4548 | "depd": "~1.1.2", 4549 | "destroy": "~1.0.4", 4550 | "encodeurl": "~1.0.2", 4551 | "escape-html": "~1.0.3", 4552 | "etag": "~1.8.1", 4553 | "fresh": "0.5.2", 4554 | "http-errors": "~1.7.2", 4555 | "mime": "1.6.0", 4556 | "ms": "2.1.1", 4557 | "on-finished": "~2.3.0", 4558 | "range-parser": "~1.2.1", 4559 | "statuses": "~1.5.0" 4560 | }, 4561 | "dependencies": { 4562 | "ms": { 4563 | "version": "2.1.1", 4564 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 4565 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 4566 | } 4567 | } 4568 | }, 4569 | "serve-static": { 4570 | "version": "1.14.1", 4571 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 4572 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 4573 | "requires": { 4574 | "encodeurl": "~1.0.2", 4575 | "escape-html": "~1.0.3", 4576 | "parseurl": "~1.3.3", 4577 | "send": "0.17.1" 4578 | } 4579 | }, 4580 | "setprototypeof": { 4581 | "version": "1.1.1", 4582 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 4583 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 4584 | }, 4585 | "shebang-command": { 4586 | "version": "1.2.0", 4587 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 4588 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 4589 | "requires": { 4590 | "shebang-regex": "^1.0.0" 4591 | } 4592 | }, 4593 | "shebang-regex": { 4594 | "version": "1.0.0", 4595 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 4596 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 4597 | }, 4598 | "sift": { 4599 | "version": "7.0.1", 4600 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 4601 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 4602 | }, 4603 | "signal-exit": { 4604 | "version": "3.0.2", 4605 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 4606 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 4607 | }, 4608 | "simple-swizzle": { 4609 | "version": "0.2.2", 4610 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 4611 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 4612 | "requires": { 4613 | "is-arrayish": "^0.3.1" 4614 | } 4615 | }, 4616 | "sliced": { 4617 | "version": "1.0.1", 4618 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 4619 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 4620 | }, 4621 | "sparse-bitfield": { 4622 | "version": "3.0.3", 4623 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 4624 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 4625 | "optional": true, 4626 | "requires": { 4627 | "memory-pager": "^1.0.2" 4628 | } 4629 | }, 4630 | "stack-trace": { 4631 | "version": "0.0.10", 4632 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 4633 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 4634 | }, 4635 | "statuses": { 4636 | "version": "1.5.0", 4637 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 4638 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 4639 | }, 4640 | "string_decoder": { 4641 | "version": "1.3.0", 4642 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 4643 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 4644 | "requires": { 4645 | "safe-buffer": "~5.2.0" 4646 | }, 4647 | "dependencies": { 4648 | "safe-buffer": { 4649 | "version": "5.2.0", 4650 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 4651 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 4652 | } 4653 | } 4654 | }, 4655 | "strip-eof": { 4656 | "version": "1.0.0", 4657 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 4658 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 4659 | }, 4660 | "supports-color": { 4661 | "version": "5.5.0", 4662 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 4663 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 4664 | "requires": { 4665 | "has-flag": "^3.0.0" 4666 | } 4667 | }, 4668 | "term-size": { 4669 | "version": "1.2.0", 4670 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 4671 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 4672 | "requires": { 4673 | "execa": "^0.7.0" 4674 | }, 4675 | "dependencies": { 4676 | "cross-spawn": { 4677 | "version": "5.1.0", 4678 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 4679 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 4680 | "requires": { 4681 | "lru-cache": "^4.0.1", 4682 | "shebang-command": "^1.2.0", 4683 | "which": "^1.2.9" 4684 | } 4685 | }, 4686 | "execa": { 4687 | "version": "0.7.0", 4688 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 4689 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 4690 | "requires": { 4691 | "cross-spawn": "^5.0.1", 4692 | "get-stream": "^3.0.0", 4693 | "is-stream": "^1.1.0", 4694 | "npm-run-path": "^2.0.0", 4695 | "p-finally": "^1.0.0", 4696 | "signal-exit": "^3.0.0", 4697 | "strip-eof": "^1.0.0" 4698 | } 4699 | }, 4700 | "get-stream": { 4701 | "version": "3.0.0", 4702 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 4703 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 4704 | }, 4705 | "lru-cache": { 4706 | "version": "4.1.5", 4707 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 4708 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 4709 | "requires": { 4710 | "pseudomap": "^1.0.2", 4711 | "yallist": "^2.1.2" 4712 | } 4713 | }, 4714 | "yallist": { 4715 | "version": "2.1.2", 4716 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 4717 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 4718 | } 4719 | } 4720 | }, 4721 | "text-hex": { 4722 | "version": "1.0.0", 4723 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 4724 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 4725 | }, 4726 | "timed-out": { 4727 | "version": "4.0.1", 4728 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 4729 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 4730 | }, 4731 | "toidentifier": { 4732 | "version": "1.0.0", 4733 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 4734 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 4735 | }, 4736 | "touch": { 4737 | "version": "3.1.0", 4738 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 4739 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 4740 | "requires": { 4741 | "nopt": "~1.0.10" 4742 | } 4743 | }, 4744 | "triple-beam": { 4745 | "version": "1.3.0", 4746 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", 4747 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" 4748 | }, 4749 | "type-is": { 4750 | "version": "1.6.18", 4751 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 4752 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 4753 | "requires": { 4754 | "media-typer": "0.3.0", 4755 | "mime-types": "~2.1.24" 4756 | } 4757 | }, 4758 | "typescript": { 4759 | "version": "2.9.2", 4760 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", 4761 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" 4762 | }, 4763 | "undefsafe": { 4764 | "version": "2.0.2", 4765 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", 4766 | "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", 4767 | "requires": { 4768 | "debug": "^2.2.0" 4769 | } 4770 | }, 4771 | "unique-string": { 4772 | "version": "1.0.0", 4773 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 4774 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 4775 | "requires": { 4776 | "crypto-random-string": "^1.0.0" 4777 | } 4778 | }, 4779 | "unpipe": { 4780 | "version": "1.0.0", 4781 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 4782 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 4783 | }, 4784 | "unzip-response": { 4785 | "version": "2.0.1", 4786 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 4787 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" 4788 | }, 4789 | "update-notifier": { 4790 | "version": "2.5.0", 4791 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", 4792 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", 4793 | "requires": { 4794 | "boxen": "^1.2.1", 4795 | "chalk": "^2.0.1", 4796 | "configstore": "^3.0.0", 4797 | "import-lazy": "^2.1.0", 4798 | "is-ci": "^1.0.10", 4799 | "is-installed-globally": "^0.1.0", 4800 | "is-npm": "^1.0.0", 4801 | "latest-version": "^3.0.0", 4802 | "semver-diff": "^2.0.0", 4803 | "xdg-basedir": "^3.0.0" 4804 | }, 4805 | "dependencies": { 4806 | "ci-info": { 4807 | "version": "1.6.0", 4808 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", 4809 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" 4810 | }, 4811 | "is-ci": { 4812 | "version": "1.2.1", 4813 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", 4814 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", 4815 | "requires": { 4816 | "ci-info": "^1.5.0" 4817 | } 4818 | } 4819 | } 4820 | }, 4821 | "url-parse-lax": { 4822 | "version": "1.0.0", 4823 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 4824 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 4825 | "requires": { 4826 | "prepend-http": "^1.0.1" 4827 | } 4828 | }, 4829 | "util-deprecate": { 4830 | "version": "1.0.2", 4831 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 4832 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 4833 | }, 4834 | "utils-merge": { 4835 | "version": "1.0.1", 4836 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 4837 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 4838 | }, 4839 | "validator": { 4840 | "version": "12.1.0", 4841 | "resolved": "https://registry.npmjs.org/validator/-/validator-12.1.0.tgz", 4842 | "integrity": "sha512-gIC2RBuFRi574Rb9vewGCJ7TCLxHXNx6EKthEgs+Iz0pYa9a9Te1VLG/bGLsAyGWrqR5FfR7tbFUI7FEF2LiGA==" 4843 | }, 4844 | "vary": { 4845 | "version": "1.1.2", 4846 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 4847 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 4848 | }, 4849 | "which": { 4850 | "version": "1.3.1", 4851 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 4852 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 4853 | "requires": { 4854 | "isexe": "^2.0.0" 4855 | } 4856 | }, 4857 | "widest-line": { 4858 | "version": "2.0.1", 4859 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", 4860 | "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", 4861 | "requires": { 4862 | "string-width": "^2.1.1" 4863 | }, 4864 | "dependencies": { 4865 | "ansi-regex": { 4866 | "version": "3.0.0", 4867 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 4868 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 4869 | }, 4870 | "is-fullwidth-code-point": { 4871 | "version": "2.0.0", 4872 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 4873 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 4874 | }, 4875 | "string-width": { 4876 | "version": "2.1.1", 4877 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 4878 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 4879 | "requires": { 4880 | "is-fullwidth-code-point": "^2.0.0", 4881 | "strip-ansi": "^4.0.0" 4882 | } 4883 | }, 4884 | "strip-ansi": { 4885 | "version": "4.0.0", 4886 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 4887 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 4888 | "requires": { 4889 | "ansi-regex": "^3.0.0" 4890 | } 4891 | } 4892 | } 4893 | }, 4894 | "winston": { 4895 | "version": "3.2.1", 4896 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", 4897 | "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", 4898 | "requires": { 4899 | "async": "^2.6.1", 4900 | "diagnostics": "^1.1.1", 4901 | "is-stream": "^1.1.0", 4902 | "logform": "^2.1.1", 4903 | "one-time": "0.0.4", 4904 | "readable-stream": "^3.1.1", 4905 | "stack-trace": "0.0.x", 4906 | "triple-beam": "^1.3.0", 4907 | "winston-transport": "^4.3.0" 4908 | } 4909 | }, 4910 | "winston-transport": { 4911 | "version": "4.3.0", 4912 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", 4913 | "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", 4914 | "requires": { 4915 | "readable-stream": "^2.3.6", 4916 | "triple-beam": "^1.2.0" 4917 | }, 4918 | "dependencies": { 4919 | "readable-stream": { 4920 | "version": "2.3.6", 4921 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 4922 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 4923 | "requires": { 4924 | "core-util-is": "~1.0.0", 4925 | "inherits": "~2.0.3", 4926 | "isarray": "~1.0.0", 4927 | "process-nextick-args": "~2.0.0", 4928 | "safe-buffer": "~5.1.1", 4929 | "string_decoder": "~1.1.1", 4930 | "util-deprecate": "~1.0.1" 4931 | } 4932 | }, 4933 | "string_decoder": { 4934 | "version": "1.1.1", 4935 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 4936 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 4937 | "requires": { 4938 | "safe-buffer": "~5.1.0" 4939 | } 4940 | } 4941 | } 4942 | }, 4943 | "write-file-atomic": { 4944 | "version": "2.4.1", 4945 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", 4946 | "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", 4947 | "requires": { 4948 | "graceful-fs": "^4.1.11", 4949 | "imurmurhash": "^0.1.4", 4950 | "signal-exit": "^3.0.2" 4951 | } 4952 | }, 4953 | "xdg-basedir": { 4954 | "version": "3.0.0", 4955 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 4956 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 4957 | } 4958 | } 4959 | } 4960 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "exceed-inside", 3 | "version": "1.0.0", 4 | "description": "exceed-inside", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js", 9 | "dev": "nodemon src/server.js" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "bcryptjs": "^2.4.3", 15 | "body-parser": "^1.19.0", 16 | "cloudinary": "^1.17.0", 17 | "cors": "^2.8.5", 18 | "dotenv": "^8.2.0", 19 | "express": "^4.17.1", 20 | "express-jwt": "^5.3.1", 21 | "is-empty": "^1.2.0", 22 | "jsonwebtoken": "^8.5.1", 23 | "mongodb": "^3.3.5", 24 | "mongoose": "^5.7.13", 25 | "morgan": "^1.9.1", 26 | "nodemon": "^2.0.1", 27 | "npm": "^6.13.2", 28 | "passport": "^0.4.0", 29 | "passport-jwt": "^4.0.0", 30 | "validator": "^12.1.0", 31 | "winston": "^3.2.1" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const app = express(); 3 | const bodyParser = require("body-parser"); 4 | const mongoose = require("mongoose"); 5 | const passport = require("passport"); 6 | const apiRoutes = require("./src/modules/routes/routes"); 7 | require("dotenv").config(); 8 | const httpLogger = require("./src/services/httpLogger"); 9 | 10 | const port = process.env.PORT || 8000; 11 | const cors = require("cors"); 12 | 13 | app.use( 14 | bodyParser.urlencoded({ 15 | extended: true 16 | }) 17 | ); 18 | app.use(bodyParser.json({ limit: "50MB" })); 19 | 20 | app.use(httpLogger); 21 | mongoose 22 | .connect(process.env.MONGODB_URL, { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false }) 23 | .then(() => { 24 | // if all is ok we will be here 25 | console.log("Database is connected successfully"); 26 | }) 27 | .catch(err => { 28 | // if error we will be here 29 | console.log("Error with connecting to database"); 30 | }); 31 | 32 | app.use(passport.initialize()); 33 | require("./src/services/passport")(passport); 34 | 35 | app.use(cors()); 36 | 37 | app.use("/api", apiRoutes); 38 | 39 | app.listen(port, () => { 40 | console.log("Running RestHub on port " + port); 41 | }); 42 | -------------------------------------------------------------------------------- /src/db/models/comment/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Mongoose model for creating comments 3 | */ 4 | const mongoose = require("mongoose"); 5 | const Schema = mongoose.Schema; 6 | 7 | const commentSchema = new Schema( 8 | { 9 | authorId: { type: String }, 10 | mentionedUser: [], 11 | answeredUser: [], 12 | postId: { type: String }, 13 | text: { type: String } 14 | }, 15 | { 16 | timestamps: true 17 | } 18 | ); 19 | 20 | // replacement _id on id and delete fields _id, _v 21 | commentSchema.set("toJSON", { 22 | transform: function(doc, ret, options) { 23 | ret.id = ret._id; 24 | delete ret._id; 25 | delete ret.__v; 26 | } 27 | }); 28 | 29 | module.exports = comment = mongoose.model("comment", commentSchema); 30 | -------------------------------------------------------------------------------- /src/db/models/event/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Mongoose model for creating events 3 | */ 4 | const mongoose = require("mongoose"); 5 | const Schema = mongoose.Schema; 6 | 7 | const eventSchema = new Schema( 8 | { 9 | authorId: { type: String }, 10 | title: { type: String }, 11 | time: { type: Date }, 12 | subscribedUsers: [] 13 | }, 14 | { 15 | timestamps: true 16 | } 17 | ); 18 | 19 | // replacement _id on id and delete fields _id, _v 20 | eventSchema.set("toJSON", { 21 | transform: function(doc, ret, options) { 22 | ret.id = ret._id; 23 | delete ret._id; 24 | delete ret.__v; 25 | } 26 | }); 27 | 28 | module.exports = event = mongoose.model("event", eventSchema); 29 | -------------------------------------------------------------------------------- /src/db/models/post/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Mongoose model for creating posts 3 | */ 4 | const mongoose = require("mongoose"); 5 | const Schema = mongoose.Schema; 6 | 7 | const postSchema = new Schema( 8 | { 9 | authorId: { type: String }, 10 | commentsCounter: { 11 | type: Number, 12 | default: 0 13 | }, 14 | images: [], 15 | text: { type: String }, 16 | title: { type: String } 17 | }, 18 | { 19 | timestamps: true 20 | } 21 | ); 22 | // replacement _id on id and delete fields _id, _v 23 | postSchema.set("toJSON", { 24 | transform: function(doc, ret, options) { 25 | ret.id = ret._id; 26 | delete ret._id; 27 | delete ret.__v; 28 | } 29 | }); 30 | 31 | module.exports = post = mongoose.model("post", postSchema); 32 | -------------------------------------------------------------------------------- /src/db/models/user/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Mongoose model for creating users 3 | */ 4 | const mongoose = require("mongoose"); 5 | const Schema = mongoose.Schema; 6 | const cloudinary = require("../../../services/cloudinary"); 7 | const avatarURL = cloudinary.url("avatars/default.png"); 8 | 9 | const userSchema = new Schema( 10 | { 11 | email: { 12 | type: String, 13 | required: true 14 | }, 15 | firstName: { 16 | type: String, 17 | default: "" 18 | }, 19 | lastName: { 20 | type: String, 21 | default: "" 22 | }, 23 | admin: { 24 | type: Boolean, 25 | default: false 26 | }, 27 | password: { 28 | type: String, 29 | required: true 30 | }, 31 | aboutInfo: { 32 | type: String, 33 | default: "" 34 | }, 35 | age: { 36 | type: Date, 37 | default: "", 38 | min: "1950-01-28", 39 | max: "2015-12-31" 40 | }, 41 | position: { 42 | type: String, 43 | default: "" 44 | }, 45 | team: { 46 | type: String, 47 | default: "" 48 | }, 49 | redCrossCounter: { 50 | type: Number, 51 | default: 0 52 | }, 53 | postCounter: { 54 | type: Number, 55 | default: 0 56 | }, 57 | commentCounter: { 58 | type: Number, 59 | default: 0 60 | }, 61 | avatar: { 62 | type: String, 63 | default: avatarURL 64 | }, 65 | isActive: { 66 | type: Boolean, 67 | default: true 68 | } 69 | }, 70 | { 71 | timestamps: true 72 | } 73 | ); 74 | 75 | // replacement _id on id and delete fields _id, _v 76 | userSchema.set("toJSON", { 77 | transform: function(doc, ret, options) { 78 | ret.id = ret._id; 79 | delete ret._id; 80 | delete ret.__v; 81 | } 82 | }); 83 | 84 | 85 | module.exports = user = mongoose.model("users", userSchema); 86 | -------------------------------------------------------------------------------- /src/modules/controllers/auth.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | General controller for user identification 3 | */ 4 | const passport = require("passport"); 5 | 6 | // Check does the user have a token 7 | module.exports.auth = (req, res, next) => { 8 | const auth = passport.authenticate("jwt", function(err, user, info) { 9 | if (err || !user) { 10 | return res.status(400).json({ Error: "Token error" }); 11 | } 12 | const isActive = user.isActive; 13 | if (!isActive) { 14 | return res.status(401).json({ Error: "User is not active" }); 15 | } 16 | req.user = { 17 | admin: user.admin, 18 | id: user.id || "" 19 | }; 20 | next(); 21 | }); 22 | auth(req, res, next); 23 | }; 24 | 25 | // Check: wathever the user is admin or owner for routes: put(/user/:id), delete(/user/:id) 26 | module.exports.isSameUser = (req, res, next) => { 27 | if (req.params.id === req.user.id || req.user.admin) { 28 | return next(); 29 | } else { 30 | res.status(403).json("Forbidden"); 31 | } 32 | }; 33 | 34 | /* 35 | Check: wathever the user is admin or owner for controllers: 36 | editComment, deleteComment, editEvent, deleteEvent, editPost, deletePost 37 | */ 38 | exports.isSameAuthor = async function isSameAuthor(model, req) { 39 | const item = await model.findById((req.params.id || req.params.commentId) , { authorId: "" }).then(); 40 | const { authorId } = item; 41 | if (authorId === req.user.id || req.user.admin) { 42 | return true; 43 | } else { 44 | return false; 45 | } 46 | }; 47 | -------------------------------------------------------------------------------- /src/modules/controllers/comment.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | General controller to describe all interactions with comments 3 | */ 4 | const users = require("../../db/models/user/index"); 5 | const posts = require("../../db/models/post/index"); 6 | const comments = require("../../db/models/comment/index"); 7 | const mongoose = require("mongoose"); 8 | const ObjectId = mongoose.Types.ObjectId; 9 | const logger = require("../../services/logger"); 10 | const { getAll } = require("../../services/helpers"); 11 | const { isSameAuthor } = require("../controllers/auth.controller"); 12 | 13 | /* 14 | Get all comments of post. 15 | route: get("/post/:postId/comments") 16 | */ 17 | module.exports.getAllComments = async (req, res) => { 18 | try { 19 | const pageOptions = { 20 | page: parseInt(req.query.page) || 0, 21 | limit: parseInt(req.query.perPage) || 10 22 | }; 23 | const find = { 24 | postId: req.params.postId 25 | }; 26 | const { model: allCommentsOfPost, error } = await getAll(comments, pageOptions, find); 27 | if (error) return res.status(400).json(error); 28 | return res.status(200).json(allCommentsOfPost); 29 | } catch (e) { 30 | res.status(500).json({ error: "Server error" }); 31 | logger.error("ErrGetAllCommentsOfPost ", e); 32 | } 33 | }; 34 | 35 | /* 36 | Create comment of post. 37 | route: post("/post/:postId/comment") 38 | */ 39 | module.exports.createComment = async (req, res, next) => { 40 | try { 41 | const generateId = ObjectId().toHexString(); 42 | const { postId } = req.params; 43 | const { text, mentionedUser } = req.body; 44 | 45 | // Is there such a post in the db 46 | const valid = await posts 47 | .findById(postId) 48 | .then(result => { 49 | if (result) return true; 50 | return false; 51 | }) 52 | .catch(e => { 53 | return false; 54 | }); 55 | 56 | if (!valid) { 57 | return res.status(404).json("Post is not found"); 58 | } 59 | 60 | // Create comment 61 | const comment = await comments 62 | .create({ 63 | _id: generateId, 64 | authorId: req.user.id, 65 | postId: postId, 66 | text: text, 67 | mentionedUser: mentionedUser 68 | }) 69 | .catch(e => { 70 | res.status(400).send({ error: "Save error" }); 71 | return false; 72 | }); 73 | // Increase the user’s publication counter and the post’s comment counter 74 | if (comment) { 75 | await users.findByIdAndUpdate(req.user.id, { $inc: { commentCounter: 1 } }).catch(e => { 76 | // res.status(400).json({ error: "Error increasing the number of user comment" }); 77 | logger.error("Error increasing the number of user comment"); 78 | }); 79 | await posts.findByIdAndUpdate(postId, { $inc: { commentsCounter: 1 } }).catch(e => { 80 | // res.status(400).json({ error: "Error increasing the number of comments of post" }) 81 | logger.error("Error increasing the number of comments of post"); 82 | }); 83 | } 84 | next(); 85 | } catch (e) { 86 | res.status(500).json({ error: "Server error" }); 87 | logger.error("ErrCreateComment ", e); 88 | } 89 | }; 90 | 91 | /* 92 | Post comment change. 93 | route put("/post/:postId/comment/:commentId") 94 | */ 95 | module.exports.editComment = async (req, res, next) => { 96 | try { 97 | // Is the author of the user or admin 98 | if (!(await isSameAuthor(comments, req))) { 99 | return res.status(403).json("Forbidden"); 100 | } 101 | const { commentId } = req.params; 102 | const updateData = { 103 | ...req.body 104 | }; 105 | // User couldn't change autor 106 | if (!req.user.admin) delete updateData.authorId; 107 | 108 | await comments.findByIdAndUpdate(commentId, { $set: { ...updateData } }).catch(e => res.status(400).json({ error: "edit error" })); 109 | next(); 110 | } catch (e) { 111 | res.status(500).json({ error: "Server error" }); 112 | logger.error("ErrUpdateComment ", e); 113 | } 114 | }; 115 | 116 | /* 117 | Delete comment 118 | route delete("/post/:postId/comment/:commentId") 119 | */ 120 | module.exports.deleteComment = async (req, res, next) => { 121 | try { 122 | // Is the author of the user or admin 123 | if (!(await isSameAuthor(comments, req))) { 124 | return res.status(403).json("Forbidden"); 125 | } 126 | const { postId, commentId } = req.params; 127 | // Delete a comment from the db 128 | const commentDelete = await comments.findByIdAndDelete(commentId).then().catch(e => { 129 | res.status(400).send({ success: false}); 130 | }); 131 | // Decrease in the user and post comments counter 132 | if (commentDelete) { 133 | await users.findByIdAndUpdate(commentDelete.authorId, { $inc: { commentCounter: -1 } }); 134 | await posts.findByIdAndUpdate(postId, { $inc: { commentsCounter: -1 } }); 135 | } else { 136 | res.status(400).send({ success: false }); 137 | } 138 | next(); 139 | } catch (e) { 140 | res.status(500).json({ error: "Server error" }); 141 | logger.error("ErrDeleteComment ", e); 142 | } 143 | }; 144 | -------------------------------------------------------------------------------- /src/modules/controllers/event.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | General controller to describe all interactions with events 3 | */ 4 | 5 | const events = require("../../db/models/event/index"); 6 | const { getAll } = require("../../services/helpers"); 7 | const logger = require("../../services/logger"); 8 | const { isSameAuthor } = require("../controllers/auth.controller"); 9 | 10 | /* 11 | Receiving data about a specific event 12 | route get("/event/:id") 13 | */ 14 | module.exports.getEvent = (req, res) => { 15 | try { 16 | const { id } = req.params; 17 | events 18 | .findById(id) 19 | .then(event => { 20 | if (!event) throw new Error(); 21 | res.status(200).json(event); 22 | }) 23 | .catch(e => res.status(404).json("Event is not found")); 24 | } catch (e) { 25 | res.status(500).json({ error: "Server error" }); 26 | logger.error("ErrGerEvent", e); 27 | } 28 | }; 29 | 30 | /* 31 | Getting data about all events 32 | route get("/events") 33 | */ 34 | module.exports.getAllEvents = async (req, res) => { 35 | try { 36 | const pageOptions = { 37 | page: parseInt(req.query.page) || 0, 38 | limit: parseInt(req.query.perPage) || 5 39 | }; 40 | const { model: allEvents, error } = await getAll(events, pageOptions); 41 | if (error) return res.status(400).json(error); 42 | return res.status(200).json(allEvents); 43 | } catch (e) { 44 | res.status(500).json({ server: "Server error" }); 45 | logger.error("ErrGetAllEvents", e); 46 | } 47 | }; 48 | 49 | /* 50 | Event creation 51 | route post("/event") 52 | */ 53 | module.exports.createEvent = async (req, res, next) => { 54 | try { 55 | const { title, time, subscribedUsers } = req.body; 56 | events 57 | .create({ 58 | authorId: req.user.id, 59 | title: title, 60 | time: time, 61 | subscribedUsers: subscribedUsers 62 | }) 63 | .catch(err => { 64 | res.status(400).json({ error: "Create error" }); 65 | }) 66 | .then(next()); 67 | } catch (e) { 68 | res.status(500).json({ server: "Server errorr" }); 69 | logger.error("ErrCreateEvent", e); 70 | } 71 | }; 72 | 73 | /* 74 | Edit event 75 | route put("/event/:id") 76 | */ 77 | module.exports.editEvent = async (req, res) => { 78 | try { 79 | // Is the author of the user or admin 80 | if (!(await isSameAuthor(events, req))) { 81 | return res.status(403).json("Forbidden"); 82 | } 83 | const { id } = req.params; 84 | const updateData = { 85 | ...req.body 86 | }; 87 | 88 | // User couldn't change autor 89 | if (!req.user.admin) delete updateData.authorId; 90 | 91 | await events 92 | .findByIdAndUpdate(id, { $set: { ...updateData } }) 93 | .then(result => res.status(200).json(result)) 94 | .catch(error => res.status(400).json({ error: "Edit error" })); 95 | } catch (e) { 96 | res.status(500).json({ server: "Server error" }); 97 | logger.error("ErrEditEvent", e); 98 | } 99 | }; 100 | 101 | /* 102 | Delete event 103 | route delete("/event/:id") 104 | */ 105 | module.exports.deleteEvent = async (req, res, next) => { 106 | try { 107 | // Is the author of the user or admin 108 | if (!(await isSameAuthor(events, req))) { 109 | return res.status(403).json("Forbidden"); 110 | } 111 | const { id } = req.params; 112 | events 113 | .findByIdAndDelete(id) 114 | .then(event => { 115 | if (!event) throw new Error(); 116 | next(); 117 | }) 118 | .catch(e => res.status(404).json("Event is not found")); 119 | } catch (e) { 120 | res.status(500).json({ server: "Server error" }); 121 | logger.error("ErrEditEvent", e); 122 | } 123 | }; 124 | 125 | /* 126 | Subscribe on event 127 | route put("/event/:id/subscribe") 128 | */ 129 | module.exports.subscribeEvent = (req, res) => { 130 | try { 131 | const { id } = req.params; 132 | events 133 | .findByIdAndUpdate(id, { $addToSet: { subscribedUsers: { id: req.body.id } } }, { new: true }) 134 | .then(result => res.status(200).json(result)) 135 | .catch(err => { 136 | res.status(400).json({ error: "Subscribe error" }); 137 | }); 138 | } catch (e) { 139 | res.status(500).json({ server: "Server error" }); 140 | logger.error("ErrSubscribe", e); 141 | } 142 | }; 143 | 144 | /* 145 | Subscribe from all evets 146 | route put("/events/subscribe") 147 | */ 148 | module.exports.subscribeAllEvents = (req, res, next) => { 149 | try { 150 | events.updateMany({}, { $addToSet: { subscribedUsers: { id: req.body.id } } }).catch(err => { 151 | res.status(400).json({ error: "Subscribe error" }); 152 | }); 153 | next(); 154 | } catch (e) { 155 | res.status(500).json({ server: "Server error" }); 156 | logger.error("ErrAllSubscribe", e); 157 | } 158 | }; 159 | 160 | /* 161 | Unsubscribe on event 162 | route put("/event/:id/unsubscribe") 163 | */ 164 | module.exports.unsubscribeEvent = (req, res) => { 165 | try { 166 | const { id } = req.params; 167 | events 168 | .findByIdAndUpdate(id, { $pull: { subscribedUsers: req.body.id } }, { new: true }) 169 | .then(result => res.status(200).json(result)) 170 | .catch(err => { 171 | res.status(400).json({ error: "Unsubscribe error" }); 172 | }); 173 | } catch (e) { 174 | res.status(500).json({ server: "Server error" }); 175 | logger.error("ErrUnsubscribeToEvent", e); 176 | } 177 | }; 178 | 179 | /* 180 | Unsubscribe from all events 181 | route route(/events/unsubscribe) 182 | */ 183 | module.exports.unsubscribeAllEvents = (req, res) => { 184 | try { 185 | events 186 | .updateMany({}, { $pull: { subscribedUsers: { $in: [req.body.id] } } }, { new: true }) 187 | .then(result => { 188 | res.status(200).json({ success: true }); 189 | }) 190 | .catch(err => { 191 | res.status(400).json({ success: false }); 192 | }); 193 | } catch (e) { 194 | res.status(500).json({ server: "Server error" }); 195 | logger.error("ErrAllSubscribe", e); 196 | } 197 | }; 198 | -------------------------------------------------------------------------------- /src/modules/controllers/login.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | Controller for login on the site 3 | */ 4 | 5 | const user = require("../../db/models/user"); 6 | const bcrypt = require("bcryptjs"); 7 | const jwt = require("jsonwebtoken"); 8 | const validationLogin = require("../../validators/loginValidation"); 9 | const logger = require("../../services/logger"); 10 | 11 | // Login module 12 | module.exports.loginUser = (req, res) => { 13 | try { 14 | // Input data validation 15 | const { errors, validation } = validationLogin(req.body); 16 | if (!validation) { 17 | return res.status(400).json(errors); 18 | } 19 | const { email } = req.body; 20 | const { password } = req.body; 21 | // Comparsion of e-mail with already registered e-mail 22 | user 23 | .findOne({ email }) 24 | .then(user => { 25 | if (!user) { 26 | return res.status(404).json({ email: "No such email" }); 27 | } 28 | // Password comparison 29 | bcrypt 30 | .compare(password, user.password) 31 | .then(success => { 32 | if (success) { 33 | // Create JWT token for user 34 | jwt.sign( 35 | (data = { 36 | id: user.id, 37 | admin: user.role === "admin" 38 | }), 39 | process.env.SECRETORKEY, 40 | { expiresIn: "7d" }, 41 | (err, token) => { 42 | res.json({ 43 | token: token 44 | }); 45 | } 46 | ); 47 | } else { 48 | return res.status(400).json({ password: "Wrong password" }); 49 | } 50 | }) 51 | .catch(e => { 52 | res.status(400).json({ error: "Password comparison error" }); 53 | }); 54 | }) 55 | .catch(e => { 56 | res.status(400).json({ error: "Email error" }); 57 | }); 58 | } catch (e) { 59 | res.status(500).json({ error: "Server error" }); 60 | logger.error("ErrGetUser", e); 61 | } 62 | }; 63 | -------------------------------------------------------------------------------- /src/modules/controllers/post.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | General controller to describe all interactions with comments 3 | */ 4 | const users = require("../../db/models/user/index"); 5 | const posts = require("../../db/models/post/index"); 6 | const cloudinary = require("../../services/cloudinary"); 7 | const mongoose = require("mongoose"); 8 | const { getAll } = require("../../services/helpers"); 9 | const { isSameAuthor } = require("../controllers/auth.controller"); 10 | const logger = require("../../services/logger"); 11 | const ObjectId = mongoose.Types.ObjectId; 12 | 13 | /* 14 | Getting data about a specific post 15 | route get("/post/:id") 16 | */ 17 | module.exports.getPost = (req, res) => { 18 | try { 19 | posts 20 | .findById(req.params.id) 21 | .then(post => { 22 | if (!post) throw new Error(); 23 | res.status(200).json(post); 24 | }) 25 | .catch(e => res.status(404).json({ error: "Post is not found" })); 26 | } catch (e) { 27 | res.status(500).json({ error: "Server error" }); 28 | logger.error("ErrGetPost", e); 29 | } 30 | }; 31 | 32 | /* 33 | Receiving data about all user posts 34 | route("/user/:id/posts") 35 | */ 36 | module.exports.GetAllpostsUser = async (req, res) => { 37 | try { 38 | const pageOptions = { 39 | page: parseInt(req.query.page) || 0, 40 | limit: parseInt(req.query.perPage) || 5 41 | }; 42 | const find = { 43 | authorId: req.params.id 44 | }; 45 | const { model: allUserPosts, error } = await getAll(posts, pageOptions, find); 46 | if (error) return res.status(400).json(error); 47 | return res.status(200).json(allUserPosts); 48 | } catch (e) { 49 | res.status(500).json({ error: "Server error" }); 50 | logger.error("ErrGetAllPostsUser", e); 51 | } 52 | }; 53 | 54 | /* 55 | Receiving data about all posts 56 | route get("/posts") 57 | */ 58 | module.exports.getAllPosts = async (req, res) => { 59 | try { 60 | const pageOptions = { 61 | page: parseInt(req.query.page) || 0, 62 | limit: parseInt(req.query.perPage) || 10 63 | }; 64 | const { model: allPosts, error } = await getAll(posts, pageOptions); 65 | if (error) return res.status(400).json(error); 66 | return res.status(200).json(allPosts); 67 | } catch (e) { 68 | res.status(500).json({ error: "Server error" }); 69 | logger.error("ErrGetAllPosts", e); 70 | } 71 | }; 72 | 73 | /* 74 | Create the new post 75 | route post("/post") 76 | */ 77 | module.exports.createPost = async (req, res) => { 78 | try { 79 | //Id for saving the images in cloudinary, the assigning to a new post this id 80 | const generateID = ObjectId().toHexString(); 81 | const { text, images, title } = req.body; 82 | 83 | // Saving the images in cloudinary and getting their id, url for writing to the db 84 | arrPromise = images.map(image => { 85 | return new Promise((resolve, reject) => { 86 | cloudinary.uploader.upload( 87 | image.src, 88 | { 89 | use_filename: true, 90 | public_id: `posts/${generateID}/${image.id}` 91 | }, 92 | async (err, result) => { 93 | if (err) { 94 | //If a user sent the wrong image the following functions delete other uploaded images from cloudinary 95 | await cloudinary.api.delete_resources_by_prefix(`posts/${generateID}`); 96 | await cloudinary.api.delete_folder(`posts/${generateID}`).catch(err => { 97 | logger.error("Error delete folder in createPost method", err); 98 | }); 99 | res.status(401).json({ error: "Uncorrect image" }); 100 | } else { 101 | resolve({ 102 | id: image.id, 103 | src: result.url 104 | }); 105 | } 106 | } 107 | ); 108 | }); 109 | }); 110 | const handleAllPromises = await Promise.all(arrPromise) 111 | .then() 112 | .catch(err => { 113 | res.status(400).json({ error: "Save image" }); 114 | }); 115 | 116 | // Creating a new post and saving in db 117 | const post = await posts 118 | .create({ 119 | _id: generateID, 120 | authorId: req.user.id, 121 | images: handleAllPromises, 122 | text: text, 123 | title: title 124 | }) 125 | .catch(e => res.status(400).send({ error: "Save error" })); 126 | 127 | // Increase the user publication counter 128 | if (post) { 129 | users 130 | .findByIdAndUpdate(req.user.id, { $inc: { postCounter: 1 } }) 131 | .then(res.status(200).send(post)) 132 | .catch(e => { 133 | res.status(400).json({ error: "Error increasing the number of user posts" }); 134 | }); 135 | } 136 | } catch (e) { 137 | res.status(500).json({ error: "Server error" }); 138 | logger.error("ErrCreatePost ", e); 139 | } 140 | }; 141 | 142 | /* 143 | Post editing 144 | route put("/post/:id") 145 | */ 146 | module.exports.editPost = async (req, res) => { 147 | try { 148 | // Is the author of the user or admin 149 | if (!(await isSameAuthor(posts, req))) { 150 | return res.status(403).json("Forbidden"); 151 | } 152 | const { id } = req.params; 153 | const { images } = req.body; 154 | const updateData = { 155 | ...req.body 156 | }; 157 | // If there are images 158 | if (images) { 159 | // Delete old post images 160 | await cloudinary.api.delete_resources_by_prefix(`posts/${req.params.id}`); 161 | // Adding new post images and uploading them to cloudinary 162 | arrPromise = images.map(image => { 163 | return new Promise((resolve, reject) => { 164 | cloudinary.uploader.upload( 165 | image.src, 166 | { 167 | use_filename: true, 168 | public_id: `posts/${id}/${image.id}` 169 | }, 170 | (err, result) => { 171 | if (err) reject(err); 172 | resolve({ 173 | id: image.id, 174 | src: result.url 175 | }); 176 | } 177 | ); 178 | }); 179 | }); 180 | updateData.images = await Promise.all(arrPromise) 181 | .then() 182 | .catch(err => { 183 | res.status(400).json({ error: "Save image" }); 184 | }); 185 | } 186 | // Updating post data in the db 187 | const editPost = await posts.findByIdAndUpdate(id, { $set: { ...updateData } }, { new: true }); 188 | res.status(200).json(editPost); 189 | } catch (e) { 190 | res.status(500).json({ error: "Server error" }); 191 | logger.error("ErrEditPost ", e); 192 | } 193 | }; 194 | 195 | /* 196 | Delete post 197 | route delete("/post/:id") 198 | */ 199 | module.exports.deletePost = async (req, res) => { 200 | const { id } = req.params; 201 | try { 202 | // Is the author of the user or admin 203 | if (!(await isSameAuthor(posts, req))) { 204 | return res.status(403).json("Forbidden"); 205 | } 206 | // Deleting post of cloudinary 207 | const post = await posts.findByIdAndDelete(id).then(); 208 | if (post) { 209 | // Deleting post images from cloudinary 210 | await cloudinary.api.delete_resources_by_prefix(`posts/${id}`).catch(err => { 211 | res.status(400).json({ error: "Delete image error" }); 212 | }); 213 | // Deleting post folder in cloudinary 214 | await cloudinary.api 215 | .delete_folder(`posts/${id}`) 216 | .then(res.status(200).send({ success: true })) 217 | .catch(err => { 218 | res.status(400).json({ error: "Delete image error" }); 219 | }); 220 | // Decrease user postCounter 221 | users.findByIdAndUpdate(post.authorId, { $inc: { postCounter: -1 } }).catch(err => { 222 | res.status(400).json({ error: "Decrease user counter of the posts" }); 223 | }); 224 | } else { 225 | res.status(400).send({ success: false }); 226 | } 227 | } catch (e) { 228 | res.status(500).json({ error: "Server error" }); 229 | logger.error("ErrDeletePost", e); 230 | } 231 | }; 232 | -------------------------------------------------------------------------------- /src/modules/controllers/user.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | General controller for describing all user interactions 3 | */ 4 | const users = require("../../db/models/user/index"); 5 | const events = require("../../db/models/event/index"); 6 | const bcrypt = require("bcryptjs"); 7 | const registrationValidation = require("../../validators/registrationValidation"); 8 | const editValidation = require("../../validators/editDataValidation"); 9 | const cloudinary = require("../../services/cloudinary"); 10 | const { getAll } = require("../../services/helpers"); 11 | const logger = require("../../services/logger"); 12 | 13 | /* 14 | Getting data about a specific user 15 | route get("/user/:id") 16 | */ 17 | module.exports.getUser = async (req, res) => { 18 | try { 19 | await users 20 | .findById(req.params.id) 21 | .then(user => { 22 | if (!user) throw new Error(); 23 | res.status(200).json(user); 24 | }) 25 | .catch(e => res.status(404).json("User is not found")); 26 | } catch (e) { 27 | res.status(500).json({ error: "Server error" }); 28 | logger.error("ErrGetUser", e); 29 | } 30 | }; 31 | 32 | /* 33 | Getting data about all users 34 | route get("/users") 35 | */ 36 | module.exports.getAllUser = async (req, res) => { 37 | try { 38 | const pageOptions = { 39 | page: parseInt(req.query.page) || 0, 40 | limit: parseInt(req.query.perPage) || 10 41 | }; 42 | const { model: allUsers, error } = await getAll(users, pageOptions); 43 | if (error) return res.status(400).json(error); 44 | return res.status(200).json(allUsers); 45 | } catch (e) { 46 | res.status(500).json({ error: "Server error" }); 47 | logger.error("ErrGetAllUsers", e); 48 | } 49 | }; 50 | 51 | /* 52 | Receiving data about all events of a specific user 53 | route get("/user/:id/events") 54 | */ 55 | module.exports.GetAllUserEvent = async (req, res) => { 56 | try { 57 | const pageOptions = { 58 | page: parseInt(req.query.page) || 0, 59 | limit: parseInt(req.query.perPage) || 10 60 | }; 61 | const find = { 62 | subscribedUsers: { $elemMatch: { id: req.body.id || req.params.id } } 63 | }; 64 | const { model: allUserEvents, error } = await getAll(events, pageOptions, find); 65 | if (error) return res.status(400).json(error); 66 | return res.status(200).json(allUserEvents); 67 | } catch (e) { 68 | res.status(500).json({ error: "Server error" }); 69 | logger.error("ErrGetAllUserEvents", e); 70 | } 71 | }; 72 | 73 | /* 74 | New user registration 75 | route post("/user") 76 | */ 77 | module.exports.createUser = (req, res) => { 78 | try { 79 | //input data validation 80 | const { errors, validation } = registrationValidation(req.body); 81 | if (!validation) { 82 | return res.status(400).json(errors); 83 | } 84 | // Verification of the correspondence of the mailing address with the already registered 85 | user.findOne({ email: req.body.email }).then(user => { 86 | if (user) { 87 | return res.status(400).json({ email: "Email already exists" }); 88 | } else { 89 | const newUser = new users({ 90 | email: req.body.email, 91 | role: req.body.role, 92 | password: req.body.password, 93 | createdAt: Date.now() 94 | }); 95 | // Password hashing 96 | bcrypt.hash(newUser.password, 10, (err, hash) => { 97 | if (err) throw err; 98 | newUser.password = hash; 99 | newUser.save().then(() => { 100 | res.status(200).send(newUser); 101 | }); 102 | }); 103 | } 104 | }); 105 | } catch (e) { 106 | res.status(500).json({ error: "Server error" }); 107 | logger.error("ErrAddNewUser", e); 108 | } 109 | }; 110 | 111 | /* 112 | Change user profile data 113 | route put("/user/:id") 114 | */ 115 | module.exports.editUser = async (req, res) => { 116 | try { 117 | const { email, password, avatar } = req.body; 118 | const { id } = req.params; 119 | const updateData = { 120 | ...req.body 121 | }; 122 | delete updateData.password; 123 | delete updateData.avatar; 124 | // User couldn't change own role 125 | if (!req.user.admin) delete updateData.admin; 126 | 127 | // Data validation 128 | const { errors, validation } = editValidation(req.body); 129 | if (!validation) { 130 | return res.status(400).json(errors); 131 | } 132 | // Verification of the correspondence of the mailing address with the already registered 133 | const user = await users.findOne({ email: email }); 134 | if (user && user.id !== id) { 135 | return res.status(400).json({ email: "Email already exists" }); 136 | } 137 | // Password hashing 138 | if (password) 139 | bcrypt.hash(password, 10, (err, hash) => { 140 | if (err) return null; 141 | updateData.password = hash; 142 | }); 143 | // Updating edit data 144 | users 145 | .findByIdAndUpdate(id, { $set: { ...updateData } }, { new: true }) 146 | .then(user => { 147 | if (!user) throw new Error("User is not found"); 148 | // Upload avatar 149 | if (avatar) 150 | cloudinary.uploader.upload( 151 | avatar, 152 | { 153 | folder: "/avatars/", 154 | use_filename: true, 155 | public_id: id 156 | }, 157 | (error, result) => { 158 | if (error) throw new Error("Avatar uploading error"); 159 | user.avatar = result.url; 160 | user.save(); 161 | } 162 | ); 163 | return user; 164 | }) 165 | .then(user => res.status(200).json(user)) 166 | .catch(e => res.status(404).json(e)); 167 | } catch (e) { 168 | res.status(500).send({ error: "Server error" }); 169 | logger.error("ErrEditUser", e); 170 | } 171 | }; 172 | 173 | /* 174 | Delete user profile 175 | route delete("/user/:id") 176 | */ 177 | module.exports.deleteUser = (req, res) => { 178 | try { 179 | users 180 | .findByIdAndDelete(req.params.id) 181 | .then(user => { 182 | if (!user) throw new Error(); 183 | res.status(200).json({ success: true }); 184 | }) 185 | .catch(e => res.status(404).json("User is not found")); 186 | } catch (e) { 187 | res.status(500).json({ error: "Server error" }); 188 | logger.error("ErrDeleteUser", e); 189 | } 190 | }; 191 | -------------------------------------------------------------------------------- /src/modules/routes/routes.js: -------------------------------------------------------------------------------- 1 | /* 2 | List of all app routes 3 | */ 4 | const express = require("express"); 5 | const router = express.Router(); 6 | 7 | // Path to controllers 8 | const { loginUser } = require("../controllers/login.controller"); 9 | const { isSameUser, auth } = require("../controllers/auth.controller"); 10 | const { getUser, getAllUser, createUser, editUser, deleteUser, GetAllUserEvent } = require("../controllers/user.controller"); 11 | const { getAllPosts, getPost, createPost, editPost, deletePost, GetAllpostsUser } = require("../controllers/post.controller"); 12 | const { getAllComments, createComment, editComment, deleteComment } = require("../controllers/comment.controller"); 13 | const { 14 | getAllEvents, 15 | getEvent, 16 | createEvent, 17 | editEvent, 18 | deleteEvent, 19 | subscribeEvent, 20 | subscribeAllEvents, 21 | unsubscribeAllEvents, 22 | unsubscribeEvent 23 | } = require("../controllers/event.controller"); 24 | 25 | // Login user 26 | router.post("/login", loginUser); 27 | 28 | //Getting information about all users 29 | router.get("/users", auth, getAllUser); 30 | 31 | // Getting information about a specific user, creating, editing, deleting 32 | router.get("/user/:id", auth, getUser); 33 | router.post("/user", createUser); 34 | router.put("/user/:id", auth, isSameUser, editUser); 35 | router.delete("/user/:id", auth, isSameUser, deleteUser); // add switch to unactive 36 | 37 | // Receiving user events 38 | router.get("/user/:id/events", auth, GetAllUserEvent); 39 | 40 | // Getting information about all user posts 41 | router.get("/user/:id/posts", auth, GetAllpostsUser); 42 | 43 | // Getting information about all posts 44 | router.get("/posts", auth, getAllPosts); 45 | 46 | // Getting information about a specific post, creating, editing, deleting 47 | router.get("/post/:id", auth, getPost); 48 | router.post("/post", auth, createPost); 49 | router.put("/post/:id", auth, editPost); 50 | router.delete("/post/:id", auth, deletePost); 51 | 52 | // Getting post comments 53 | router.get("/post/:postId/comments", auth, getAllComments); 54 | 55 | // Create, edit, delete comment 56 | router.post("/post/:postId/comment", auth, createComment, getAllComments); 57 | router.put("/post/:postId/comment/:commentId", auth, editComment, getAllComments); 58 | router.delete("/post/:postId/comment/:commentId", auth, deleteComment, getAllComments); 59 | 60 | // Receiving all events 61 | router.get("/events", auth, getAllEvents); 62 | 63 | // Subscribe to the event 64 | router.put("/event/:id/subscribe", auth, subscribeEvent); 65 | router.put("/events/subscribe", auth, subscribeAllEvents, GetAllUserEvent); 66 | 67 | // Unsubscribe from the event 68 | router.put("/event/:id/unsubscribe", auth, unsubscribeEvent); 69 | router.put("/events/unsubscribe", auth, unsubscribeAllEvents); 70 | 71 | // Getting information about a specific event, creating, editing, deleting 72 | router.get("/event/:id", auth, getEvent); 73 | router.post("/event", auth, createEvent, getAllEvents); 74 | router.put("/event/:id", auth, editEvent); 75 | router.delete("/event/:id", auth, deleteEvent, getAllEvents); 76 | 77 | module.exports = router; 78 | -------------------------------------------------------------------------------- /src/services/cloudinary.js: -------------------------------------------------------------------------------- 1 | /* 2 | Settings for connecting cloudinary 3 | */ 4 | 5 | const cloudinary = require('cloudinary').v2; 6 | require('dotenv').config() 7 | 8 | cloudinary.config({ 9 | cloud_name: process.env.CLOUD_NAME, 10 | api_key: process.env.API_KEY, 11 | api_secret: process.env.API_SECRET 12 | }); 13 | 14 | module.exports = cloudinary; -------------------------------------------------------------------------------- /src/services/helpers.js: -------------------------------------------------------------------------------- 1 | /* 2 | Module with help functions 3 | */ 4 | 5 | const empty = require("is-empty"); 6 | 7 | // If an object has fields with the undefined or null value this function fills the field empty string 8 | // Used for validator 9 | exports.fillEmptyFields = (object, fields) => { 10 | fields.forEach(element => { 11 | if (object.hasOwnProperty(element)) object[element] = !empty(object[element]) ? object[element] : ""; 12 | }); 13 | return object; 14 | }; 15 | 16 | // General function to get all elements from the DB 17 | // Return an object with model and error fields, where the model is an array of DB items 18 | exports.getAll = async function getAll(model, pagination = { page: 0, limit: 10 }, find = {}) { 19 | return await model 20 | .find(find) 21 | .sort({ createdAt: -1 }) 22 | .skip(pagination.page * pagination.limit) 23 | .limit(pagination.limit) 24 | .then(items => { 25 | if (!items) throw new Error(); 26 | return { model: items, error: null }; 27 | }) 28 | .catch(e => { 29 | return { model: [], error: { error: "User is not found" } }; 30 | }); 31 | }; 32 | -------------------------------------------------------------------------------- /src/services/httpLogger.js: -------------------------------------------------------------------------------- 1 | /* 2 | Initialization of logger with morgan 3 | */ 4 | 5 | const morgan = require('morgan'); 6 | const logger = require('./logger'); 7 | 8 | //Log scheme 9 | logger.stream = { 10 | write: message => logger.info(message.substring(0, message.lastIndexOf('\n'))) 11 | }; 12 | 13 | module.exports = morgan( 14 | ':method :url :status :response-time ms - :res[content-length]', 15 | { stream: logger.stream } 16 | ); -------------------------------------------------------------------------------- /src/services/logger.js: -------------------------------------------------------------------------------- 1 | /* 2 | Initialization of logger 3 | */ 4 | const { createLogger, transports, format } = require('winston'); 5 | 6 | // Writing logs to a file 7 | const logger = createLogger({ 8 | format: format.combine( 9 | format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), 10 | format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`) 11 | ), 12 | transports: [ 13 | new transports.File({ 14 | filename: './logs/all-logs.log', 15 | json: false, 16 | maxsize: 5242880, 17 | maxFiles: 5, 18 | }), 19 | new transports.Console(), 20 | ] 21 | }); 22 | 23 | module.exports = logger; -------------------------------------------------------------------------------- /src/services/passport.js: -------------------------------------------------------------------------------- 1 | /* 2 | A Passport strategy for authenticating with a JSON Web Token. 3 | */ 4 | const JwtStrategy = require("passport-jwt").Strategy; 5 | const ExtractJwt = require("passport-jwt").ExtractJwt; 6 | const mongoose = require("mongoose"); 7 | const users = mongoose.model("users"); 8 | const opts = {}; 9 | 10 | opts.jwtFromRequest = ExtractJwt.fromHeader("authorization"); 11 | opts.secretOrKey = process.env.SECRETORKEY; 12 | 13 | // Authenticate requests 14 | module.exports = passport => { 15 | passport.use( 16 | new JwtStrategy(opts, function(jwt_payload, done) { 17 | const id = jwt_payload.id 18 | users 19 | .findById(id) 20 | .then(user => { 21 | if (user) { 22 | done(null, user); 23 | } else { 24 | done(null, false); 25 | } 26 | }) 27 | .catch(err => { 28 | return done(err, false); 29 | }); 30 | }) 31 | ); 32 | }; 33 | -------------------------------------------------------------------------------- /src/validators/editDataValidation.js: -------------------------------------------------------------------------------- 1 | /* 2 | Validation of entered data when changing a profile 3 | */ 4 | const validator = require("validator"); 5 | const empty = require("is-empty"); 6 | const { fillEmptyFields } = require("../services/helpers"); 7 | 8 | module.exports = function editDataValidation(user) { 9 | const errors = {}; 10 | 11 | user = fillEmptyFields(user, ["email", "password"]); 12 | 13 | if (user.hasOwnProperty("email")) 14 | if (validator.isEmpty(user.email)) { 15 | errors.email = "empty email"; 16 | } else if (!validator.isEmail(user.email)) { 17 | errors.email = "uncorrect email"; 18 | } 19 | 20 | if (user.hasOwnProperty("password")) 21 | if (validator.isEmpty(user.password)) { 22 | errors.password = "empty password"; 23 | } else if (!validator.isLength(user.password, { min: 6, max: undefined })) { 24 | errors.password = "password too short"; 25 | } 26 | 27 | if (user.hasOwnProperty("redCrossCounter")) 28 | if (validator.isEmpty(user.redCrossCounter)) { 29 | errors.redCrossCounter = "the field cannot be empty"; 30 | } else if (!validator.isDecimal(user.redCrossCounter)) { 31 | errors.redCrossCounter = "value cannot be a string or negative number"; 32 | } else if (user.redCrossCounter < 0) { 33 | errors.redCrossCounter = "value cannot be a negative number"; 34 | } 35 | 36 | if (user.hasOwnProperty("commentCounter")) 37 | if (validator.isEmpty(user.redCrossCounter)) { 38 | errors.commentCounter = "the field cannot be empty"; 39 | } else if (!validator.isDecimal(user.commentCounter)) { 40 | errors.commentCounter = "value cannot be a string or negative number"; 41 | } else if (user.commentCounter < 0) { 42 | errors.commentCounter = "value cannot be a negative number"; 43 | } 44 | 45 | if (user.hasOwnProperty("age")) 46 | if (validator.isBefore(user.age, "01.01.1900")) { 47 | errors.age = "value cannot be"; 48 | } 49 | 50 | return { 51 | errors, 52 | validation: empty(errors) 53 | }; 54 | }; 55 | -------------------------------------------------------------------------------- /src/validators/loginValidation.js: -------------------------------------------------------------------------------- 1 | /* 2 | Validation of entered data when login 3 | */ 4 | const validator = require("validator"); 5 | const empty = require("is-empty"); 6 | 7 | module.exports = function validationLoginInput(user) { 8 | let errors = {}; 9 | 10 | if (validator.isEmpty(user.email)) { 11 | errors.email = 'empty email'; 12 | } else if (!validator.isEmail(user.email)) { 13 | errors.email = 'uncorrect email'; 14 | } 15 | 16 | if (validator.isEmpty(user.password)) { 17 | errors.password = 'empty passwords'; 18 | } 19 | 20 | return { 21 | errors, 22 | validation: empty(errors) 23 | } 24 | }; -------------------------------------------------------------------------------- /src/validators/registrationValidation.js: -------------------------------------------------------------------------------- 1 | /* 2 | Validation of entered data when registartion new user 3 | */ 4 | const validator = require("validator"); 5 | const empty = require("is-empty"); 6 | 7 | module.exports = function registrationValidation(user) { 8 | const errors = {} 9 | 10 | if (validator.isEmpty(user.email)) { 11 | errors.email = 'empty email'; 12 | } else if (!validator.isEmail(user.email)) { 13 | errors.email = 'uncorrect email'; 14 | }; 15 | 16 | if (validator.isEmpty(user.password)) { 17 | errors.password = 'empty password'; 18 | } else if (!validator.isLength(user.password, { min: 6, max: undefined })) { 19 | errors.password = 'password too short'; 20 | }; 21 | 22 | if (validator.isEmpty(user.password2)) { 23 | errors.password2 = 'empty password'; 24 | }; 25 | 26 | if (!validator.equals(user.password, user.password2)) { 27 | errors.password = 'passwords do not match'; 28 | }; 29 | 30 | return { 31 | errors, 32 | validation: empty(errors) 33 | }; 34 | }; --------------------------------------------------------------------------------