├── .gitignore ├── controllers └── book.controller.js ├── database.js ├── index.js ├── package-lock.json ├── package.json ├── routes └── book.router.js └── vercel.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .env -------------------------------------------------------------------------------- /controllers/book.controller.js: -------------------------------------------------------------------------------- 1 | const postgre = require('../database') 2 | const bookController = { 3 | getAll: async(req, res) => { 4 | try { 5 | const { rows } = await postgre.query("select * from books") 6 | res.json({msg: "OK", data: rows}) 7 | } catch (error) { 8 | res.json({msg: error.msg}) 9 | } 10 | }, 11 | getById: async(req, res) => { 12 | try { 13 | const { rows } = await postgre.query("select * from books where book_id = $1", [req.params.id]) 14 | 15 | if (rows[0]) { 16 | return res.json({msg: "OK", data: rows}) 17 | } 18 | 19 | res.status(404).json({msg: "not found"}) 20 | } catch (error) { 21 | res.json({msg: error.msg}) 22 | } 23 | }, 24 | create: async(req, res) => { 25 | try { 26 | const { name, price } = req.body 27 | 28 | const sql = 'INSERT INTO books(name, price) VALUES($1, $2) RETURNING *' 29 | 30 | const { rows } = await postgre.query(sql, [name, price]) 31 | 32 | res.json({msg: "OK", data: rows[0]}) 33 | 34 | } catch (error) { 35 | res.json({msg: error.msg}) 36 | } 37 | }, 38 | updateById: async(req, res) => { 39 | try { 40 | const { name, price } = req.body 41 | 42 | const sql = 'UPDATE books set name = $1, price = $2 where book_id = $3 RETURNING *' 43 | 44 | const { rows } = await postgre.query(sql, [name, price, req.params.id]) 45 | 46 | res.json({msg: "OK", data: rows[0]}) 47 | 48 | } catch (error) { 49 | res.json({msg: error.msg}) 50 | } 51 | }, 52 | deleteById: async(req, res) => { 53 | try { 54 | const sql = 'DELETE FROM books where book_id = $1 RETURNING *' 55 | 56 | const { rows } = await postgre.query(sql, [req.params.id]) 57 | 58 | if (rows[0]) { 59 | return res.json({msg: "OK", data: rows[0]}) 60 | } 61 | 62 | return res.status(404).json({msg: "not found"}) 63 | 64 | 65 | } catch (error) { 66 | res.json({msg: error.msg}) 67 | } 68 | } 69 | } 70 | 71 | module.exports = bookController -------------------------------------------------------------------------------- /database.js: -------------------------------------------------------------------------------- 1 | const { Pool } = require('pg') 2 | 3 | const pool = new Pool({ 4 | connectionString: process.env.POSTGRES_URL + "?sslmode=require", 5 | }) 6 | 7 | pool.connect((err) => { 8 | if (err) throw err 9 | console.log("Connect to PostgreSQL successfully!") 10 | }) 11 | 12 | module.exports = pool -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require("express") 2 | const app = express() 3 | 4 | require('dotenv').config() 5 | 6 | app.use(express.json()) 7 | 8 | 9 | const bookRouter = require('./routes/book.router') 10 | 11 | app.use("/api/v1/books", bookRouter) 12 | 13 | app.listen(process.env.PORT, () => console.log("Server is running on port 5000")) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postgre-crud", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "postgre-crud", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "dotenv": "^16.0.3", 13 | "express": "^4.18.2", 14 | "pg": "^8.10.0" 15 | } 16 | }, 17 | "node_modules/accepts": { 18 | "version": "1.3.8", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 20 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 21 | "dependencies": { 22 | "mime-types": "~2.1.34", 23 | "negotiator": "0.6.3" 24 | }, 25 | "engines": { 26 | "node": ">= 0.6" 27 | } 28 | }, 29 | "node_modules/array-flatten": { 30 | "version": "1.1.1", 31 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 32 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 33 | }, 34 | "node_modules/body-parser": { 35 | "version": "1.20.1", 36 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 37 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 38 | "dependencies": { 39 | "bytes": "3.1.2", 40 | "content-type": "~1.0.4", 41 | "debug": "2.6.9", 42 | "depd": "2.0.0", 43 | "destroy": "1.2.0", 44 | "http-errors": "2.0.0", 45 | "iconv-lite": "0.4.24", 46 | "on-finished": "2.4.1", 47 | "qs": "6.11.0", 48 | "raw-body": "2.5.1", 49 | "type-is": "~1.6.18", 50 | "unpipe": "1.0.0" 51 | }, 52 | "engines": { 53 | "node": ">= 0.8", 54 | "npm": "1.2.8000 || >= 1.4.16" 55 | } 56 | }, 57 | "node_modules/buffer-writer": { 58 | "version": "2.0.0", 59 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 60 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", 61 | "engines": { 62 | "node": ">=4" 63 | } 64 | }, 65 | "node_modules/bytes": { 66 | "version": "3.1.2", 67 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 68 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 69 | "engines": { 70 | "node": ">= 0.8" 71 | } 72 | }, 73 | "node_modules/call-bind": { 74 | "version": "1.0.2", 75 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 76 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 77 | "dependencies": { 78 | "function-bind": "^1.1.1", 79 | "get-intrinsic": "^1.0.2" 80 | }, 81 | "funding": { 82 | "url": "https://github.com/sponsors/ljharb" 83 | } 84 | }, 85 | "node_modules/content-disposition": { 86 | "version": "0.5.4", 87 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 88 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 89 | "dependencies": { 90 | "safe-buffer": "5.2.1" 91 | }, 92 | "engines": { 93 | "node": ">= 0.6" 94 | } 95 | }, 96 | "node_modules/content-type": { 97 | "version": "1.0.5", 98 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 99 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 100 | "engines": { 101 | "node": ">= 0.6" 102 | } 103 | }, 104 | "node_modules/cookie": { 105 | "version": "0.5.0", 106 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 107 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 108 | "engines": { 109 | "node": ">= 0.6" 110 | } 111 | }, 112 | "node_modules/cookie-signature": { 113 | "version": "1.0.6", 114 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 115 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 116 | }, 117 | "node_modules/debug": { 118 | "version": "2.6.9", 119 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 120 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 121 | "dependencies": { 122 | "ms": "2.0.0" 123 | } 124 | }, 125 | "node_modules/depd": { 126 | "version": "2.0.0", 127 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 128 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 129 | "engines": { 130 | "node": ">= 0.8" 131 | } 132 | }, 133 | "node_modules/destroy": { 134 | "version": "1.2.0", 135 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 136 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 137 | "engines": { 138 | "node": ">= 0.8", 139 | "npm": "1.2.8000 || >= 1.4.16" 140 | } 141 | }, 142 | "node_modules/dotenv": { 143 | "version": "16.0.3", 144 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 145 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 146 | "engines": { 147 | "node": ">=12" 148 | } 149 | }, 150 | "node_modules/ee-first": { 151 | "version": "1.1.1", 152 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 153 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 154 | }, 155 | "node_modules/encodeurl": { 156 | "version": "1.0.2", 157 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 158 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 159 | "engines": { 160 | "node": ">= 0.8" 161 | } 162 | }, 163 | "node_modules/escape-html": { 164 | "version": "1.0.3", 165 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 166 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 167 | }, 168 | "node_modules/etag": { 169 | "version": "1.8.1", 170 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 171 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 172 | "engines": { 173 | "node": ">= 0.6" 174 | } 175 | }, 176 | "node_modules/express": { 177 | "version": "4.18.2", 178 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 179 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 180 | "dependencies": { 181 | "accepts": "~1.3.8", 182 | "array-flatten": "1.1.1", 183 | "body-parser": "1.20.1", 184 | "content-disposition": "0.5.4", 185 | "content-type": "~1.0.4", 186 | "cookie": "0.5.0", 187 | "cookie-signature": "1.0.6", 188 | "debug": "2.6.9", 189 | "depd": "2.0.0", 190 | "encodeurl": "~1.0.2", 191 | "escape-html": "~1.0.3", 192 | "etag": "~1.8.1", 193 | "finalhandler": "1.2.0", 194 | "fresh": "0.5.2", 195 | "http-errors": "2.0.0", 196 | "merge-descriptors": "1.0.1", 197 | "methods": "~1.1.2", 198 | "on-finished": "2.4.1", 199 | "parseurl": "~1.3.3", 200 | "path-to-regexp": "0.1.7", 201 | "proxy-addr": "~2.0.7", 202 | "qs": "6.11.0", 203 | "range-parser": "~1.2.1", 204 | "safe-buffer": "5.2.1", 205 | "send": "0.18.0", 206 | "serve-static": "1.15.0", 207 | "setprototypeof": "1.2.0", 208 | "statuses": "2.0.1", 209 | "type-is": "~1.6.18", 210 | "utils-merge": "1.0.1", 211 | "vary": "~1.1.2" 212 | }, 213 | "engines": { 214 | "node": ">= 0.10.0" 215 | } 216 | }, 217 | "node_modules/finalhandler": { 218 | "version": "1.2.0", 219 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 220 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 221 | "dependencies": { 222 | "debug": "2.6.9", 223 | "encodeurl": "~1.0.2", 224 | "escape-html": "~1.0.3", 225 | "on-finished": "2.4.1", 226 | "parseurl": "~1.3.3", 227 | "statuses": "2.0.1", 228 | "unpipe": "~1.0.0" 229 | }, 230 | "engines": { 231 | "node": ">= 0.8" 232 | } 233 | }, 234 | "node_modules/forwarded": { 235 | "version": "0.2.0", 236 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 237 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 238 | "engines": { 239 | "node": ">= 0.6" 240 | } 241 | }, 242 | "node_modules/fresh": { 243 | "version": "0.5.2", 244 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 245 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 246 | "engines": { 247 | "node": ">= 0.6" 248 | } 249 | }, 250 | "node_modules/function-bind": { 251 | "version": "1.1.1", 252 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 253 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 254 | }, 255 | "node_modules/get-intrinsic": { 256 | "version": "1.2.0", 257 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 258 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 259 | "dependencies": { 260 | "function-bind": "^1.1.1", 261 | "has": "^1.0.3", 262 | "has-symbols": "^1.0.3" 263 | }, 264 | "funding": { 265 | "url": "https://github.com/sponsors/ljharb" 266 | } 267 | }, 268 | "node_modules/has": { 269 | "version": "1.0.3", 270 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 271 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 272 | "dependencies": { 273 | "function-bind": "^1.1.1" 274 | }, 275 | "engines": { 276 | "node": ">= 0.4.0" 277 | } 278 | }, 279 | "node_modules/has-symbols": { 280 | "version": "1.0.3", 281 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 282 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 283 | "engines": { 284 | "node": ">= 0.4" 285 | }, 286 | "funding": { 287 | "url": "https://github.com/sponsors/ljharb" 288 | } 289 | }, 290 | "node_modules/http-errors": { 291 | "version": "2.0.0", 292 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 293 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 294 | "dependencies": { 295 | "depd": "2.0.0", 296 | "inherits": "2.0.4", 297 | "setprototypeof": "1.2.0", 298 | "statuses": "2.0.1", 299 | "toidentifier": "1.0.1" 300 | }, 301 | "engines": { 302 | "node": ">= 0.8" 303 | } 304 | }, 305 | "node_modules/iconv-lite": { 306 | "version": "0.4.24", 307 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 308 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 309 | "dependencies": { 310 | "safer-buffer": ">= 2.1.2 < 3" 311 | }, 312 | "engines": { 313 | "node": ">=0.10.0" 314 | } 315 | }, 316 | "node_modules/inherits": { 317 | "version": "2.0.4", 318 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 319 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 320 | }, 321 | "node_modules/ipaddr.js": { 322 | "version": "1.9.1", 323 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 324 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 325 | "engines": { 326 | "node": ">= 0.10" 327 | } 328 | }, 329 | "node_modules/media-typer": { 330 | "version": "0.3.0", 331 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 332 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 333 | "engines": { 334 | "node": ">= 0.6" 335 | } 336 | }, 337 | "node_modules/merge-descriptors": { 338 | "version": "1.0.1", 339 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 340 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 341 | }, 342 | "node_modules/methods": { 343 | "version": "1.1.2", 344 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 345 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 346 | "engines": { 347 | "node": ">= 0.6" 348 | } 349 | }, 350 | "node_modules/mime": { 351 | "version": "1.6.0", 352 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 353 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 354 | "bin": { 355 | "mime": "cli.js" 356 | }, 357 | "engines": { 358 | "node": ">=4" 359 | } 360 | }, 361 | "node_modules/mime-db": { 362 | "version": "1.52.0", 363 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 364 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 365 | "engines": { 366 | "node": ">= 0.6" 367 | } 368 | }, 369 | "node_modules/mime-types": { 370 | "version": "2.1.35", 371 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 372 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 373 | "dependencies": { 374 | "mime-db": "1.52.0" 375 | }, 376 | "engines": { 377 | "node": ">= 0.6" 378 | } 379 | }, 380 | "node_modules/ms": { 381 | "version": "2.0.0", 382 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 383 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 384 | }, 385 | "node_modules/negotiator": { 386 | "version": "0.6.3", 387 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 388 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 389 | "engines": { 390 | "node": ">= 0.6" 391 | } 392 | }, 393 | "node_modules/object-inspect": { 394 | "version": "1.12.3", 395 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 396 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 397 | "funding": { 398 | "url": "https://github.com/sponsors/ljharb" 399 | } 400 | }, 401 | "node_modules/on-finished": { 402 | "version": "2.4.1", 403 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 404 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 405 | "dependencies": { 406 | "ee-first": "1.1.1" 407 | }, 408 | "engines": { 409 | "node": ">= 0.8" 410 | } 411 | }, 412 | "node_modules/packet-reader": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 415 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 416 | }, 417 | "node_modules/parseurl": { 418 | "version": "1.3.3", 419 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 420 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 421 | "engines": { 422 | "node": ">= 0.8" 423 | } 424 | }, 425 | "node_modules/path-to-regexp": { 426 | "version": "0.1.7", 427 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 428 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 429 | }, 430 | "node_modules/pg": { 431 | "version": "8.10.0", 432 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", 433 | "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", 434 | "dependencies": { 435 | "buffer-writer": "2.0.0", 436 | "packet-reader": "1.0.0", 437 | "pg-connection-string": "^2.5.0", 438 | "pg-pool": "^3.6.0", 439 | "pg-protocol": "^1.6.0", 440 | "pg-types": "^2.1.0", 441 | "pgpass": "1.x" 442 | }, 443 | "engines": { 444 | "node": ">= 8.0.0" 445 | }, 446 | "peerDependencies": { 447 | "pg-native": ">=3.0.1" 448 | }, 449 | "peerDependenciesMeta": { 450 | "pg-native": { 451 | "optional": true 452 | } 453 | } 454 | }, 455 | "node_modules/pg-connection-string": { 456 | "version": "2.5.0", 457 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 458 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 459 | }, 460 | "node_modules/pg-int8": { 461 | "version": "1.0.1", 462 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 463 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 464 | "engines": { 465 | "node": ">=4.0.0" 466 | } 467 | }, 468 | "node_modules/pg-pool": { 469 | "version": "3.6.0", 470 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", 471 | "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", 472 | "peerDependencies": { 473 | "pg": ">=8.0" 474 | } 475 | }, 476 | "node_modules/pg-protocol": { 477 | "version": "1.6.0", 478 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", 479 | "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" 480 | }, 481 | "node_modules/pg-types": { 482 | "version": "2.2.0", 483 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 484 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 485 | "dependencies": { 486 | "pg-int8": "1.0.1", 487 | "postgres-array": "~2.0.0", 488 | "postgres-bytea": "~1.0.0", 489 | "postgres-date": "~1.0.4", 490 | "postgres-interval": "^1.1.0" 491 | }, 492 | "engines": { 493 | "node": ">=4" 494 | } 495 | }, 496 | "node_modules/pgpass": { 497 | "version": "1.0.5", 498 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 499 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 500 | "dependencies": { 501 | "split2": "^4.1.0" 502 | } 503 | }, 504 | "node_modules/postgres-array": { 505 | "version": "2.0.0", 506 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 507 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 508 | "engines": { 509 | "node": ">=4" 510 | } 511 | }, 512 | "node_modules/postgres-bytea": { 513 | "version": "1.0.0", 514 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 515 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 516 | "engines": { 517 | "node": ">=0.10.0" 518 | } 519 | }, 520 | "node_modules/postgres-date": { 521 | "version": "1.0.7", 522 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 523 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 524 | "engines": { 525 | "node": ">=0.10.0" 526 | } 527 | }, 528 | "node_modules/postgres-interval": { 529 | "version": "1.2.0", 530 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 531 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 532 | "dependencies": { 533 | "xtend": "^4.0.0" 534 | }, 535 | "engines": { 536 | "node": ">=0.10.0" 537 | } 538 | }, 539 | "node_modules/proxy-addr": { 540 | "version": "2.0.7", 541 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 542 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 543 | "dependencies": { 544 | "forwarded": "0.2.0", 545 | "ipaddr.js": "1.9.1" 546 | }, 547 | "engines": { 548 | "node": ">= 0.10" 549 | } 550 | }, 551 | "node_modules/qs": { 552 | "version": "6.11.0", 553 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 554 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 555 | "dependencies": { 556 | "side-channel": "^1.0.4" 557 | }, 558 | "engines": { 559 | "node": ">=0.6" 560 | }, 561 | "funding": { 562 | "url": "https://github.com/sponsors/ljharb" 563 | } 564 | }, 565 | "node_modules/range-parser": { 566 | "version": "1.2.1", 567 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 568 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 569 | "engines": { 570 | "node": ">= 0.6" 571 | } 572 | }, 573 | "node_modules/raw-body": { 574 | "version": "2.5.1", 575 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 576 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 577 | "dependencies": { 578 | "bytes": "3.1.2", 579 | "http-errors": "2.0.0", 580 | "iconv-lite": "0.4.24", 581 | "unpipe": "1.0.0" 582 | }, 583 | "engines": { 584 | "node": ">= 0.8" 585 | } 586 | }, 587 | "node_modules/safe-buffer": { 588 | "version": "5.2.1", 589 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 590 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 591 | "funding": [ 592 | { 593 | "type": "github", 594 | "url": "https://github.com/sponsors/feross" 595 | }, 596 | { 597 | "type": "patreon", 598 | "url": "https://www.patreon.com/feross" 599 | }, 600 | { 601 | "type": "consulting", 602 | "url": "https://feross.org/support" 603 | } 604 | ] 605 | }, 606 | "node_modules/safer-buffer": { 607 | "version": "2.1.2", 608 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 609 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 610 | }, 611 | "node_modules/send": { 612 | "version": "0.18.0", 613 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 614 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 615 | "dependencies": { 616 | "debug": "2.6.9", 617 | "depd": "2.0.0", 618 | "destroy": "1.2.0", 619 | "encodeurl": "~1.0.2", 620 | "escape-html": "~1.0.3", 621 | "etag": "~1.8.1", 622 | "fresh": "0.5.2", 623 | "http-errors": "2.0.0", 624 | "mime": "1.6.0", 625 | "ms": "2.1.3", 626 | "on-finished": "2.4.1", 627 | "range-parser": "~1.2.1", 628 | "statuses": "2.0.1" 629 | }, 630 | "engines": { 631 | "node": ">= 0.8.0" 632 | } 633 | }, 634 | "node_modules/send/node_modules/ms": { 635 | "version": "2.1.3", 636 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 637 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 638 | }, 639 | "node_modules/serve-static": { 640 | "version": "1.15.0", 641 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 642 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 643 | "dependencies": { 644 | "encodeurl": "~1.0.2", 645 | "escape-html": "~1.0.3", 646 | "parseurl": "~1.3.3", 647 | "send": "0.18.0" 648 | }, 649 | "engines": { 650 | "node": ">= 0.8.0" 651 | } 652 | }, 653 | "node_modules/setprototypeof": { 654 | "version": "1.2.0", 655 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 656 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 657 | }, 658 | "node_modules/side-channel": { 659 | "version": "1.0.4", 660 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 661 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 662 | "dependencies": { 663 | "call-bind": "^1.0.0", 664 | "get-intrinsic": "^1.0.2", 665 | "object-inspect": "^1.9.0" 666 | }, 667 | "funding": { 668 | "url": "https://github.com/sponsors/ljharb" 669 | } 670 | }, 671 | "node_modules/split2": { 672 | "version": "4.2.0", 673 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 674 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 675 | "engines": { 676 | "node": ">= 10.x" 677 | } 678 | }, 679 | "node_modules/statuses": { 680 | "version": "2.0.1", 681 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 682 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 683 | "engines": { 684 | "node": ">= 0.8" 685 | } 686 | }, 687 | "node_modules/toidentifier": { 688 | "version": "1.0.1", 689 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 690 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 691 | "engines": { 692 | "node": ">=0.6" 693 | } 694 | }, 695 | "node_modules/type-is": { 696 | "version": "1.6.18", 697 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 698 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 699 | "dependencies": { 700 | "media-typer": "0.3.0", 701 | "mime-types": "~2.1.24" 702 | }, 703 | "engines": { 704 | "node": ">= 0.6" 705 | } 706 | }, 707 | "node_modules/unpipe": { 708 | "version": "1.0.0", 709 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 710 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 711 | "engines": { 712 | "node": ">= 0.8" 713 | } 714 | }, 715 | "node_modules/utils-merge": { 716 | "version": "1.0.1", 717 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 718 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 719 | "engines": { 720 | "node": ">= 0.4.0" 721 | } 722 | }, 723 | "node_modules/vary": { 724 | "version": "1.1.2", 725 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 726 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 727 | "engines": { 728 | "node": ">= 0.8" 729 | } 730 | }, 731 | "node_modules/xtend": { 732 | "version": "4.0.2", 733 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 734 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 735 | "engines": { 736 | "node": ">=0.4" 737 | } 738 | } 739 | }, 740 | "dependencies": { 741 | "accepts": { 742 | "version": "1.3.8", 743 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 744 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 745 | "requires": { 746 | "mime-types": "~2.1.34", 747 | "negotiator": "0.6.3" 748 | } 749 | }, 750 | "array-flatten": { 751 | "version": "1.1.1", 752 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 753 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 754 | }, 755 | "body-parser": { 756 | "version": "1.20.1", 757 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 758 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 759 | "requires": { 760 | "bytes": "3.1.2", 761 | "content-type": "~1.0.4", 762 | "debug": "2.6.9", 763 | "depd": "2.0.0", 764 | "destroy": "1.2.0", 765 | "http-errors": "2.0.0", 766 | "iconv-lite": "0.4.24", 767 | "on-finished": "2.4.1", 768 | "qs": "6.11.0", 769 | "raw-body": "2.5.1", 770 | "type-is": "~1.6.18", 771 | "unpipe": "1.0.0" 772 | } 773 | }, 774 | "buffer-writer": { 775 | "version": "2.0.0", 776 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 777 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 778 | }, 779 | "bytes": { 780 | "version": "3.1.2", 781 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 782 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 783 | }, 784 | "call-bind": { 785 | "version": "1.0.2", 786 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 787 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 788 | "requires": { 789 | "function-bind": "^1.1.1", 790 | "get-intrinsic": "^1.0.2" 791 | } 792 | }, 793 | "content-disposition": { 794 | "version": "0.5.4", 795 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 796 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 797 | "requires": { 798 | "safe-buffer": "5.2.1" 799 | } 800 | }, 801 | "content-type": { 802 | "version": "1.0.5", 803 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 804 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 805 | }, 806 | "cookie": { 807 | "version": "0.5.0", 808 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 809 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 810 | }, 811 | "cookie-signature": { 812 | "version": "1.0.6", 813 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 814 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 815 | }, 816 | "debug": { 817 | "version": "2.6.9", 818 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 819 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 820 | "requires": { 821 | "ms": "2.0.0" 822 | } 823 | }, 824 | "depd": { 825 | "version": "2.0.0", 826 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 827 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 828 | }, 829 | "destroy": { 830 | "version": "1.2.0", 831 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 832 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 833 | }, 834 | "dotenv": { 835 | "version": "16.0.3", 836 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 837 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" 838 | }, 839 | "ee-first": { 840 | "version": "1.1.1", 841 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 842 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 843 | }, 844 | "encodeurl": { 845 | "version": "1.0.2", 846 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 847 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 848 | }, 849 | "escape-html": { 850 | "version": "1.0.3", 851 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 852 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 853 | }, 854 | "etag": { 855 | "version": "1.8.1", 856 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 857 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 858 | }, 859 | "express": { 860 | "version": "4.18.2", 861 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 862 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 863 | "requires": { 864 | "accepts": "~1.3.8", 865 | "array-flatten": "1.1.1", 866 | "body-parser": "1.20.1", 867 | "content-disposition": "0.5.4", 868 | "content-type": "~1.0.4", 869 | "cookie": "0.5.0", 870 | "cookie-signature": "1.0.6", 871 | "debug": "2.6.9", 872 | "depd": "2.0.0", 873 | "encodeurl": "~1.0.2", 874 | "escape-html": "~1.0.3", 875 | "etag": "~1.8.1", 876 | "finalhandler": "1.2.0", 877 | "fresh": "0.5.2", 878 | "http-errors": "2.0.0", 879 | "merge-descriptors": "1.0.1", 880 | "methods": "~1.1.2", 881 | "on-finished": "2.4.1", 882 | "parseurl": "~1.3.3", 883 | "path-to-regexp": "0.1.7", 884 | "proxy-addr": "~2.0.7", 885 | "qs": "6.11.0", 886 | "range-parser": "~1.2.1", 887 | "safe-buffer": "5.2.1", 888 | "send": "0.18.0", 889 | "serve-static": "1.15.0", 890 | "setprototypeof": "1.2.0", 891 | "statuses": "2.0.1", 892 | "type-is": "~1.6.18", 893 | "utils-merge": "1.0.1", 894 | "vary": "~1.1.2" 895 | } 896 | }, 897 | "finalhandler": { 898 | "version": "1.2.0", 899 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 900 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 901 | "requires": { 902 | "debug": "2.6.9", 903 | "encodeurl": "~1.0.2", 904 | "escape-html": "~1.0.3", 905 | "on-finished": "2.4.1", 906 | "parseurl": "~1.3.3", 907 | "statuses": "2.0.1", 908 | "unpipe": "~1.0.0" 909 | } 910 | }, 911 | "forwarded": { 912 | "version": "0.2.0", 913 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 914 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 915 | }, 916 | "fresh": { 917 | "version": "0.5.2", 918 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 919 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 920 | }, 921 | "function-bind": { 922 | "version": "1.1.1", 923 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 924 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 925 | }, 926 | "get-intrinsic": { 927 | "version": "1.2.0", 928 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 929 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 930 | "requires": { 931 | "function-bind": "^1.1.1", 932 | "has": "^1.0.3", 933 | "has-symbols": "^1.0.3" 934 | } 935 | }, 936 | "has": { 937 | "version": "1.0.3", 938 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 939 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 940 | "requires": { 941 | "function-bind": "^1.1.1" 942 | } 943 | }, 944 | "has-symbols": { 945 | "version": "1.0.3", 946 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 947 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 948 | }, 949 | "http-errors": { 950 | "version": "2.0.0", 951 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 952 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 953 | "requires": { 954 | "depd": "2.0.0", 955 | "inherits": "2.0.4", 956 | "setprototypeof": "1.2.0", 957 | "statuses": "2.0.1", 958 | "toidentifier": "1.0.1" 959 | } 960 | }, 961 | "iconv-lite": { 962 | "version": "0.4.24", 963 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 964 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 965 | "requires": { 966 | "safer-buffer": ">= 2.1.2 < 3" 967 | } 968 | }, 969 | "inherits": { 970 | "version": "2.0.4", 971 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 972 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 973 | }, 974 | "ipaddr.js": { 975 | "version": "1.9.1", 976 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 977 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 978 | }, 979 | "media-typer": { 980 | "version": "0.3.0", 981 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 982 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 983 | }, 984 | "merge-descriptors": { 985 | "version": "1.0.1", 986 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 987 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 988 | }, 989 | "methods": { 990 | "version": "1.1.2", 991 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 992 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 993 | }, 994 | "mime": { 995 | "version": "1.6.0", 996 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 997 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 998 | }, 999 | "mime-db": { 1000 | "version": "1.52.0", 1001 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1002 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1003 | }, 1004 | "mime-types": { 1005 | "version": "2.1.35", 1006 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1007 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1008 | "requires": { 1009 | "mime-db": "1.52.0" 1010 | } 1011 | }, 1012 | "ms": { 1013 | "version": "2.0.0", 1014 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1015 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1016 | }, 1017 | "negotiator": { 1018 | "version": "0.6.3", 1019 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1020 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1021 | }, 1022 | "object-inspect": { 1023 | "version": "1.12.3", 1024 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1025 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" 1026 | }, 1027 | "on-finished": { 1028 | "version": "2.4.1", 1029 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1030 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1031 | "requires": { 1032 | "ee-first": "1.1.1" 1033 | } 1034 | }, 1035 | "packet-reader": { 1036 | "version": "1.0.0", 1037 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 1038 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 1039 | }, 1040 | "parseurl": { 1041 | "version": "1.3.3", 1042 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1043 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1044 | }, 1045 | "path-to-regexp": { 1046 | "version": "0.1.7", 1047 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1048 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1049 | }, 1050 | "pg": { 1051 | "version": "8.10.0", 1052 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", 1053 | "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", 1054 | "requires": { 1055 | "buffer-writer": "2.0.0", 1056 | "packet-reader": "1.0.0", 1057 | "pg-connection-string": "^2.5.0", 1058 | "pg-pool": "^3.6.0", 1059 | "pg-protocol": "^1.6.0", 1060 | "pg-types": "^2.1.0", 1061 | "pgpass": "1.x" 1062 | } 1063 | }, 1064 | "pg-connection-string": { 1065 | "version": "2.5.0", 1066 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 1067 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 1068 | }, 1069 | "pg-int8": { 1070 | "version": "1.0.1", 1071 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 1072 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 1073 | }, 1074 | "pg-pool": { 1075 | "version": "3.6.0", 1076 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", 1077 | "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", 1078 | "requires": {} 1079 | }, 1080 | "pg-protocol": { 1081 | "version": "1.6.0", 1082 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", 1083 | "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" 1084 | }, 1085 | "pg-types": { 1086 | "version": "2.2.0", 1087 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 1088 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 1089 | "requires": { 1090 | "pg-int8": "1.0.1", 1091 | "postgres-array": "~2.0.0", 1092 | "postgres-bytea": "~1.0.0", 1093 | "postgres-date": "~1.0.4", 1094 | "postgres-interval": "^1.1.0" 1095 | } 1096 | }, 1097 | "pgpass": { 1098 | "version": "1.0.5", 1099 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 1100 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 1101 | "requires": { 1102 | "split2": "^4.1.0" 1103 | } 1104 | }, 1105 | "postgres-array": { 1106 | "version": "2.0.0", 1107 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 1108 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 1109 | }, 1110 | "postgres-bytea": { 1111 | "version": "1.0.0", 1112 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 1113 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" 1114 | }, 1115 | "postgres-date": { 1116 | "version": "1.0.7", 1117 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 1118 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" 1119 | }, 1120 | "postgres-interval": { 1121 | "version": "1.2.0", 1122 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 1123 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 1124 | "requires": { 1125 | "xtend": "^4.0.0" 1126 | } 1127 | }, 1128 | "proxy-addr": { 1129 | "version": "2.0.7", 1130 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1131 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1132 | "requires": { 1133 | "forwarded": "0.2.0", 1134 | "ipaddr.js": "1.9.1" 1135 | } 1136 | }, 1137 | "qs": { 1138 | "version": "6.11.0", 1139 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1140 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1141 | "requires": { 1142 | "side-channel": "^1.0.4" 1143 | } 1144 | }, 1145 | "range-parser": { 1146 | "version": "1.2.1", 1147 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1148 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1149 | }, 1150 | "raw-body": { 1151 | "version": "2.5.1", 1152 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1153 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1154 | "requires": { 1155 | "bytes": "3.1.2", 1156 | "http-errors": "2.0.0", 1157 | "iconv-lite": "0.4.24", 1158 | "unpipe": "1.0.0" 1159 | } 1160 | }, 1161 | "safe-buffer": { 1162 | "version": "5.2.1", 1163 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1164 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1165 | }, 1166 | "safer-buffer": { 1167 | "version": "2.1.2", 1168 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1169 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1170 | }, 1171 | "send": { 1172 | "version": "0.18.0", 1173 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1174 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1175 | "requires": { 1176 | "debug": "2.6.9", 1177 | "depd": "2.0.0", 1178 | "destroy": "1.2.0", 1179 | "encodeurl": "~1.0.2", 1180 | "escape-html": "~1.0.3", 1181 | "etag": "~1.8.1", 1182 | "fresh": "0.5.2", 1183 | "http-errors": "2.0.0", 1184 | "mime": "1.6.0", 1185 | "ms": "2.1.3", 1186 | "on-finished": "2.4.1", 1187 | "range-parser": "~1.2.1", 1188 | "statuses": "2.0.1" 1189 | }, 1190 | "dependencies": { 1191 | "ms": { 1192 | "version": "2.1.3", 1193 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1194 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1195 | } 1196 | } 1197 | }, 1198 | "serve-static": { 1199 | "version": "1.15.0", 1200 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1201 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1202 | "requires": { 1203 | "encodeurl": "~1.0.2", 1204 | "escape-html": "~1.0.3", 1205 | "parseurl": "~1.3.3", 1206 | "send": "0.18.0" 1207 | } 1208 | }, 1209 | "setprototypeof": { 1210 | "version": "1.2.0", 1211 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1212 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1213 | }, 1214 | "side-channel": { 1215 | "version": "1.0.4", 1216 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1217 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1218 | "requires": { 1219 | "call-bind": "^1.0.0", 1220 | "get-intrinsic": "^1.0.2", 1221 | "object-inspect": "^1.9.0" 1222 | } 1223 | }, 1224 | "split2": { 1225 | "version": "4.2.0", 1226 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 1227 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" 1228 | }, 1229 | "statuses": { 1230 | "version": "2.0.1", 1231 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1232 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1233 | }, 1234 | "toidentifier": { 1235 | "version": "1.0.1", 1236 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1237 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1238 | }, 1239 | "type-is": { 1240 | "version": "1.6.18", 1241 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1242 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1243 | "requires": { 1244 | "media-typer": "0.3.0", 1245 | "mime-types": "~2.1.24" 1246 | } 1247 | }, 1248 | "unpipe": { 1249 | "version": "1.0.0", 1250 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1251 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1252 | }, 1253 | "utils-merge": { 1254 | "version": "1.0.1", 1255 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1256 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1257 | }, 1258 | "vary": { 1259 | "version": "1.1.2", 1260 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1261 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1262 | }, 1263 | "xtend": { 1264 | "version": "4.0.2", 1265 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1266 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1267 | } 1268 | } 1269 | } 1270 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postgre-crud", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "dotenv": "^16.0.3", 14 | "express": "^4.18.2", 15 | "pg": "^8.10.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /routes/book.router.js: -------------------------------------------------------------------------------- 1 | const express = require("express") 2 | const router = express.Router() 3 | 4 | const bookController = require('../controllers/book.controller') 5 | 6 | router.get("/", bookController.getAll) 7 | router.get("/:id", bookController.getById) 8 | router.post("/", bookController.create) 9 | router.put("/:id", bookController.updateById) 10 | router.delete("/:id", bookController.deleteById) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { 5 | "src": "./index.js", 6 | "use": "@vercel/node" 7 | } 8 | ], 9 | "routes": [ 10 | { 11 | "src": "/(.*)", 12 | "dest": "/" 13 | } 14 | ] 15 | } --------------------------------------------------------------------------------