├── .env ├── .gitignore ├── index.js ├── package-lock.json ├── package.json └── src ├── config └── index.js ├── docs ├── Image.gql ├── Posts.gql └── Users.gql ├── graphql ├── directives │ ├── auth.directive.js │ └── index.js ├── resolvers │ ├── image.js │ ├── index.js │ ├── post.js │ └── user.js └── typeDefs │ ├── baseDefs.js │ ├── image.js │ ├── index.js │ ├── post.js │ └── user.js ├── helpers └── Userfunctions.js ├── index.js ├── middlewares └── auth.js ├── models ├── Post.js ├── User.js └── index.js ├── uploads └── .gitkeep └── validations ├── index.js ├── post.js └── user.js /.env: -------------------------------------------------------------------------------- 1 | PROD=dev 2 | PORT=5000 3 | SECRET=1234567890 4 | DB=mongodb://localhost:27017/posts-app -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import './src'; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "posts-graph", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@apollo/protobufjs": { 8 | "version": "1.0.5", 9 | "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.0.5.tgz", 10 | "integrity": "sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA==", 11 | "requires": { 12 | "@protobufjs/aspromise": "^1.1.2", 13 | "@protobufjs/base64": "^1.1.2", 14 | "@protobufjs/codegen": "^2.0.4", 15 | "@protobufjs/eventemitter": "^1.1.0", 16 | "@protobufjs/fetch": "^1.1.0", 17 | "@protobufjs/float": "^1.0.2", 18 | "@protobufjs/inquire": "^1.1.0", 19 | "@protobufjs/path": "^1.1.2", 20 | "@protobufjs/pool": "^1.1.0", 21 | "@protobufjs/utf8": "^1.1.0", 22 | "@types/long": "^4.0.0", 23 | "@types/node": "^10.1.0", 24 | "long": "^4.0.0" 25 | }, 26 | "dependencies": { 27 | "@types/node": { 28 | "version": "10.17.32", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.32.tgz", 30 | "integrity": "sha512-EUq+cjH/3KCzQHikGnNbWAGe548IFLSm93Vl8xA7EuYEEATiyOVDyEVuGkowL7c9V69FF/RiZSAOCFPApMs/ig==" 31 | } 32 | } 33 | }, 34 | "@apollographql/apollo-tools": { 35 | "version": "0.4.8", 36 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz", 37 | "integrity": "sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA==", 38 | "requires": { 39 | "apollo-env": "^0.6.5" 40 | } 41 | }, 42 | "@apollographql/graphql-playground-html": { 43 | "version": "1.6.26", 44 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz", 45 | "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==", 46 | "requires": { 47 | "xss": "^1.0.6" 48 | } 49 | }, 50 | "@babel/runtime": { 51 | "version": "7.11.2", 52 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", 53 | "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", 54 | "requires": { 55 | "regenerator-runtime": "^0.13.4" 56 | } 57 | }, 58 | "@protobufjs/aspromise": { 59 | "version": "1.1.2", 60 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 61 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 62 | }, 63 | "@protobufjs/base64": { 64 | "version": "1.1.2", 65 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 66 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 67 | }, 68 | "@protobufjs/codegen": { 69 | "version": "2.0.4", 70 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 71 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 72 | }, 73 | "@protobufjs/eventemitter": { 74 | "version": "1.1.0", 75 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 76 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 77 | }, 78 | "@protobufjs/fetch": { 79 | "version": "1.1.0", 80 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 81 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 82 | "requires": { 83 | "@protobufjs/aspromise": "^1.1.1", 84 | "@protobufjs/inquire": "^1.1.0" 85 | } 86 | }, 87 | "@protobufjs/float": { 88 | "version": "1.0.2", 89 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 90 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 91 | }, 92 | "@protobufjs/inquire": { 93 | "version": "1.1.0", 94 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 95 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 96 | }, 97 | "@protobufjs/path": { 98 | "version": "1.1.2", 99 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 100 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 101 | }, 102 | "@protobufjs/pool": { 103 | "version": "1.1.0", 104 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 105 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 106 | }, 107 | "@protobufjs/utf8": { 108 | "version": "1.1.0", 109 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 110 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 111 | }, 112 | "@types/accepts": { 113 | "version": "1.3.5", 114 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 115 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 116 | "requires": { 117 | "@types/node": "*" 118 | } 119 | }, 120 | "@types/body-parser": { 121 | "version": "1.19.0", 122 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 123 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 124 | "requires": { 125 | "@types/connect": "*", 126 | "@types/node": "*" 127 | } 128 | }, 129 | "@types/connect": { 130 | "version": "3.4.33", 131 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 132 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 133 | "requires": { 134 | "@types/node": "*" 135 | } 136 | }, 137 | "@types/content-disposition": { 138 | "version": "0.5.3", 139 | "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", 140 | "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==" 141 | }, 142 | "@types/cookies": { 143 | "version": "0.7.4", 144 | "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz", 145 | "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==", 146 | "requires": { 147 | "@types/connect": "*", 148 | "@types/express": "*", 149 | "@types/keygrip": "*", 150 | "@types/node": "*" 151 | } 152 | }, 153 | "@types/cors": { 154 | "version": "2.8.7", 155 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.7.tgz", 156 | "integrity": "sha512-sOdDRU3oRS7LBNTIqwDkPJyq0lpHYcbMTt0TrjzsXbk/e37hcLTH6eZX7CdbDeN0yJJvzw9hFBZkbtCSbk/jAQ==", 157 | "requires": { 158 | "@types/express": "*" 159 | } 160 | }, 161 | "@types/express": { 162 | "version": "4.17.7", 163 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", 164 | "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", 165 | "requires": { 166 | "@types/body-parser": "*", 167 | "@types/express-serve-static-core": "*", 168 | "@types/qs": "*", 169 | "@types/serve-static": "*" 170 | } 171 | }, 172 | "@types/express-serve-static-core": { 173 | "version": "4.17.12", 174 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.12.tgz", 175 | "integrity": "sha512-EaEdY+Dty1jEU7U6J4CUWwxL+hyEGMkO5jan5gplfegUgCUsIUWqXxqw47uGjimeT4Qgkz/XUfwoau08+fgvKA==", 176 | "requires": { 177 | "@types/node": "*", 178 | "@types/qs": "*", 179 | "@types/range-parser": "*" 180 | } 181 | }, 182 | "@types/fs-capacitor": { 183 | "version": "2.0.0", 184 | "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", 185 | "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", 186 | "requires": { 187 | "@types/node": "*" 188 | } 189 | }, 190 | "@types/graphql-upload": { 191 | "version": "8.0.4", 192 | "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-8.0.4.tgz", 193 | "integrity": "sha512-0TRyJD2o8vbkmJF8InppFcPVcXKk+Rvlg/xvpHBIndSJYpmDWfmtx/ZAtl4f3jR2vfarpTqYgj8MZuJssSoU7Q==", 194 | "requires": { 195 | "@types/express": "*", 196 | "@types/fs-capacitor": "*", 197 | "@types/koa": "*", 198 | "graphql": "^15.3.0" 199 | } 200 | }, 201 | "@types/http-assert": { 202 | "version": "1.5.1", 203 | "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", 204 | "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" 205 | }, 206 | "@types/http-errors": { 207 | "version": "1.8.0", 208 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", 209 | "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" 210 | }, 211 | "@types/keygrip": { 212 | "version": "1.0.2", 213 | "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", 214 | "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" 215 | }, 216 | "@types/koa": { 217 | "version": "2.11.4", 218 | "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.4.tgz", 219 | "integrity": "sha512-Etqs0kdqbuAsNr5k6mlZQelpZKVwMu9WPRHVVTLnceZlhr0pYmblRNJbCgoCMzKWWePldydU0AYEOX4Q9fnGUQ==", 220 | "requires": { 221 | "@types/accepts": "*", 222 | "@types/content-disposition": "*", 223 | "@types/cookies": "*", 224 | "@types/http-assert": "*", 225 | "@types/http-errors": "*", 226 | "@types/keygrip": "*", 227 | "@types/koa-compose": "*", 228 | "@types/node": "*" 229 | } 230 | }, 231 | "@types/koa-compose": { 232 | "version": "3.2.5", 233 | "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", 234 | "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", 235 | "requires": { 236 | "@types/koa": "*" 237 | } 238 | }, 239 | "@types/long": { 240 | "version": "4.0.1", 241 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 242 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 243 | }, 244 | "@types/mime": { 245 | "version": "2.0.3", 246 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", 247 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" 248 | }, 249 | "@types/node": { 250 | "version": "14.10.1", 251 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.1.tgz", 252 | "integrity": "sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==" 253 | }, 254 | "@types/node-fetch": { 255 | "version": "2.5.7", 256 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", 257 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", 258 | "requires": { 259 | "@types/node": "*", 260 | "form-data": "^3.0.0" 261 | } 262 | }, 263 | "@types/qs": { 264 | "version": "6.9.4", 265 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", 266 | "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==" 267 | }, 268 | "@types/range-parser": { 269 | "version": "1.2.3", 270 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 271 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 272 | }, 273 | "@types/serve-static": { 274 | "version": "1.13.5", 275 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", 276 | "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", 277 | "requires": { 278 | "@types/express-serve-static-core": "*", 279 | "@types/mime": "*" 280 | } 281 | }, 282 | "@types/ws": { 283 | "version": "7.2.6", 284 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz", 285 | "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==", 286 | "requires": { 287 | "@types/node": "*" 288 | } 289 | }, 290 | "@wry/equality": { 291 | "version": "0.1.11", 292 | "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", 293 | "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", 294 | "requires": { 295 | "tslib": "^1.9.3" 296 | } 297 | }, 298 | "accepts": { 299 | "version": "1.3.7", 300 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 301 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 302 | "requires": { 303 | "mime-types": "~2.1.24", 304 | "negotiator": "0.6.2" 305 | } 306 | }, 307 | "apollo-cache-control": { 308 | "version": "0.11.1", 309 | "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.1.tgz", 310 | "integrity": "sha512-6iHa8TkcKt4rx5SKRzDNjUIpCQX+7/FlZwD7vRh9JDnM4VH8SWhpj8fUR3CiEY8Kuc4ChXnOY8bCcMju5KPnIQ==", 311 | "requires": { 312 | "apollo-server-env": "^2.4.5", 313 | "apollo-server-plugin-base": "^0.9.1" 314 | } 315 | }, 316 | "apollo-datasource": { 317 | "version": "0.7.2", 318 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.2.tgz", 319 | "integrity": "sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw==", 320 | "requires": { 321 | "apollo-server-caching": "^0.5.2", 322 | "apollo-server-env": "^2.4.5" 323 | } 324 | }, 325 | "apollo-engine-reporting": { 326 | "version": "2.3.0", 327 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-2.3.0.tgz", 328 | "integrity": "sha512-SbcPLFuUZcRqDEZ6mSs8uHM9Ftr8yyt2IEu0JA8c3LNBmYXSLM7MHqFe80SVcosYSTBgtMz8mLJO8orhYoSYZw==", 329 | "requires": { 330 | "apollo-engine-reporting-protobuf": "^0.5.2", 331 | "apollo-graphql": "^0.5.0", 332 | "apollo-server-caching": "^0.5.2", 333 | "apollo-server-env": "^2.4.5", 334 | "apollo-server-errors": "^2.4.2", 335 | "apollo-server-plugin-base": "^0.9.1", 336 | "apollo-server-types": "^0.5.1", 337 | "async-retry": "^1.2.1", 338 | "uuid": "^8.0.0" 339 | } 340 | }, 341 | "apollo-engine-reporting-protobuf": { 342 | "version": "0.5.2", 343 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz", 344 | "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==", 345 | "requires": { 346 | "@apollo/protobufjs": "^1.0.3" 347 | } 348 | }, 349 | "apollo-env": { 350 | "version": "0.6.5", 351 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.5.tgz", 352 | "integrity": "sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg==", 353 | "requires": { 354 | "@types/node-fetch": "2.5.7", 355 | "core-js": "^3.0.1", 356 | "node-fetch": "^2.2.0", 357 | "sha.js": "^2.4.11" 358 | } 359 | }, 360 | "apollo-graphql": { 361 | "version": "0.5.0", 362 | "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.5.0.tgz", 363 | "integrity": "sha512-YSdF/BKPbsnQpxWpmCE53pBJX44aaoif31Y22I/qKpB6ZSGzYijV5YBoCL5Q15H2oA/v/02Oazh9lbp4ek3eig==", 364 | "requires": { 365 | "apollo-env": "^0.6.5", 366 | "lodash.sortby": "^4.7.0" 367 | } 368 | }, 369 | "apollo-link": { 370 | "version": "1.2.14", 371 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", 372 | "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", 373 | "requires": { 374 | "apollo-utilities": "^1.3.0", 375 | "ts-invariant": "^0.4.0", 376 | "tslib": "^1.9.3", 377 | "zen-observable-ts": "^0.8.21" 378 | } 379 | }, 380 | "apollo-server-caching": { 381 | "version": "0.5.2", 382 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", 383 | "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", 384 | "requires": { 385 | "lru-cache": "^5.0.0" 386 | } 387 | }, 388 | "apollo-server-core": { 389 | "version": "2.17.0", 390 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.17.0.tgz", 391 | "integrity": "sha512-rjAkBbKSrGLDfg/g5bohnPlQahmkAxgEBuMDVsoF3aa+RaEPXPUMYrLbOxntl0LWeLbPiMa/IyFF43dvlGqV7w==", 392 | "requires": { 393 | "@apollographql/apollo-tools": "^0.4.3", 394 | "@apollographql/graphql-playground-html": "1.6.26", 395 | "@types/graphql-upload": "^8.0.0", 396 | "@types/ws": "^7.0.0", 397 | "apollo-cache-control": "^0.11.1", 398 | "apollo-datasource": "^0.7.2", 399 | "apollo-engine-reporting": "^2.3.0", 400 | "apollo-server-caching": "^0.5.2", 401 | "apollo-server-env": "^2.4.5", 402 | "apollo-server-errors": "^2.4.2", 403 | "apollo-server-plugin-base": "^0.9.1", 404 | "apollo-server-types": "^0.5.1", 405 | "apollo-tracing": "^0.11.2", 406 | "fast-json-stable-stringify": "^2.0.0", 407 | "graphql-extensions": "^0.12.4", 408 | "graphql-tag": "^2.9.2", 409 | "graphql-tools": "^4.0.0", 410 | "graphql-upload": "^8.0.2", 411 | "loglevel": "^1.6.7", 412 | "sha.js": "^2.4.11", 413 | "subscriptions-transport-ws": "^0.9.11", 414 | "ws": "^6.0.0" 415 | } 416 | }, 417 | "apollo-server-env": { 418 | "version": "2.4.5", 419 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", 420 | "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", 421 | "requires": { 422 | "node-fetch": "^2.1.2", 423 | "util.promisify": "^1.0.0" 424 | } 425 | }, 426 | "apollo-server-errors": { 427 | "version": "2.4.2", 428 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz", 429 | "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==" 430 | }, 431 | "apollo-server-express": { 432 | "version": "2.17.0", 433 | "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.17.0.tgz", 434 | "integrity": "sha512-PonpWOuM1DH3Cz0bu56Tusr3GXOnectC6AD/gy2GXK0v84E7tKTuxEY3SgsgxhvfvvhfwJbXTyIogL/wezqnCw==", 435 | "requires": { 436 | "@apollographql/graphql-playground-html": "1.6.26", 437 | "@types/accepts": "^1.3.5", 438 | "@types/body-parser": "1.19.0", 439 | "@types/cors": "^2.8.4", 440 | "@types/express": "4.17.7", 441 | "accepts": "^1.3.5", 442 | "apollo-server-core": "^2.17.0", 443 | "apollo-server-types": "^0.5.1", 444 | "body-parser": "^1.18.3", 445 | "cors": "^2.8.4", 446 | "express": "^4.17.1", 447 | "graphql-subscriptions": "^1.0.0", 448 | "graphql-tools": "^4.0.0", 449 | "parseurl": "^1.3.2", 450 | "subscriptions-transport-ws": "^0.9.16", 451 | "type-is": "^1.6.16" 452 | } 453 | }, 454 | "apollo-server-plugin-base": { 455 | "version": "0.9.1", 456 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.1.tgz", 457 | "integrity": "sha512-kvrX4Z3FdpjrZdHkyl5iY2A1Wvp4b6KQp00DeZqss7GyyKNUBKr80/7RQgBLEw7EWM7WB19j459xM/TjvW0FKQ==", 458 | "requires": { 459 | "apollo-server-types": "^0.5.1" 460 | } 461 | }, 462 | "apollo-server-types": { 463 | "version": "0.5.1", 464 | "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz", 465 | "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==", 466 | "requires": { 467 | "apollo-engine-reporting-protobuf": "^0.5.2", 468 | "apollo-server-caching": "^0.5.2", 469 | "apollo-server-env": "^2.4.5" 470 | } 471 | }, 472 | "apollo-tracing": { 473 | "version": "0.11.2", 474 | "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.11.2.tgz", 475 | "integrity": "sha512-QjmRd2ozGD+PfmF6U9w/w6jrclYSBNczN6Bzppr8qA5somEGl5pqdprIZYL28H0IapZiutA3x6p6ZVF/cVX8wA==", 476 | "requires": { 477 | "apollo-server-env": "^2.4.5", 478 | "apollo-server-plugin-base": "^0.9.1" 479 | } 480 | }, 481 | "apollo-utilities": { 482 | "version": "1.3.4", 483 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", 484 | "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", 485 | "requires": { 486 | "@wry/equality": "^0.1.2", 487 | "fast-json-stable-stringify": "^2.0.0", 488 | "ts-invariant": "^0.4.0", 489 | "tslib": "^1.10.0" 490 | } 491 | }, 492 | "array-flatten": { 493 | "version": "1.1.1", 494 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 495 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 496 | }, 497 | "async-limiter": { 498 | "version": "1.0.1", 499 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 500 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 501 | }, 502 | "async-retry": { 503 | "version": "1.3.1", 504 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", 505 | "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", 506 | "requires": { 507 | "retry": "0.12.0" 508 | } 509 | }, 510 | "asynckit": { 511 | "version": "0.4.0", 512 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 513 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 514 | }, 515 | "backo2": { 516 | "version": "1.0.2", 517 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 518 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 519 | }, 520 | "bcryptjs": { 521 | "version": "2.4.3", 522 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", 523 | "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" 524 | }, 525 | "bl": { 526 | "version": "2.2.1", 527 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", 528 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", 529 | "requires": { 530 | "readable-stream": "^2.3.5", 531 | "safe-buffer": "^5.1.1" 532 | } 533 | }, 534 | "bluebird": { 535 | "version": "3.5.1", 536 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 537 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 538 | }, 539 | "body-parser": { 540 | "version": "1.19.0", 541 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 542 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 543 | "requires": { 544 | "bytes": "3.1.0", 545 | "content-type": "~1.0.4", 546 | "debug": "2.6.9", 547 | "depd": "~1.1.2", 548 | "http-errors": "1.7.2", 549 | "iconv-lite": "0.4.24", 550 | "on-finished": "~2.3.0", 551 | "qs": "6.7.0", 552 | "raw-body": "2.4.0", 553 | "type-is": "~1.6.17" 554 | }, 555 | "dependencies": { 556 | "http-errors": { 557 | "version": "1.7.2", 558 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 559 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 560 | "requires": { 561 | "depd": "~1.1.2", 562 | "inherits": "2.0.3", 563 | "setprototypeof": "1.1.1", 564 | "statuses": ">= 1.5.0 < 2", 565 | "toidentifier": "1.0.0" 566 | } 567 | }, 568 | "inherits": { 569 | "version": "2.0.3", 570 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 571 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 572 | }, 573 | "setprototypeof": { 574 | "version": "1.1.1", 575 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 576 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 577 | } 578 | } 579 | }, 580 | "bson": { 581 | "version": "1.1.5", 582 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", 583 | "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" 584 | }, 585 | "buffer-equal-constant-time": { 586 | "version": "1.0.1", 587 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 588 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 589 | }, 590 | "busboy": { 591 | "version": "0.3.1", 592 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", 593 | "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", 594 | "requires": { 595 | "dicer": "0.3.0" 596 | } 597 | }, 598 | "bytes": { 599 | "version": "3.1.0", 600 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 601 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 602 | }, 603 | "combined-stream": { 604 | "version": "1.0.8", 605 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 606 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 607 | "requires": { 608 | "delayed-stream": "~1.0.0" 609 | } 610 | }, 611 | "commander": { 612 | "version": "2.20.3", 613 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 614 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 615 | }, 616 | "consola": { 617 | "version": "2.15.0", 618 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", 619 | "integrity": "sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ==" 620 | }, 621 | "content-disposition": { 622 | "version": "0.5.3", 623 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 624 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 625 | "requires": { 626 | "safe-buffer": "5.1.2" 627 | }, 628 | "dependencies": { 629 | "safe-buffer": { 630 | "version": "5.1.2", 631 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 632 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 633 | } 634 | } 635 | }, 636 | "content-type": { 637 | "version": "1.0.4", 638 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 639 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 640 | }, 641 | "cookie": { 642 | "version": "0.4.0", 643 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 644 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 645 | }, 646 | "cookie-signature": { 647 | "version": "1.0.6", 648 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 649 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 650 | }, 651 | "core-js": { 652 | "version": "3.6.5", 653 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 654 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" 655 | }, 656 | "core-util-is": { 657 | "version": "1.0.2", 658 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 659 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 660 | }, 661 | "cors": { 662 | "version": "2.8.5", 663 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 664 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 665 | "requires": { 666 | "object-assign": "^4", 667 | "vary": "^1" 668 | } 669 | }, 670 | "cssfilter": { 671 | "version": "0.0.10", 672 | "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", 673 | "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" 674 | }, 675 | "debug": { 676 | "version": "2.6.9", 677 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 678 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 679 | "requires": { 680 | "ms": "2.0.0" 681 | } 682 | }, 683 | "define-properties": { 684 | "version": "1.1.3", 685 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 686 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 687 | "requires": { 688 | "object-keys": "^1.0.12" 689 | } 690 | }, 691 | "delayed-stream": { 692 | "version": "1.0.0", 693 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 694 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 695 | }, 696 | "denque": { 697 | "version": "1.4.1", 698 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 699 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 700 | }, 701 | "depd": { 702 | "version": "1.1.2", 703 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 704 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 705 | }, 706 | "deprecated-decorator": { 707 | "version": "0.1.6", 708 | "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", 709 | "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" 710 | }, 711 | "destroy": { 712 | "version": "1.0.4", 713 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 714 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 715 | }, 716 | "dicer": { 717 | "version": "0.3.0", 718 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 719 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 720 | "requires": { 721 | "streamsearch": "0.1.2" 722 | } 723 | }, 724 | "dotenv": { 725 | "version": "8.2.0", 726 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 727 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 728 | }, 729 | "ecdsa-sig-formatter": { 730 | "version": "1.0.11", 731 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 732 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 733 | "requires": { 734 | "safe-buffer": "^5.0.1" 735 | } 736 | }, 737 | "ee-first": { 738 | "version": "1.1.1", 739 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 740 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 741 | }, 742 | "encodeurl": { 743 | "version": "1.0.2", 744 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 745 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 746 | }, 747 | "es-abstract": { 748 | "version": "1.17.6", 749 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 750 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 751 | "requires": { 752 | "es-to-primitive": "^1.2.1", 753 | "function-bind": "^1.1.1", 754 | "has": "^1.0.3", 755 | "has-symbols": "^1.0.1", 756 | "is-callable": "^1.2.0", 757 | "is-regex": "^1.1.0", 758 | "object-inspect": "^1.7.0", 759 | "object-keys": "^1.1.1", 760 | "object.assign": "^4.1.0", 761 | "string.prototype.trimend": "^1.0.1", 762 | "string.prototype.trimstart": "^1.0.1" 763 | } 764 | }, 765 | "es-to-primitive": { 766 | "version": "1.2.1", 767 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 768 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 769 | "requires": { 770 | "is-callable": "^1.1.4", 771 | "is-date-object": "^1.0.1", 772 | "is-symbol": "^1.0.2" 773 | } 774 | }, 775 | "escape-html": { 776 | "version": "1.0.3", 777 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 778 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 779 | }, 780 | "esm": { 781 | "version": "3.2.25", 782 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", 783 | "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" 784 | }, 785 | "etag": { 786 | "version": "1.8.1", 787 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 788 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 789 | }, 790 | "eventemitter3": { 791 | "version": "3.1.2", 792 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", 793 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" 794 | }, 795 | "express": { 796 | "version": "4.17.1", 797 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 798 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 799 | "requires": { 800 | "accepts": "~1.3.7", 801 | "array-flatten": "1.1.1", 802 | "body-parser": "1.19.0", 803 | "content-disposition": "0.5.3", 804 | "content-type": "~1.0.4", 805 | "cookie": "0.4.0", 806 | "cookie-signature": "1.0.6", 807 | "debug": "2.6.9", 808 | "depd": "~1.1.2", 809 | "encodeurl": "~1.0.2", 810 | "escape-html": "~1.0.3", 811 | "etag": "~1.8.1", 812 | "finalhandler": "~1.1.2", 813 | "fresh": "0.5.2", 814 | "merge-descriptors": "1.0.1", 815 | "methods": "~1.1.2", 816 | "on-finished": "~2.3.0", 817 | "parseurl": "~1.3.3", 818 | "path-to-regexp": "0.1.7", 819 | "proxy-addr": "~2.0.5", 820 | "qs": "6.7.0", 821 | "range-parser": "~1.2.1", 822 | "safe-buffer": "5.1.2", 823 | "send": "0.17.1", 824 | "serve-static": "1.14.1", 825 | "setprototypeof": "1.1.1", 826 | "statuses": "~1.5.0", 827 | "type-is": "~1.6.18", 828 | "utils-merge": "1.0.1", 829 | "vary": "~1.1.2" 830 | }, 831 | "dependencies": { 832 | "safe-buffer": { 833 | "version": "5.1.2", 834 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 835 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 836 | }, 837 | "setprototypeof": { 838 | "version": "1.1.1", 839 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 840 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 841 | } 842 | } 843 | }, 844 | "fast-json-stable-stringify": { 845 | "version": "2.1.0", 846 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 847 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 848 | }, 849 | "finalhandler": { 850 | "version": "1.1.2", 851 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 852 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 853 | "requires": { 854 | "debug": "2.6.9", 855 | "encodeurl": "~1.0.2", 856 | "escape-html": "~1.0.3", 857 | "on-finished": "~2.3.0", 858 | "parseurl": "~1.3.3", 859 | "statuses": "~1.5.0", 860 | "unpipe": "~1.0.0" 861 | } 862 | }, 863 | "fn-name": { 864 | "version": "3.0.0", 865 | "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-3.0.0.tgz", 866 | "integrity": "sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA==" 867 | }, 868 | "form-data": { 869 | "version": "3.0.0", 870 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 871 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 872 | "requires": { 873 | "asynckit": "^0.4.0", 874 | "combined-stream": "^1.0.8", 875 | "mime-types": "^2.1.12" 876 | } 877 | }, 878 | "forwarded": { 879 | "version": "0.1.2", 880 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 881 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 882 | }, 883 | "fresh": { 884 | "version": "0.5.2", 885 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 886 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 887 | }, 888 | "fs-capacitor": { 889 | "version": "2.0.4", 890 | "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", 891 | "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" 892 | }, 893 | "function-bind": { 894 | "version": "1.1.1", 895 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 896 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 897 | }, 898 | "graphql": { 899 | "version": "15.3.0", 900 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.3.0.tgz", 901 | "integrity": "sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==" 902 | }, 903 | "graphql-extensions": { 904 | "version": "0.12.4", 905 | "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.4.tgz", 906 | "integrity": "sha512-GnR4LiWk3s2bGOqIh6V1JgnSXw2RCH4NOgbCFEWvB6JqWHXTlXnLZ8bRSkCiD4pltv7RHUPWqN/sGh8R6Ae/ag==", 907 | "requires": { 908 | "@apollographql/apollo-tools": "^0.4.3", 909 | "apollo-server-env": "^2.4.5", 910 | "apollo-server-types": "^0.5.1" 911 | } 912 | }, 913 | "graphql-subscriptions": { 914 | "version": "1.1.0", 915 | "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", 916 | "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", 917 | "requires": { 918 | "iterall": "^1.2.1" 919 | } 920 | }, 921 | "graphql-tag": { 922 | "version": "2.11.0", 923 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz", 924 | "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" 925 | }, 926 | "graphql-tools": { 927 | "version": "4.0.8", 928 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", 929 | "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", 930 | "requires": { 931 | "apollo-link": "^1.2.14", 932 | "apollo-utilities": "^1.0.1", 933 | "deprecated-decorator": "^0.1.6", 934 | "iterall": "^1.1.3", 935 | "uuid": "^3.1.0" 936 | }, 937 | "dependencies": { 938 | "uuid": { 939 | "version": "3.4.0", 940 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 941 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 942 | } 943 | } 944 | }, 945 | "graphql-upload": { 946 | "version": "8.1.0", 947 | "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", 948 | "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", 949 | "requires": { 950 | "busboy": "^0.3.1", 951 | "fs-capacitor": "^2.0.4", 952 | "http-errors": "^1.7.3", 953 | "object-path": "^0.11.4" 954 | } 955 | }, 956 | "has": { 957 | "version": "1.0.3", 958 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 959 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 960 | "requires": { 961 | "function-bind": "^1.1.1" 962 | } 963 | }, 964 | "has-symbols": { 965 | "version": "1.0.1", 966 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 967 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 968 | }, 969 | "http-errors": { 970 | "version": "1.8.0", 971 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", 972 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", 973 | "requires": { 974 | "depd": "~1.1.2", 975 | "inherits": "2.0.4", 976 | "setprototypeof": "1.2.0", 977 | "statuses": ">= 1.5.0 < 2", 978 | "toidentifier": "1.0.0" 979 | } 980 | }, 981 | "iconv-lite": { 982 | "version": "0.4.24", 983 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 984 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 985 | "requires": { 986 | "safer-buffer": ">= 2.1.2 < 3" 987 | } 988 | }, 989 | "inherits": { 990 | "version": "2.0.4", 991 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 992 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 993 | }, 994 | "ipaddr.js": { 995 | "version": "1.9.1", 996 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 997 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 998 | }, 999 | "is-callable": { 1000 | "version": "1.2.1", 1001 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", 1002 | "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" 1003 | }, 1004 | "is-date-object": { 1005 | "version": "1.0.2", 1006 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1007 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 1008 | }, 1009 | "is-negative-zero": { 1010 | "version": "2.0.0", 1011 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", 1012 | "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" 1013 | }, 1014 | "is-regex": { 1015 | "version": "1.1.1", 1016 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 1017 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 1018 | "requires": { 1019 | "has-symbols": "^1.0.1" 1020 | } 1021 | }, 1022 | "is-symbol": { 1023 | "version": "1.0.3", 1024 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1025 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1026 | "requires": { 1027 | "has-symbols": "^1.0.1" 1028 | } 1029 | }, 1030 | "isarray": { 1031 | "version": "1.0.0", 1032 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1033 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1034 | }, 1035 | "iterall": { 1036 | "version": "1.3.0", 1037 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", 1038 | "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" 1039 | }, 1040 | "jsonwebtoken": { 1041 | "version": "8.5.1", 1042 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1043 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1044 | "requires": { 1045 | "jws": "^3.2.2", 1046 | "lodash.includes": "^4.3.0", 1047 | "lodash.isboolean": "^3.0.3", 1048 | "lodash.isinteger": "^4.0.4", 1049 | "lodash.isnumber": "^3.0.3", 1050 | "lodash.isplainobject": "^4.0.6", 1051 | "lodash.isstring": "^4.0.1", 1052 | "lodash.once": "^4.0.0", 1053 | "ms": "^2.1.1", 1054 | "semver": "^5.6.0" 1055 | }, 1056 | "dependencies": { 1057 | "ms": { 1058 | "version": "2.1.2", 1059 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1060 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1061 | } 1062 | } 1063 | }, 1064 | "jwa": { 1065 | "version": "1.4.1", 1066 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1067 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1068 | "requires": { 1069 | "buffer-equal-constant-time": "1.0.1", 1070 | "ecdsa-sig-formatter": "1.0.11", 1071 | "safe-buffer": "^5.0.1" 1072 | } 1073 | }, 1074 | "jws": { 1075 | "version": "3.2.2", 1076 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1077 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1078 | "requires": { 1079 | "jwa": "^1.4.1", 1080 | "safe-buffer": "^5.0.1" 1081 | } 1082 | }, 1083 | "kareem": { 1084 | "version": "2.3.1", 1085 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 1086 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 1087 | }, 1088 | "lodash": { 1089 | "version": "4.17.20", 1090 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1091 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 1092 | }, 1093 | "lodash-es": { 1094 | "version": "4.17.15", 1095 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", 1096 | "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" 1097 | }, 1098 | "lodash.includes": { 1099 | "version": "4.3.0", 1100 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1101 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1102 | }, 1103 | "lodash.isboolean": { 1104 | "version": "3.0.3", 1105 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1106 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1107 | }, 1108 | "lodash.isinteger": { 1109 | "version": "4.0.4", 1110 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1111 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1112 | }, 1113 | "lodash.isnumber": { 1114 | "version": "3.0.3", 1115 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1116 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1117 | }, 1118 | "lodash.isplainobject": { 1119 | "version": "4.0.6", 1120 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1121 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1122 | }, 1123 | "lodash.isstring": { 1124 | "version": "4.0.1", 1125 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1126 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1127 | }, 1128 | "lodash.once": { 1129 | "version": "4.1.1", 1130 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1131 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1132 | }, 1133 | "lodash.sortby": { 1134 | "version": "4.7.0", 1135 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1136 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1137 | }, 1138 | "loglevel": { 1139 | "version": "1.7.0", 1140 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", 1141 | "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" 1142 | }, 1143 | "long": { 1144 | "version": "4.0.0", 1145 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1146 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1147 | }, 1148 | "lru-cache": { 1149 | "version": "5.1.1", 1150 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1151 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1152 | "requires": { 1153 | "yallist": "^3.0.2" 1154 | } 1155 | }, 1156 | "media-typer": { 1157 | "version": "0.3.0", 1158 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1159 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1160 | }, 1161 | "memory-pager": { 1162 | "version": "1.5.0", 1163 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 1164 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 1165 | "optional": true 1166 | }, 1167 | "merge-descriptors": { 1168 | "version": "1.0.1", 1169 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1170 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1171 | }, 1172 | "methods": { 1173 | "version": "1.1.2", 1174 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1175 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1176 | }, 1177 | "mime": { 1178 | "version": "1.6.0", 1179 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1180 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1181 | }, 1182 | "mime-db": { 1183 | "version": "1.44.0", 1184 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1185 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1186 | }, 1187 | "mime-types": { 1188 | "version": "2.1.27", 1189 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1190 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1191 | "requires": { 1192 | "mime-db": "1.44.0" 1193 | } 1194 | }, 1195 | "mongodb": { 1196 | "version": "3.6.2", 1197 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", 1198 | "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", 1199 | "requires": { 1200 | "bl": "^2.2.1", 1201 | "bson": "^1.1.4", 1202 | "denque": "^1.4.1", 1203 | "require_optional": "^1.0.1", 1204 | "safe-buffer": "^5.1.2", 1205 | "saslprep": "^1.0.0" 1206 | } 1207 | }, 1208 | "mongoose": { 1209 | "version": "5.10.5", 1210 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.5.tgz", 1211 | "integrity": "sha512-BOQZsZn9Y79f3rWZFLD1gvOLNN5gOiGvGr5raqQ5v/T4fdAmnjXGCVynpW4SRnQLtrcCeLXyaaXVRT75863Q0w==", 1212 | "requires": { 1213 | "bson": "^1.1.4", 1214 | "kareem": "2.3.1", 1215 | "mongodb": "3.6.2", 1216 | "mongoose-legacy-pluralize": "1.0.2", 1217 | "mpath": "0.7.0", 1218 | "mquery": "3.2.2", 1219 | "ms": "2.1.2", 1220 | "regexp-clone": "1.0.0", 1221 | "safe-buffer": "5.2.1", 1222 | "sift": "7.0.1", 1223 | "sliced": "1.0.1" 1224 | }, 1225 | "dependencies": { 1226 | "ms": { 1227 | "version": "2.1.2", 1228 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1229 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1230 | } 1231 | } 1232 | }, 1233 | "mongoose-legacy-pluralize": { 1234 | "version": "1.0.2", 1235 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 1236 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 1237 | }, 1238 | "mongoose-paginate-v2": { 1239 | "version": "1.3.9", 1240 | "resolved": "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.3.9.tgz", 1241 | "integrity": "sha512-KXLmsTYDaS7zHqT45B2MZcCGzJtBySGANor5Xf6c0nU3y34xkRMqcDiVTizLd27KGqy5smqLe6LVNkTK994XGA==" 1242 | }, 1243 | "mpath": { 1244 | "version": "0.7.0", 1245 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", 1246 | "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" 1247 | }, 1248 | "mquery": { 1249 | "version": "3.2.2", 1250 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 1251 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 1252 | "requires": { 1253 | "bluebird": "3.5.1", 1254 | "debug": "3.1.0", 1255 | "regexp-clone": "^1.0.0", 1256 | "safe-buffer": "5.1.2", 1257 | "sliced": "1.0.1" 1258 | }, 1259 | "dependencies": { 1260 | "debug": { 1261 | "version": "3.1.0", 1262 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1263 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1264 | "requires": { 1265 | "ms": "2.0.0" 1266 | } 1267 | }, 1268 | "safe-buffer": { 1269 | "version": "5.1.2", 1270 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1271 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1272 | } 1273 | } 1274 | }, 1275 | "ms": { 1276 | "version": "2.0.0", 1277 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1278 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1279 | }, 1280 | "negotiator": { 1281 | "version": "0.6.2", 1282 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1283 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1284 | }, 1285 | "node-fetch": { 1286 | "version": "2.6.1", 1287 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1288 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1289 | }, 1290 | "object-assign": { 1291 | "version": "4.1.1", 1292 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1293 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1294 | }, 1295 | "object-inspect": { 1296 | "version": "1.8.0", 1297 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 1298 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" 1299 | }, 1300 | "object-keys": { 1301 | "version": "1.1.1", 1302 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1303 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1304 | }, 1305 | "object-path": { 1306 | "version": "0.11.4", 1307 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", 1308 | "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" 1309 | }, 1310 | "object.assign": { 1311 | "version": "4.1.1", 1312 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", 1313 | "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", 1314 | "requires": { 1315 | "define-properties": "^1.1.3", 1316 | "es-abstract": "^1.18.0-next.0", 1317 | "has-symbols": "^1.0.1", 1318 | "object-keys": "^1.1.1" 1319 | }, 1320 | "dependencies": { 1321 | "es-abstract": { 1322 | "version": "1.18.0-next.0", 1323 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", 1324 | "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", 1325 | "requires": { 1326 | "es-to-primitive": "^1.2.1", 1327 | "function-bind": "^1.1.1", 1328 | "has": "^1.0.3", 1329 | "has-symbols": "^1.0.1", 1330 | "is-callable": "^1.2.0", 1331 | "is-negative-zero": "^2.0.0", 1332 | "is-regex": "^1.1.1", 1333 | "object-inspect": "^1.8.0", 1334 | "object-keys": "^1.1.1", 1335 | "object.assign": "^4.1.0", 1336 | "string.prototype.trimend": "^1.0.1", 1337 | "string.prototype.trimstart": "^1.0.1" 1338 | } 1339 | } 1340 | } 1341 | }, 1342 | "object.getownpropertydescriptors": { 1343 | "version": "2.1.0", 1344 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 1345 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 1346 | "requires": { 1347 | "define-properties": "^1.1.3", 1348 | "es-abstract": "^1.17.0-next.1" 1349 | } 1350 | }, 1351 | "on-finished": { 1352 | "version": "2.3.0", 1353 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1354 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1355 | "requires": { 1356 | "ee-first": "1.1.1" 1357 | } 1358 | }, 1359 | "parseurl": { 1360 | "version": "1.3.3", 1361 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1362 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1363 | }, 1364 | "path-to-regexp": { 1365 | "version": "0.1.7", 1366 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1367 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1368 | }, 1369 | "process-nextick-args": { 1370 | "version": "2.0.1", 1371 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1372 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1373 | }, 1374 | "property-expr": { 1375 | "version": "2.0.4", 1376 | "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", 1377 | "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" 1378 | }, 1379 | "proxy-addr": { 1380 | "version": "2.0.6", 1381 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1382 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1383 | "requires": { 1384 | "forwarded": "~0.1.2", 1385 | "ipaddr.js": "1.9.1" 1386 | } 1387 | }, 1388 | "qs": { 1389 | "version": "6.7.0", 1390 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1391 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1392 | }, 1393 | "range-parser": { 1394 | "version": "1.2.1", 1395 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1396 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1397 | }, 1398 | "raw-body": { 1399 | "version": "2.4.0", 1400 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1401 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1402 | "requires": { 1403 | "bytes": "3.1.0", 1404 | "http-errors": "1.7.2", 1405 | "iconv-lite": "0.4.24", 1406 | "unpipe": "1.0.0" 1407 | }, 1408 | "dependencies": { 1409 | "http-errors": { 1410 | "version": "1.7.2", 1411 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1412 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1413 | "requires": { 1414 | "depd": "~1.1.2", 1415 | "inherits": "2.0.3", 1416 | "setprototypeof": "1.1.1", 1417 | "statuses": ">= 1.5.0 < 2", 1418 | "toidentifier": "1.0.0" 1419 | } 1420 | }, 1421 | "inherits": { 1422 | "version": "2.0.3", 1423 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1424 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1425 | }, 1426 | "setprototypeof": { 1427 | "version": "1.1.1", 1428 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1429 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1430 | } 1431 | } 1432 | }, 1433 | "readable-stream": { 1434 | "version": "2.3.7", 1435 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1436 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1437 | "requires": { 1438 | "core-util-is": "~1.0.0", 1439 | "inherits": "~2.0.3", 1440 | "isarray": "~1.0.0", 1441 | "process-nextick-args": "~2.0.0", 1442 | "safe-buffer": "~5.1.1", 1443 | "string_decoder": "~1.1.1", 1444 | "util-deprecate": "~1.0.1" 1445 | }, 1446 | "dependencies": { 1447 | "safe-buffer": { 1448 | "version": "5.1.2", 1449 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1450 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1451 | } 1452 | } 1453 | }, 1454 | "regenerator-runtime": { 1455 | "version": "0.13.7", 1456 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1457 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" 1458 | }, 1459 | "regexp-clone": { 1460 | "version": "1.0.0", 1461 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 1462 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 1463 | }, 1464 | "require_optional": { 1465 | "version": "1.0.1", 1466 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 1467 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 1468 | "requires": { 1469 | "resolve-from": "^2.0.0", 1470 | "semver": "^5.1.0" 1471 | } 1472 | }, 1473 | "resolve-from": { 1474 | "version": "2.0.0", 1475 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1476 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1477 | }, 1478 | "retry": { 1479 | "version": "0.12.0", 1480 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1481 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 1482 | }, 1483 | "safe-buffer": { 1484 | "version": "5.2.1", 1485 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1486 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1487 | }, 1488 | "safer-buffer": { 1489 | "version": "2.1.2", 1490 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1491 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1492 | }, 1493 | "saslprep": { 1494 | "version": "1.0.3", 1495 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 1496 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 1497 | "optional": true, 1498 | "requires": { 1499 | "sparse-bitfield": "^3.0.3" 1500 | } 1501 | }, 1502 | "semver": { 1503 | "version": "5.7.1", 1504 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1505 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1506 | }, 1507 | "send": { 1508 | "version": "0.17.1", 1509 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1510 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1511 | "requires": { 1512 | "debug": "2.6.9", 1513 | "depd": "~1.1.2", 1514 | "destroy": "~1.0.4", 1515 | "encodeurl": "~1.0.2", 1516 | "escape-html": "~1.0.3", 1517 | "etag": "~1.8.1", 1518 | "fresh": "0.5.2", 1519 | "http-errors": "~1.7.2", 1520 | "mime": "1.6.0", 1521 | "ms": "2.1.1", 1522 | "on-finished": "~2.3.0", 1523 | "range-parser": "~1.2.1", 1524 | "statuses": "~1.5.0" 1525 | }, 1526 | "dependencies": { 1527 | "http-errors": { 1528 | "version": "1.7.3", 1529 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1530 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1531 | "requires": { 1532 | "depd": "~1.1.2", 1533 | "inherits": "2.0.4", 1534 | "setprototypeof": "1.1.1", 1535 | "statuses": ">= 1.5.0 < 2", 1536 | "toidentifier": "1.0.0" 1537 | } 1538 | }, 1539 | "ms": { 1540 | "version": "2.1.1", 1541 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1542 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1543 | }, 1544 | "setprototypeof": { 1545 | "version": "1.1.1", 1546 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1547 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1548 | } 1549 | } 1550 | }, 1551 | "serve-static": { 1552 | "version": "1.14.1", 1553 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1554 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1555 | "requires": { 1556 | "encodeurl": "~1.0.2", 1557 | "escape-html": "~1.0.3", 1558 | "parseurl": "~1.3.3", 1559 | "send": "0.17.1" 1560 | } 1561 | }, 1562 | "setprototypeof": { 1563 | "version": "1.2.0", 1564 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1565 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1566 | }, 1567 | "sha.js": { 1568 | "version": "2.4.11", 1569 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1570 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1571 | "requires": { 1572 | "inherits": "^2.0.1", 1573 | "safe-buffer": "^5.0.1" 1574 | } 1575 | }, 1576 | "sift": { 1577 | "version": "7.0.1", 1578 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 1579 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 1580 | }, 1581 | "sliced": { 1582 | "version": "1.0.1", 1583 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1584 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1585 | }, 1586 | "sparse-bitfield": { 1587 | "version": "3.0.3", 1588 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1589 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1590 | "optional": true, 1591 | "requires": { 1592 | "memory-pager": "^1.0.2" 1593 | } 1594 | }, 1595 | "statuses": { 1596 | "version": "1.5.0", 1597 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1598 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1599 | }, 1600 | "streamsearch": { 1601 | "version": "0.1.2", 1602 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1603 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1604 | }, 1605 | "string.prototype.trimend": { 1606 | "version": "1.0.1", 1607 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1608 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1609 | "requires": { 1610 | "define-properties": "^1.1.3", 1611 | "es-abstract": "^1.17.5" 1612 | } 1613 | }, 1614 | "string.prototype.trimstart": { 1615 | "version": "1.0.1", 1616 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1617 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1618 | "requires": { 1619 | "define-properties": "^1.1.3", 1620 | "es-abstract": "^1.17.5" 1621 | } 1622 | }, 1623 | "string_decoder": { 1624 | "version": "1.1.1", 1625 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1626 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1627 | "requires": { 1628 | "safe-buffer": "~5.1.0" 1629 | }, 1630 | "dependencies": { 1631 | "safe-buffer": { 1632 | "version": "5.1.2", 1633 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1634 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1635 | } 1636 | } 1637 | }, 1638 | "subscriptions-transport-ws": { 1639 | "version": "0.9.18", 1640 | "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz", 1641 | "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==", 1642 | "requires": { 1643 | "backo2": "^1.0.2", 1644 | "eventemitter3": "^3.1.0", 1645 | "iterall": "^1.2.1", 1646 | "symbol-observable": "^1.0.4", 1647 | "ws": "^5.2.0" 1648 | }, 1649 | "dependencies": { 1650 | "ws": { 1651 | "version": "5.2.2", 1652 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 1653 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 1654 | "requires": { 1655 | "async-limiter": "~1.0.0" 1656 | } 1657 | } 1658 | } 1659 | }, 1660 | "symbol-observable": { 1661 | "version": "1.2.0", 1662 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 1663 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1664 | }, 1665 | "synchronous-promise": { 1666 | "version": "2.0.13", 1667 | "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz", 1668 | "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==" 1669 | }, 1670 | "toidentifier": { 1671 | "version": "1.0.0", 1672 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1673 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1674 | }, 1675 | "toposort": { 1676 | "version": "2.0.2", 1677 | "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", 1678 | "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" 1679 | }, 1680 | "ts-invariant": { 1681 | "version": "0.4.4", 1682 | "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", 1683 | "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", 1684 | "requires": { 1685 | "tslib": "^1.9.3" 1686 | } 1687 | }, 1688 | "tslib": { 1689 | "version": "1.13.0", 1690 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1691 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" 1692 | }, 1693 | "type-is": { 1694 | "version": "1.6.18", 1695 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1696 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1697 | "requires": { 1698 | "media-typer": "0.3.0", 1699 | "mime-types": "~2.1.24" 1700 | } 1701 | }, 1702 | "unpipe": { 1703 | "version": "1.0.0", 1704 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1705 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1706 | }, 1707 | "util-deprecate": { 1708 | "version": "1.0.2", 1709 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1710 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1711 | }, 1712 | "util.promisify": { 1713 | "version": "1.0.1", 1714 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", 1715 | "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", 1716 | "requires": { 1717 | "define-properties": "^1.1.3", 1718 | "es-abstract": "^1.17.2", 1719 | "has-symbols": "^1.0.1", 1720 | "object.getownpropertydescriptors": "^2.1.0" 1721 | } 1722 | }, 1723 | "utils-merge": { 1724 | "version": "1.0.1", 1725 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1726 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1727 | }, 1728 | "uuid": { 1729 | "version": "8.3.0", 1730 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", 1731 | "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" 1732 | }, 1733 | "vary": { 1734 | "version": "1.1.2", 1735 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1736 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1737 | }, 1738 | "ws": { 1739 | "version": "6.2.1", 1740 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 1741 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 1742 | "requires": { 1743 | "async-limiter": "~1.0.0" 1744 | } 1745 | }, 1746 | "xss": { 1747 | "version": "1.0.8", 1748 | "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz", 1749 | "integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==", 1750 | "requires": { 1751 | "commander": "^2.20.3", 1752 | "cssfilter": "0.0.10" 1753 | } 1754 | }, 1755 | "yallist": { 1756 | "version": "3.1.1", 1757 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1758 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1759 | }, 1760 | "yup": { 1761 | "version": "0.29.3", 1762 | "resolved": "https://registry.npmjs.org/yup/-/yup-0.29.3.tgz", 1763 | "integrity": "sha512-RNUGiZ/sQ37CkhzKFoedkeMfJM0vNQyaz+wRZJzxdKE7VfDeVKH8bb4rr7XhRLbHJz5hSjoDNwMEIaKhuMZ8gQ==", 1764 | "requires": { 1765 | "@babel/runtime": "^7.10.5", 1766 | "fn-name": "~3.0.0", 1767 | "lodash": "^4.17.15", 1768 | "lodash-es": "^4.17.11", 1769 | "property-expr": "^2.0.2", 1770 | "synchronous-promise": "^2.0.13", 1771 | "toposort": "^2.0.2" 1772 | } 1773 | }, 1774 | "zen-observable": { 1775 | "version": "0.8.15", 1776 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 1777 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" 1778 | }, 1779 | "zen-observable-ts": { 1780 | "version": "0.8.21", 1781 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", 1782 | "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", 1783 | "requires": { 1784 | "tslib": "^1.9.3", 1785 | "zen-observable": "^0.8.0" 1786 | } 1787 | } 1788 | } 1789 | } 1790 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "posts-graph", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node -r esm .", 8 | "dev": "nodemon -r esm" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "apollo-server-express": "^2.17.0", 15 | "bcryptjs": "^2.4.3", 16 | "body-parser": "^1.19.0", 17 | "consola": "^2.15.0", 18 | "cors": "^2.8.5", 19 | "dotenv": "^8.2.0", 20 | "esm": "^3.2.25", 21 | "express": "^4.17.1", 22 | "graphql": "^15.3.0", 23 | "jsonwebtoken": "^8.5.1", 24 | "lodash": "^4.17.20", 25 | "mongoose": "^5.10.5", 26 | "mongoose-paginate-v2": "^1.3.9", 27 | "yup": "^0.29.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/config/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | config 3 | } from 'dotenv'; 4 | 5 | const { 6 | parsed 7 | } = config(); 8 | 9 | export const { 10 | DB, 11 | PORT, 12 | PROD, 13 | SECRET, 14 | IN_PROD = PROD === 'prod', 15 | BASE_URL = `http://localhost:${PORT}`, 16 | } = parsed; -------------------------------------------------------------------------------- /src/docs/Image.gql: -------------------------------------------------------------------------------- 1 | mutation UPLOAD_IMAGE($file: Upload!) { 2 | imageUploader(file: $file) 3 | } 4 | -------------------------------------------------------------------------------- /src/docs/Posts.gql: -------------------------------------------------------------------------------- 1 | # Muration to Create a new Post 2 | mutation NEW_POST( 3 | $title: String!, 4 | $content: String!, 5 | $featuredImage: String 6 | ) { 7 | createPost(newPost:{ 8 | title: $title, 9 | content: $content, 10 | featuredImage: $featuredImage 11 | }){ 12 | id 13 | title 14 | content, 15 | createdAt 16 | } 17 | } 18 | 19 | # Query to Fetch all the Posts 20 | query ALL_POSTS { 21 | allPosts{ 22 | id 23 | title 24 | content 25 | createdAt 26 | updatedAt 27 | } 28 | } 29 | 30 | # Query to Fetch single Post by ID 31 | query POST_BY_ID($id: ID!) { 32 | getPostById(id: $id) { 33 | title 34 | content 35 | createdAt 36 | updatedAt 37 | featuredImage 38 | author { 39 | id 40 | username 41 | firstName 42 | } 43 | } 44 | } 45 | 46 | # Mutation to Update the Post (Authentication Required) 47 | mutation UPDATE_POST_BY_ID($id: ID!, $title: String!, 48 | $content: String!, 49 | $featuredImage: String) { 50 | updatePost( 51 | id: $id 52 | updatedPost: { 53 | title: $title, 54 | content: $content, 55 | featuredImage: $featuredImage 56 | } 57 | ) { 58 | id 59 | title 60 | content 61 | featuredImage 62 | author { 63 | id 64 | username 65 | } 66 | } 67 | } 68 | 69 | # Get All Posts With Pagination 70 | # Get All Posts of a User by User ID (Optional) 71 | query GET_POSTS_BY_LIMIT_AND_PAGE( 72 | $page: Int, 73 | $limit: Int, 74 | $user_id: ID! 75 | ){ 76 | getPostsWithPagination( 77 | page: $page, 78 | limit: $limit, 79 | user_id: $user_id 80 | ){ 81 | posts{ 82 | id 83 | title 84 | content 85 | author{ 86 | id 87 | username 88 | firstName 89 | lastName 90 | } 91 | } 92 | paginator{ 93 | next 94 | prev 95 | slNo 96 | perPage 97 | totalPosts 98 | totalPages 99 | currentPage 100 | hasPrevPage 101 | hasNextPage 102 | } 103 | } 104 | } 105 | 106 | # Get All of the Authenticated User's Post 107 | 108 | 109 | query GET_ALL_MY_POSTS_WITH_PAGINATION{ 110 | getMyPostsWithPagination(page: 1, limit: 10){ 111 | posts{ 112 | id 113 | title 114 | content 115 | author{ 116 | id 117 | username 118 | firstName 119 | lastName 120 | } 121 | } 122 | paginator{ 123 | next 124 | prev 125 | slNo 126 | perPage 127 | totalPosts 128 | totalPages 129 | currentPage 130 | hasPrevPage 131 | hasNextPage 132 | } 133 | } 134 | } -------------------------------------------------------------------------------- /src/docs/Users.gql: -------------------------------------------------------------------------------- 1 | # Mutation to Register a new User in the Database 2 | mutation REGISTER_USER( 3 | $email: String!, 4 | $username: String!, 5 | $password: String!, 6 | $firstName: String!, 7 | $lastName: String!, 8 | ) { 9 | registerUser( 10 | newUser: { 11 | email: $email, 12 | username: $username, 13 | password: $password, 14 | lastName: $lastName, 15 | firstName: $firstName 16 | } 17 | ) { 18 | token 19 | user { 20 | id 21 | email 22 | username 23 | lastName 24 | firstName 25 | } 26 | } 27 | } 28 | 29 | # Query to Authenticate the User 30 | query LOGIN_USER ( 31 | $username: String!, 32 | $password: String! 33 | ) { 34 | loginUser( 35 | username: $username, 36 | password: $password 37 | ) { 38 | token 39 | user { 40 | id 41 | email 42 | firstName 43 | lastName 44 | } 45 | } 46 | } 47 | 48 | # Query to Fetch the Authenticated User by Token 49 | query AUTH_USER { 50 | authUser{ 51 | id 52 | lastName 53 | username 54 | firstName 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/graphql/directives/auth.directive.js: -------------------------------------------------------------------------------- 1 | import { 2 | defaultFieldResolver 3 | } from "graphql"; 4 | 5 | import { 6 | ApolloError, 7 | SchemaDirectiveVisitor 8 | } from 'apollo-server-express'; 9 | 10 | export class IsAuthDirective extends SchemaDirectiveVisitor { 11 | visitFieldDefinition(field) { 12 | const { 13 | resolve = defaultFieldResolver 14 | } = field; 15 | 16 | field.resolve = async function (...args) { 17 | let [_, {}, { 18 | user, 19 | isAuth 20 | }] = args; 21 | if (isAuth) { 22 | const result = await resolve.apply(this, args); 23 | return result; 24 | } else { 25 | throw new ApolloError( 26 | 'You must be the authenticated user to get this information' 27 | ); 28 | } 29 | }; 30 | } 31 | } -------------------------------------------------------------------------------- /src/graphql/directives/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | IsAuthDirective, 3 | } from './auth.directive'; 4 | 5 | export const schemaDirectives = { 6 | isAuth: IsAuthDirective, 7 | }; -------------------------------------------------------------------------------- /src/graphql/resolvers/image.js: -------------------------------------------------------------------------------- 1 | import { 2 | join, 3 | parse 4 | } from 'path'; 5 | 6 | import { 7 | mkdirSync, 8 | existsSync, 9 | createWriteStream 10 | } from 'fs'; 11 | 12 | import { 13 | BASE_URL 14 | } from '../../config'; 15 | 16 | import { 17 | ApolloError 18 | } from 'apollo-server-express'; 19 | 20 | export default { 21 | Query: { 22 | hello: () => "I am Image Upload Resolver." 23 | }, 24 | Mutation: { 25 | imageUploader: async (_, { 26 | file 27 | }) => { 28 | try { 29 | const { 30 | filename, 31 | createReadStream 32 | } = await file; 33 | 34 | let stream = createReadStream(); 35 | 36 | let { 37 | ext, 38 | name 39 | } = parse(filename); 40 | 41 | name = name.replace(/([^a-z0-9 ]+)/gi, '-').replace(' ', '_'); 42 | 43 | let serverFile = join( 44 | __dirname, `../../uploads/${name}-${Date.now()}${ext}` 45 | ); 46 | 47 | serverFile = serverFile.replace(' ', '_'); 48 | 49 | let writeStream = await createWriteStream(serverFile); 50 | 51 | await stream.pipe(writeStream); 52 | 53 | serverFile = `${BASE_URL}${serverFile.split('uploads')[1]}`; 54 | 55 | return serverFile; 56 | } catch (err) { 57 | throw new ApolloError(err.message); 58 | } 59 | }, 60 | } 61 | } -------------------------------------------------------------------------------- /src/graphql/resolvers/index.js: -------------------------------------------------------------------------------- 1 | import post from './post'; 2 | import user from './user'; 3 | import image from './image'; 4 | 5 | export default [ 6 | post, 7 | user, 8 | image 9 | ] -------------------------------------------------------------------------------- /src/graphql/resolvers/post.js: -------------------------------------------------------------------------------- 1 | import { 2 | NewPostRules 3 | } from '../../validations'; 4 | 5 | import { 6 | ApolloError 7 | } from 'apollo-server-express'; 8 | 9 | const PostLabels = { 10 | docs: 'posts', 11 | limit: 'perPage', 12 | nextPage: 'next', 13 | prevPage: 'prev', 14 | meta: 'paginator', 15 | page: 'currentPage', 16 | pagingCounter: 'slNo', 17 | totalDocs: 'totalPosts', 18 | totalPages: 'totalPages', 19 | }; 20 | 21 | export default { 22 | Query: { 23 | /** 24 | * @DESC to Get all the Posts 25 | * @Access Public 26 | */ 27 | allPosts: async (_, {}, { 28 | Post 29 | }) => { 30 | let posts = await Post.find().populate('author'); 31 | return posts; 32 | }, 33 | /** 34 | * @DESC to Get single the Post by ID 35 | * @Access Public 36 | */ 37 | getPostById: async (_, { 38 | id 39 | }, { 40 | Post 41 | }) => { 42 | let post = await Post.findById(id).populate('author'); 43 | return post; 44 | }, 45 | /** 46 | * @DESC to Get Posts by Pagination variables 47 | * @Access Public 48 | */ 49 | getPostsWithPagination: async (_, { 50 | page, 51 | limit, 52 | user_id 53 | }, { 54 | Post 55 | }) => { 56 | 57 | const options = { 58 | page: page || 1, 59 | limit: limit || 10, 60 | customLabels: PostLabels, 61 | sort: { 62 | createdAt: -1 63 | }, 64 | populate: 'author', 65 | }; 66 | 67 | let query = {}; 68 | if (user_id) { 69 | query = { 70 | author: user_id 71 | } 72 | } 73 | 74 | let posts = await Post.paginate(query, options); 75 | 76 | return posts; 77 | }, 78 | /** 79 | * @DESC to Get Posts by Pagination variables 80 | * @Access Public 81 | */ 82 | getMyPostsWithPagination: async (_, { 83 | page, 84 | limit 85 | }, { 86 | Post, 87 | user 88 | }) => { 89 | 90 | const options = { 91 | page: page || 1, 92 | limit: limit || 10, 93 | customLabels: PostLabels, 94 | sort: { 95 | createdAt: -1 96 | }, 97 | populate: 'author', 98 | }; 99 | 100 | let posts = await Post.paginate({ 101 | author: user.id 102 | }, options); 103 | 104 | return posts; 105 | } 106 | }, 107 | Mutation: { 108 | /** 109 | * @DESC to Create new Post 110 | * @Params newPost{ 111 | title!, 112 | content!, 113 | featuredImage 114 | } 115 | * @Access Private 116 | */ 117 | createPost: async (_, { 118 | newPost 119 | }, { 120 | Post, 121 | user 122 | }) => { 123 | const { 124 | title, 125 | content, 126 | } = newPost; 127 | 128 | // Validate the incoming new Post arguments 129 | await NewPostRules.validate({ 130 | title, 131 | content 132 | }, { 133 | abortEarly: false 134 | }); 135 | // Once the Validations are passed Create New Post 136 | const post = new Post({ 137 | ...newPost, 138 | author: user.id 139 | }); 140 | // Save the post 141 | let result = await post.save(); 142 | result = { 143 | ...result.toObject(), 144 | id: result._id.toString() 145 | } 146 | return result; 147 | }, 148 | /** 149 | * @DESC to Update an Existing Post by ID 150 | * @Params updatedPost { 151 | title!, 152 | content!, 153 | featuredImage 154 | } 155 | * @Access Private 156 | */ 157 | updatePost: async (_, { 158 | updatedPost, 159 | id, 160 | }, { 161 | Post, 162 | user 163 | }) => { 164 | try { 165 | let { 166 | title, 167 | content 168 | } = updatedPost; 169 | 170 | await NewPostRules.validate({ 171 | title, 172 | content 173 | }, { 174 | abortEarly: false 175 | }); 176 | 177 | let post = await Post 178 | .findOneAndUpdate({ 179 | _id: id, 180 | author: user.id 181 | }, 182 | updatedPost, { 183 | new: true 184 | } 185 | ); 186 | 187 | if (!post) { 188 | throw new Error("Unathorized Access"); 189 | } 190 | 191 | // Populate the Author Fields 192 | await post 193 | .populate('author') 194 | .execPopulate(); 195 | 196 | return post; 197 | } catch (err) { 198 | throw new ApolloError(err.message); 199 | } 200 | }, 201 | /** 202 | * @DESC to Delete an Existing Post by ID 203 | * @Params id! 204 | * @Access Private 205 | */ 206 | deletePost: async (_, { 207 | id, 208 | }, { 209 | Post, 210 | user 211 | }) => { 212 | try { 213 | let post = await Post.findOneAndDelete({ 214 | _id: id, 215 | author: user.id 216 | }); 217 | 218 | if (!post) { 219 | throw new Error("Unathorized Access"); 220 | } 221 | return { 222 | success: true, 223 | message: "Post Deleted Successfully." 224 | } 225 | } catch (err) { 226 | throw new ApolloError(err.message); 227 | } 228 | } 229 | } 230 | } -------------------------------------------------------------------------------- /src/graphql/resolvers/user.js: -------------------------------------------------------------------------------- 1 | import { 2 | hash, 3 | compare, 4 | } from 'bcryptjs'; 5 | 6 | import { 7 | ApolloError 8 | } from 'apollo-server-express'; 9 | 10 | import { 11 | serializeUser, 12 | issueAuthToken 13 | } from '../../helpers/Userfunctions'; 14 | 15 | import { 16 | UserRegisterationRules, 17 | UserAuthenticationRules, 18 | } from '../../validations'; 19 | 20 | export default { 21 | // Standarad User Query Property 22 | Query: { 23 | /** 24 | * @DESC to authenticate using parameters 25 | * @Params { username, password } 26 | * @Access Public 27 | */ 28 | loginUser: async (_, { 29 | username, 30 | password 31 | }, { 32 | User 33 | }) => { 34 | // Validate Incoming User Credentials 35 | await UserAuthenticationRules.validate({ username, password }, { abortEarly: false }); 36 | // Find the user from the database 37 | let user = await User.findOne({ 38 | username 39 | }); 40 | // If User is not found 41 | if (!user) { 42 | throw new ApolloError("Username not found", '404'); 43 | } 44 | // If user is found then compare the password 45 | let isMatch = compare(password, user.password); 46 | // If Password don't match 47 | if (!isMatch) { 48 | throw new ApolloError("Username not found", '403'); 49 | } 50 | user = await serializeUser(user); 51 | // Issue Token 52 | let token = await issueAuthToken(user); 53 | return { 54 | user, 55 | token, 56 | } 57 | }, 58 | /** 59 | * @DESC to get the authenticated User 60 | * @Headers Authorization 61 | * @Access Private 62 | */ 63 | authUser: (_, __, { 64 | req: { 65 | user 66 | } 67 | }) => user, 68 | }, 69 | // Standarad User Mutation Property 70 | Mutation: { 71 | /** 72 | * @DESC to Register new user 73 | * @Params newUser{ username, firstName, lastName, email, password } 74 | * @Access Public 75 | */ 76 | registerUser: async (_, { 77 | newUser 78 | }, { 79 | User 80 | }) => { 81 | try { 82 | 83 | let { 84 | email, 85 | username 86 | } = newUser; 87 | 88 | // Validate Incoming New User Arguments 89 | await UserRegisterationRules.validate(newUser, {abortEarly: false}); 90 | 91 | // Check if the Username is taken 92 | let user = await User.findOne({ 93 | username 94 | }); 95 | if (user) { 96 | throw new ApolloError('Username is already taken.', '403') 97 | } 98 | 99 | // Check is the Email address is already registred 100 | user = await User.findOne({ 101 | email 102 | }); 103 | if (user) { 104 | throw new ApolloError('Email is already registred.', '403') 105 | } 106 | 107 | // New User's Account can be created 108 | user = new User(newUser); 109 | 110 | // Hash the user password 111 | user.password = await hash(user.password, 10); 112 | 113 | // Save the user to the database 114 | let result = await user.save(); 115 | result = await serializeUser(result); 116 | // Issue Token 117 | let token = await issueAuthToken(result); 118 | return { 119 | token, 120 | user: result 121 | } 122 | } catch (err) { 123 | throw new ApolloError(err.message); 124 | } 125 | } 126 | } 127 | } -------------------------------------------------------------------------------- /src/graphql/typeDefs/baseDefs.js: -------------------------------------------------------------------------------- 1 | import { 2 | gql 3 | } from 'apollo-server-express'; 4 | 5 | export default gql ` 6 | directive @isAuth on FIELD_DEFINITION 7 | 8 | type Query { 9 | _:String 10 | } 11 | type Mutation{ 12 | _:String 13 | } 14 | type Subscription { 15 | _:String 16 | } 17 | `; -------------------------------------------------------------------------------- /src/graphql/typeDefs/image.js: -------------------------------------------------------------------------------- 1 | import { 2 | gql 3 | } from "apollo-server-express"; 4 | 5 | 6 | export default gql ` 7 | extend type Query { 8 | hello: String! 9 | } 10 | 11 | extend type Mutation { 12 | imageUploader(file: Upload!): String! @isAuth 13 | } 14 | 15 | ` -------------------------------------------------------------------------------- /src/graphql/typeDefs/index.js: -------------------------------------------------------------------------------- 1 | import baseDefs from './baseDefs'; 2 | import image from './image'; 3 | import post from './post'; 4 | import user from './user'; 5 | 6 | export default [ 7 | post, 8 | user, 9 | image, 10 | baseDefs, 11 | ]; -------------------------------------------------------------------------------- /src/graphql/typeDefs/post.js: -------------------------------------------------------------------------------- 1 | import { 2 | gql 3 | } from 'apollo-server-express'; 4 | 5 | export default gql ` 6 | extend type Query { 7 | allPosts: [Post!]! 8 | getPostById(id: ID!): Post! 9 | getMyPostsWithPagination(page: Int, limit: Int): PostPaginator! 10 | getPostsWithPagination(page: Int, limit: Int, user_id: ID): PostPaginator! 11 | } 12 | 13 | extend type Mutation { 14 | createPost(newPost: PostInput): Post! @isAuth 15 | deletePost(id: ID!): PostMessageResponse! @isAuth 16 | updatePost(updatedPost: PostInput, id: ID!): Post! @isAuth 17 | } 18 | 19 | input PostInput { 20 | title: String! 21 | content: String! 22 | featuredImage: String 23 | } 24 | 25 | type PostMessageResponse { 26 | message: String! 27 | success: Boolean 28 | } 29 | 30 | type PostPaginator { 31 | posts: [Post!]! 32 | paginator: Paginator! 33 | } 34 | 35 | type Paginator { 36 | slNo: Int 37 | prev: Int 38 | next: Int 39 | perPage: Int 40 | totalPosts: Int 41 | totalPages: Int 42 | currentPage: Int 43 | hasPrevPage: Boolean 44 | hasNextPage: Boolean 45 | } 46 | 47 | type Post { 48 | id: ID!, 49 | author: User! 50 | title: String! 51 | content: String! 52 | createdAt: String! 53 | updatedAt: String! 54 | featuredImage: String 55 | } 56 | ` -------------------------------------------------------------------------------- /src/graphql/typeDefs/user.js: -------------------------------------------------------------------------------- 1 | import { 2 | gql 3 | } from "apollo-server-express"; 4 | 5 | export default gql ` 6 | extend type Query { 7 | authUser: User! @isAuth 8 | loginUser(username: String!, password: String!):AuthUser! 9 | } 10 | 11 | extend type Mutation { 12 | registerUser(newUser: UserInput!): AuthUser! 13 | } 14 | 15 | input UserInput { 16 | email:String! 17 | username:String! 18 | lastName: String! 19 | password: String! 20 | firstName: String! 21 | } 22 | 23 | type User { 24 | id: ID! 25 | email:String! 26 | username:String! 27 | lastName: String! 28 | firstName: String! 29 | createdAt: String 30 | updatedAt: String 31 | } 32 | 33 | type AuthUser { 34 | user: User! 35 | token:String! 36 | } 37 | `; -------------------------------------------------------------------------------- /src/helpers/Userfunctions.js: -------------------------------------------------------------------------------- 1 | import { 2 | pick 3 | } from 'lodash'; 4 | 5 | import { 6 | sign, 7 | } from 'jsonwebtoken'; 8 | 9 | import { 10 | SECRET 11 | } from '../config'; 12 | 13 | export const issueAuthToken = async (jwtPayload) => { 14 | let token = await sign(jwtPayload, SECRET, { 15 | expiresIn: 3600*24 16 | }); 17 | return `Bearer ${token}`; 18 | }; 19 | 20 | export const serializeUser = user => pick(user, [ 21 | 'id', 22 | 'email', 23 | 'username', 24 | 'lastName', 25 | 'firstName', 26 | ]); -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | join 3 | } from 'path'; 4 | import { 5 | error, 6 | success, 7 | } from 'consola'; 8 | import { 9 | DB, 10 | PORT, 11 | IN_PROD 12 | } from './config'; 13 | import { 14 | ApolloServer, 15 | } from 'apollo-server-express'; 16 | import { 17 | schemaDirectives 18 | } from './graphql/directives'; 19 | import express from 'express'; 20 | import mongoose from 'mongoose'; 21 | import bodyParser from 'body-parser'; 22 | import * as AppModels from './models'; 23 | import typeDefs from './graphql/typeDefs'; 24 | import resolvers from './graphql/resolvers'; 25 | import AuthMiddleware from './middlewares/auth'; 26 | 27 | const app = express(); 28 | // Remove x-powered-by header 29 | app.disable("x-powered-by"); 30 | app.use(AuthMiddleware); 31 | app.use(bodyParser.json()); 32 | 33 | // Set Express Static Directory 34 | app.use(express.static(join(__dirname, './uploads'))); 35 | 36 | // Define the Apollo-Server 37 | const server = new ApolloServer({ 38 | typeDefs, 39 | resolvers, 40 | schemaDirectives, 41 | playground: !IN_PROD, 42 | context: ({ 43 | req 44 | }) => { 45 | 46 | let { 47 | user, 48 | isAuth, 49 | } = req; 50 | 51 | return { 52 | req, 53 | user, 54 | isAuth, 55 | ...AppModels, 56 | }; 57 | } 58 | }); 59 | 60 | // Function to start express and apollo server 61 | const startApp = async () => { 62 | try { 63 | // Connect With MongoDB Database 64 | await mongoose.connect(DB, { 65 | useNewUrlParser: true, 66 | useFindAndModify: false, 67 | useUnifiedTopology: true, 68 | }); 69 | success({ 70 | badge: true, 71 | message: `Successfully connected with the database ${DB}`, 72 | }); 73 | 74 | // Apply Apollo-Express-Server Middlware to express application 75 | server.applyMiddleware({ 76 | app, 77 | cors: true 78 | }); 79 | 80 | // Start Listening on the Server 81 | app.listen(PORT, () => 82 | success({ 83 | badge: true, 84 | message: `🚀 Server ready at http://localhost:${PORT}${server.graphqlPath}`, 85 | }) 86 | ); 87 | } catch (err) { 88 | error({ 89 | badge: true, 90 | message: err.message 91 | }); 92 | } 93 | } 94 | 95 | // Invoke Start Application Function 96 | startApp(); -------------------------------------------------------------------------------- /src/middlewares/auth.js: -------------------------------------------------------------------------------- 1 | import { 2 | SECRET 3 | } from '../config'; 4 | 5 | import { 6 | User 7 | } from '../models'; 8 | 9 | import { 10 | verify 11 | } from 'jsonwebtoken'; 12 | 13 | 14 | /** 15 | * Custom User Authentication Middleware 16 | * Which Finds the user from the database using the request token 17 | */ 18 | const AuthMiddleware = async (req, res, next) => { 19 | // Extract Authorization Header 20 | const authHeader = req.get("Authorization"); 21 | if (!authHeader) { 22 | req.isAuth = false; 23 | return next(); 24 | } 25 | 26 | // Extract the token and check for token 27 | const token = authHeader.split(" ")[1]; 28 | if (!token || token === "") { 29 | req.isAuth = false; 30 | return next(); 31 | } 32 | 33 | // Verify the extracted token 34 | let decodedToken; 35 | try { 36 | decodedToken = verify(token, SECRET); 37 | } catch (err) { 38 | req.isAuth = false; 39 | return next(); 40 | } 41 | 42 | // If decoded token is null then set authentication of the request false 43 | if (!decodedToken) { 44 | req.isAuth = false; 45 | return next(); 46 | } 47 | 48 | // If the user has valid token then Find the user by decoded token's id 49 | let authUser = await User.findById(decodedToken.id); 50 | if (!authUser) { 51 | req.isAuth = false; 52 | return next(); 53 | } 54 | 55 | req.isAuth = true; 56 | req.user = authUser; 57 | return next(); 58 | } 59 | 60 | export default AuthMiddleware; -------------------------------------------------------------------------------- /src/models/Post.js: -------------------------------------------------------------------------------- 1 | import { 2 | model, 3 | Schema 4 | } from 'mongoose'; 5 | 6 | import Paginate from 'mongoose-paginate-v2'; 7 | 8 | const PostSchema = new Schema({ 9 | title: { 10 | type: String, 11 | required: true 12 | }, 13 | content: { 14 | type: String, 15 | required: true 16 | }, 17 | featuredImage: { 18 | type: String, 19 | required: false 20 | }, 21 | author: { 22 | ref: 'users', 23 | type: Schema.Types.ObjectId 24 | } 25 | }, { 26 | timestamps: true 27 | }); 28 | 29 | PostSchema.plugin(Paginate); 30 | 31 | const Post = model('posts', PostSchema); 32 | 33 | export default Post; -------------------------------------------------------------------------------- /src/models/User.js: -------------------------------------------------------------------------------- 1 | import { 2 | model, 3 | Schema 4 | } from 'mongoose'; 5 | 6 | const UserSchema = new Schema({ 7 | username: { 8 | type: String, 9 | required: true 10 | }, 11 | email: { 12 | type: String, 13 | required: true 14 | }, 15 | firstName: { 16 | type: String, 17 | required: true 18 | }, 19 | lastName: { 20 | type: String, 21 | required: true 22 | }, 23 | password: { 24 | type: String, 25 | required: true 26 | } 27 | }, { 28 | timestamps: true 29 | }); 30 | 31 | const User = model('users', UserSchema); 32 | 33 | export default User; -------------------------------------------------------------------------------- /src/models/index.js: -------------------------------------------------------------------------------- 1 | export { 2 | default as User 3 | } 4 | from './User'; 5 | 6 | export { 7 | default as Post 8 | } 9 | from './Post'; -------------------------------------------------------------------------------- /src/uploads/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nandymandy1/apollo-server-express-auth/90ded7a49203cd475ec9276c1eae2e36269c7d54/src/uploads/.gitkeep -------------------------------------------------------------------------------- /src/validations/index.js: -------------------------------------------------------------------------------- 1 | export * from './post'; 2 | export * from './user'; -------------------------------------------------------------------------------- /src/validations/post.js: -------------------------------------------------------------------------------- 1 | import * as yup from 'yup'; 2 | 3 | const title = yup 4 | .string() 5 | .required('Title of Blog is required.') 6 | .min(5, 'Title of the Blog should have atleast 5 characters.') 7 | .max(50, 'Title of the Blog should have atmost 50 characters.'); 8 | 9 | const content = yup 10 | .string() 11 | .required('Content of the Blog is required.') 12 | .min(20, 'Content of the Blog should have atleast 5 characters.') 13 | .max(3000, 'Content of the Blog should have atmost 3000 characters.'); 14 | 15 | export const NewPostRules = yup 16 | .object() 17 | .shape({ 18 | title, 19 | content, 20 | }); -------------------------------------------------------------------------------- /src/validations/user.js: -------------------------------------------------------------------------------- 1 | import * as yup from 'yup'; 2 | 3 | /** 4 | * USER MODEL Validation Rules 5 | */ 6 | 7 | const username = yup 8 | .string() 9 | .required('Username is required.') 10 | .min(5, 'Username should have atleast 5 characters.') 11 | .max(20, 'Username should have atmost 10 characters.') 12 | .matches(/^\w+$/, 'Should be alphanumeric.'); 13 | 14 | const firstName = yup 15 | .string() 16 | .required('First Name is required.') 17 | .min(3, 'First name should have atleast 3 characters.'); 18 | 19 | const lastName = yup 20 | .string() 21 | .required('Last name is required.') 22 | .min(3, 'Last name should have atleast 3 characters.'); 23 | 24 | const email = yup 25 | .string() 26 | .required('Email is required.') 27 | .email('This is invalid email.'); 28 | 29 | const password = yup 30 | .string() 31 | .required("Password is required.") 32 | .min(5, 'Password should have atleast 5 characters.') 33 | .max(10, 'Password should have atmost 10 characters.'); 34 | 35 | // User Registeration Validation Schema 36 | export const UserRegisterationRules = yup.object().shape({ 37 | username, 38 | password, 39 | firstName, 40 | lastName, 41 | email 42 | }); 43 | 44 | // User Authentication Validation Schema 45 | export const UserAuthenticationRules = yup.object().shape({ 46 | username, 47 | password 48 | }); --------------------------------------------------------------------------------