├── .env.example ├── .gitignore ├── .vscode └── settings.json ├── package.json ├── pnpm-lock.yaml ├── src ├── app.ts ├── config │ └── index.ts ├── controllers │ └── test.controller.ts ├── index.ts ├── interfaces │ └── route.interface.ts ├── middlewares │ ├── error.middleware.ts │ ├── interceptor.middleware.ts │ └── morgan.middleware.ts ├── routes │ └── test.route.ts ├── services │ └── test.service.ts └── utils │ ├── exception.ts │ └── logger.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | # LOG 2 | LOG_FORMAT='dev' 3 | LOG_DIR='../../logs' 4 | 5 | PORT=3010 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | dist 4 | 5 | .env 6 | 7 | logs -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Workspace settings 2 | { 3 | "files.exclude": { 4 | "**/node_modules": true, 5 | "**/dist": true 6 | }, 7 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "noobruz-lint", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "dist/index.js", 6 | "scripts": { 7 | "build": "npx tsc", 8 | "start": "node dist/index.js", 9 | "dev": "ts-node-dev --respawn --transpile-only src/index.ts" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "cors": "^2.8.5", 16 | "dotenv": "^16.0.3", 17 | "express": "^4.18.2", 18 | "express-async-errors": "^3.1.1", 19 | "express-list-routes": "^1.1.5", 20 | "http-status-codes": "^2.2.0", 21 | "morgan": "^1.10.0", 22 | "winston": "^3.8.2" 23 | }, 24 | "devDependencies": { 25 | "@types/cors": "^2.8.12", 26 | "@types/express": "^4.17.15", 27 | "@types/morgan": "^1.9.4", 28 | "@types/node": "^18.11.18", 29 | "nodemon": "^2.0.20", 30 | "ts-node-dev": "^2.0.0", 31 | "typescript": "^4.9.4" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/cors': ^2.8.12 5 | '@types/express': ^4.17.15 6 | '@types/morgan': ^1.9.4 7 | '@types/node': ^18.11.18 8 | cors: ^2.8.5 9 | dotenv: ^16.0.3 10 | express: ^4.18.2 11 | express-async-errors: ^3.1.1 12 | express-list-routes: ^1.1.5 13 | http-status-codes: ^2.2.0 14 | morgan: ^1.10.0 15 | nodemon: ^2.0.20 16 | ts-node-dev: ^2.0.0 17 | typescript: ^4.9.4 18 | winston: ^3.8.2 19 | 20 | dependencies: 21 | cors: 2.8.5 22 | dotenv: 16.1.3 23 | express: 4.18.2 24 | express-async-errors: 3.1.1_express@4.18.2 25 | express-list-routes: 1.1.5 26 | http-status-codes: 2.2.0 27 | morgan: 1.10.0 28 | winston: 3.9.0 29 | 30 | devDependencies: 31 | '@types/cors': 2.8.13 32 | '@types/express': 4.17.17 33 | '@types/morgan': 1.9.4 34 | '@types/node': 18.16.16 35 | nodemon: 2.0.22 36 | ts-node-dev: 2.0.0_gbfmtwj2t57hq5iibp7xw5qwjq 37 | typescript: 4.9.5 38 | 39 | packages: 40 | 41 | /@colors/colors/1.5.0: 42 | resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} 43 | engines: {node: '>=0.1.90'} 44 | dev: false 45 | 46 | /@cspotcode/source-map-support/0.8.1: 47 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 48 | engines: {node: '>=12'} 49 | dependencies: 50 | '@jridgewell/trace-mapping': 0.3.9 51 | dev: true 52 | 53 | /@dabh/diagnostics/2.0.3: 54 | resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 55 | dependencies: 56 | colorspace: 1.1.4 57 | enabled: 2.0.0 58 | kuler: 2.0.0 59 | dev: false 60 | 61 | /@jridgewell/resolve-uri/3.1.1: 62 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 63 | engines: {node: '>=6.0.0'} 64 | dev: true 65 | 66 | /@jridgewell/sourcemap-codec/1.4.15: 67 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 68 | dev: true 69 | 70 | /@jridgewell/trace-mapping/0.3.9: 71 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 72 | dependencies: 73 | '@jridgewell/resolve-uri': 3.1.1 74 | '@jridgewell/sourcemap-codec': 1.4.15 75 | dev: true 76 | 77 | /@tsconfig/node10/1.0.9: 78 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 79 | dev: true 80 | 81 | /@tsconfig/node12/1.0.11: 82 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 83 | dev: true 84 | 85 | /@tsconfig/node14/1.0.3: 86 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 87 | dev: true 88 | 89 | /@tsconfig/node16/1.0.4: 90 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 91 | dev: true 92 | 93 | /@types/body-parser/1.19.2: 94 | resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} 95 | dependencies: 96 | '@types/connect': 3.4.35 97 | '@types/node': 18.16.16 98 | dev: true 99 | 100 | /@types/connect/3.4.35: 101 | resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} 102 | dependencies: 103 | '@types/node': 18.16.16 104 | dev: true 105 | 106 | /@types/cors/2.8.13: 107 | resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} 108 | dependencies: 109 | '@types/node': 18.16.16 110 | dev: true 111 | 112 | /@types/express-serve-static-core/4.17.35: 113 | resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} 114 | dependencies: 115 | '@types/node': 18.16.16 116 | '@types/qs': 6.9.7 117 | '@types/range-parser': 1.2.4 118 | '@types/send': 0.17.1 119 | dev: true 120 | 121 | /@types/express/4.17.17: 122 | resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} 123 | dependencies: 124 | '@types/body-parser': 1.19.2 125 | '@types/express-serve-static-core': 4.17.35 126 | '@types/qs': 6.9.7 127 | '@types/serve-static': 1.15.1 128 | dev: true 129 | 130 | /@types/mime/1.3.2: 131 | resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} 132 | dev: true 133 | 134 | /@types/mime/3.0.1: 135 | resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} 136 | dev: true 137 | 138 | /@types/morgan/1.9.4: 139 | resolution: {integrity: sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==} 140 | dependencies: 141 | '@types/node': 18.16.16 142 | dev: true 143 | 144 | /@types/node/18.16.16: 145 | resolution: {integrity: sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==} 146 | dev: true 147 | 148 | /@types/qs/6.9.7: 149 | resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} 150 | dev: true 151 | 152 | /@types/range-parser/1.2.4: 153 | resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} 154 | dev: true 155 | 156 | /@types/send/0.17.1: 157 | resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} 158 | dependencies: 159 | '@types/mime': 1.3.2 160 | '@types/node': 18.16.16 161 | dev: true 162 | 163 | /@types/serve-static/1.15.1: 164 | resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} 165 | dependencies: 166 | '@types/mime': 3.0.1 167 | '@types/node': 18.16.16 168 | dev: true 169 | 170 | /@types/strip-bom/3.0.0: 171 | resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} 172 | dev: true 173 | 174 | /@types/strip-json-comments/0.0.30: 175 | resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} 176 | dev: true 177 | 178 | /@types/triple-beam/1.3.2: 179 | resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} 180 | dev: false 181 | 182 | /abbrev/1.1.1: 183 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 184 | dev: true 185 | 186 | /accepts/1.3.8: 187 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 188 | engines: {node: '>= 0.6'} 189 | dependencies: 190 | mime-types: 2.1.35 191 | negotiator: 0.6.3 192 | dev: false 193 | 194 | /acorn-walk/8.2.0: 195 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 196 | engines: {node: '>=0.4.0'} 197 | dev: true 198 | 199 | /acorn/8.8.2: 200 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 201 | engines: {node: '>=0.4.0'} 202 | hasBin: true 203 | dev: true 204 | 205 | /anymatch/3.1.3: 206 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 207 | engines: {node: '>= 8'} 208 | dependencies: 209 | normalize-path: 3.0.0 210 | picomatch: 2.3.1 211 | dev: true 212 | 213 | /arg/4.1.3: 214 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 215 | dev: true 216 | 217 | /array-flatten/1.1.1: 218 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 219 | dev: false 220 | 221 | /async/3.2.4: 222 | resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} 223 | dev: false 224 | 225 | /balanced-match/1.0.2: 226 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 227 | dev: true 228 | 229 | /basic-auth/2.0.1: 230 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} 231 | engines: {node: '>= 0.8'} 232 | dependencies: 233 | safe-buffer: 5.1.2 234 | dev: false 235 | 236 | /binary-extensions/2.2.0: 237 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 238 | engines: {node: '>=8'} 239 | dev: true 240 | 241 | /body-parser/1.20.1: 242 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 243 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 244 | dependencies: 245 | bytes: 3.1.2 246 | content-type: 1.0.5 247 | debug: 2.6.9 248 | depd: 2.0.0 249 | destroy: 1.2.0 250 | http-errors: 2.0.0 251 | iconv-lite: 0.4.24 252 | on-finished: 2.4.1 253 | qs: 6.11.0 254 | raw-body: 2.5.1 255 | type-is: 1.6.18 256 | unpipe: 1.0.0 257 | transitivePeerDependencies: 258 | - supports-color 259 | dev: false 260 | 261 | /brace-expansion/1.1.11: 262 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 263 | dependencies: 264 | balanced-match: 1.0.2 265 | concat-map: 0.0.1 266 | dev: true 267 | 268 | /braces/3.0.2: 269 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 270 | engines: {node: '>=8'} 271 | dependencies: 272 | fill-range: 7.0.1 273 | dev: true 274 | 275 | /buffer-from/1.1.2: 276 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 277 | dev: true 278 | 279 | /bytes/3.1.2: 280 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 281 | engines: {node: '>= 0.8'} 282 | dev: false 283 | 284 | /call-bind/1.0.2: 285 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 286 | dependencies: 287 | function-bind: 1.1.1 288 | get-intrinsic: 1.2.1 289 | dev: false 290 | 291 | /chokidar/3.5.3: 292 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 293 | engines: {node: '>= 8.10.0'} 294 | dependencies: 295 | anymatch: 3.1.3 296 | braces: 3.0.2 297 | glob-parent: 5.1.2 298 | is-binary-path: 2.1.0 299 | is-glob: 4.0.3 300 | normalize-path: 3.0.0 301 | readdirp: 3.6.0 302 | optionalDependencies: 303 | fsevents: 2.3.2 304 | dev: true 305 | 306 | /color-convert/1.9.3: 307 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 308 | dependencies: 309 | color-name: 1.1.3 310 | dev: false 311 | 312 | /color-name/1.1.3: 313 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 314 | dev: false 315 | 316 | /color-name/1.1.4: 317 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 318 | dev: false 319 | 320 | /color-string/1.9.1: 321 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 322 | dependencies: 323 | color-name: 1.1.4 324 | simple-swizzle: 0.2.2 325 | dev: false 326 | 327 | /color/3.2.1: 328 | resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} 329 | dependencies: 330 | color-convert: 1.9.3 331 | color-string: 1.9.1 332 | dev: false 333 | 334 | /colorspace/1.1.4: 335 | resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 336 | dependencies: 337 | color: 3.2.1 338 | text-hex: 1.0.0 339 | dev: false 340 | 341 | /concat-map/0.0.1: 342 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 343 | dev: true 344 | 345 | /content-disposition/0.5.4: 346 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 347 | engines: {node: '>= 0.6'} 348 | dependencies: 349 | safe-buffer: 5.2.1 350 | dev: false 351 | 352 | /content-type/1.0.5: 353 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 354 | engines: {node: '>= 0.6'} 355 | dev: false 356 | 357 | /cookie-signature/1.0.6: 358 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 359 | dev: false 360 | 361 | /cookie/0.5.0: 362 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 363 | engines: {node: '>= 0.6'} 364 | dev: false 365 | 366 | /cors/2.8.5: 367 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 368 | engines: {node: '>= 0.10'} 369 | dependencies: 370 | object-assign: 4.1.1 371 | vary: 1.1.2 372 | dev: false 373 | 374 | /create-require/1.1.1: 375 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 376 | dev: true 377 | 378 | /debug/2.6.9: 379 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 380 | peerDependencies: 381 | supports-color: '*' 382 | peerDependenciesMeta: 383 | supports-color: 384 | optional: true 385 | dependencies: 386 | ms: 2.0.0 387 | dev: false 388 | 389 | /debug/3.2.7_supports-color@5.5.0: 390 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 391 | peerDependencies: 392 | supports-color: '*' 393 | peerDependenciesMeta: 394 | supports-color: 395 | optional: true 396 | dependencies: 397 | ms: 2.1.3 398 | supports-color: 5.5.0 399 | dev: true 400 | 401 | /depd/2.0.0: 402 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 403 | engines: {node: '>= 0.8'} 404 | dev: false 405 | 406 | /destroy/1.2.0: 407 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 408 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 409 | dev: false 410 | 411 | /diff/4.0.2: 412 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 413 | engines: {node: '>=0.3.1'} 414 | dev: true 415 | 416 | /dotenv/16.1.3: 417 | resolution: {integrity: sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==} 418 | engines: {node: '>=12'} 419 | dev: false 420 | 421 | /dynamic-dedupe/0.3.0: 422 | resolution: {integrity: sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==} 423 | dependencies: 424 | xtend: 4.0.2 425 | dev: true 426 | 427 | /ee-first/1.1.1: 428 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 429 | dev: false 430 | 431 | /enabled/2.0.0: 432 | resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 433 | dev: false 434 | 435 | /encodeurl/1.0.2: 436 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 437 | engines: {node: '>= 0.8'} 438 | dev: false 439 | 440 | /escape-html/1.0.3: 441 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 442 | dev: false 443 | 444 | /etag/1.8.1: 445 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 446 | engines: {node: '>= 0.6'} 447 | dev: false 448 | 449 | /express-async-errors/3.1.1_express@4.18.2: 450 | resolution: {integrity: sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==} 451 | peerDependencies: 452 | express: ^4.16.2 453 | dependencies: 454 | express: 4.18.2 455 | dev: false 456 | 457 | /express-list-routes/1.1.5: 458 | resolution: {integrity: sha512-DUqJE9lxUmRSuw2Od/5C0vhlzvzcHFVo4fXat12fk6agAuxXGgO6cOQeq1/1sFBKzbjgSfMilT2CRJdYpcBh4g==} 459 | dev: false 460 | 461 | /express/4.18.2: 462 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 463 | engines: {node: '>= 0.10.0'} 464 | dependencies: 465 | accepts: 1.3.8 466 | array-flatten: 1.1.1 467 | body-parser: 1.20.1 468 | content-disposition: 0.5.4 469 | content-type: 1.0.5 470 | cookie: 0.5.0 471 | cookie-signature: 1.0.6 472 | debug: 2.6.9 473 | depd: 2.0.0 474 | encodeurl: 1.0.2 475 | escape-html: 1.0.3 476 | etag: 1.8.1 477 | finalhandler: 1.2.0 478 | fresh: 0.5.2 479 | http-errors: 2.0.0 480 | merge-descriptors: 1.0.1 481 | methods: 1.1.2 482 | on-finished: 2.4.1 483 | parseurl: 1.3.3 484 | path-to-regexp: 0.1.7 485 | proxy-addr: 2.0.7 486 | qs: 6.11.0 487 | range-parser: 1.2.1 488 | safe-buffer: 5.2.1 489 | send: 0.18.0 490 | serve-static: 1.15.0 491 | setprototypeof: 1.2.0 492 | statuses: 2.0.1 493 | type-is: 1.6.18 494 | utils-merge: 1.0.1 495 | vary: 1.1.2 496 | transitivePeerDependencies: 497 | - supports-color 498 | dev: false 499 | 500 | /fecha/4.2.3: 501 | resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 502 | dev: false 503 | 504 | /fill-range/7.0.1: 505 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 506 | engines: {node: '>=8'} 507 | dependencies: 508 | to-regex-range: 5.0.1 509 | dev: true 510 | 511 | /finalhandler/1.2.0: 512 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 513 | engines: {node: '>= 0.8'} 514 | dependencies: 515 | debug: 2.6.9 516 | encodeurl: 1.0.2 517 | escape-html: 1.0.3 518 | on-finished: 2.4.1 519 | parseurl: 1.3.3 520 | statuses: 2.0.1 521 | unpipe: 1.0.0 522 | transitivePeerDependencies: 523 | - supports-color 524 | dev: false 525 | 526 | /fn.name/1.1.0: 527 | resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} 528 | dev: false 529 | 530 | /forwarded/0.2.0: 531 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 532 | engines: {node: '>= 0.6'} 533 | dev: false 534 | 535 | /fresh/0.5.2: 536 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 537 | engines: {node: '>= 0.6'} 538 | dev: false 539 | 540 | /fs.realpath/1.0.0: 541 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 542 | dev: true 543 | 544 | /fsevents/2.3.2: 545 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 546 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 547 | os: [darwin] 548 | requiresBuild: true 549 | dev: true 550 | optional: true 551 | 552 | /function-bind/1.1.1: 553 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 554 | 555 | /get-intrinsic/1.2.1: 556 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 557 | dependencies: 558 | function-bind: 1.1.1 559 | has: 1.0.3 560 | has-proto: 1.0.1 561 | has-symbols: 1.0.3 562 | dev: false 563 | 564 | /glob-parent/5.1.2: 565 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 566 | engines: {node: '>= 6'} 567 | dependencies: 568 | is-glob: 4.0.3 569 | dev: true 570 | 571 | /glob/7.2.3: 572 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 573 | dependencies: 574 | fs.realpath: 1.0.0 575 | inflight: 1.0.6 576 | inherits: 2.0.4 577 | minimatch: 3.1.2 578 | once: 1.4.0 579 | path-is-absolute: 1.0.1 580 | dev: true 581 | 582 | /has-flag/3.0.0: 583 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 584 | engines: {node: '>=4'} 585 | dev: true 586 | 587 | /has-proto/1.0.1: 588 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 589 | engines: {node: '>= 0.4'} 590 | dev: false 591 | 592 | /has-symbols/1.0.3: 593 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 594 | engines: {node: '>= 0.4'} 595 | dev: false 596 | 597 | /has/1.0.3: 598 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 599 | engines: {node: '>= 0.4.0'} 600 | dependencies: 601 | function-bind: 1.1.1 602 | 603 | /http-errors/2.0.0: 604 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 605 | engines: {node: '>= 0.8'} 606 | dependencies: 607 | depd: 2.0.0 608 | inherits: 2.0.4 609 | setprototypeof: 1.2.0 610 | statuses: 2.0.1 611 | toidentifier: 1.0.1 612 | dev: false 613 | 614 | /http-status-codes/2.2.0: 615 | resolution: {integrity: sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==} 616 | dev: false 617 | 618 | /iconv-lite/0.4.24: 619 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 620 | engines: {node: '>=0.10.0'} 621 | dependencies: 622 | safer-buffer: 2.1.2 623 | dev: false 624 | 625 | /ignore-by-default/1.0.1: 626 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 627 | dev: true 628 | 629 | /inflight/1.0.6: 630 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 631 | dependencies: 632 | once: 1.4.0 633 | wrappy: 1.0.2 634 | dev: true 635 | 636 | /inherits/2.0.4: 637 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 638 | 639 | /ipaddr.js/1.9.1: 640 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 641 | engines: {node: '>= 0.10'} 642 | dev: false 643 | 644 | /is-arrayish/0.3.2: 645 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 646 | dev: false 647 | 648 | /is-binary-path/2.1.0: 649 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 650 | engines: {node: '>=8'} 651 | dependencies: 652 | binary-extensions: 2.2.0 653 | dev: true 654 | 655 | /is-core-module/2.12.1: 656 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} 657 | dependencies: 658 | has: 1.0.3 659 | dev: true 660 | 661 | /is-extglob/2.1.1: 662 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 663 | engines: {node: '>=0.10.0'} 664 | dev: true 665 | 666 | /is-glob/4.0.3: 667 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 668 | engines: {node: '>=0.10.0'} 669 | dependencies: 670 | is-extglob: 2.1.1 671 | dev: true 672 | 673 | /is-number/7.0.0: 674 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 675 | engines: {node: '>=0.12.0'} 676 | dev: true 677 | 678 | /is-stream/2.0.1: 679 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 680 | engines: {node: '>=8'} 681 | dev: false 682 | 683 | /kuler/2.0.0: 684 | resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 685 | dev: false 686 | 687 | /logform/2.5.1: 688 | resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} 689 | dependencies: 690 | '@colors/colors': 1.5.0 691 | '@types/triple-beam': 1.3.2 692 | fecha: 4.2.3 693 | ms: 2.1.3 694 | safe-stable-stringify: 2.4.3 695 | triple-beam: 1.3.0 696 | dev: false 697 | 698 | /make-error/1.3.6: 699 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 700 | dev: true 701 | 702 | /media-typer/0.3.0: 703 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 704 | engines: {node: '>= 0.6'} 705 | dev: false 706 | 707 | /merge-descriptors/1.0.1: 708 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 709 | dev: false 710 | 711 | /methods/1.1.2: 712 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 713 | engines: {node: '>= 0.6'} 714 | dev: false 715 | 716 | /mime-db/1.52.0: 717 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 718 | engines: {node: '>= 0.6'} 719 | dev: false 720 | 721 | /mime-types/2.1.35: 722 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 723 | engines: {node: '>= 0.6'} 724 | dependencies: 725 | mime-db: 1.52.0 726 | dev: false 727 | 728 | /mime/1.6.0: 729 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 730 | engines: {node: '>=4'} 731 | hasBin: true 732 | dev: false 733 | 734 | /minimatch/3.1.2: 735 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 736 | dependencies: 737 | brace-expansion: 1.1.11 738 | dev: true 739 | 740 | /minimist/1.2.8: 741 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 742 | dev: true 743 | 744 | /mkdirp/1.0.4: 745 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 746 | engines: {node: '>=10'} 747 | hasBin: true 748 | dev: true 749 | 750 | /morgan/1.10.0: 751 | resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} 752 | engines: {node: '>= 0.8.0'} 753 | dependencies: 754 | basic-auth: 2.0.1 755 | debug: 2.6.9 756 | depd: 2.0.0 757 | on-finished: 2.3.0 758 | on-headers: 1.0.2 759 | transitivePeerDependencies: 760 | - supports-color 761 | dev: false 762 | 763 | /ms/2.0.0: 764 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 765 | dev: false 766 | 767 | /ms/2.1.3: 768 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 769 | 770 | /negotiator/0.6.3: 771 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 772 | engines: {node: '>= 0.6'} 773 | dev: false 774 | 775 | /nodemon/2.0.22: 776 | resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} 777 | engines: {node: '>=8.10.0'} 778 | hasBin: true 779 | dependencies: 780 | chokidar: 3.5.3 781 | debug: 3.2.7_supports-color@5.5.0 782 | ignore-by-default: 1.0.1 783 | minimatch: 3.1.2 784 | pstree.remy: 1.1.8 785 | semver: 5.7.1 786 | simple-update-notifier: 1.1.0 787 | supports-color: 5.5.0 788 | touch: 3.1.0 789 | undefsafe: 2.0.5 790 | dev: true 791 | 792 | /nopt/1.0.10: 793 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 794 | hasBin: true 795 | dependencies: 796 | abbrev: 1.1.1 797 | dev: true 798 | 799 | /normalize-path/3.0.0: 800 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 801 | engines: {node: '>=0.10.0'} 802 | dev: true 803 | 804 | /object-assign/4.1.1: 805 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 806 | engines: {node: '>=0.10.0'} 807 | dev: false 808 | 809 | /object-inspect/1.12.3: 810 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 811 | dev: false 812 | 813 | /on-finished/2.3.0: 814 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 815 | engines: {node: '>= 0.8'} 816 | dependencies: 817 | ee-first: 1.1.1 818 | dev: false 819 | 820 | /on-finished/2.4.1: 821 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 822 | engines: {node: '>= 0.8'} 823 | dependencies: 824 | ee-first: 1.1.1 825 | dev: false 826 | 827 | /on-headers/1.0.2: 828 | resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} 829 | engines: {node: '>= 0.8'} 830 | dev: false 831 | 832 | /once/1.4.0: 833 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 834 | dependencies: 835 | wrappy: 1.0.2 836 | dev: true 837 | 838 | /one-time/1.0.0: 839 | resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} 840 | dependencies: 841 | fn.name: 1.1.0 842 | dev: false 843 | 844 | /parseurl/1.3.3: 845 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 846 | engines: {node: '>= 0.8'} 847 | dev: false 848 | 849 | /path-is-absolute/1.0.1: 850 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 851 | engines: {node: '>=0.10.0'} 852 | dev: true 853 | 854 | /path-parse/1.0.7: 855 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 856 | dev: true 857 | 858 | /path-to-regexp/0.1.7: 859 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 860 | dev: false 861 | 862 | /picomatch/2.3.1: 863 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 864 | engines: {node: '>=8.6'} 865 | dev: true 866 | 867 | /proxy-addr/2.0.7: 868 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 869 | engines: {node: '>= 0.10'} 870 | dependencies: 871 | forwarded: 0.2.0 872 | ipaddr.js: 1.9.1 873 | dev: false 874 | 875 | /pstree.remy/1.1.8: 876 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 877 | dev: true 878 | 879 | /qs/6.11.0: 880 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 881 | engines: {node: '>=0.6'} 882 | dependencies: 883 | side-channel: 1.0.4 884 | dev: false 885 | 886 | /range-parser/1.2.1: 887 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 888 | engines: {node: '>= 0.6'} 889 | dev: false 890 | 891 | /raw-body/2.5.1: 892 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 893 | engines: {node: '>= 0.8'} 894 | dependencies: 895 | bytes: 3.1.2 896 | http-errors: 2.0.0 897 | iconv-lite: 0.4.24 898 | unpipe: 1.0.0 899 | dev: false 900 | 901 | /readable-stream/3.6.2: 902 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 903 | engines: {node: '>= 6'} 904 | dependencies: 905 | inherits: 2.0.4 906 | string_decoder: 1.3.0 907 | util-deprecate: 1.0.2 908 | dev: false 909 | 910 | /readdirp/3.6.0: 911 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 912 | engines: {node: '>=8.10.0'} 913 | dependencies: 914 | picomatch: 2.3.1 915 | dev: true 916 | 917 | /resolve/1.22.2: 918 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} 919 | hasBin: true 920 | dependencies: 921 | is-core-module: 2.12.1 922 | path-parse: 1.0.7 923 | supports-preserve-symlinks-flag: 1.0.0 924 | dev: true 925 | 926 | /rimraf/2.7.1: 927 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 928 | hasBin: true 929 | dependencies: 930 | glob: 7.2.3 931 | dev: true 932 | 933 | /safe-buffer/5.1.2: 934 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 935 | dev: false 936 | 937 | /safe-buffer/5.2.1: 938 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 939 | dev: false 940 | 941 | /safe-stable-stringify/2.4.3: 942 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 943 | engines: {node: '>=10'} 944 | dev: false 945 | 946 | /safer-buffer/2.1.2: 947 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 948 | dev: false 949 | 950 | /semver/5.7.1: 951 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 952 | hasBin: true 953 | dev: true 954 | 955 | /semver/7.0.0: 956 | resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} 957 | hasBin: true 958 | dev: true 959 | 960 | /send/0.18.0: 961 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 962 | engines: {node: '>= 0.8.0'} 963 | dependencies: 964 | debug: 2.6.9 965 | depd: 2.0.0 966 | destroy: 1.2.0 967 | encodeurl: 1.0.2 968 | escape-html: 1.0.3 969 | etag: 1.8.1 970 | fresh: 0.5.2 971 | http-errors: 2.0.0 972 | mime: 1.6.0 973 | ms: 2.1.3 974 | on-finished: 2.4.1 975 | range-parser: 1.2.1 976 | statuses: 2.0.1 977 | transitivePeerDependencies: 978 | - supports-color 979 | dev: false 980 | 981 | /serve-static/1.15.0: 982 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 983 | engines: {node: '>= 0.8.0'} 984 | dependencies: 985 | encodeurl: 1.0.2 986 | escape-html: 1.0.3 987 | parseurl: 1.3.3 988 | send: 0.18.0 989 | transitivePeerDependencies: 990 | - supports-color 991 | dev: false 992 | 993 | /setprototypeof/1.2.0: 994 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 995 | dev: false 996 | 997 | /side-channel/1.0.4: 998 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 999 | dependencies: 1000 | call-bind: 1.0.2 1001 | get-intrinsic: 1.2.1 1002 | object-inspect: 1.12.3 1003 | dev: false 1004 | 1005 | /simple-swizzle/0.2.2: 1006 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1007 | dependencies: 1008 | is-arrayish: 0.3.2 1009 | dev: false 1010 | 1011 | /simple-update-notifier/1.1.0: 1012 | resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} 1013 | engines: {node: '>=8.10.0'} 1014 | dependencies: 1015 | semver: 7.0.0 1016 | dev: true 1017 | 1018 | /source-map-support/0.5.21: 1019 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1020 | dependencies: 1021 | buffer-from: 1.1.2 1022 | source-map: 0.6.1 1023 | dev: true 1024 | 1025 | /source-map/0.6.1: 1026 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1027 | engines: {node: '>=0.10.0'} 1028 | dev: true 1029 | 1030 | /stack-trace/0.0.10: 1031 | resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 1032 | dev: false 1033 | 1034 | /statuses/2.0.1: 1035 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1036 | engines: {node: '>= 0.8'} 1037 | dev: false 1038 | 1039 | /string_decoder/1.3.0: 1040 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1041 | dependencies: 1042 | safe-buffer: 5.2.1 1043 | dev: false 1044 | 1045 | /strip-bom/3.0.0: 1046 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1047 | engines: {node: '>=4'} 1048 | dev: true 1049 | 1050 | /strip-json-comments/2.0.1: 1051 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1052 | engines: {node: '>=0.10.0'} 1053 | dev: true 1054 | 1055 | /supports-color/5.5.0: 1056 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1057 | engines: {node: '>=4'} 1058 | dependencies: 1059 | has-flag: 3.0.0 1060 | dev: true 1061 | 1062 | /supports-preserve-symlinks-flag/1.0.0: 1063 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1064 | engines: {node: '>= 0.4'} 1065 | dev: true 1066 | 1067 | /text-hex/1.0.0: 1068 | resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 1069 | dev: false 1070 | 1071 | /to-regex-range/5.0.1: 1072 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1073 | engines: {node: '>=8.0'} 1074 | dependencies: 1075 | is-number: 7.0.0 1076 | dev: true 1077 | 1078 | /toidentifier/1.0.1: 1079 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1080 | engines: {node: '>=0.6'} 1081 | dev: false 1082 | 1083 | /touch/3.1.0: 1084 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1085 | hasBin: true 1086 | dependencies: 1087 | nopt: 1.0.10 1088 | dev: true 1089 | 1090 | /tree-kill/1.2.2: 1091 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1092 | hasBin: true 1093 | dev: true 1094 | 1095 | /triple-beam/1.3.0: 1096 | resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} 1097 | dev: false 1098 | 1099 | /ts-node-dev/2.0.0_gbfmtwj2t57hq5iibp7xw5qwjq: 1100 | resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} 1101 | engines: {node: '>=0.8.0'} 1102 | hasBin: true 1103 | peerDependencies: 1104 | node-notifier: '*' 1105 | typescript: '*' 1106 | peerDependenciesMeta: 1107 | node-notifier: 1108 | optional: true 1109 | dependencies: 1110 | chokidar: 3.5.3 1111 | dynamic-dedupe: 0.3.0 1112 | minimist: 1.2.8 1113 | mkdirp: 1.0.4 1114 | resolve: 1.22.2 1115 | rimraf: 2.7.1 1116 | source-map-support: 0.5.21 1117 | tree-kill: 1.2.2 1118 | ts-node: 10.9.1_gbfmtwj2t57hq5iibp7xw5qwjq 1119 | tsconfig: 7.0.0 1120 | typescript: 4.9.5 1121 | transitivePeerDependencies: 1122 | - '@swc/core' 1123 | - '@swc/wasm' 1124 | - '@types/node' 1125 | dev: true 1126 | 1127 | /ts-node/10.9.1_gbfmtwj2t57hq5iibp7xw5qwjq: 1128 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 1129 | hasBin: true 1130 | peerDependencies: 1131 | '@swc/core': '>=1.2.50' 1132 | '@swc/wasm': '>=1.2.50' 1133 | '@types/node': '*' 1134 | typescript: '>=2.7' 1135 | peerDependenciesMeta: 1136 | '@swc/core': 1137 | optional: true 1138 | '@swc/wasm': 1139 | optional: true 1140 | dependencies: 1141 | '@cspotcode/source-map-support': 0.8.1 1142 | '@tsconfig/node10': 1.0.9 1143 | '@tsconfig/node12': 1.0.11 1144 | '@tsconfig/node14': 1.0.3 1145 | '@tsconfig/node16': 1.0.4 1146 | '@types/node': 18.16.16 1147 | acorn: 8.8.2 1148 | acorn-walk: 8.2.0 1149 | arg: 4.1.3 1150 | create-require: 1.1.1 1151 | diff: 4.0.2 1152 | make-error: 1.3.6 1153 | typescript: 4.9.5 1154 | v8-compile-cache-lib: 3.0.1 1155 | yn: 3.1.1 1156 | dev: true 1157 | 1158 | /tsconfig/7.0.0: 1159 | resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} 1160 | dependencies: 1161 | '@types/strip-bom': 3.0.0 1162 | '@types/strip-json-comments': 0.0.30 1163 | strip-bom: 3.0.0 1164 | strip-json-comments: 2.0.1 1165 | dev: true 1166 | 1167 | /type-is/1.6.18: 1168 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1169 | engines: {node: '>= 0.6'} 1170 | dependencies: 1171 | media-typer: 0.3.0 1172 | mime-types: 2.1.35 1173 | dev: false 1174 | 1175 | /typescript/4.9.5: 1176 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1177 | engines: {node: '>=4.2.0'} 1178 | hasBin: true 1179 | dev: true 1180 | 1181 | /undefsafe/2.0.5: 1182 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 1183 | dev: true 1184 | 1185 | /unpipe/1.0.0: 1186 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1187 | engines: {node: '>= 0.8'} 1188 | dev: false 1189 | 1190 | /util-deprecate/1.0.2: 1191 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1192 | dev: false 1193 | 1194 | /utils-merge/1.0.1: 1195 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1196 | engines: {node: '>= 0.4.0'} 1197 | dev: false 1198 | 1199 | /v8-compile-cache-lib/3.0.1: 1200 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1201 | dev: true 1202 | 1203 | /vary/1.1.2: 1204 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1205 | engines: {node: '>= 0.8'} 1206 | dev: false 1207 | 1208 | /winston-transport/4.5.0: 1209 | resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} 1210 | engines: {node: '>= 6.4.0'} 1211 | dependencies: 1212 | logform: 2.5.1 1213 | readable-stream: 3.6.2 1214 | triple-beam: 1.3.0 1215 | dev: false 1216 | 1217 | /winston/3.9.0: 1218 | resolution: {integrity: sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==} 1219 | engines: {node: '>= 12.0.0'} 1220 | dependencies: 1221 | '@colors/colors': 1.5.0 1222 | '@dabh/diagnostics': 2.0.3 1223 | async: 3.2.4 1224 | is-stream: 2.0.1 1225 | logform: 2.5.1 1226 | one-time: 1.0.0 1227 | readable-stream: 3.6.2 1228 | safe-stable-stringify: 2.4.3 1229 | stack-trace: 0.0.10 1230 | triple-beam: 1.3.0 1231 | winston-transport: 4.5.0 1232 | dev: false 1233 | 1234 | /wrappy/1.0.2: 1235 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1236 | dev: true 1237 | 1238 | /xtend/4.0.2: 1239 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1240 | engines: {node: '>=0.4'} 1241 | dev: true 1242 | 1243 | /yn/3.1.1: 1244 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1245 | engines: {node: '>=6'} 1246 | dev: true 1247 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import cors from 'cors'; 2 | import "express-async-errors" 3 | import express, { Application, Request } from "express"; 4 | import { PORT } from './config'; 5 | import { Route } from './interfaces/route.interface'; 6 | import morganMiddleware from './middlewares/morgan.middleware'; 7 | import { logger } from './utils/logger'; 8 | import ErrorMiddleWare from './middlewares/error.middleware'; 9 | import expressListRoutes from "express-list-routes" 10 | 11 | export default class App { 12 | 13 | public app: Application; 14 | public port: string | number; 15 | 16 | constructor(routes: Route[]) { 17 | this.app = express(); 18 | this.port = PORT || 8000; 19 | this.initializeMiddlewares() 20 | this.initializeRoutes(routes) 21 | this.initializeErrorHandling() 22 | this.listRoutes() 23 | } 24 | 25 | public listen(): void { 26 | this.app.listen(this.port, () => { 27 | logger.info(`📡 [server]: Server is running @ http://localhost:${this.port}`) 28 | }) 29 | } 30 | 31 | private initializeMiddlewares(): void { 32 | this.app.use(express.json()); 33 | this.app.use(cors()); 34 | this.app.use(express.urlencoded({ extended: true })); 35 | this.app.use(morganMiddleware) 36 | } 37 | 38 | private initializeRoutes(routes: Route[]): void { 39 | routes.forEach(route => { 40 | this.app.use("/api/v1", route.router) 41 | }) 42 | } 43 | 44 | private initializeErrorHandling() { 45 | this.app.use(ErrorMiddleWare.handleErrors) 46 | } 47 | 48 | private listRoutes() { 49 | expressListRoutes( 50 | this.app, 51 | { 52 | logger: ((method, space, path) => logger.info(`🚏 [Routes]: ${method} ${path}`)) 53 | } 54 | ) 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /src/config/index.ts: -------------------------------------------------------------------------------- 1 | import { config } from "dotenv"; 2 | config(); 3 | 4 | export const CREDENTIALS = process.env.CREDENTIALS === "true"; 5 | export const { 6 | NODE_ENV, 7 | PORT, 8 | LOG_FORMAT, 9 | LOG_DIR, 10 | } = process.env; -------------------------------------------------------------------------------- /src/controllers/test.controller.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction, Request, Response } from "express" 2 | import TestService from "../services/test.service" 3 | import { StatusCodes } from "http-status-codes" 4 | 5 | export default class TestController { 6 | 7 | private readonly testServices: TestService; 8 | 9 | constructor () { 10 | this.testServices = new TestService() 11 | } 12 | 13 | public getHello = (request: Request, response: Response, next: NextFunction) => { 14 | response.status(StatusCodes.OK).send(this.testServices.sayHello("Dave")) 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import App from "./app" 2 | import TestRoute from "./routes/test.route" 3 | 4 | const app = new App([ 5 | new TestRoute() 6 | ]) 7 | 8 | app.listen() -------------------------------------------------------------------------------- /src/interfaces/route.interface.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | 3 | export interface Route { 4 | path?: string, 5 | router: Router 6 | } -------------------------------------------------------------------------------- /src/middlewares/error.middleware.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction, Request, Response } from "express"; 2 | import Interceptor from "./interceptor.middleware"; 3 | import HttpException from "../utils/exception"; 4 | import { logger } from "../utils/logger"; 5 | 6 | export default class ErrorMiddleWare extends Interceptor { 7 | 8 | constructor( 9 | req: Request, 10 | res: Response, 11 | next: NextFunction 12 | ) { 13 | super(req, res, next) 14 | } 15 | 16 | static async handleErrors( 17 | error: HttpException, 18 | req: Request, 19 | res: Response, 20 | next: NextFunction 21 | ) { 22 | const status: number = error.status || 500; 23 | const message: string = error.message || "Something went wrong"; 24 | 25 | logger.error( 26 | `[Error Handler]: Path: ${req.path}, Method: ${req.method}, Status: ${status}, ${message}` 27 | ); 28 | 29 | res.status(status).json({ message }) 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/middlewares/interceptor.middleware.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction, Request, Response } from "express"; 2 | 3 | export default class Interceptor { 4 | 5 | protected ip: string 6 | 7 | constructor (req: Request, res: Response, next: NextFunction) { 8 | this.ip = req.ip 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /src/middlewares/morgan.middleware.ts: -------------------------------------------------------------------------------- 1 | import morgan, { StreamOptions } from "morgan"; 2 | import { NODE_ENV } from "../config"; 3 | import { logger } from "../utils/logger"; 4 | 5 | const stream: StreamOptions = { 6 | write: (message: string) => 7 | logger.http(message.substring(0, message.lastIndexOf("\n"))) 8 | } 9 | 10 | const skip = () => { 11 | const env = NODE_ENV || "development" 12 | return env !== "development" 13 | } 14 | 15 | const morganMiddleware = morgan( 16 | ":method :url :status :res[content-length] - :response-time ms", 17 | { stream, skip } 18 | ) 19 | 20 | export default morganMiddleware -------------------------------------------------------------------------------- /src/routes/test.route.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import TestController from "../controllers/test.controller"; 3 | import { IRoute } from "../interfaces/route.interface"; 4 | 5 | class TestRoute implements IRoute { 6 | public path: string = "/test" 7 | public router: Router = Router() 8 | public controller: TestController = new TestController() 9 | 10 | constructor(){ 11 | this.initializeRoutes() 12 | } 13 | 14 | private initializeRoutes(){ 15 | this.router.get(this.path, this.controller.getHello) 16 | } 17 | } 18 | 19 | export default TestRoute -------------------------------------------------------------------------------- /src/services/test.service.ts: -------------------------------------------------------------------------------- 1 | export default class TestService { 2 | public sayHello(name: string): string { 3 | return `Hello ${name}` 4 | } 5 | } -------------------------------------------------------------------------------- /src/utils/exception.ts: -------------------------------------------------------------------------------- 1 | export default class HttpException extends Error { 2 | public status: number; 3 | public message: string; 4 | 5 | constructor(status: number, message: string){ 6 | super(message) 7 | this.status = status; 8 | this.message = message; 9 | } 10 | } -------------------------------------------------------------------------------- /src/utils/logger.ts: -------------------------------------------------------------------------------- 1 | import { existsSync, mkdirSync } from "fs"; 2 | import path, { join } from "path"; 3 | import winston from "winston"; 4 | import { LOG_DIR } from "../config"; 5 | import { fileURLToPath } from 'url'; 6 | 7 | const dir: string = join(__dirname, LOG_DIR!); 8 | 9 | if (!existsSync(dir)) { 10 | mkdirSync(dir); 11 | } 12 | // Define your severity levels. 13 | // With them, You can create log files, 14 | // see or hide levels based on the running ENV. 15 | const levels = { 16 | error: 0, 17 | warn: 1, 18 | info: 2, 19 | http: 3, 20 | debug: 4, 21 | }; 22 | 23 | // This method set the current severity based on 24 | // the current NODE_ENV: show all the log levels 25 | // if the server was run in development mode; otherwise, 26 | // if it was run in production, show only warn and error messages. 27 | const level = () => { 28 | const env = process.env.NODE_ENV || "development"; 29 | const isDevelopment = env === "development"; 30 | return isDevelopment ? "debug" : "warn"; 31 | }; 32 | 33 | // Define different colors for each level. 34 | // Colors make the log message more visible, 35 | // adding the ability to focus or ignore messages. 36 | const colors = { 37 | error: "red", 38 | warn: "yellow", 39 | info: "green", 40 | http: "magenta", 41 | debug: "white", 42 | }; 43 | 44 | // Tell winston that you want to link the colors 45 | // defined above to the severity levels. 46 | winston.addColors(colors); 47 | 48 | // Chose the aspect of your log customizing the log format. 49 | const format = winston.format.combine( 50 | // Add the message timestamp with the preferred format 51 | winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss:ms" }), 52 | // Tell Winston that the logs must be colored 53 | winston.format.colorize({ all: true }), 54 | // Define the format of the message showing the timestamp, the level and the message 55 | winston.format.printf( 56 | (info) => `${info.timestamp} [${info.level}]: ${info.message}` 57 | ) 58 | ); 59 | const custformat = winston.format.combine( 60 | // Add the message timestamp with the preferred format 61 | winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss:ms" }), 62 | // Tell Winston that the logs must be colored 63 | // Define the format of the message showing the timestamp, the level and the message 64 | winston.format.printf( 65 | (info) => `${info.timestamp} [${info.level}]: ${info.message}` 66 | ) 67 | ); 68 | 69 | // Define which transports the logger must use to print out messages. 70 | // In this example, we are using three different transports 71 | const transports = [ 72 | // Allow the use the console to print the messages 73 | new winston.transports.Console({ 74 | format, 75 | }), 76 | // Allow to print all the error level messages inside the error.log file 77 | new winston.transports.File({ 78 | dirname: dir, 79 | filename: 'error.log', 80 | level: 'error', 81 | format: custformat, 82 | }), 83 | // Allow to print all the error message inside the all.log file 84 | // (also the error log that are also printed inside the error.log( 85 | new winston.transports.File({ 86 | dirname: dir, 87 | format: custformat, 88 | filename: 'all.log', 89 | }), 90 | 91 | ]; 92 | 93 | // Create the logger instance that has to be exported 94 | // and used to log messages. 95 | const logger = winston.createLogger({ 96 | level: level(), 97 | levels, 98 | transports, 99 | }); 100 | const stream = { 101 | write: (message: string) => { 102 | logger.info(message.substring(0, message.lastIndexOf("\n"))); 103 | }, 104 | }; 105 | 106 | export { 107 | logger, 108 | stream 109 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true, 4 | "target": "es2016", 5 | "module": "commonjs", 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strictPropertyInitialization": false, 9 | "strict": true, 10 | "outDir": "./dist", 11 | "rootDir": "src", 12 | "noImplicitAny": false, 13 | }, 14 | "include": [ 15 | "src/**/*" 16 | ], 17 | "exclude": [ 18 | "node_modules" 19 | ] 20 | } --------------------------------------------------------------------------------