├── .gitignore ├── db.js ├── package-lock.json ├── package.json └── src ├── controllers ├── authController.js ├── getItemsController.js └── salesController.js ├── middlewares ├── validationAuth.js └── validationToken.js ├── routes ├── authRouter.js ├── index.js ├── itemsRouter.js ├── salesRouter.js └── utilsRouter.js ├── schemas ├── sanitizer.js ├── schemaSignIn.js └── schemaSignUp.js └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | /node_modules -------------------------------------------------------------------------------- /db.js: -------------------------------------------------------------------------------- 1 | import { MongoClient } from "mongodb"; 2 | import dotenv from "dotenv"; 3 | dotenv.config(); 4 | 5 | const mongoClient = new MongoClient(process.env.MONGO_URI); 6 | let db; 7 | await mongoClient.connect() 8 | db = mongoClient.db("myItems"); 9 | export default db; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-myitems", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@hapi/hoek": { 8 | "version": "9.2.1", 9 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", 10 | "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" 11 | }, 12 | "@hapi/topo": { 13 | "version": "5.1.0", 14 | "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", 15 | "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", 16 | "requires": { 17 | "@hapi/hoek": "^9.0.0" 18 | } 19 | }, 20 | "@mapbox/node-pre-gyp": { 21 | "version": "1.0.8", 22 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", 23 | "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", 24 | "requires": { 25 | "detect-libc": "^1.0.3", 26 | "https-proxy-agent": "^5.0.0", 27 | "make-dir": "^3.1.0", 28 | "node-fetch": "^2.6.5", 29 | "nopt": "^5.0.0", 30 | "npmlog": "^5.0.1", 31 | "rimraf": "^3.0.2", 32 | "semver": "^7.3.5", 33 | "tar": "^6.1.11" 34 | } 35 | }, 36 | "@sideway/address": { 37 | "version": "4.1.3", 38 | "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", 39 | "integrity": "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==", 40 | "requires": { 41 | "@hapi/hoek": "^9.0.0" 42 | } 43 | }, 44 | "@sideway/formula": { 45 | "version": "3.0.0", 46 | "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", 47 | "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" 48 | }, 49 | "@sideway/pinpoint": { 50 | "version": "2.0.0", 51 | "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", 52 | "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" 53 | }, 54 | "@types/node": { 55 | "version": "17.0.17", 56 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", 57 | "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==" 58 | }, 59 | "@types/webidl-conversions": { 60 | "version": "6.1.1", 61 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", 62 | "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" 63 | }, 64 | "@types/whatwg-url": { 65 | "version": "8.2.1", 66 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", 67 | "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", 68 | "requires": { 69 | "@types/node": "*", 70 | "@types/webidl-conversions": "*" 71 | } 72 | }, 73 | "abbrev": { 74 | "version": "1.1.1", 75 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 76 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 77 | }, 78 | "accepts": { 79 | "version": "1.3.8", 80 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 81 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 82 | "requires": { 83 | "mime-types": "~2.1.34", 84 | "negotiator": "0.6.3" 85 | } 86 | }, 87 | "agent-base": { 88 | "version": "6.0.2", 89 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 90 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 91 | "requires": { 92 | "debug": "4" 93 | }, 94 | "dependencies": { 95 | "debug": { 96 | "version": "4.3.3", 97 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 98 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 99 | "requires": { 100 | "ms": "2.1.2" 101 | } 102 | }, 103 | "ms": { 104 | "version": "2.1.2", 105 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 106 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 107 | } 108 | } 109 | }, 110 | "ansi-regex": { 111 | "version": "5.0.1", 112 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 113 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 114 | }, 115 | "aproba": { 116 | "version": "2.0.0", 117 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 118 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 119 | }, 120 | "are-we-there-yet": { 121 | "version": "2.0.0", 122 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 123 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 124 | "requires": { 125 | "delegates": "^1.0.0", 126 | "readable-stream": "^3.6.0" 127 | } 128 | }, 129 | "array-flatten": { 130 | "version": "1.1.1", 131 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 132 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 133 | }, 134 | "balanced-match": { 135 | "version": "1.0.2", 136 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 137 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 138 | }, 139 | "base64-js": { 140 | "version": "1.5.1", 141 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 142 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 143 | }, 144 | "bcrypt": { 145 | "version": "5.0.1", 146 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", 147 | "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==", 148 | "requires": { 149 | "@mapbox/node-pre-gyp": "^1.0.0", 150 | "node-addon-api": "^3.1.0" 151 | } 152 | }, 153 | "body-parser": { 154 | "version": "1.19.1", 155 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 156 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 157 | "requires": { 158 | "bytes": "3.1.1", 159 | "content-type": "~1.0.4", 160 | "debug": "2.6.9", 161 | "depd": "~1.1.2", 162 | "http-errors": "1.8.1", 163 | "iconv-lite": "0.4.24", 164 | "on-finished": "~2.3.0", 165 | "qs": "6.9.6", 166 | "raw-body": "2.4.2", 167 | "type-is": "~1.6.18" 168 | } 169 | }, 170 | "brace-expansion": { 171 | "version": "1.1.11", 172 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 173 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 174 | "requires": { 175 | "balanced-match": "^1.0.0", 176 | "concat-map": "0.0.1" 177 | } 178 | }, 179 | "bson": { 180 | "version": "4.6.1", 181 | "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", 182 | "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", 183 | "requires": { 184 | "buffer": "^5.6.0" 185 | } 186 | }, 187 | "buffer": { 188 | "version": "5.7.1", 189 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 190 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 191 | "requires": { 192 | "base64-js": "^1.3.1", 193 | "ieee754": "^1.1.13" 194 | } 195 | }, 196 | "buffer-equal-constant-time": { 197 | "version": "1.0.1", 198 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 199 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 200 | }, 201 | "bytes": { 202 | "version": "3.1.1", 203 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 204 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" 205 | }, 206 | "chownr": { 207 | "version": "2.0.0", 208 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 209 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" 210 | }, 211 | "color-support": { 212 | "version": "1.1.3", 213 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 214 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" 215 | }, 216 | "concat-map": { 217 | "version": "0.0.1", 218 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 219 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 220 | }, 221 | "console-control-strings": { 222 | "version": "1.1.0", 223 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 224 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 225 | }, 226 | "content-disposition": { 227 | "version": "0.5.4", 228 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 229 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 230 | "requires": { 231 | "safe-buffer": "5.2.1" 232 | } 233 | }, 234 | "content-type": { 235 | "version": "1.0.4", 236 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 237 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 238 | }, 239 | "cookie": { 240 | "version": "0.4.1", 241 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 242 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 243 | }, 244 | "cookie-signature": { 245 | "version": "1.0.6", 246 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 247 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 248 | }, 249 | "cors": { 250 | "version": "2.8.5", 251 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 252 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 253 | "requires": { 254 | "object-assign": "^4", 255 | "vary": "^1" 256 | } 257 | }, 258 | "dayjs": { 259 | "version": "1.10.7", 260 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", 261 | "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" 262 | }, 263 | "debug": { 264 | "version": "2.6.9", 265 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 266 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 267 | "requires": { 268 | "ms": "2.0.0" 269 | } 270 | }, 271 | "delegates": { 272 | "version": "1.0.0", 273 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 274 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 275 | }, 276 | "denque": { 277 | "version": "2.0.1", 278 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", 279 | "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" 280 | }, 281 | "depd": { 282 | "version": "1.1.2", 283 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 284 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 285 | }, 286 | "destroy": { 287 | "version": "1.0.4", 288 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 289 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 290 | }, 291 | "detect-libc": { 292 | "version": "1.0.3", 293 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 294 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 295 | }, 296 | "dotenv": { 297 | "version": "16.0.0", 298 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", 299 | "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" 300 | }, 301 | "ecdsa-sig-formatter": { 302 | "version": "1.0.11", 303 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 304 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 305 | "requires": { 306 | "safe-buffer": "^5.0.1" 307 | } 308 | }, 309 | "ee-first": { 310 | "version": "1.1.1", 311 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 312 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 313 | }, 314 | "emoji-regex": { 315 | "version": "8.0.0", 316 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 317 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 318 | }, 319 | "encodeurl": { 320 | "version": "1.0.2", 321 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 322 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 323 | }, 324 | "escape-html": { 325 | "version": "1.0.3", 326 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 327 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 328 | }, 329 | "etag": { 330 | "version": "1.8.1", 331 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 332 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 333 | }, 334 | "express": { 335 | "version": "4.17.2", 336 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 337 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 338 | "requires": { 339 | "accepts": "~1.3.7", 340 | "array-flatten": "1.1.1", 341 | "body-parser": "1.19.1", 342 | "content-disposition": "0.5.4", 343 | "content-type": "~1.0.4", 344 | "cookie": "0.4.1", 345 | "cookie-signature": "1.0.6", 346 | "debug": "2.6.9", 347 | "depd": "~1.1.2", 348 | "encodeurl": "~1.0.2", 349 | "escape-html": "~1.0.3", 350 | "etag": "~1.8.1", 351 | "finalhandler": "~1.1.2", 352 | "fresh": "0.5.2", 353 | "merge-descriptors": "1.0.1", 354 | "methods": "~1.1.2", 355 | "on-finished": "~2.3.0", 356 | "parseurl": "~1.3.3", 357 | "path-to-regexp": "0.1.7", 358 | "proxy-addr": "~2.0.7", 359 | "qs": "6.9.6", 360 | "range-parser": "~1.2.1", 361 | "safe-buffer": "5.2.1", 362 | "send": "0.17.2", 363 | "serve-static": "1.14.2", 364 | "setprototypeof": "1.2.0", 365 | "statuses": "~1.5.0", 366 | "type-is": "~1.6.18", 367 | "utils-merge": "1.0.1", 368 | "vary": "~1.1.2" 369 | } 370 | }, 371 | "finalhandler": { 372 | "version": "1.1.2", 373 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 374 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 375 | "requires": { 376 | "debug": "2.6.9", 377 | "encodeurl": "~1.0.2", 378 | "escape-html": "~1.0.3", 379 | "on-finished": "~2.3.0", 380 | "parseurl": "~1.3.3", 381 | "statuses": "~1.5.0", 382 | "unpipe": "~1.0.0" 383 | } 384 | }, 385 | "forwarded": { 386 | "version": "0.2.0", 387 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 388 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 389 | }, 390 | "fresh": { 391 | "version": "0.5.2", 392 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 393 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 394 | }, 395 | "fs-minipass": { 396 | "version": "2.1.0", 397 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 398 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 399 | "requires": { 400 | "minipass": "^3.0.0" 401 | } 402 | }, 403 | "fs.realpath": { 404 | "version": "1.0.0", 405 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 406 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 407 | }, 408 | "gauge": { 409 | "version": "3.0.2", 410 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", 411 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 412 | "requires": { 413 | "aproba": "^1.0.3 || ^2.0.0", 414 | "color-support": "^1.1.2", 415 | "console-control-strings": "^1.0.0", 416 | "has-unicode": "^2.0.1", 417 | "object-assign": "^4.1.1", 418 | "signal-exit": "^3.0.0", 419 | "string-width": "^4.2.3", 420 | "strip-ansi": "^6.0.1", 421 | "wide-align": "^1.1.2" 422 | } 423 | }, 424 | "glob": { 425 | "version": "7.2.0", 426 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 427 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 428 | "requires": { 429 | "fs.realpath": "^1.0.0", 430 | "inflight": "^1.0.4", 431 | "inherits": "2", 432 | "minimatch": "^3.0.4", 433 | "once": "^1.3.0", 434 | "path-is-absolute": "^1.0.0" 435 | } 436 | }, 437 | "has-unicode": { 438 | "version": "2.0.1", 439 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 440 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 441 | }, 442 | "html-entities": { 443 | "version": "2.3.2", 444 | "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", 445 | "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" 446 | }, 447 | "http-errors": { 448 | "version": "1.8.1", 449 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 450 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 451 | "requires": { 452 | "depd": "~1.1.2", 453 | "inherits": "2.0.4", 454 | "setprototypeof": "1.2.0", 455 | "statuses": ">= 1.5.0 < 2", 456 | "toidentifier": "1.0.1" 457 | } 458 | }, 459 | "https-proxy-agent": { 460 | "version": "5.0.0", 461 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 462 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 463 | "requires": { 464 | "agent-base": "6", 465 | "debug": "4" 466 | }, 467 | "dependencies": { 468 | "debug": { 469 | "version": "4.3.3", 470 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 471 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 472 | "requires": { 473 | "ms": "2.1.2" 474 | } 475 | }, 476 | "ms": { 477 | "version": "2.1.2", 478 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 479 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 480 | } 481 | } 482 | }, 483 | "iconv-lite": { 484 | "version": "0.4.24", 485 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 486 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 487 | "requires": { 488 | "safer-buffer": ">= 2.1.2 < 3" 489 | } 490 | }, 491 | "ieee754": { 492 | "version": "1.2.1", 493 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 494 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 495 | }, 496 | "inflight": { 497 | "version": "1.0.6", 498 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 499 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 500 | "requires": { 501 | "once": "^1.3.0", 502 | "wrappy": "1" 503 | } 504 | }, 505 | "inherits": { 506 | "version": "2.0.4", 507 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 508 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 509 | }, 510 | "ip": { 511 | "version": "1.1.5", 512 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 513 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 514 | }, 515 | "ipaddr.js": { 516 | "version": "1.9.1", 517 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 518 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 519 | }, 520 | "is-fullwidth-code-point": { 521 | "version": "3.0.0", 522 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 523 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 524 | }, 525 | "joi": { 526 | "version": "17.6.0", 527 | "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", 528 | "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", 529 | "requires": { 530 | "@hapi/hoek": "^9.0.0", 531 | "@hapi/topo": "^5.0.0", 532 | "@sideway/address": "^4.1.3", 533 | "@sideway/formula": "^3.0.0", 534 | "@sideway/pinpoint": "^2.0.0" 535 | } 536 | }, 537 | "jsonwebtoken": { 538 | "version": "8.5.1", 539 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 540 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 541 | "requires": { 542 | "jws": "^3.2.2", 543 | "lodash.includes": "^4.3.0", 544 | "lodash.isboolean": "^3.0.3", 545 | "lodash.isinteger": "^4.0.4", 546 | "lodash.isnumber": "^3.0.3", 547 | "lodash.isplainobject": "^4.0.6", 548 | "lodash.isstring": "^4.0.1", 549 | "lodash.once": "^4.0.0", 550 | "ms": "^2.1.1", 551 | "semver": "^5.6.0" 552 | }, 553 | "dependencies": { 554 | "ms": { 555 | "version": "2.1.3", 556 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 557 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 558 | }, 559 | "semver": { 560 | "version": "5.7.1", 561 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 562 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 563 | } 564 | } 565 | }, 566 | "jwa": { 567 | "version": "1.4.1", 568 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 569 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 570 | "requires": { 571 | "buffer-equal-constant-time": "1.0.1", 572 | "ecdsa-sig-formatter": "1.0.11", 573 | "safe-buffer": "^5.0.1" 574 | } 575 | }, 576 | "jws": { 577 | "version": "3.2.2", 578 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 579 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 580 | "requires": { 581 | "jwa": "^1.4.1", 582 | "safe-buffer": "^5.0.1" 583 | } 584 | }, 585 | "lodash.clonedeep": { 586 | "version": "4.5.0", 587 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 588 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" 589 | }, 590 | "lodash.includes": { 591 | "version": "4.3.0", 592 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 593 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 594 | }, 595 | "lodash.isboolean": { 596 | "version": "3.0.3", 597 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 598 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 599 | }, 600 | "lodash.isinteger": { 601 | "version": "4.0.4", 602 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 603 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 604 | }, 605 | "lodash.isnumber": { 606 | "version": "3.0.3", 607 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 608 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 609 | }, 610 | "lodash.isplainobject": { 611 | "version": "4.0.6", 612 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 613 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 614 | }, 615 | "lodash.isstring": { 616 | "version": "4.0.1", 617 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 618 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 619 | }, 620 | "lodash.once": { 621 | "version": "4.1.1", 622 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 623 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 624 | }, 625 | "lodash.trim": { 626 | "version": "4.5.1", 627 | "resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz", 628 | "integrity": "sha1-NkJefukL5KpeJ7zruFt9EepHqlc=" 629 | }, 630 | "lodash.without": { 631 | "version": "4.4.0", 632 | "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", 633 | "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" 634 | }, 635 | "lru-cache": { 636 | "version": "6.0.0", 637 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 638 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 639 | "requires": { 640 | "yallist": "^4.0.0" 641 | } 642 | }, 643 | "make-dir": { 644 | "version": "3.1.0", 645 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 646 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 647 | "requires": { 648 | "semver": "^6.0.0" 649 | }, 650 | "dependencies": { 651 | "semver": { 652 | "version": "6.3.0", 653 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 654 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 655 | } 656 | } 657 | }, 658 | "media-typer": { 659 | "version": "0.3.0", 660 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 661 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 662 | }, 663 | "memory-pager": { 664 | "version": "1.5.0", 665 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 666 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 667 | "optional": true 668 | }, 669 | "merge-descriptors": { 670 | "version": "1.0.1", 671 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 672 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 673 | }, 674 | "methods": { 675 | "version": "1.1.2", 676 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 677 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 678 | }, 679 | "mime": { 680 | "version": "1.6.0", 681 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 682 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 683 | }, 684 | "mime-db": { 685 | "version": "1.51.0", 686 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 687 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 688 | }, 689 | "mime-types": { 690 | "version": "2.1.34", 691 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 692 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 693 | "requires": { 694 | "mime-db": "1.51.0" 695 | } 696 | }, 697 | "minimatch": { 698 | "version": "3.0.5", 699 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", 700 | "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", 701 | "requires": { 702 | "brace-expansion": "^1.1.7" 703 | } 704 | }, 705 | "minipass": { 706 | "version": "3.1.6", 707 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", 708 | "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", 709 | "requires": { 710 | "yallist": "^4.0.0" 711 | } 712 | }, 713 | "minizlib": { 714 | "version": "2.1.2", 715 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 716 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 717 | "requires": { 718 | "minipass": "^3.0.0", 719 | "yallist": "^4.0.0" 720 | } 721 | }, 722 | "mkdirp": { 723 | "version": "1.0.4", 724 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 725 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 726 | }, 727 | "mongodb": { 728 | "version": "4.3.1", 729 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.3.1.tgz", 730 | "integrity": "sha512-sNa8APSIk+r4x31ZwctKjuPSaeKuvUeNb/fu/3B6dRM02HpEgig7hTHM8A/PJQTlxuC/KFWlDlQjhsk/S43tBg==", 731 | "requires": { 732 | "bson": "^4.6.1", 733 | "denque": "^2.0.1", 734 | "mongodb-connection-string-url": "^2.4.1", 735 | "saslprep": "^1.0.3", 736 | "socks": "^2.6.1" 737 | } 738 | }, 739 | "mongodb-connection-string-url": { 740 | "version": "2.4.2", 741 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.2.tgz", 742 | "integrity": "sha512-mZUXF6nUzRWk5J3h41MsPv13ukWlH4jOMSk6astVeoZ1EbdTJyF5I3wxKkvqBAOoVtzLgyEYUvDjrGdcPlKjAw==", 743 | "requires": { 744 | "@types/whatwg-url": "^8.2.1", 745 | "whatwg-url": "^11.0.0" 746 | } 747 | }, 748 | "ms": { 749 | "version": "2.0.0", 750 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 751 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 752 | }, 753 | "negotiator": { 754 | "version": "0.6.3", 755 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 756 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 757 | }, 758 | "node-addon-api": { 759 | "version": "3.2.1", 760 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", 761 | "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" 762 | }, 763 | "node-fetch": { 764 | "version": "2.6.7", 765 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 766 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 767 | "requires": { 768 | "whatwg-url": "^5.0.0" 769 | }, 770 | "dependencies": { 771 | "tr46": { 772 | "version": "0.0.3", 773 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 774 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 775 | }, 776 | "webidl-conversions": { 777 | "version": "3.0.1", 778 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 779 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 780 | }, 781 | "whatwg-url": { 782 | "version": "5.0.0", 783 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 784 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 785 | "requires": { 786 | "tr46": "~0.0.3", 787 | "webidl-conversions": "^3.0.0" 788 | } 789 | } 790 | } 791 | }, 792 | "nopt": { 793 | "version": "5.0.0", 794 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 795 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 796 | "requires": { 797 | "abbrev": "1" 798 | } 799 | }, 800 | "npmlog": { 801 | "version": "5.0.1", 802 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", 803 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 804 | "requires": { 805 | "are-we-there-yet": "^2.0.0", 806 | "console-control-strings": "^1.1.0", 807 | "gauge": "^3.0.0", 808 | "set-blocking": "^2.0.0" 809 | } 810 | }, 811 | "object-assign": { 812 | "version": "4.1.1", 813 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 814 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 815 | }, 816 | "on-finished": { 817 | "version": "2.3.0", 818 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 819 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 820 | "requires": { 821 | "ee-first": "1.1.1" 822 | } 823 | }, 824 | "once": { 825 | "version": "1.4.0", 826 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 827 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 828 | "requires": { 829 | "wrappy": "1" 830 | } 831 | }, 832 | "parseurl": { 833 | "version": "1.3.3", 834 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 835 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 836 | }, 837 | "path-is-absolute": { 838 | "version": "1.0.1", 839 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 840 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 841 | }, 842 | "path-to-regexp": { 843 | "version": "0.1.7", 844 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 845 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 846 | }, 847 | "proxy-addr": { 848 | "version": "2.0.7", 849 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 850 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 851 | "requires": { 852 | "forwarded": "0.2.0", 853 | "ipaddr.js": "1.9.1" 854 | } 855 | }, 856 | "punycode": { 857 | "version": "2.1.1", 858 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 859 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 860 | }, 861 | "qs": { 862 | "version": "6.9.6", 863 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 864 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" 865 | }, 866 | "range-parser": { 867 | "version": "1.2.1", 868 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 869 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 870 | }, 871 | "ranges-apply": { 872 | "version": "6.0.12", 873 | "resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-6.0.12.tgz", 874 | "integrity": "sha512-uLCboDelwCftR4/QeHPHw+YDZf9bFJssgUNyw3q22WB4foBiozc9dzE5lh1as04NTL7zMGWdmff4TqKX7eq/Ag==", 875 | "requires": { 876 | "ranges-merge": "^8.0.12", 877 | "tiny-invariant": "^1.2.0" 878 | } 879 | }, 880 | "ranges-merge": { 881 | "version": "8.0.12", 882 | "resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-8.0.12.tgz", 883 | "integrity": "sha512-rYrql9CEh32JUfVnKH600fC8KE4hlhLuhDoqXIXopqT4mFyFhrer+Hj+aMQpSqe34MK+1dZ5SxymnKerNgC37g==", 884 | "requires": { 885 | "ranges-push": "^6.0.12", 886 | "ranges-sort": "^5.0.12" 887 | } 888 | }, 889 | "ranges-push": { 890 | "version": "6.0.12", 891 | "resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-6.0.12.tgz", 892 | "integrity": "sha512-THUoFJyZUXl/KdWAKyMYaQ4vJBAmTyv4uz9j2EHpVwzetZdMUjdDUizO0nROGyh5pHEnb+wXmkPYYjBZEl08uQ==", 893 | "requires": { 894 | "string-collapse-leading-whitespace": "^6.0.12", 895 | "string-trim-spaces-only": "^4.0.12" 896 | } 897 | }, 898 | "ranges-sort": { 899 | "version": "5.0.12", 900 | "resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-5.0.12.tgz", 901 | "integrity": "sha512-/tCfYzEFrdNc4bpyPrXeVubkZCpIABzwyZXVH/x2H+tXnZEs+A/yk6shQEaBa5QUN+zyMzW2bTVoNkwM0TWKSQ==" 902 | }, 903 | "raw-body": { 904 | "version": "2.4.2", 905 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 906 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 907 | "requires": { 908 | "bytes": "3.1.1", 909 | "http-errors": "1.8.1", 910 | "iconv-lite": "0.4.24", 911 | "unpipe": "1.0.0" 912 | } 913 | }, 914 | "readable-stream": { 915 | "version": "3.6.0", 916 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 917 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 918 | "requires": { 919 | "inherits": "^2.0.3", 920 | "string_decoder": "^1.1.1", 921 | "util-deprecate": "^1.0.1" 922 | } 923 | }, 924 | "rimraf": { 925 | "version": "3.0.2", 926 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 927 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 928 | "requires": { 929 | "glob": "^7.1.3" 930 | } 931 | }, 932 | "safe-buffer": { 933 | "version": "5.2.1", 934 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 935 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 936 | }, 937 | "safer-buffer": { 938 | "version": "2.1.2", 939 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 940 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 941 | }, 942 | "saslprep": { 943 | "version": "1.0.3", 944 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 945 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 946 | "optional": true, 947 | "requires": { 948 | "sparse-bitfield": "^3.0.3" 949 | } 950 | }, 951 | "semver": { 952 | "version": "7.3.5", 953 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 954 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 955 | "requires": { 956 | "lru-cache": "^6.0.0" 957 | } 958 | }, 959 | "send": { 960 | "version": "0.17.2", 961 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 962 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 963 | "requires": { 964 | "debug": "2.6.9", 965 | "depd": "~1.1.2", 966 | "destroy": "~1.0.4", 967 | "encodeurl": "~1.0.2", 968 | "escape-html": "~1.0.3", 969 | "etag": "~1.8.1", 970 | "fresh": "0.5.2", 971 | "http-errors": "1.8.1", 972 | "mime": "1.6.0", 973 | "ms": "2.1.3", 974 | "on-finished": "~2.3.0", 975 | "range-parser": "~1.2.1", 976 | "statuses": "~1.5.0" 977 | }, 978 | "dependencies": { 979 | "ms": { 980 | "version": "2.1.3", 981 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 982 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 983 | } 984 | } 985 | }, 986 | "serve-static": { 987 | "version": "1.14.2", 988 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 989 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 990 | "requires": { 991 | "encodeurl": "~1.0.2", 992 | "escape-html": "~1.0.3", 993 | "parseurl": "~1.3.3", 994 | "send": "0.17.2" 995 | } 996 | }, 997 | "set-blocking": { 998 | "version": "2.0.0", 999 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1000 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1001 | }, 1002 | "setprototypeof": { 1003 | "version": "1.2.0", 1004 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1005 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1006 | }, 1007 | "signal-exit": { 1008 | "version": "3.0.7", 1009 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1010 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1011 | }, 1012 | "smart-buffer": { 1013 | "version": "4.2.0", 1014 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1015 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" 1016 | }, 1017 | "socks": { 1018 | "version": "2.6.2", 1019 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", 1020 | "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", 1021 | "requires": { 1022 | "ip": "^1.1.5", 1023 | "smart-buffer": "^4.2.0" 1024 | } 1025 | }, 1026 | "sparse-bitfield": { 1027 | "version": "3.0.3", 1028 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1029 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1030 | "optional": true, 1031 | "requires": { 1032 | "memory-pager": "^1.0.2" 1033 | } 1034 | }, 1035 | "statuses": { 1036 | "version": "1.5.0", 1037 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1038 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1039 | }, 1040 | "string-collapse-leading-whitespace": { 1041 | "version": "6.0.12", 1042 | "resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-6.0.12.tgz", 1043 | "integrity": "sha512-FKZOQgRgaEw1w0CydQAKQFyJ8n8CC6NaPqWlsJXa4uWtoUUK7da87k4GiFi5ulBfe/Ipp2Md6+afyho+SvydfQ==" 1044 | }, 1045 | "string-left-right": { 1046 | "version": "5.0.12", 1047 | "resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-5.0.12.tgz", 1048 | "integrity": "sha512-0EneSGwpThkbBpcwvcpHf7OXnwLUa+n6Z3MIwjcqrjyaVD8TyE94pNxivNAcCD4Py5FuRecgqNSv9vWMqrPtgQ==", 1049 | "requires": { 1050 | "lodash.clonedeep": "^4.5.0", 1051 | "lodash.isplainobject": "^4.0.6" 1052 | } 1053 | }, 1054 | "string-strip-html": { 1055 | "version": "9.1.6", 1056 | "resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-9.1.6.tgz", 1057 | "integrity": "sha512-yBGxCHloEGbAqaa1RdBo51qyW0rHZo5wMkz2taJHmLsWJ4rdAA1IKgj7B+sQrCeRgr1af99zONKba2FoEtw6AQ==", 1058 | "requires": { 1059 | "html-entities": "^2.3.2", 1060 | "lodash.isplainobject": "^4.0.6", 1061 | "lodash.trim": "^4.5.1", 1062 | "lodash.without": "^4.4.0", 1063 | "ranges-apply": "^6.0.12", 1064 | "ranges-push": "^6.0.12", 1065 | "string-left-right": "^5.0.12" 1066 | } 1067 | }, 1068 | "string-trim-spaces-only": { 1069 | "version": "4.0.12", 1070 | "resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-4.0.12.tgz", 1071 | "integrity": "sha512-NbO7lUymVMheLnxZobLqRdzIvN5jLr+cPI6xTlytD2n1UTM35TUlUhHX51rswGFQBuWFTbKhTHycYvBb0qOZ3g==" 1072 | }, 1073 | "string-width": { 1074 | "version": "4.2.3", 1075 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1076 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1077 | "requires": { 1078 | "emoji-regex": "^8.0.0", 1079 | "is-fullwidth-code-point": "^3.0.0", 1080 | "strip-ansi": "^6.0.1" 1081 | } 1082 | }, 1083 | "string_decoder": { 1084 | "version": "1.3.0", 1085 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1086 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1087 | "requires": { 1088 | "safe-buffer": "~5.2.0" 1089 | } 1090 | }, 1091 | "strip-ansi": { 1092 | "version": "6.0.1", 1093 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1094 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1095 | "requires": { 1096 | "ansi-regex": "^5.0.1" 1097 | } 1098 | }, 1099 | "tar": { 1100 | "version": "6.1.11", 1101 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", 1102 | "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", 1103 | "requires": { 1104 | "chownr": "^2.0.0", 1105 | "fs-minipass": "^2.0.0", 1106 | "minipass": "^3.0.0", 1107 | "minizlib": "^2.1.1", 1108 | "mkdirp": "^1.0.3", 1109 | "yallist": "^4.0.0" 1110 | } 1111 | }, 1112 | "tiny-invariant": { 1113 | "version": "1.2.0", 1114 | "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", 1115 | "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" 1116 | }, 1117 | "toidentifier": { 1118 | "version": "1.0.1", 1119 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1120 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1121 | }, 1122 | "tr46": { 1123 | "version": "3.0.0", 1124 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 1125 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 1126 | "requires": { 1127 | "punycode": "^2.1.1" 1128 | } 1129 | }, 1130 | "type-is": { 1131 | "version": "1.6.18", 1132 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1133 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1134 | "requires": { 1135 | "media-typer": "0.3.0", 1136 | "mime-types": "~2.1.24" 1137 | } 1138 | }, 1139 | "unpipe": { 1140 | "version": "1.0.0", 1141 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1142 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1143 | }, 1144 | "util-deprecate": { 1145 | "version": "1.0.2", 1146 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1147 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1148 | }, 1149 | "utils-merge": { 1150 | "version": "1.0.1", 1151 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1152 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1153 | }, 1154 | "vary": { 1155 | "version": "1.1.2", 1156 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1157 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1158 | }, 1159 | "webidl-conversions": { 1160 | "version": "7.0.0", 1161 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1162 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" 1163 | }, 1164 | "whatwg-url": { 1165 | "version": "11.0.0", 1166 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 1167 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 1168 | "requires": { 1169 | "tr46": "^3.0.0", 1170 | "webidl-conversions": "^7.0.0" 1171 | } 1172 | }, 1173 | "wide-align": { 1174 | "version": "1.1.5", 1175 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 1176 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 1177 | "requires": { 1178 | "string-width": "^1.0.2 || 2 || 3 || 4" 1179 | } 1180 | }, 1181 | "wrappy": { 1182 | "version": "1.0.2", 1183 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1184 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1185 | }, 1186 | "yallist": { 1187 | "version": "4.0.0", 1188 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1189 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1190 | } 1191 | } 1192 | } 1193 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-myitems", 3 | "type": "module", 4 | "version": "1.0.0", 5 | "description": "", 6 | "main": "index.js", 7 | "scripts": { 8 | "dev": "npx nodemon src/server.js", 9 | "start": "node src/server.js" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "bcrypt": "^5.0.1", 16 | "cors": "^2.8.5", 17 | "dayjs": "^1.10.7", 18 | "dotenv": "^16.0.0", 19 | "express": "^4.17.2", 20 | "joi": "^17.6.0", 21 | "jsonwebtoken": "^8.5.1", 22 | "mongodb": "^4.3.1", 23 | "string-strip-html": "^9.1.6" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/controllers/authController.js: -------------------------------------------------------------------------------- 1 | import db from "../../db.js"; 2 | import bcrypt from 'bcrypt' 3 | import jwt from "jsonwebtoken" 4 | 5 | export async function signUp(req, res) { 6 | 7 | const userData = res.locals.user 8 | const alreadyInDB = await db.collection("users").findOne({userData}) 9 | if(alreadyInDB){ 10 | return res.sendStatus(409) 11 | } 12 | 13 | try { 14 | const passwordHash = bcrypt.hashSync(userData.password, parseInt(process.env.DIF)); 15 | await db.collection("users").insertOne({ ...userData, password: passwordHash }); 16 | res.sendStatus(201); 17 | 18 | } catch (error) { 19 | console.log(error) 20 | res.sendStatus(500) 21 | } 22 | 23 | 24 | } 25 | 26 | export async function signIn(req, res) { 27 | const user = res.locals.user 28 | 29 | try { 30 | const participant = await db.collection("users").findOne({email:user.email}) 31 | 32 | if(participant && bcrypt.compareSync(user.password, participant.password)){ 33 | let session = await db.collection("sessions").findOne({userId: participant._id}) 34 | 35 | if(!session){ 36 | await db.collection("sessions").insertOne({ 37 | userId: participant._id 38 | }) 39 | session = await db.collection("sessions").findOne({userId: participant._id}) 40 | } 41 | 42 | const data = { session: session._id }; 43 | const secretkey = process.env.JWT_SECRET; 44 | const token = jwt.sign(data, secretkey); 45 | 46 | return res.status(200).send(token); 47 | }else{ 48 | return res.status(401).send("Participante não existe") 49 | } 50 | } catch (error) { 51 | res.status(500).send(error.message) 52 | } 53 | } -------------------------------------------------------------------------------- /src/controllers/getItemsController.js: -------------------------------------------------------------------------------- 1 | import db from "../../db.js" 2 | export async function getItems(req,res){ 3 | let page = req.query.page; 4 | console.log(page) 5 | try{ 6 | let totalCount = await db.collection("items").count(); 7 | if(page){ 8 | let items = await db.collection("items").find().sort({$natural:1}).limit(9).skip(page*9).toArray(); 9 | return res.send({items,total:totalCount}) 10 | } 11 | let items = await db.collection("items").find().sort({$natural:1}).toArray(); 12 | return res.send(items) 13 | }catch(e){ 14 | console.log(e) 15 | res.status(501).send({msg:"Erro no banco de dados"}) 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /src/controllers/salesController.js: -------------------------------------------------------------------------------- 1 | import db from "../../db.js"; 2 | 3 | export async function resgisterSales(req, res) { 4 | 5 | const userData = res.locals.user 6 | 7 | 8 | 9 | try { 10 | 11 | await db.collection("sales").insertOne( {buyer : userData._id , boughtItems : req.body}); 12 | res.sendStatus(201); 13 | 14 | } catch (error) { 15 | console.log(error) 16 | res.sendStatus(500) 17 | } 18 | 19 | 20 | } -------------------------------------------------------------------------------- /src/middlewares/validationAuth.js: -------------------------------------------------------------------------------- 1 | import sanitizeData from "../schemas/sanitizer.js"; 2 | import schemaSignUp from "../schemas/schemaSignUp.js" 3 | import signInSchema from "../schemas/schemaSignIn.js" 4 | 5 | 6 | 7 | 8 | export async function validateSchemaSignUp(req, res, next){ 9 | const validation = schemaSignUp.validate(req.body) 10 | 11 | if (validation.error) { 12 | res.status(422).send(validation.error.details) 13 | return; 14 | } 15 | 16 | res.locals.user = { 17 | firstname : sanitizeData(req.body.firstname), 18 | lastname : sanitizeData(req.body.lastname), 19 | email : sanitizeData(req.body.email), 20 | password : sanitizeData(req.body.password) 21 | } 22 | 23 | next() 24 | } 25 | 26 | export async function validateSchemaSignIn(req, res, next){ 27 | const validation = signInSchema.validate(req.body) 28 | 29 | if (validation.error) { 30 | res.status(422).send(validation.error.details) 31 | return; 32 | } 33 | 34 | res.locals.user = { 35 | email : sanitizeData(req.body.email), 36 | password : sanitizeData(req.body.password) 37 | } 38 | 39 | next() 40 | 41 | } -------------------------------------------------------------------------------- /src/middlewares/validationToken.js: -------------------------------------------------------------------------------- 1 | import db from "../../db.js" 2 | import jwt from 'jsonwebtoken'; 3 | import { ObjectId } from "mongodb" 4 | 5 | export default async function validateTokenMiddleware(req, res, next){ 6 | try { 7 | const token = req.headers.authorization?.replace("Bearer ", "") 8 | 9 | if(!token) return res.sendStatus(401) 10 | 11 | const {session} = jwt.verify(token, process.env.JWT_SECRET); 12 | 13 | const userSession = await db.collection("sessions").findOne({_id:new ObjectId(session)}) 14 | if(!userSession) return res.sendStatus(401) 15 | 16 | const user = await db.collection("users").findOne({_id:userSession.userId}) 17 | if(!user) return res.sendStatus(401) 18 | 19 | res.locals.user = user 20 | 21 | next() 22 | } catch (error) { 23 | res.status(500).send(error); 24 | } 25 | } -------------------------------------------------------------------------------- /src/routes/authRouter.js: -------------------------------------------------------------------------------- 1 | 2 | import express from 'express'; 3 | import { signUp, signIn } from '../controllers/authController.js'; 4 | import { validateSchemaSignIn, validateSchemaSignUp } from '../middlewares/validationAuth.js'; 5 | 6 | 7 | const authRouter = express.Router() 8 | 9 | authRouter.post("/sign-up", validateSchemaSignUp ,signUp); 10 | authRouter.post("/sign-in", validateSchemaSignIn, signIn) 11 | 12 | export default authRouter -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- 1 | import authRouter from './authRouter.js'; 2 | import utilRouter from './utilsRouter.js'; 3 | import itemsRouter from './itemsRouter.js'; 4 | import salesRouter from './salesRouter.js'; 5 | import express from 'express'; 6 | 7 | const router = express.Router() 8 | router.use(authRouter) 9 | router.use(utilRouter) 10 | router.use(itemsRouter) 11 | router.use(salesRouter) 12 | export default router; -------------------------------------------------------------------------------- /src/routes/itemsRouter.js: -------------------------------------------------------------------------------- 1 | import express, { Router } from "express"; 2 | import { getItems } from "../controllers/getItemsController.js"; 3 | const itemsRouter = Router(); 4 | 5 | itemsRouter.get("/items",getItems) 6 | 7 | 8 | 9 | export default itemsRouter; -------------------------------------------------------------------------------- /src/routes/salesRouter.js: -------------------------------------------------------------------------------- 1 | import express, { Router } from "express"; 2 | import { resgisterSales } from "../controllers/salesController.js"; 3 | import validateTokenMiddleware from "../middlewares/validationToken.js"; 4 | const salesRouter = Router(); 5 | 6 | salesRouter.post("/sale", validateTokenMiddleware , resgisterSales ) 7 | 8 | 9 | 10 | export default salesRouter; -------------------------------------------------------------------------------- /src/routes/utilsRouter.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import db from '../../db.js'; 3 | 4 | const utilRouter = express.Router() 5 | 6 | utilRouter.post("/db" , (req, res) => { 7 | const data = req.body.data 8 | 9 | data.map(async (item) => { 10 | try { 11 | await db.collection("items").insertOne({marketName : item.market_name , image : item.image, price: item.prices.avg}) 12 | 13 | } catch (error) { 14 | console.log(error) 15 | } 16 | } ) 17 | res.sendStatus(200) 18 | }); 19 | 20 | export default utilRouter -------------------------------------------------------------------------------- /src/schemas/sanitizer.js: -------------------------------------------------------------------------------- 1 | import { stripHtml } from "string-strip-html"; 2 | 3 | export default function sanitizeData(string) { 4 | return stripHtml(string.trim()).result; 5 | } 6 | 7 | -------------------------------------------------------------------------------- /src/schemas/schemaSignIn.js: -------------------------------------------------------------------------------- 1 | import joi from "joi" 2 | 3 | const signInSchema = joi.object({ 4 | email: joi.string().email().required(), 5 | password: joi.string().alphanum().required() 6 | }); 7 | 8 | export default signInSchema -------------------------------------------------------------------------------- /src/schemas/schemaSignUp.js: -------------------------------------------------------------------------------- 1 | import joi from "joi"; 2 | 3 | const schemaSignUp = joi.object({ 4 | firstname: joi.string().required(), 5 | lastname: joi.string().required(), 6 | email: joi.string().email().required(), 7 | password: joi.string().required(), 8 | }); 9 | 10 | export default schemaSignUp 11 | -------------------------------------------------------------------------------- /src/server.js: -------------------------------------------------------------------------------- 1 | import cors from "cors"; 2 | import express, { json } from "express"; 3 | import router from "./routes/index.js" 4 | 5 | const server = express(); 6 | 7 | 8 | server.use(cors()); 9 | server.use(json()); 10 | server.use(router) 11 | 12 | 13 | export default router; 14 | 15 | server.listen(process.env.PORT, () => { 16 | console.log("Server is listening on port " + process.env.PORT); 17 | }); 18 | 19 | --------------------------------------------------------------------------------