├── .gitignore ├── README.md ├── backend ├── app.js ├── config.js ├── controllers │ └── books.controller.js ├── database.js ├── index.js ├── models │ └── Book.js └── routes │ └── books.routes.js ├── frontend ├── .gitignore ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public │ └── vite.svg └── src │ ├── UI.js │ ├── components │ └── bookForm.js │ ├── main.js │ ├── models │ └── Book.js │ ├── services │ └── BookService.js │ └── styles │ └── app.css ├── package.json ├── pnpm-lock.yaml └── requests └── books.rest /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | backend/public -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Javascript FullStack Course 2 | 3 | This is a practical example to learn How to develop a simple FullStack Javascript application using Javascript in the frontend (with Vite) and Nodejs Backend with MongoDB 4 | 5 | ### Development Backend Installation 6 | 7 | ```sh 8 | git clone https://github.com/FaztWeb/javascript-fullstack-simple 9 | cd javascript-fullstack-simple 10 | npm i 11 | npm run dev 12 | ``` 13 | 14 | then continue with the frontend installation 15 | 16 | ### Development Frontend Installation 17 | 18 | ```sh 19 | cd frontend 20 | npm i 21 | npm run dev 22 | ``` -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import morgan from "morgan"; 3 | import cors from "cors"; 4 | import multer from "multer"; 5 | import { dirname, extname, join } from "path"; 6 | import { fileURLToPath } from "url"; 7 | import booksRoutes from "./routes/books.routes.js"; 8 | 9 | const app = express(); 10 | const __dirname = dirname(fileURLToPath(import.meta.url)); 11 | 12 | // middlewares 13 | app.use(morgan("dev")); 14 | app.use(cors()); 15 | const storage = multer.diskStorage({ 16 | destination: join(__dirname, "public/uploads"), 17 | filename(req, file, cb) { 18 | cb(null, new Date().getTime() + extname(file.originalname)); 19 | }, 20 | }); 21 | app.use(multer({ storage }).single("image")); 22 | app.use(express.urlencoded({ extended: false })); 23 | app.use(express.json()); 24 | 25 | // routes 26 | app.use("/api/books", booksRoutes); 27 | 28 | // static files 29 | app.use(express.static(join(__dirname, "public"))); 30 | 31 | // uploads 32 | app.use("/uploads", express.static(join(__dirname, "public/uploads"))); 33 | 34 | // frontend 35 | app.use(express.static(join(__dirname, "../frontend/dist"))); 36 | 37 | export default app; 38 | -------------------------------------------------------------------------------- /backend/config.js: -------------------------------------------------------------------------------- 1 | import { config } from "dotenv"; 2 | 3 | config(); 4 | 5 | export const PORT = process.env.PORT || 3000; 6 | export const MONGODB_URI = 7 | process.env.MONGODB_URI || "mongodb://localhost:27017/bookstore"; 8 | -------------------------------------------------------------------------------- /backend/controllers/books.controller.js: -------------------------------------------------------------------------------- 1 | import Book from "../models/Book.js"; 2 | import path from "path"; 3 | import fs from "fs/promises"; 4 | 5 | export const getAllBooks = async (req, res) => { 6 | try { 7 | const books = await Book.find().sort("-_id"); 8 | res.json(books); 9 | } catch (error) { 10 | return res.status(500).json({ message: error.message }); 11 | } 12 | } 13 | 14 | export const createBook = async (req, res) => { 15 | try { 16 | const { title, author, isbn } = req.body; 17 | 18 | if (!title || !author || !isbn) 19 | return res.status(400).json({ message: "Please, provide all fields" }); 20 | 21 | const newBook = new Book({ title, author, isbn }); 22 | 23 | if (req.file) { 24 | newBook.imagePath = "/uploads/" + req.file.filename; 25 | } 26 | 27 | const savedBook = await newBook.save(); 28 | res.json(savedBook); 29 | } catch (error) { 30 | return res.status(500).json({ message: error.message }); 31 | } 32 | } 33 | 34 | export const deleteBook = async (req, res) => { 35 | try { 36 | const book = await Book.findByIdAndDelete(req.params.id); 37 | await fs.unlink(path.resolve("./backend/public/" + book.imagePath)); 38 | res.json({ message: "Book Deleted" }); 39 | } catch (error) { 40 | return res.status(500).json({ message: error.message }); 41 | } 42 | } 43 | 44 | export const updateBook = async (req, res) => { 45 | try { 46 | const book = await Book.findByIdAndUpdate(req.params.id, req.body, { 47 | new: true, 48 | }); 49 | res.json(book); 50 | } catch (error) { 51 | return res.status(500).json({ message: error.message }); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /backend/database.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | import { MONGODB_URI } from "./config.js"; 3 | 4 | try { 5 | const db = await mongoose.connect(MONGODB_URI); 6 | console.log("Database is connected to", db.connection.host); 7 | } catch (error) { 8 | console.error(error); 9 | } 10 | -------------------------------------------------------------------------------- /backend/index.js: -------------------------------------------------------------------------------- 1 | import app from "./app.js"; 2 | import { PORT } from "./config.js"; 3 | 4 | // Initializations 5 | import "./database.js"; 6 | 7 | // start the server 8 | app.listen(PORT); 9 | console.log(`Server started on port ${PORT}`); 10 | -------------------------------------------------------------------------------- /backend/models/Book.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | 3 | const BookSchema = new mongoose.Schema( 4 | { 5 | title: { type: String, required: true, trim: true }, 6 | author: { type: String, required: true, trim: true }, 7 | isbn: { type: String, required: true, trim: true }, 8 | imagePath: { type: String }, 9 | }, 10 | { 11 | timestamps: true, 12 | } 13 | ); 14 | 15 | export default mongoose.model("Book", BookSchema); 16 | -------------------------------------------------------------------------------- /backend/routes/books.routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import { 3 | createBook, 4 | deleteBook, 5 | getAllBooks, 6 | updateBook, 7 | } from "../controllers/books.controller.js"; 8 | 9 | const router = Router(); 10 | 11 | router.get("/", getAllBooks); 12 | 13 | router.post("/", createBook); 14 | 15 | router.delete("/:id", deleteBook); 16 | 17 | router.patch("/:id", updateBook); 18 | 19 | export default router; 20 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | Vite App 12 | 13 | 14 | 15 | 20 |
21 |
22 |
23 | 24 |
25 |
26 | 27 | 34 |
35 |
36 | 37 | 43 |
44 |
45 | 46 | 52 |
53 |
54 | 55 | 56 |
57 | 58 |
59 |
60 | 61 |
62 |
63 |
64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "vite": "^3.0.0" 13 | } 14 | } -------------------------------------------------------------------------------- /frontend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | vite: ^3.0.0 5 | 6 | devDependencies: 7 | vite: 3.2.3 8 | 9 | packages: 10 | 11 | /@esbuild/android-arm/0.15.13: 12 | resolution: {integrity: sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==} 13 | engines: {node: '>=12'} 14 | cpu: [arm] 15 | os: [android] 16 | requiresBuild: true 17 | dev: true 18 | optional: true 19 | 20 | /@esbuild/linux-loong64/0.15.13: 21 | resolution: {integrity: sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==} 22 | engines: {node: '>=12'} 23 | cpu: [loong64] 24 | os: [linux] 25 | requiresBuild: true 26 | dev: true 27 | optional: true 28 | 29 | /esbuild-android-64/0.15.13: 30 | resolution: {integrity: sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==} 31 | engines: {node: '>=12'} 32 | cpu: [x64] 33 | os: [android] 34 | requiresBuild: true 35 | dev: true 36 | optional: true 37 | 38 | /esbuild-android-arm64/0.15.13: 39 | resolution: {integrity: sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==} 40 | engines: {node: '>=12'} 41 | cpu: [arm64] 42 | os: [android] 43 | requiresBuild: true 44 | dev: true 45 | optional: true 46 | 47 | /esbuild-darwin-64/0.15.13: 48 | resolution: {integrity: sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==} 49 | engines: {node: '>=12'} 50 | cpu: [x64] 51 | os: [darwin] 52 | requiresBuild: true 53 | dev: true 54 | optional: true 55 | 56 | /esbuild-darwin-arm64/0.15.13: 57 | resolution: {integrity: sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==} 58 | engines: {node: '>=12'} 59 | cpu: [arm64] 60 | os: [darwin] 61 | requiresBuild: true 62 | dev: true 63 | optional: true 64 | 65 | /esbuild-freebsd-64/0.15.13: 66 | resolution: {integrity: sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==} 67 | engines: {node: '>=12'} 68 | cpu: [x64] 69 | os: [freebsd] 70 | requiresBuild: true 71 | dev: true 72 | optional: true 73 | 74 | /esbuild-freebsd-arm64/0.15.13: 75 | resolution: {integrity: sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==} 76 | engines: {node: '>=12'} 77 | cpu: [arm64] 78 | os: [freebsd] 79 | requiresBuild: true 80 | dev: true 81 | optional: true 82 | 83 | /esbuild-linux-32/0.15.13: 84 | resolution: {integrity: sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==} 85 | engines: {node: '>=12'} 86 | cpu: [ia32] 87 | os: [linux] 88 | requiresBuild: true 89 | dev: true 90 | optional: true 91 | 92 | /esbuild-linux-64/0.15.13: 93 | resolution: {integrity: sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==} 94 | engines: {node: '>=12'} 95 | cpu: [x64] 96 | os: [linux] 97 | requiresBuild: true 98 | dev: true 99 | optional: true 100 | 101 | /esbuild-linux-arm/0.15.13: 102 | resolution: {integrity: sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==} 103 | engines: {node: '>=12'} 104 | cpu: [arm] 105 | os: [linux] 106 | requiresBuild: true 107 | dev: true 108 | optional: true 109 | 110 | /esbuild-linux-arm64/0.15.13: 111 | resolution: {integrity: sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==} 112 | engines: {node: '>=12'} 113 | cpu: [arm64] 114 | os: [linux] 115 | requiresBuild: true 116 | dev: true 117 | optional: true 118 | 119 | /esbuild-linux-mips64le/0.15.13: 120 | resolution: {integrity: sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==} 121 | engines: {node: '>=12'} 122 | cpu: [mips64el] 123 | os: [linux] 124 | requiresBuild: true 125 | dev: true 126 | optional: true 127 | 128 | /esbuild-linux-ppc64le/0.15.13: 129 | resolution: {integrity: sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==} 130 | engines: {node: '>=12'} 131 | cpu: [ppc64] 132 | os: [linux] 133 | requiresBuild: true 134 | dev: true 135 | optional: true 136 | 137 | /esbuild-linux-riscv64/0.15.13: 138 | resolution: {integrity: sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==} 139 | engines: {node: '>=12'} 140 | cpu: [riscv64] 141 | os: [linux] 142 | requiresBuild: true 143 | dev: true 144 | optional: true 145 | 146 | /esbuild-linux-s390x/0.15.13: 147 | resolution: {integrity: sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==} 148 | engines: {node: '>=12'} 149 | cpu: [s390x] 150 | os: [linux] 151 | requiresBuild: true 152 | dev: true 153 | optional: true 154 | 155 | /esbuild-netbsd-64/0.15.13: 156 | resolution: {integrity: sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==} 157 | engines: {node: '>=12'} 158 | cpu: [x64] 159 | os: [netbsd] 160 | requiresBuild: true 161 | dev: true 162 | optional: true 163 | 164 | /esbuild-openbsd-64/0.15.13: 165 | resolution: {integrity: sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==} 166 | engines: {node: '>=12'} 167 | cpu: [x64] 168 | os: [openbsd] 169 | requiresBuild: true 170 | dev: true 171 | optional: true 172 | 173 | /esbuild-sunos-64/0.15.13: 174 | resolution: {integrity: sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==} 175 | engines: {node: '>=12'} 176 | cpu: [x64] 177 | os: [sunos] 178 | requiresBuild: true 179 | dev: true 180 | optional: true 181 | 182 | /esbuild-windows-32/0.15.13: 183 | resolution: {integrity: sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==} 184 | engines: {node: '>=12'} 185 | cpu: [ia32] 186 | os: [win32] 187 | requiresBuild: true 188 | dev: true 189 | optional: true 190 | 191 | /esbuild-windows-64/0.15.13: 192 | resolution: {integrity: sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==} 193 | engines: {node: '>=12'} 194 | cpu: [x64] 195 | os: [win32] 196 | requiresBuild: true 197 | dev: true 198 | optional: true 199 | 200 | /esbuild-windows-arm64/0.15.13: 201 | resolution: {integrity: sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==} 202 | engines: {node: '>=12'} 203 | cpu: [arm64] 204 | os: [win32] 205 | requiresBuild: true 206 | dev: true 207 | optional: true 208 | 209 | /esbuild/0.15.13: 210 | resolution: {integrity: sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==} 211 | engines: {node: '>=12'} 212 | hasBin: true 213 | requiresBuild: true 214 | optionalDependencies: 215 | '@esbuild/android-arm': 0.15.13 216 | '@esbuild/linux-loong64': 0.15.13 217 | esbuild-android-64: 0.15.13 218 | esbuild-android-arm64: 0.15.13 219 | esbuild-darwin-64: 0.15.13 220 | esbuild-darwin-arm64: 0.15.13 221 | esbuild-freebsd-64: 0.15.13 222 | esbuild-freebsd-arm64: 0.15.13 223 | esbuild-linux-32: 0.15.13 224 | esbuild-linux-64: 0.15.13 225 | esbuild-linux-arm: 0.15.13 226 | esbuild-linux-arm64: 0.15.13 227 | esbuild-linux-mips64le: 0.15.13 228 | esbuild-linux-ppc64le: 0.15.13 229 | esbuild-linux-riscv64: 0.15.13 230 | esbuild-linux-s390x: 0.15.13 231 | esbuild-netbsd-64: 0.15.13 232 | esbuild-openbsd-64: 0.15.13 233 | esbuild-sunos-64: 0.15.13 234 | esbuild-windows-32: 0.15.13 235 | esbuild-windows-64: 0.15.13 236 | esbuild-windows-arm64: 0.15.13 237 | dev: true 238 | 239 | /fsevents/2.3.2: 240 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 241 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 242 | os: [darwin] 243 | requiresBuild: true 244 | dev: true 245 | optional: true 246 | 247 | /function-bind/1.1.1: 248 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 249 | dev: true 250 | 251 | /has/1.0.3: 252 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 253 | engines: {node: '>= 0.4.0'} 254 | dependencies: 255 | function-bind: 1.1.1 256 | dev: true 257 | 258 | /is-core-module/2.11.0: 259 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 260 | dependencies: 261 | has: 1.0.3 262 | dev: true 263 | 264 | /nanoid/3.3.4: 265 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 266 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 267 | hasBin: true 268 | dev: true 269 | 270 | /path-parse/1.0.7: 271 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 272 | dev: true 273 | 274 | /picocolors/1.0.0: 275 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 276 | dev: true 277 | 278 | /postcss/8.4.19: 279 | resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} 280 | engines: {node: ^10 || ^12 || >=14} 281 | dependencies: 282 | nanoid: 3.3.4 283 | picocolors: 1.0.0 284 | source-map-js: 1.0.2 285 | dev: true 286 | 287 | /resolve/1.22.1: 288 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 289 | hasBin: true 290 | dependencies: 291 | is-core-module: 2.11.0 292 | path-parse: 1.0.7 293 | supports-preserve-symlinks-flag: 1.0.0 294 | dev: true 295 | 296 | /rollup/2.79.1: 297 | resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} 298 | engines: {node: '>=10.0.0'} 299 | hasBin: true 300 | optionalDependencies: 301 | fsevents: 2.3.2 302 | dev: true 303 | 304 | /source-map-js/1.0.2: 305 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 306 | engines: {node: '>=0.10.0'} 307 | dev: true 308 | 309 | /supports-preserve-symlinks-flag/1.0.0: 310 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 311 | engines: {node: '>= 0.4'} 312 | dev: true 313 | 314 | /vite/3.2.3: 315 | resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} 316 | engines: {node: ^14.18.0 || >=16.0.0} 317 | hasBin: true 318 | peerDependencies: 319 | '@types/node': '>= 14' 320 | less: '*' 321 | sass: '*' 322 | stylus: '*' 323 | sugarss: '*' 324 | terser: ^5.4.0 325 | peerDependenciesMeta: 326 | '@types/node': 327 | optional: true 328 | less: 329 | optional: true 330 | sass: 331 | optional: true 332 | stylus: 333 | optional: true 334 | sugarss: 335 | optional: true 336 | terser: 337 | optional: true 338 | dependencies: 339 | esbuild: 0.15.13 340 | postcss: 8.4.19 341 | resolve: 1.22.1 342 | rollup: 2.79.1 343 | optionalDependencies: 344 | fsevents: 2.3.2 345 | dev: true 346 | -------------------------------------------------------------------------------- /frontend/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/UI.js: -------------------------------------------------------------------------------- 1 | import { BookService } from "./services/BookService"; 2 | import { format } from "timeago.js"; 3 | 4 | const bookService = new BookService( 5 | `${import.meta.env.VITE_API_URL}/api/books` 6 | ); 7 | 8 | export class UI { 9 | async renderBooks() { 10 | const books = await bookService.getBooks(); 11 | const booksCardContainer = document.getElementById("books-cards"); 12 | booksCardContainer.innerHTML = ""; 13 | 14 | books.forEach((book) => { 15 | const div = document.createElement("div"); 16 | div.className = "animated fadeInRight"; 17 | div.innerHTML = ` 18 |
19 |
20 |
21 | 26 |
27 |
28 |
29 |
30 |

${book.title}

31 | Delete 34 |
35 |

${book.author}

36 |
37 |
38 |
39 | 42 |
43 | `; 44 | booksCardContainer.appendChild(div); 45 | }); 46 | } 47 | 48 | async addANewBook(book) { 49 | await bookService.postBook(book); 50 | this.renderBooks(); 51 | this.clearBookForm(); 52 | } 53 | 54 | clearBookForm() { 55 | document.getElementById("book-form").reset(); 56 | document.getElementById("title").focus(); 57 | } 58 | 59 | renderMessage(message, colorMessage, secondsToRemove) { 60 | // Creating a div 61 | const div = document.createElement("div"); 62 | // Styling the div 63 | div.className = `message ${colorMessage}`; 64 | // Adding Text to the div 65 | div.appendChild(document.createTextNode(message)); 66 | // Puting in the documnet 67 | const container = document.querySelector(".col-md-4"); 68 | const bookForm = document.querySelector("#book-form"); 69 | container.insertBefore(div, bookForm); 70 | // Removing the div after some secconds 71 | setTimeout(() => { 72 | document.querySelector(".message").remove(); 73 | }, secondsToRemove); 74 | } 75 | 76 | async deleteBook(bookId) { 77 | await bookService.deleteBook(bookId); 78 | this.renderBooks(); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /frontend/src/components/bookForm.js: -------------------------------------------------------------------------------- 1 | import {UI} from "../UI.js"; 2 | 3 | const bookForm = document.getElementById("book-form"); 4 | 5 | bookForm.addEventListener("submit", (e) => { 6 | e.preventDefault(); 7 | const title = bookForm["title"].value; 8 | const author = bookForm["author"].value; 9 | const isbn = bookForm["isbn"].value; 10 | 11 | const image = document.getElementById("image").files; 12 | 13 | const formData = new FormData(); 14 | formData.append("image", image[0]); 15 | formData.append("title", title); 16 | formData.append("author", author); 17 | formData.append("isbn", isbn); 18 | 19 | for (var pair of formData.entries()) { 20 | console.log(pair[0] + ", " + pair[1]); 21 | } 22 | 23 | // Instatiating the UI 24 | const ui = new UI(); 25 | 26 | // // Validating User Input 27 | if (title === "" || author === "" || isbn === "") { 28 | ui.renderMessage("Please fill all the fields", "error", 3000); 29 | } else { 30 | // Pass the new book to the UI 31 | ui.addANewBook(formData); 32 | ui.renderMessage("New Book Added Successfully", "success", 2000); 33 | } 34 | }); 35 | -------------------------------------------------------------------------------- /frontend/src/main.js: -------------------------------------------------------------------------------- 1 | import "./styles/app.css"; 2 | import { UI } from "./UI.js"; 3 | import "./components/bookForm.js"; 4 | 5 | document.addEventListener("DOMContentLoaded", () => { 6 | const ui = new UI(); 7 | ui.renderBooks(); 8 | }); 9 | 10 | 11 | document.getElementById("books-cards").addEventListener("click", (e) => { 12 | const ui = new UI(); 13 | if (e.target.classList.contains("delete")) { 14 | ui.deleteBook(e.target.getAttribute("_id")); 15 | ui.renderMessage("Book Deleted Successfully", "success", 3000); 16 | } 17 | e.preventDefault(); 18 | }); 19 | -------------------------------------------------------------------------------- /frontend/src/models/Book.js: -------------------------------------------------------------------------------- 1 | export class Book { 2 | constructor(title, author, isbn) { 3 | this.title = title; 4 | this.author = author; 5 | this.isbn = isbn; 6 | } 7 | } 8 | 9 | export default Book; 10 | -------------------------------------------------------------------------------- /frontend/src/services/BookService.js: -------------------------------------------------------------------------------- 1 | export class BookService { 2 | constructor(URL) { 3 | this.URI = URL; 4 | } 5 | 6 | async getBooks() { 7 | return (await fetch(this.URI)).json() 8 | } 9 | 10 | async postBook(book) { 11 | const res = await fetch(this.URI, { 12 | method: "POST", 13 | body: book, 14 | }); 15 | const data = await res.json(); 16 | } 17 | 18 | async deleteBook(bookId) { 19 | const res = await fetch(`${this.URI}/${bookId}`, { 20 | headers: { 21 | "Content-Type": "application/json", 22 | }, 23 | method: "Delete", 24 | }); 25 | const data = await res.json(); 26 | console.log(data); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /frontend/src/styles/app.css: -------------------------------------------------------------------------------- 1 | .success, .error { 2 | color: white; 3 | padding: 10px; 4 | margin: 5px 0 15px 0; 5 | } 6 | 7 | .success { 8 | background: green; 9 | } 10 | 11 | .error { 12 | background: red; 13 | } 14 | 15 | body { 16 | background: #303030; 17 | } 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "javascript-fullstack-simple", 3 | "version": "1.0.0", 4 | "description": "", 5 | "type": "module", 6 | "main": "index.js", 7 | "scripts": { 8 | "dev": "nodemon backend/index.js --ignore frontend", 9 | "build": "npm run build --prefix frontend", 10 | "start": "node backend/index.js" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "nodemon": "^2.0.20", 17 | "timeago.js": "^4.0.2" 18 | }, 19 | "dependencies": { 20 | "cors": "^2.8.5", 21 | "dotenv": "^16.0.3", 22 | "express": "^4.18.2", 23 | "mongoose": "^6.7.2", 24 | "morgan": "^1.10.0", 25 | "multer": "^1.4.4" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | cors: ^2.8.5 5 | dotenv: ^16.0.3 6 | express: ^4.18.2 7 | mongoose: ^6.7.2 8 | morgan: ^1.10.0 9 | multer: ^1.4.4 10 | nodemon: ^2.0.20 11 | timeago.js: ^4.0.2 12 | 13 | dependencies: 14 | cors: 2.8.5 15 | dotenv: 16.0.3 16 | express: 4.18.2 17 | mongoose: 6.7.2 18 | morgan: 1.10.0 19 | multer: 1.4.4 20 | 21 | devDependencies: 22 | nodemon: 2.0.20 23 | timeago.js: 4.0.2 24 | 25 | packages: 26 | 27 | /@aws-crypto/ie11-detection/2.0.2: 28 | resolution: {integrity: sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==} 29 | dependencies: 30 | tslib: 1.14.1 31 | dev: false 32 | optional: true 33 | 34 | /@aws-crypto/sha256-browser/2.0.0: 35 | resolution: {integrity: sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==} 36 | dependencies: 37 | '@aws-crypto/ie11-detection': 2.0.2 38 | '@aws-crypto/sha256-js': 2.0.0 39 | '@aws-crypto/supports-web-crypto': 2.0.2 40 | '@aws-crypto/util': 2.0.2 41 | '@aws-sdk/types': 3.208.0 42 | '@aws-sdk/util-locate-window': 3.208.0 43 | '@aws-sdk/util-utf8-browser': 3.188.0 44 | tslib: 1.14.1 45 | dev: false 46 | optional: true 47 | 48 | /@aws-crypto/sha256-js/2.0.0: 49 | resolution: {integrity: sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==} 50 | dependencies: 51 | '@aws-crypto/util': 2.0.2 52 | '@aws-sdk/types': 3.208.0 53 | tslib: 1.14.1 54 | dev: false 55 | optional: true 56 | 57 | /@aws-crypto/supports-web-crypto/2.0.2: 58 | resolution: {integrity: sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==} 59 | dependencies: 60 | tslib: 1.14.1 61 | dev: false 62 | optional: true 63 | 64 | /@aws-crypto/util/2.0.2: 65 | resolution: {integrity: sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==} 66 | dependencies: 67 | '@aws-sdk/types': 3.208.0 68 | '@aws-sdk/util-utf8-browser': 3.188.0 69 | tslib: 1.14.1 70 | dev: false 71 | optional: true 72 | 73 | /@aws-sdk/abort-controller/3.208.0: 74 | resolution: {integrity: sha512-mQkDR+8VLCafg9KI4TgftftBOL170ricyb+HgV8n5jLDrEG+TfOfud8e6us2lIFESEuMpohC+/8yIcf6JjKkMg==} 75 | engines: {node: '>=14.0.0'} 76 | dependencies: 77 | '@aws-sdk/types': 3.208.0 78 | tslib: 2.4.1 79 | dev: false 80 | optional: true 81 | 82 | /@aws-sdk/client-cognito-identity/3.209.0: 83 | resolution: {integrity: sha512-u7lqFKi2PXC/LZzBEBCczlF78/bclv5Gndy4AWxNBdDBbJyuQrE+hk+IIwQQznCeFfgFOhpQMcWFPZH3tSH/qQ==} 84 | engines: {node: '>=14.0.0'} 85 | dependencies: 86 | '@aws-crypto/sha256-browser': 2.0.0 87 | '@aws-crypto/sha256-js': 2.0.0 88 | '@aws-sdk/client-sts': 3.209.0 89 | '@aws-sdk/config-resolver': 3.209.0 90 | '@aws-sdk/credential-provider-node': 3.209.0 91 | '@aws-sdk/fetch-http-handler': 3.208.0 92 | '@aws-sdk/hash-node': 3.208.0 93 | '@aws-sdk/invalid-dependency': 3.208.0 94 | '@aws-sdk/middleware-content-length': 3.208.0 95 | '@aws-sdk/middleware-endpoint': 3.208.0 96 | '@aws-sdk/middleware-host-header': 3.208.0 97 | '@aws-sdk/middleware-logger': 3.208.0 98 | '@aws-sdk/middleware-recursion-detection': 3.208.0 99 | '@aws-sdk/middleware-retry': 3.209.0 100 | '@aws-sdk/middleware-serde': 3.208.0 101 | '@aws-sdk/middleware-signing': 3.208.0 102 | '@aws-sdk/middleware-stack': 3.208.0 103 | '@aws-sdk/middleware-user-agent': 3.208.0 104 | '@aws-sdk/node-config-provider': 3.209.0 105 | '@aws-sdk/node-http-handler': 3.208.0 106 | '@aws-sdk/protocol-http': 3.208.0 107 | '@aws-sdk/smithy-client': 3.209.0 108 | '@aws-sdk/types': 3.208.0 109 | '@aws-sdk/url-parser': 3.208.0 110 | '@aws-sdk/util-base64': 3.208.0 111 | '@aws-sdk/util-body-length-browser': 3.188.0 112 | '@aws-sdk/util-body-length-node': 3.208.0 113 | '@aws-sdk/util-defaults-mode-browser': 3.209.0 114 | '@aws-sdk/util-defaults-mode-node': 3.209.0 115 | '@aws-sdk/util-endpoints': 3.209.0 116 | '@aws-sdk/util-user-agent-browser': 3.208.0 117 | '@aws-sdk/util-user-agent-node': 3.209.0 118 | '@aws-sdk/util-utf8-browser': 3.188.0 119 | '@aws-sdk/util-utf8-node': 3.208.0 120 | tslib: 2.4.1 121 | transitivePeerDependencies: 122 | - aws-crt 123 | dev: false 124 | optional: true 125 | 126 | /@aws-sdk/client-sso-oidc/3.209.0: 127 | resolution: {integrity: sha512-KSmT181IcE32lqoZsS0h400qiL/BSQ84DS1iPOqP0NkLcgnvmOkKygVpYjTql2xSUWLQBwPNFihYJ+jmAj3HtQ==} 128 | engines: {node: '>=14.0.0'} 129 | dependencies: 130 | '@aws-crypto/sha256-browser': 2.0.0 131 | '@aws-crypto/sha256-js': 2.0.0 132 | '@aws-sdk/config-resolver': 3.209.0 133 | '@aws-sdk/fetch-http-handler': 3.208.0 134 | '@aws-sdk/hash-node': 3.208.0 135 | '@aws-sdk/invalid-dependency': 3.208.0 136 | '@aws-sdk/middleware-content-length': 3.208.0 137 | '@aws-sdk/middleware-endpoint': 3.208.0 138 | '@aws-sdk/middleware-host-header': 3.208.0 139 | '@aws-sdk/middleware-logger': 3.208.0 140 | '@aws-sdk/middleware-recursion-detection': 3.208.0 141 | '@aws-sdk/middleware-retry': 3.209.0 142 | '@aws-sdk/middleware-serde': 3.208.0 143 | '@aws-sdk/middleware-stack': 3.208.0 144 | '@aws-sdk/middleware-user-agent': 3.208.0 145 | '@aws-sdk/node-config-provider': 3.209.0 146 | '@aws-sdk/node-http-handler': 3.208.0 147 | '@aws-sdk/protocol-http': 3.208.0 148 | '@aws-sdk/smithy-client': 3.209.0 149 | '@aws-sdk/types': 3.208.0 150 | '@aws-sdk/url-parser': 3.208.0 151 | '@aws-sdk/util-base64': 3.208.0 152 | '@aws-sdk/util-body-length-browser': 3.188.0 153 | '@aws-sdk/util-body-length-node': 3.208.0 154 | '@aws-sdk/util-defaults-mode-browser': 3.209.0 155 | '@aws-sdk/util-defaults-mode-node': 3.209.0 156 | '@aws-sdk/util-endpoints': 3.209.0 157 | '@aws-sdk/util-user-agent-browser': 3.208.0 158 | '@aws-sdk/util-user-agent-node': 3.209.0 159 | '@aws-sdk/util-utf8-browser': 3.188.0 160 | '@aws-sdk/util-utf8-node': 3.208.0 161 | tslib: 2.4.1 162 | transitivePeerDependencies: 163 | - aws-crt 164 | dev: false 165 | optional: true 166 | 167 | /@aws-sdk/client-sso/3.209.0: 168 | resolution: {integrity: sha512-rh9QktLCOVTbvDzCb0ikSe4Q1I35Wxcx5XZ7k1J+2ze54FOBfCr3vOwcQpo5tpYWEe1Ysbt3gvA8RAqj9oDFdw==} 169 | engines: {node: '>=14.0.0'} 170 | dependencies: 171 | '@aws-crypto/sha256-browser': 2.0.0 172 | '@aws-crypto/sha256-js': 2.0.0 173 | '@aws-sdk/config-resolver': 3.209.0 174 | '@aws-sdk/fetch-http-handler': 3.208.0 175 | '@aws-sdk/hash-node': 3.208.0 176 | '@aws-sdk/invalid-dependency': 3.208.0 177 | '@aws-sdk/middleware-content-length': 3.208.0 178 | '@aws-sdk/middleware-endpoint': 3.208.0 179 | '@aws-sdk/middleware-host-header': 3.208.0 180 | '@aws-sdk/middleware-logger': 3.208.0 181 | '@aws-sdk/middleware-recursion-detection': 3.208.0 182 | '@aws-sdk/middleware-retry': 3.209.0 183 | '@aws-sdk/middleware-serde': 3.208.0 184 | '@aws-sdk/middleware-stack': 3.208.0 185 | '@aws-sdk/middleware-user-agent': 3.208.0 186 | '@aws-sdk/node-config-provider': 3.209.0 187 | '@aws-sdk/node-http-handler': 3.208.0 188 | '@aws-sdk/protocol-http': 3.208.0 189 | '@aws-sdk/smithy-client': 3.209.0 190 | '@aws-sdk/types': 3.208.0 191 | '@aws-sdk/url-parser': 3.208.0 192 | '@aws-sdk/util-base64': 3.208.0 193 | '@aws-sdk/util-body-length-browser': 3.188.0 194 | '@aws-sdk/util-body-length-node': 3.208.0 195 | '@aws-sdk/util-defaults-mode-browser': 3.209.0 196 | '@aws-sdk/util-defaults-mode-node': 3.209.0 197 | '@aws-sdk/util-endpoints': 3.209.0 198 | '@aws-sdk/util-user-agent-browser': 3.208.0 199 | '@aws-sdk/util-user-agent-node': 3.209.0 200 | '@aws-sdk/util-utf8-browser': 3.188.0 201 | '@aws-sdk/util-utf8-node': 3.208.0 202 | tslib: 2.4.1 203 | transitivePeerDependencies: 204 | - aws-crt 205 | dev: false 206 | optional: true 207 | 208 | /@aws-sdk/client-sts/3.209.0: 209 | resolution: {integrity: sha512-zWlM+9/JbshEgrG79KZlqYusUziKiKqe8vRlvQ9wcuEHNbQnAri4UvObEKik+7YpTBeP3mR+US1T71G0PqJByw==} 210 | engines: {node: '>=14.0.0'} 211 | dependencies: 212 | '@aws-crypto/sha256-browser': 2.0.0 213 | '@aws-crypto/sha256-js': 2.0.0 214 | '@aws-sdk/config-resolver': 3.209.0 215 | '@aws-sdk/credential-provider-node': 3.209.0 216 | '@aws-sdk/fetch-http-handler': 3.208.0 217 | '@aws-sdk/hash-node': 3.208.0 218 | '@aws-sdk/invalid-dependency': 3.208.0 219 | '@aws-sdk/middleware-content-length': 3.208.0 220 | '@aws-sdk/middleware-endpoint': 3.208.0 221 | '@aws-sdk/middleware-host-header': 3.208.0 222 | '@aws-sdk/middleware-logger': 3.208.0 223 | '@aws-sdk/middleware-recursion-detection': 3.208.0 224 | '@aws-sdk/middleware-retry': 3.209.0 225 | '@aws-sdk/middleware-sdk-sts': 3.208.0 226 | '@aws-sdk/middleware-serde': 3.208.0 227 | '@aws-sdk/middleware-signing': 3.208.0 228 | '@aws-sdk/middleware-stack': 3.208.0 229 | '@aws-sdk/middleware-user-agent': 3.208.0 230 | '@aws-sdk/node-config-provider': 3.209.0 231 | '@aws-sdk/node-http-handler': 3.208.0 232 | '@aws-sdk/protocol-http': 3.208.0 233 | '@aws-sdk/smithy-client': 3.209.0 234 | '@aws-sdk/types': 3.208.0 235 | '@aws-sdk/url-parser': 3.208.0 236 | '@aws-sdk/util-base64': 3.208.0 237 | '@aws-sdk/util-body-length-browser': 3.188.0 238 | '@aws-sdk/util-body-length-node': 3.208.0 239 | '@aws-sdk/util-defaults-mode-browser': 3.209.0 240 | '@aws-sdk/util-defaults-mode-node': 3.209.0 241 | '@aws-sdk/util-endpoints': 3.209.0 242 | '@aws-sdk/util-user-agent-browser': 3.208.0 243 | '@aws-sdk/util-user-agent-node': 3.209.0 244 | '@aws-sdk/util-utf8-browser': 3.188.0 245 | '@aws-sdk/util-utf8-node': 3.208.0 246 | fast-xml-parser: 4.0.11 247 | tslib: 2.4.1 248 | transitivePeerDependencies: 249 | - aws-crt 250 | dev: false 251 | optional: true 252 | 253 | /@aws-sdk/config-resolver/3.209.0: 254 | resolution: {integrity: sha512-wLXI1Jg9xx9wE8vdIfOgSKnoBWbn9j3IvW4+7PnM/nf5xC30/Jp4j+JndEG/BKyDQF7HJQTIeRpSkwKaqJhCRA==} 255 | engines: {node: '>=14.0.0'} 256 | dependencies: 257 | '@aws-sdk/signature-v4': 3.208.0 258 | '@aws-sdk/types': 3.208.0 259 | '@aws-sdk/util-config-provider': 3.208.0 260 | '@aws-sdk/util-middleware': 3.208.0 261 | tslib: 2.4.1 262 | dev: false 263 | optional: true 264 | 265 | /@aws-sdk/credential-provider-cognito-identity/3.209.0: 266 | resolution: {integrity: sha512-31OAwgElZlJyPoV0WwerRSIrrlMlbXX6rpoBceHu9m+wACu18P+GwqKjMCjTL04Q+z7zr699pLCLp5lbLYJe3w==} 267 | engines: {node: '>=14.0.0'} 268 | dependencies: 269 | '@aws-sdk/client-cognito-identity': 3.209.0 270 | '@aws-sdk/property-provider': 3.208.0 271 | '@aws-sdk/types': 3.208.0 272 | tslib: 2.4.1 273 | transitivePeerDependencies: 274 | - aws-crt 275 | dev: false 276 | optional: true 277 | 278 | /@aws-sdk/credential-provider-env/3.208.0: 279 | resolution: {integrity: sha512-FB+KUSpZc03wVTXxGnMmgtaP0sJOv0D7oyogHb7wcf5b7RjjwqoaeUcJHTdKRZaW6e1foLk3/L9uebxiWefDbQ==} 280 | engines: {node: '>=14.0.0'} 281 | dependencies: 282 | '@aws-sdk/property-provider': 3.208.0 283 | '@aws-sdk/types': 3.208.0 284 | tslib: 2.4.1 285 | dev: false 286 | optional: true 287 | 288 | /@aws-sdk/credential-provider-imds/3.209.0: 289 | resolution: {integrity: sha512-EjA1nWduIHjALjNF6O2lpKVOoTIlfGHgvqCxjFf7XNqBTTKWCxEflcmUgqXwo9A7TU0mTTyr7nLGMAsNE2CR3w==} 290 | engines: {node: '>=14.0.0'} 291 | dependencies: 292 | '@aws-sdk/node-config-provider': 3.209.0 293 | '@aws-sdk/property-provider': 3.208.0 294 | '@aws-sdk/types': 3.208.0 295 | '@aws-sdk/url-parser': 3.208.0 296 | tslib: 2.4.1 297 | dev: false 298 | optional: true 299 | 300 | /@aws-sdk/credential-provider-ini/3.209.0: 301 | resolution: {integrity: sha512-aszuzkKIg7V+tCcq8RNpr1dAyECXWvJRAvzlmE5ZBYtjHMIX/qVAqSP4sfLNeI/Qagyj7W0TeVA1XVRjkivjYA==} 302 | engines: {node: '>=14.0.0'} 303 | dependencies: 304 | '@aws-sdk/credential-provider-env': 3.208.0 305 | '@aws-sdk/credential-provider-imds': 3.209.0 306 | '@aws-sdk/credential-provider-sso': 3.209.0 307 | '@aws-sdk/credential-provider-web-identity': 3.208.0 308 | '@aws-sdk/property-provider': 3.208.0 309 | '@aws-sdk/shared-ini-file-loader': 3.209.0 310 | '@aws-sdk/types': 3.208.0 311 | tslib: 2.4.1 312 | transitivePeerDependencies: 313 | - aws-crt 314 | dev: false 315 | optional: true 316 | 317 | /@aws-sdk/credential-provider-node/3.209.0: 318 | resolution: {integrity: sha512-R0kV6B+GxbfdSowf/6eeEAHZC6X7P/IxJ/o/gCuMmAOixge0e6AWVgCvrd0cg0togJHWbmoYSuUyqWPIMxM1Yg==} 319 | engines: {node: '>=14.0.0'} 320 | dependencies: 321 | '@aws-sdk/credential-provider-env': 3.208.0 322 | '@aws-sdk/credential-provider-imds': 3.209.0 323 | '@aws-sdk/credential-provider-ini': 3.209.0 324 | '@aws-sdk/credential-provider-process': 3.209.0 325 | '@aws-sdk/credential-provider-sso': 3.209.0 326 | '@aws-sdk/credential-provider-web-identity': 3.208.0 327 | '@aws-sdk/property-provider': 3.208.0 328 | '@aws-sdk/shared-ini-file-loader': 3.209.0 329 | '@aws-sdk/types': 3.208.0 330 | tslib: 2.4.1 331 | transitivePeerDependencies: 332 | - aws-crt 333 | dev: false 334 | optional: true 335 | 336 | /@aws-sdk/credential-provider-process/3.209.0: 337 | resolution: {integrity: sha512-G0urC5p1kgUfgpK8lncdisSewa8onnoQAVdf2Uh51hOqc7UufGce+ouvLH8J2iMkMaL1MSyu8fqwfZNyDtH37g==} 338 | engines: {node: '>=14.0.0'} 339 | dependencies: 340 | '@aws-sdk/property-provider': 3.208.0 341 | '@aws-sdk/shared-ini-file-loader': 3.209.0 342 | '@aws-sdk/types': 3.208.0 343 | tslib: 2.4.1 344 | dev: false 345 | optional: true 346 | 347 | /@aws-sdk/credential-provider-sso/3.209.0: 348 | resolution: {integrity: sha512-SKzUYOn2EFx58+iU1KihGLtBz9s1jolWUQ6HYxOy4AkWnZVGUt9Vb4mIo6wB07nSSUgYRxOSYn21SKvvBzpc2g==} 349 | engines: {node: '>=14.0.0'} 350 | dependencies: 351 | '@aws-sdk/client-sso': 3.209.0 352 | '@aws-sdk/property-provider': 3.208.0 353 | '@aws-sdk/shared-ini-file-loader': 3.209.0 354 | '@aws-sdk/token-providers': 3.209.0 355 | '@aws-sdk/types': 3.208.0 356 | tslib: 2.4.1 357 | transitivePeerDependencies: 358 | - aws-crt 359 | dev: false 360 | optional: true 361 | 362 | /@aws-sdk/credential-provider-web-identity/3.208.0: 363 | resolution: {integrity: sha512-7wtrdEr8uvDr5t0stimrXGsW4G+TQyluZ9OucCCY0HXgNihmnk1BIu+COuOSxRtFXHwCh4rIPaVE1ABG2Mq24g==} 364 | engines: {node: '>=14.0.0'} 365 | dependencies: 366 | '@aws-sdk/property-provider': 3.208.0 367 | '@aws-sdk/types': 3.208.0 368 | tslib: 2.4.1 369 | dev: false 370 | optional: true 371 | 372 | /@aws-sdk/credential-providers/3.209.0: 373 | resolution: {integrity: sha512-/oQJwzTedZC5TbQJ2pwHcpbcZS7O1RzP/3+cICw73WrIjlrpS1JGmTCvTGrIfGE8RUk5GKdLN3fjgTpVCS82cA==} 374 | engines: {node: '>=14.0.0'} 375 | requiresBuild: true 376 | dependencies: 377 | '@aws-sdk/client-cognito-identity': 3.209.0 378 | '@aws-sdk/client-sso': 3.209.0 379 | '@aws-sdk/client-sts': 3.209.0 380 | '@aws-sdk/credential-provider-cognito-identity': 3.209.0 381 | '@aws-sdk/credential-provider-env': 3.208.0 382 | '@aws-sdk/credential-provider-imds': 3.209.0 383 | '@aws-sdk/credential-provider-ini': 3.209.0 384 | '@aws-sdk/credential-provider-node': 3.209.0 385 | '@aws-sdk/credential-provider-process': 3.209.0 386 | '@aws-sdk/credential-provider-sso': 3.209.0 387 | '@aws-sdk/credential-provider-web-identity': 3.208.0 388 | '@aws-sdk/property-provider': 3.208.0 389 | '@aws-sdk/shared-ini-file-loader': 3.209.0 390 | '@aws-sdk/types': 3.208.0 391 | tslib: 2.4.1 392 | transitivePeerDependencies: 393 | - aws-crt 394 | dev: false 395 | optional: true 396 | 397 | /@aws-sdk/fetch-http-handler/3.208.0: 398 | resolution: {integrity: sha512-GuwkwOeyLKCbSbnFlyHdlKd7u54cnQUI8NfVDAxpZvomY3PV476Tzg8XEyOYE67r5rR6XMqn6IK1PmFAACY+ew==} 399 | dependencies: 400 | '@aws-sdk/protocol-http': 3.208.0 401 | '@aws-sdk/querystring-builder': 3.208.0 402 | '@aws-sdk/types': 3.208.0 403 | '@aws-sdk/util-base64': 3.208.0 404 | tslib: 2.4.1 405 | dev: false 406 | optional: true 407 | 408 | /@aws-sdk/hash-node/3.208.0: 409 | resolution: {integrity: sha512-X5u6nD9+wzaA6qhqbobxsIgiyDJMW8NgqjZgHoc5x1wz4unHUCEuSBZy1kbIZ6+EPZ9bQHQZ21gKgf1j5vhsvQ==} 410 | engines: {node: '>=14.0.0'} 411 | dependencies: 412 | '@aws-sdk/types': 3.208.0 413 | '@aws-sdk/util-buffer-from': 3.208.0 414 | tslib: 2.4.1 415 | dev: false 416 | optional: true 417 | 418 | /@aws-sdk/invalid-dependency/3.208.0: 419 | resolution: {integrity: sha512-mUpbtijk14KntYy+w5FSvmsfj/Dqa8HylYeCKniKBKkQ1avjEz7CdizVoxyZrR3rldnLE3gItr0FEDRUhtfkAA==} 420 | dependencies: 421 | '@aws-sdk/types': 3.208.0 422 | tslib: 2.4.1 423 | dev: false 424 | optional: true 425 | 426 | /@aws-sdk/is-array-buffer/3.201.0: 427 | resolution: {integrity: sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==} 428 | engines: {node: '>=14.0.0'} 429 | dependencies: 430 | tslib: 2.4.1 431 | dev: false 432 | optional: true 433 | 434 | /@aws-sdk/middleware-content-length/3.208.0: 435 | resolution: {integrity: sha512-8bLh7lHtmKQQ2fk0fGiP7pcVJglB/dz7Q9OooxFYK+eybqxfIDDUgKphA8AFT5W34tJRh5nhT3QTJ6zrOTQM3w==} 436 | engines: {node: '>=14.0.0'} 437 | dependencies: 438 | '@aws-sdk/protocol-http': 3.208.0 439 | '@aws-sdk/types': 3.208.0 440 | tslib: 2.4.1 441 | dev: false 442 | optional: true 443 | 444 | /@aws-sdk/middleware-endpoint/3.208.0: 445 | resolution: {integrity: sha512-pVa/cyB6ronfTVAoKUUTFbAPslDPU43DWOKXY/bACC3ys1lFo1CWjz4dLSQARxEEW3iZ1yZTy0zoHXnNrw5CFQ==} 446 | engines: {node: '>=14.0.0'} 447 | dependencies: 448 | '@aws-sdk/middleware-serde': 3.208.0 449 | '@aws-sdk/protocol-http': 3.208.0 450 | '@aws-sdk/signature-v4': 3.208.0 451 | '@aws-sdk/types': 3.208.0 452 | '@aws-sdk/url-parser': 3.208.0 453 | '@aws-sdk/util-config-provider': 3.208.0 454 | '@aws-sdk/util-middleware': 3.208.0 455 | tslib: 2.4.1 456 | dev: false 457 | optional: true 458 | 459 | /@aws-sdk/middleware-host-header/3.208.0: 460 | resolution: {integrity: sha512-3oyXK81TLWOZ2T/9Ltpbj/Z7R4QWSf+FCQRpY48ND2im/ALkgFRk/tmDTOshv+TQzW1q2lOSEeq4vK6yOCar7g==} 461 | engines: {node: '>=14.0.0'} 462 | dependencies: 463 | '@aws-sdk/protocol-http': 3.208.0 464 | '@aws-sdk/types': 3.208.0 465 | tslib: 2.4.1 466 | dev: false 467 | optional: true 468 | 469 | /@aws-sdk/middleware-logger/3.208.0: 470 | resolution: {integrity: sha512-mwSpuWruB8RrgUAAW7w/lvadnMDesl/bZ2IELBgJri+2rIqLGbAtygJBiG0Y3e8/IeOHuKuGkN1rFYZ4SKr7/A==} 471 | engines: {node: '>=14.0.0'} 472 | dependencies: 473 | '@aws-sdk/types': 3.208.0 474 | tslib: 2.4.1 475 | dev: false 476 | optional: true 477 | 478 | /@aws-sdk/middleware-recursion-detection/3.208.0: 479 | resolution: {integrity: sha512-Dgpf5NEOYXvkQuGcbxvDovTh4HwO4ULJReGko67NJjgdZZyFS1fNykVPncxenRpsN9SJBigswYs3lwPVpqijzA==} 480 | engines: {node: '>=14.0.0'} 481 | dependencies: 482 | '@aws-sdk/protocol-http': 3.208.0 483 | '@aws-sdk/types': 3.208.0 484 | tslib: 2.4.1 485 | dev: false 486 | optional: true 487 | 488 | /@aws-sdk/middleware-retry/3.209.0: 489 | resolution: {integrity: sha512-PGHbpGw74HxmtqsMEH+xn2oC5/BPdHVyapB66x83n+sywt1ejTiarbQhNs70YzcSsTrJfbhbrFP1V9AzRmMaQA==} 490 | engines: {node: '>=14.0.0'} 491 | dependencies: 492 | '@aws-sdk/protocol-http': 3.208.0 493 | '@aws-sdk/service-error-classification': 3.208.0 494 | '@aws-sdk/types': 3.208.0 495 | '@aws-sdk/util-middleware': 3.208.0 496 | tslib: 2.4.1 497 | uuid: 8.3.2 498 | dev: false 499 | optional: true 500 | 501 | /@aws-sdk/middleware-sdk-sts/3.208.0: 502 | resolution: {integrity: sha512-lFVodZHYLF7puXgNZ1m5ycKbyCPp79nqI+pkRXl066ZtZWzCW8+JKCaLjF3jfXlnvg6foPDJdxUvt0VU5EddGg==} 503 | engines: {node: '>=14.0.0'} 504 | dependencies: 505 | '@aws-sdk/middleware-signing': 3.208.0 506 | '@aws-sdk/property-provider': 3.208.0 507 | '@aws-sdk/protocol-http': 3.208.0 508 | '@aws-sdk/signature-v4': 3.208.0 509 | '@aws-sdk/types': 3.208.0 510 | tslib: 2.4.1 511 | dev: false 512 | optional: true 513 | 514 | /@aws-sdk/middleware-serde/3.208.0: 515 | resolution: {integrity: sha512-3h2yP6qyf/IhfdvyFeNX7w4BF37vOZvfUDBq+wb1QEc7DCAskoUKWtCCKJ9HDq3IJQp8hzqY82eawUir6flqlQ==} 516 | engines: {node: '>=14.0.0'} 517 | dependencies: 518 | '@aws-sdk/types': 3.208.0 519 | tslib: 2.4.1 520 | dev: false 521 | optional: true 522 | 523 | /@aws-sdk/middleware-signing/3.208.0: 524 | resolution: {integrity: sha512-cMSWhg8xOrxZw04EYKEQQQ7RT+03rigS4KS3Uy6x/M+jFyoM+sRiY/7376sJCwlpvKH2xJIVpwPbKk/uz4j4DA==} 525 | engines: {node: '>=14.0.0'} 526 | dependencies: 527 | '@aws-sdk/property-provider': 3.208.0 528 | '@aws-sdk/protocol-http': 3.208.0 529 | '@aws-sdk/signature-v4': 3.208.0 530 | '@aws-sdk/types': 3.208.0 531 | '@aws-sdk/util-middleware': 3.208.0 532 | tslib: 2.4.1 533 | dev: false 534 | optional: true 535 | 536 | /@aws-sdk/middleware-stack/3.208.0: 537 | resolution: {integrity: sha512-bvFPUa+RTB7PSRCUsO6bRlEtiEadrDES+dpNmInMNQ9kmbd4OhNOCb664hhtiglIIXX5cd8mSPEo+w/RV0kEEQ==} 538 | engines: {node: '>=14.0.0'} 539 | dependencies: 540 | tslib: 2.4.1 541 | dev: false 542 | optional: true 543 | 544 | /@aws-sdk/middleware-user-agent/3.208.0: 545 | resolution: {integrity: sha512-6RNf+TOZpiCy7xUcDSh8ji/x8ht1oAM+qIhm6hsEPLdI1cTvbPZrwowO9Y6L0J68V9OkEgLYiq77KKKYT7QQSw==} 546 | engines: {node: '>=14.0.0'} 547 | dependencies: 548 | '@aws-sdk/protocol-http': 3.208.0 549 | '@aws-sdk/types': 3.208.0 550 | tslib: 2.4.1 551 | dev: false 552 | optional: true 553 | 554 | /@aws-sdk/node-config-provider/3.209.0: 555 | resolution: {integrity: sha512-jNrUn8qTN9BIxHCcLTv2s2h8Riaz4kjwDhubVQNyI0WGZ+PYKATnZjA+Guzbnq2WMzZmwrMIE5GoOiVsPD8xYQ==} 556 | engines: {node: '>=14.0.0'} 557 | dependencies: 558 | '@aws-sdk/property-provider': 3.208.0 559 | '@aws-sdk/shared-ini-file-loader': 3.209.0 560 | '@aws-sdk/types': 3.208.0 561 | tslib: 2.4.1 562 | dev: false 563 | optional: true 564 | 565 | /@aws-sdk/node-http-handler/3.208.0: 566 | resolution: {integrity: sha512-2t0b9Id7WekluqxQdPugAZhe/wdzW0L53rfMEfDS3R0INNSq1sEfddIfCzJrmfWDCrCOGIDNyxo/w7Ki3NclzQ==} 567 | engines: {node: '>=14.0.0'} 568 | dependencies: 569 | '@aws-sdk/abort-controller': 3.208.0 570 | '@aws-sdk/protocol-http': 3.208.0 571 | '@aws-sdk/querystring-builder': 3.208.0 572 | '@aws-sdk/types': 3.208.0 573 | tslib: 2.4.1 574 | dev: false 575 | optional: true 576 | 577 | /@aws-sdk/property-provider/3.208.0: 578 | resolution: {integrity: sha512-aUhfuwXjZ5TGzLhBstuAMmbnxHXeSGhzoIS8yy465ifgc95p6cHFZf+ZibgwgCMaGrKlTDCia2zwwpKQHN+4cw==} 579 | engines: {node: '>=14.0.0'} 580 | dependencies: 581 | '@aws-sdk/types': 3.208.0 582 | tslib: 2.4.1 583 | dev: false 584 | optional: true 585 | 586 | /@aws-sdk/protocol-http/3.208.0: 587 | resolution: {integrity: sha512-Sr9dmaW0Z9X9s16NHZn94efLRpaqLyLqABFPgjqE8cYP6eLX/VrmZGNR62GFVxCiyEEpVxy4Ddk1YkbRwnuonA==} 588 | engines: {node: '>=14.0.0'} 589 | dependencies: 590 | '@aws-sdk/types': 3.208.0 591 | tslib: 2.4.1 592 | dev: false 593 | optional: true 594 | 595 | /@aws-sdk/querystring-builder/3.208.0: 596 | resolution: {integrity: sha512-1Rpauh5hWlK++KjsHQjHcSN7yE05hj1FVb0HaeLrFIJB5rQYWXK7DpOUhmv5SOmU+q6cIM2kNCrSxH31+WglMw==} 597 | engines: {node: '>=14.0.0'} 598 | dependencies: 599 | '@aws-sdk/types': 3.208.0 600 | '@aws-sdk/util-uri-escape': 3.201.0 601 | tslib: 2.4.1 602 | dev: false 603 | optional: true 604 | 605 | /@aws-sdk/querystring-parser/3.208.0: 606 | resolution: {integrity: sha512-dVVLdP3il9bJX74/BNBjFn59XrEVBUZ4xSKYH6t7dgSz9uSu8DcT4pPzwaq+/94dVewCW3zq2jVA1iw1rK7JVQ==} 607 | engines: {node: '>=14.0.0'} 608 | dependencies: 609 | '@aws-sdk/types': 3.208.0 610 | tslib: 2.4.1 611 | dev: false 612 | optional: true 613 | 614 | /@aws-sdk/service-error-classification/3.208.0: 615 | resolution: {integrity: sha512-ZZWV3AOTd8UDcfXCNoQ8v4sHaTgFxGaXWO0NHHgqFbVYr1d+8EXQiOy/v8JsY1jrfoXBWXptTOcioCTeM0xBpw==} 616 | engines: {node: '>=14.0.0'} 617 | dev: false 618 | optional: true 619 | 620 | /@aws-sdk/shared-ini-file-loader/3.209.0: 621 | resolution: {integrity: sha512-hji3B/q3zFuElaUQM/ZZUFbCFBsaVjpWATgiDTnSYP+MShWvvwm/WigeC2aCNos1bs/8HVizOy9cmvK63vLZbw==} 622 | engines: {node: '>=14.0.0'} 623 | dependencies: 624 | '@aws-sdk/types': 3.208.0 625 | tslib: 2.4.1 626 | dev: false 627 | optional: true 628 | 629 | /@aws-sdk/signature-v4/3.208.0: 630 | resolution: {integrity: sha512-+c5A8RsN4Lk3TXFiQ3ZsW7sJ4zYPPmYQ55ITSfjock5hzgM1vW43Mgvjjq6foW5L7SNfdhLH+NrhpgFwSF/GeA==} 631 | engines: {node: '>=14.0.0'} 632 | dependencies: 633 | '@aws-sdk/is-array-buffer': 3.201.0 634 | '@aws-sdk/types': 3.208.0 635 | '@aws-sdk/util-hex-encoding': 3.201.0 636 | '@aws-sdk/util-middleware': 3.208.0 637 | '@aws-sdk/util-uri-escape': 3.201.0 638 | tslib: 2.4.1 639 | dev: false 640 | optional: true 641 | 642 | /@aws-sdk/smithy-client/3.209.0: 643 | resolution: {integrity: sha512-+d9lPAFOu3hZdLfyzMurRU6xZ+eqwKbF6HY7mDL4hGafRb/uw28HBncSwyUk5s7MIND9+RnvY4F/MwBq9wznXg==} 644 | engines: {node: '>=14.0.0'} 645 | dependencies: 646 | '@aws-sdk/middleware-stack': 3.208.0 647 | '@aws-sdk/types': 3.208.0 648 | tslib: 2.4.1 649 | dev: false 650 | optional: true 651 | 652 | /@aws-sdk/token-providers/3.209.0: 653 | resolution: {integrity: sha512-MMtL/yD98SxjejcZYghLN4qhC1TDNeHjnzb+zBcXANxgh5m+QdhERsZkDGU8QiEo+DL6M2HKbwyXu82z89sqnQ==} 654 | engines: {node: '>=14.0.0'} 655 | dependencies: 656 | '@aws-sdk/client-sso-oidc': 3.209.0 657 | '@aws-sdk/property-provider': 3.208.0 658 | '@aws-sdk/shared-ini-file-loader': 3.209.0 659 | '@aws-sdk/types': 3.208.0 660 | tslib: 2.4.1 661 | transitivePeerDependencies: 662 | - aws-crt 663 | dev: false 664 | optional: true 665 | 666 | /@aws-sdk/types/3.208.0: 667 | resolution: {integrity: sha512-5AuOPtY1Hdf4xoEo+voRijl3OnFm8IB+oITXl+SN2iASJv+XPnRNw/QVbIxfGeWgWhmK31F+XdjTYsjT2rx8Qw==} 668 | engines: {node: '>=14.0.0'} 669 | dev: false 670 | optional: true 671 | 672 | /@aws-sdk/url-parser/3.208.0: 673 | resolution: {integrity: sha512-zhU231xkZbUh68Z/TGNRW30MGTZQVigGuMiJU6eOtL2aOulnKqI1Yjs/QejrTtPWsqSihWvxOUZ2cVRPyeOvrA==} 674 | dependencies: 675 | '@aws-sdk/querystring-parser': 3.208.0 676 | '@aws-sdk/types': 3.208.0 677 | tslib: 2.4.1 678 | dev: false 679 | optional: true 680 | 681 | /@aws-sdk/util-base64/3.208.0: 682 | resolution: {integrity: sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==} 683 | engines: {node: '>=14.0.0'} 684 | dependencies: 685 | '@aws-sdk/util-buffer-from': 3.208.0 686 | tslib: 2.4.1 687 | dev: false 688 | optional: true 689 | 690 | /@aws-sdk/util-body-length-browser/3.188.0: 691 | resolution: {integrity: sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==} 692 | dependencies: 693 | tslib: 2.4.1 694 | dev: false 695 | optional: true 696 | 697 | /@aws-sdk/util-body-length-node/3.208.0: 698 | resolution: {integrity: sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==} 699 | engines: {node: '>=14.0.0'} 700 | dependencies: 701 | tslib: 2.4.1 702 | dev: false 703 | optional: true 704 | 705 | /@aws-sdk/util-buffer-from/3.208.0: 706 | resolution: {integrity: sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==} 707 | engines: {node: '>=14.0.0'} 708 | dependencies: 709 | '@aws-sdk/is-array-buffer': 3.201.0 710 | tslib: 2.4.1 711 | dev: false 712 | optional: true 713 | 714 | /@aws-sdk/util-config-provider/3.208.0: 715 | resolution: {integrity: sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==} 716 | engines: {node: '>=14.0.0'} 717 | dependencies: 718 | tslib: 2.4.1 719 | dev: false 720 | optional: true 721 | 722 | /@aws-sdk/util-defaults-mode-browser/3.209.0: 723 | resolution: {integrity: sha512-c+AlHqsgeDr9+87fS1wfnyVzEH3myt56GvNt0puzIv0QQqfpobMnfN8/Fy0cqMpf1eQNYY4a6lFlkComsXi5dw==} 724 | engines: {node: '>= 10.0.0'} 725 | dependencies: 726 | '@aws-sdk/property-provider': 3.208.0 727 | '@aws-sdk/types': 3.208.0 728 | bowser: 2.11.0 729 | tslib: 2.4.1 730 | dev: false 731 | optional: true 732 | 733 | /@aws-sdk/util-defaults-mode-node/3.209.0: 734 | resolution: {integrity: sha512-RljPVLog6EX052DQjx4XQ95n7ZiAbmn7Vd6YSn1x93U797umaC5CnrT7a/WusTQACtxBDFWcosRgO1ZGDXuRKQ==} 735 | engines: {node: '>= 10.0.0'} 736 | dependencies: 737 | '@aws-sdk/config-resolver': 3.209.0 738 | '@aws-sdk/credential-provider-imds': 3.209.0 739 | '@aws-sdk/node-config-provider': 3.209.0 740 | '@aws-sdk/property-provider': 3.208.0 741 | '@aws-sdk/types': 3.208.0 742 | tslib: 2.4.1 743 | dev: false 744 | optional: true 745 | 746 | /@aws-sdk/util-endpoints/3.209.0: 747 | resolution: {integrity: sha512-jwraCtWjQ0P4LyIg4qoQRF94mTUg0zFPmicy4v+Dq1V8BBRf6YWa9B10SoIdGIKQXmQvoyahK5OuH5SWKkY2pw==} 748 | engines: {node: '>=14.0.0'} 749 | dependencies: 750 | '@aws-sdk/types': 3.208.0 751 | tslib: 2.4.1 752 | dev: false 753 | optional: true 754 | 755 | /@aws-sdk/util-hex-encoding/3.201.0: 756 | resolution: {integrity: sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==} 757 | engines: {node: '>=14.0.0'} 758 | dependencies: 759 | tslib: 2.4.1 760 | dev: false 761 | optional: true 762 | 763 | /@aws-sdk/util-locate-window/3.208.0: 764 | resolution: {integrity: sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==} 765 | engines: {node: '>=14.0.0'} 766 | dependencies: 767 | tslib: 2.4.1 768 | dev: false 769 | optional: true 770 | 771 | /@aws-sdk/util-middleware/3.208.0: 772 | resolution: {integrity: sha512-oXilrYpXwaPyMw1uNjL1wmR54zeFzIWx2ve1MSMheIYr26deFP3RpMfKkGXwiOvXzZ9pzTcA8shNLhg1frO/zg==} 773 | engines: {node: '>=14.0.0'} 774 | dependencies: 775 | tslib: 2.4.1 776 | dev: false 777 | optional: true 778 | 779 | /@aws-sdk/util-uri-escape/3.201.0: 780 | resolution: {integrity: sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==} 781 | engines: {node: '>=14.0.0'} 782 | dependencies: 783 | tslib: 2.4.1 784 | dev: false 785 | optional: true 786 | 787 | /@aws-sdk/util-user-agent-browser/3.208.0: 788 | resolution: {integrity: sha512-Z5n9Kg2pBstzzQgRymQRgb4pM0bNPLGQejB3ZmCAphaxvuTBfu2E6KO55h5WwkFHUuh0i5u2wn1BI9R66S8CgQ==} 789 | dependencies: 790 | '@aws-sdk/types': 3.208.0 791 | bowser: 2.11.0 792 | tslib: 2.4.1 793 | dev: false 794 | optional: true 795 | 796 | /@aws-sdk/util-user-agent-node/3.209.0: 797 | resolution: {integrity: sha512-lWfvnSX8rckMGaalrKZmBlPW7F0QOviG7XbLffwToN4HnYUyXcZXIE4EzOQzuOvDsOUlos/xLkUj6krdIAApcA==} 798 | engines: {node: '>=14.0.0'} 799 | peerDependencies: 800 | aws-crt: '>=1.0.0' 801 | peerDependenciesMeta: 802 | aws-crt: 803 | optional: true 804 | dependencies: 805 | '@aws-sdk/node-config-provider': 3.209.0 806 | '@aws-sdk/types': 3.208.0 807 | tslib: 2.4.1 808 | dev: false 809 | optional: true 810 | 811 | /@aws-sdk/util-utf8-browser/3.188.0: 812 | resolution: {integrity: sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==} 813 | dependencies: 814 | tslib: 2.4.1 815 | dev: false 816 | optional: true 817 | 818 | /@aws-sdk/util-utf8-node/3.208.0: 819 | resolution: {integrity: sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==} 820 | engines: {node: '>=14.0.0'} 821 | dependencies: 822 | '@aws-sdk/util-buffer-from': 3.208.0 823 | tslib: 2.4.1 824 | dev: false 825 | optional: true 826 | 827 | /@types/node/18.11.9: 828 | resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} 829 | dev: false 830 | 831 | /@types/webidl-conversions/7.0.0: 832 | resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} 833 | dev: false 834 | 835 | /@types/whatwg-url/8.2.2: 836 | resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} 837 | dependencies: 838 | '@types/node': 18.11.9 839 | '@types/webidl-conversions': 7.0.0 840 | dev: false 841 | 842 | /abbrev/1.1.1: 843 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 844 | dev: true 845 | 846 | /accepts/1.3.8: 847 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 848 | engines: {node: '>= 0.6'} 849 | dependencies: 850 | mime-types: 2.1.35 851 | negotiator: 0.6.3 852 | dev: false 853 | 854 | /anymatch/3.1.2: 855 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 856 | engines: {node: '>= 8'} 857 | dependencies: 858 | normalize-path: 3.0.0 859 | picomatch: 2.3.1 860 | dev: true 861 | 862 | /append-field/1.0.0: 863 | resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} 864 | dev: false 865 | 866 | /array-flatten/1.1.1: 867 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 868 | dev: false 869 | 870 | /balanced-match/1.0.2: 871 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 872 | dev: true 873 | 874 | /base64-js/1.5.1: 875 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 876 | dev: false 877 | 878 | /basic-auth/2.0.1: 879 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} 880 | engines: {node: '>= 0.8'} 881 | dependencies: 882 | safe-buffer: 5.1.2 883 | dev: false 884 | 885 | /binary-extensions/2.2.0: 886 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 887 | engines: {node: '>=8'} 888 | dev: true 889 | 890 | /body-parser/1.20.1: 891 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 892 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 893 | dependencies: 894 | bytes: 3.1.2 895 | content-type: 1.0.4 896 | debug: 2.6.9 897 | depd: 2.0.0 898 | destroy: 1.2.0 899 | http-errors: 2.0.0 900 | iconv-lite: 0.4.24 901 | on-finished: 2.4.1 902 | qs: 6.11.0 903 | raw-body: 2.5.1 904 | type-is: 1.6.18 905 | unpipe: 1.0.0 906 | transitivePeerDependencies: 907 | - supports-color 908 | dev: false 909 | 910 | /bowser/2.11.0: 911 | resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} 912 | dev: false 913 | optional: true 914 | 915 | /brace-expansion/1.1.11: 916 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 917 | dependencies: 918 | balanced-match: 1.0.2 919 | concat-map: 0.0.1 920 | dev: true 921 | 922 | /braces/3.0.2: 923 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 924 | engines: {node: '>=8'} 925 | dependencies: 926 | fill-range: 7.0.1 927 | dev: true 928 | 929 | /bson/4.7.0: 930 | resolution: {integrity: sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==} 931 | engines: {node: '>=6.9.0'} 932 | dependencies: 933 | buffer: 5.7.1 934 | dev: false 935 | 936 | /buffer-from/1.1.2: 937 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 938 | dev: false 939 | 940 | /buffer/5.7.1: 941 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 942 | dependencies: 943 | base64-js: 1.5.1 944 | ieee754: 1.2.1 945 | dev: false 946 | 947 | /busboy/0.2.14: 948 | resolution: {integrity: sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==} 949 | engines: {node: '>=0.8.0'} 950 | dependencies: 951 | dicer: 0.2.5 952 | readable-stream: 1.1.14 953 | dev: false 954 | 955 | /bytes/3.1.2: 956 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 957 | engines: {node: '>= 0.8'} 958 | dev: false 959 | 960 | /call-bind/1.0.2: 961 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 962 | dependencies: 963 | function-bind: 1.1.1 964 | get-intrinsic: 1.1.3 965 | dev: false 966 | 967 | /chokidar/3.5.3: 968 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 969 | engines: {node: '>= 8.10.0'} 970 | dependencies: 971 | anymatch: 3.1.2 972 | braces: 3.0.2 973 | glob-parent: 5.1.2 974 | is-binary-path: 2.1.0 975 | is-glob: 4.0.3 976 | normalize-path: 3.0.0 977 | readdirp: 3.6.0 978 | optionalDependencies: 979 | fsevents: 2.3.2 980 | dev: true 981 | 982 | /concat-map/0.0.1: 983 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 984 | dev: true 985 | 986 | /concat-stream/1.6.2: 987 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 988 | engines: {'0': node >= 0.8} 989 | dependencies: 990 | buffer-from: 1.1.2 991 | inherits: 2.0.4 992 | readable-stream: 2.3.7 993 | typedarray: 0.0.6 994 | dev: false 995 | 996 | /content-disposition/0.5.4: 997 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 998 | engines: {node: '>= 0.6'} 999 | dependencies: 1000 | safe-buffer: 5.2.1 1001 | dev: false 1002 | 1003 | /content-type/1.0.4: 1004 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 1005 | engines: {node: '>= 0.6'} 1006 | dev: false 1007 | 1008 | /cookie-signature/1.0.6: 1009 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 1010 | dev: false 1011 | 1012 | /cookie/0.5.0: 1013 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1014 | engines: {node: '>= 0.6'} 1015 | dev: false 1016 | 1017 | /core-util-is/1.0.3: 1018 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 1019 | dev: false 1020 | 1021 | /cors/2.8.5: 1022 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 1023 | engines: {node: '>= 0.10'} 1024 | dependencies: 1025 | object-assign: 4.1.1 1026 | vary: 1.1.2 1027 | dev: false 1028 | 1029 | /debug/2.6.9: 1030 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1031 | peerDependencies: 1032 | supports-color: '*' 1033 | peerDependenciesMeta: 1034 | supports-color: 1035 | optional: true 1036 | dependencies: 1037 | ms: 2.0.0 1038 | dev: false 1039 | 1040 | /debug/3.2.7_supports-color@5.5.0: 1041 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 1042 | peerDependencies: 1043 | supports-color: '*' 1044 | peerDependenciesMeta: 1045 | supports-color: 1046 | optional: true 1047 | dependencies: 1048 | ms: 2.1.3 1049 | supports-color: 5.5.0 1050 | dev: true 1051 | 1052 | /debug/4.3.4: 1053 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1054 | engines: {node: '>=6.0'} 1055 | peerDependencies: 1056 | supports-color: '*' 1057 | peerDependenciesMeta: 1058 | supports-color: 1059 | optional: true 1060 | dependencies: 1061 | ms: 2.1.2 1062 | dev: false 1063 | 1064 | /denque/2.1.0: 1065 | resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} 1066 | engines: {node: '>=0.10'} 1067 | dev: false 1068 | 1069 | /depd/2.0.0: 1070 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 1071 | engines: {node: '>= 0.8'} 1072 | dev: false 1073 | 1074 | /destroy/1.2.0: 1075 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 1076 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1077 | dev: false 1078 | 1079 | /dicer/0.2.5: 1080 | resolution: {integrity: sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==} 1081 | engines: {node: '>=0.8.0'} 1082 | dependencies: 1083 | readable-stream: 1.1.14 1084 | streamsearch: 0.1.2 1085 | dev: false 1086 | 1087 | /dotenv/16.0.3: 1088 | resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} 1089 | engines: {node: '>=12'} 1090 | dev: false 1091 | 1092 | /ee-first/1.1.1: 1093 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 1094 | dev: false 1095 | 1096 | /encodeurl/1.0.2: 1097 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 1098 | engines: {node: '>= 0.8'} 1099 | dev: false 1100 | 1101 | /escape-html/1.0.3: 1102 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1103 | dev: false 1104 | 1105 | /etag/1.8.1: 1106 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1107 | engines: {node: '>= 0.6'} 1108 | dev: false 1109 | 1110 | /express/4.18.2: 1111 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 1112 | engines: {node: '>= 0.10.0'} 1113 | dependencies: 1114 | accepts: 1.3.8 1115 | array-flatten: 1.1.1 1116 | body-parser: 1.20.1 1117 | content-disposition: 0.5.4 1118 | content-type: 1.0.4 1119 | cookie: 0.5.0 1120 | cookie-signature: 1.0.6 1121 | debug: 2.6.9 1122 | depd: 2.0.0 1123 | encodeurl: 1.0.2 1124 | escape-html: 1.0.3 1125 | etag: 1.8.1 1126 | finalhandler: 1.2.0 1127 | fresh: 0.5.2 1128 | http-errors: 2.0.0 1129 | merge-descriptors: 1.0.1 1130 | methods: 1.1.2 1131 | on-finished: 2.4.1 1132 | parseurl: 1.3.3 1133 | path-to-regexp: 0.1.7 1134 | proxy-addr: 2.0.7 1135 | qs: 6.11.0 1136 | range-parser: 1.2.1 1137 | safe-buffer: 5.2.1 1138 | send: 0.18.0 1139 | serve-static: 1.15.0 1140 | setprototypeof: 1.2.0 1141 | statuses: 2.0.1 1142 | type-is: 1.6.18 1143 | utils-merge: 1.0.1 1144 | vary: 1.1.2 1145 | transitivePeerDependencies: 1146 | - supports-color 1147 | dev: false 1148 | 1149 | /fast-xml-parser/4.0.11: 1150 | resolution: {integrity: sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==} 1151 | hasBin: true 1152 | dependencies: 1153 | strnum: 1.0.5 1154 | dev: false 1155 | optional: true 1156 | 1157 | /fill-range/7.0.1: 1158 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1159 | engines: {node: '>=8'} 1160 | dependencies: 1161 | to-regex-range: 5.0.1 1162 | dev: true 1163 | 1164 | /finalhandler/1.2.0: 1165 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 1166 | engines: {node: '>= 0.8'} 1167 | dependencies: 1168 | debug: 2.6.9 1169 | encodeurl: 1.0.2 1170 | escape-html: 1.0.3 1171 | on-finished: 2.4.1 1172 | parseurl: 1.3.3 1173 | statuses: 2.0.1 1174 | unpipe: 1.0.0 1175 | transitivePeerDependencies: 1176 | - supports-color 1177 | dev: false 1178 | 1179 | /forwarded/0.2.0: 1180 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 1181 | engines: {node: '>= 0.6'} 1182 | dev: false 1183 | 1184 | /fresh/0.5.2: 1185 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 1186 | engines: {node: '>= 0.6'} 1187 | dev: false 1188 | 1189 | /fsevents/2.3.2: 1190 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1191 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1192 | os: [darwin] 1193 | requiresBuild: true 1194 | dev: true 1195 | optional: true 1196 | 1197 | /function-bind/1.1.1: 1198 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1199 | dev: false 1200 | 1201 | /get-intrinsic/1.1.3: 1202 | resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} 1203 | dependencies: 1204 | function-bind: 1.1.1 1205 | has: 1.0.3 1206 | has-symbols: 1.0.3 1207 | dev: false 1208 | 1209 | /glob-parent/5.1.2: 1210 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1211 | engines: {node: '>= 6'} 1212 | dependencies: 1213 | is-glob: 4.0.3 1214 | dev: true 1215 | 1216 | /has-flag/3.0.0: 1217 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1218 | engines: {node: '>=4'} 1219 | dev: true 1220 | 1221 | /has-symbols/1.0.3: 1222 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1223 | engines: {node: '>= 0.4'} 1224 | dev: false 1225 | 1226 | /has/1.0.3: 1227 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1228 | engines: {node: '>= 0.4.0'} 1229 | dependencies: 1230 | function-bind: 1.1.1 1231 | dev: false 1232 | 1233 | /http-errors/2.0.0: 1234 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 1235 | engines: {node: '>= 0.8'} 1236 | dependencies: 1237 | depd: 2.0.0 1238 | inherits: 2.0.4 1239 | setprototypeof: 1.2.0 1240 | statuses: 2.0.1 1241 | toidentifier: 1.0.1 1242 | dev: false 1243 | 1244 | /iconv-lite/0.4.24: 1245 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1246 | engines: {node: '>=0.10.0'} 1247 | dependencies: 1248 | safer-buffer: 2.1.2 1249 | dev: false 1250 | 1251 | /ieee754/1.2.1: 1252 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1253 | dev: false 1254 | 1255 | /ignore-by-default/1.0.1: 1256 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 1257 | dev: true 1258 | 1259 | /inherits/2.0.4: 1260 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1261 | dev: false 1262 | 1263 | /ip/2.0.0: 1264 | resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} 1265 | dev: false 1266 | 1267 | /ipaddr.js/1.9.1: 1268 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1269 | engines: {node: '>= 0.10'} 1270 | dev: false 1271 | 1272 | /is-binary-path/2.1.0: 1273 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1274 | engines: {node: '>=8'} 1275 | dependencies: 1276 | binary-extensions: 2.2.0 1277 | dev: true 1278 | 1279 | /is-extglob/2.1.1: 1280 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1281 | engines: {node: '>=0.10.0'} 1282 | dev: true 1283 | 1284 | /is-glob/4.0.3: 1285 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1286 | engines: {node: '>=0.10.0'} 1287 | dependencies: 1288 | is-extglob: 2.1.1 1289 | dev: true 1290 | 1291 | /is-number/7.0.0: 1292 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1293 | engines: {node: '>=0.12.0'} 1294 | dev: true 1295 | 1296 | /isarray/0.0.1: 1297 | resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} 1298 | dev: false 1299 | 1300 | /isarray/1.0.0: 1301 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1302 | dev: false 1303 | 1304 | /kareem/2.4.1: 1305 | resolution: {integrity: sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==} 1306 | dev: false 1307 | 1308 | /media-typer/0.3.0: 1309 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1310 | engines: {node: '>= 0.6'} 1311 | dev: false 1312 | 1313 | /memory-pager/1.5.0: 1314 | resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} 1315 | dev: false 1316 | optional: true 1317 | 1318 | /merge-descriptors/1.0.1: 1319 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 1320 | dev: false 1321 | 1322 | /methods/1.1.2: 1323 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 1324 | engines: {node: '>= 0.6'} 1325 | dev: false 1326 | 1327 | /mime-db/1.52.0: 1328 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1329 | engines: {node: '>= 0.6'} 1330 | dev: false 1331 | 1332 | /mime-types/2.1.35: 1333 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1334 | engines: {node: '>= 0.6'} 1335 | dependencies: 1336 | mime-db: 1.52.0 1337 | dev: false 1338 | 1339 | /mime/1.6.0: 1340 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1341 | engines: {node: '>=4'} 1342 | hasBin: true 1343 | dev: false 1344 | 1345 | /minimatch/3.1.2: 1346 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1347 | dependencies: 1348 | brace-expansion: 1.1.11 1349 | dev: true 1350 | 1351 | /minimist/1.2.7: 1352 | resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} 1353 | dev: false 1354 | 1355 | /mkdirp/0.5.6: 1356 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1357 | hasBin: true 1358 | dependencies: 1359 | minimist: 1.2.7 1360 | dev: false 1361 | 1362 | /mongodb-connection-string-url/2.5.4: 1363 | resolution: {integrity: sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==} 1364 | dependencies: 1365 | '@types/whatwg-url': 8.2.2 1366 | whatwg-url: 11.0.0 1367 | dev: false 1368 | 1369 | /mongodb/4.11.0: 1370 | resolution: {integrity: sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==} 1371 | engines: {node: '>=12.9.0'} 1372 | dependencies: 1373 | bson: 4.7.0 1374 | denque: 2.1.0 1375 | mongodb-connection-string-url: 2.5.4 1376 | socks: 2.7.1 1377 | optionalDependencies: 1378 | '@aws-sdk/credential-providers': 3.209.0 1379 | saslprep: 1.0.3 1380 | transitivePeerDependencies: 1381 | - aws-crt 1382 | dev: false 1383 | 1384 | /mongoose/6.7.2: 1385 | resolution: {integrity: sha512-lrP2V5U1qhaf+z33fiIn7aYAZZ1fVDly+TkFRjTujNBF/FIHESATj2RbgAOSlWqv32fsZXkXejXzeVfjbv35Ow==} 1386 | engines: {node: '>=12.0.0'} 1387 | dependencies: 1388 | bson: 4.7.0 1389 | kareem: 2.4.1 1390 | mongodb: 4.11.0 1391 | mpath: 0.9.0 1392 | mquery: 4.0.3 1393 | ms: 2.1.3 1394 | sift: 16.0.1 1395 | transitivePeerDependencies: 1396 | - aws-crt 1397 | - supports-color 1398 | dev: false 1399 | 1400 | /morgan/1.10.0: 1401 | resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} 1402 | engines: {node: '>= 0.8.0'} 1403 | dependencies: 1404 | basic-auth: 2.0.1 1405 | debug: 2.6.9 1406 | depd: 2.0.0 1407 | on-finished: 2.3.0 1408 | on-headers: 1.0.2 1409 | transitivePeerDependencies: 1410 | - supports-color 1411 | dev: false 1412 | 1413 | /mpath/0.9.0: 1414 | resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} 1415 | engines: {node: '>=4.0.0'} 1416 | dev: false 1417 | 1418 | /mquery/4.0.3: 1419 | resolution: {integrity: sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==} 1420 | engines: {node: '>=12.0.0'} 1421 | dependencies: 1422 | debug: 4.3.4 1423 | transitivePeerDependencies: 1424 | - supports-color 1425 | dev: false 1426 | 1427 | /ms/2.0.0: 1428 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1429 | dev: false 1430 | 1431 | /ms/2.1.2: 1432 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1433 | dev: false 1434 | 1435 | /ms/2.1.3: 1436 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1437 | 1438 | /multer/1.4.4: 1439 | resolution: {integrity: sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==} 1440 | engines: {node: '>= 0.10.0'} 1441 | deprecated: Multer 1.x is affected by CVE-2022-24434. This is fixed in v1.4.4-lts.1 which drops support for versions of Node.js before 6. Please upgrade to at least Node.js 6 and version 1.4.4-lts.1 of Multer. If you need support for older versions of Node.js, we are open to accepting patches that would fix the CVE on the main 1.x release line, whilst maintaining compatibility with Node.js 0.10. 1442 | dependencies: 1443 | append-field: 1.0.0 1444 | busboy: 0.2.14 1445 | concat-stream: 1.6.2 1446 | mkdirp: 0.5.6 1447 | object-assign: 4.1.1 1448 | on-finished: 2.4.1 1449 | type-is: 1.6.18 1450 | xtend: 4.0.2 1451 | dev: false 1452 | 1453 | /negotiator/0.6.3: 1454 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1455 | engines: {node: '>= 0.6'} 1456 | dev: false 1457 | 1458 | /nodemon/2.0.20: 1459 | resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} 1460 | engines: {node: '>=8.10.0'} 1461 | hasBin: true 1462 | dependencies: 1463 | chokidar: 3.5.3 1464 | debug: 3.2.7_supports-color@5.5.0 1465 | ignore-by-default: 1.0.1 1466 | minimatch: 3.1.2 1467 | pstree.remy: 1.1.8 1468 | semver: 5.7.1 1469 | simple-update-notifier: 1.0.7 1470 | supports-color: 5.5.0 1471 | touch: 3.1.0 1472 | undefsafe: 2.0.5 1473 | dev: true 1474 | 1475 | /nopt/1.0.10: 1476 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 1477 | hasBin: true 1478 | dependencies: 1479 | abbrev: 1.1.1 1480 | dev: true 1481 | 1482 | /normalize-path/3.0.0: 1483 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1484 | engines: {node: '>=0.10.0'} 1485 | dev: true 1486 | 1487 | /object-assign/4.1.1: 1488 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1489 | engines: {node: '>=0.10.0'} 1490 | dev: false 1491 | 1492 | /object-inspect/1.12.2: 1493 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1494 | dev: false 1495 | 1496 | /on-finished/2.3.0: 1497 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 1498 | engines: {node: '>= 0.8'} 1499 | dependencies: 1500 | ee-first: 1.1.1 1501 | dev: false 1502 | 1503 | /on-finished/2.4.1: 1504 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1505 | engines: {node: '>= 0.8'} 1506 | dependencies: 1507 | ee-first: 1.1.1 1508 | dev: false 1509 | 1510 | /on-headers/1.0.2: 1511 | resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} 1512 | engines: {node: '>= 0.8'} 1513 | dev: false 1514 | 1515 | /parseurl/1.3.3: 1516 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1517 | engines: {node: '>= 0.8'} 1518 | dev: false 1519 | 1520 | /path-to-regexp/0.1.7: 1521 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 1522 | dev: false 1523 | 1524 | /picomatch/2.3.1: 1525 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1526 | engines: {node: '>=8.6'} 1527 | dev: true 1528 | 1529 | /process-nextick-args/2.0.1: 1530 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1531 | dev: false 1532 | 1533 | /proxy-addr/2.0.7: 1534 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1535 | engines: {node: '>= 0.10'} 1536 | dependencies: 1537 | forwarded: 0.2.0 1538 | ipaddr.js: 1.9.1 1539 | dev: false 1540 | 1541 | /pstree.remy/1.1.8: 1542 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 1543 | dev: true 1544 | 1545 | /punycode/2.1.1: 1546 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 1547 | engines: {node: '>=6'} 1548 | dev: false 1549 | 1550 | /qs/6.11.0: 1551 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 1552 | engines: {node: '>=0.6'} 1553 | dependencies: 1554 | side-channel: 1.0.4 1555 | dev: false 1556 | 1557 | /range-parser/1.2.1: 1558 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1559 | engines: {node: '>= 0.6'} 1560 | dev: false 1561 | 1562 | /raw-body/2.5.1: 1563 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 1564 | engines: {node: '>= 0.8'} 1565 | dependencies: 1566 | bytes: 3.1.2 1567 | http-errors: 2.0.0 1568 | iconv-lite: 0.4.24 1569 | unpipe: 1.0.0 1570 | dev: false 1571 | 1572 | /readable-stream/1.1.14: 1573 | resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} 1574 | dependencies: 1575 | core-util-is: 1.0.3 1576 | inherits: 2.0.4 1577 | isarray: 0.0.1 1578 | string_decoder: 0.10.31 1579 | dev: false 1580 | 1581 | /readable-stream/2.3.7: 1582 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1583 | dependencies: 1584 | core-util-is: 1.0.3 1585 | inherits: 2.0.4 1586 | isarray: 1.0.0 1587 | process-nextick-args: 2.0.1 1588 | safe-buffer: 5.1.2 1589 | string_decoder: 1.1.1 1590 | util-deprecate: 1.0.2 1591 | dev: false 1592 | 1593 | /readdirp/3.6.0: 1594 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1595 | engines: {node: '>=8.10.0'} 1596 | dependencies: 1597 | picomatch: 2.3.1 1598 | dev: true 1599 | 1600 | /safe-buffer/5.1.2: 1601 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1602 | dev: false 1603 | 1604 | /safe-buffer/5.2.1: 1605 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1606 | dev: false 1607 | 1608 | /safer-buffer/2.1.2: 1609 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1610 | dev: false 1611 | 1612 | /saslprep/1.0.3: 1613 | resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} 1614 | engines: {node: '>=6'} 1615 | requiresBuild: true 1616 | dependencies: 1617 | sparse-bitfield: 3.0.3 1618 | dev: false 1619 | optional: true 1620 | 1621 | /semver/5.7.1: 1622 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1623 | hasBin: true 1624 | dev: true 1625 | 1626 | /semver/7.0.0: 1627 | resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} 1628 | hasBin: true 1629 | dev: true 1630 | 1631 | /send/0.18.0: 1632 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 1633 | engines: {node: '>= 0.8.0'} 1634 | dependencies: 1635 | debug: 2.6.9 1636 | depd: 2.0.0 1637 | destroy: 1.2.0 1638 | encodeurl: 1.0.2 1639 | escape-html: 1.0.3 1640 | etag: 1.8.1 1641 | fresh: 0.5.2 1642 | http-errors: 2.0.0 1643 | mime: 1.6.0 1644 | ms: 2.1.3 1645 | on-finished: 2.4.1 1646 | range-parser: 1.2.1 1647 | statuses: 2.0.1 1648 | transitivePeerDependencies: 1649 | - supports-color 1650 | dev: false 1651 | 1652 | /serve-static/1.15.0: 1653 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 1654 | engines: {node: '>= 0.8.0'} 1655 | dependencies: 1656 | encodeurl: 1.0.2 1657 | escape-html: 1.0.3 1658 | parseurl: 1.3.3 1659 | send: 0.18.0 1660 | transitivePeerDependencies: 1661 | - supports-color 1662 | dev: false 1663 | 1664 | /setprototypeof/1.2.0: 1665 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1666 | dev: false 1667 | 1668 | /side-channel/1.0.4: 1669 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1670 | dependencies: 1671 | call-bind: 1.0.2 1672 | get-intrinsic: 1.1.3 1673 | object-inspect: 1.12.2 1674 | dev: false 1675 | 1676 | /sift/16.0.1: 1677 | resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} 1678 | dev: false 1679 | 1680 | /simple-update-notifier/1.0.7: 1681 | resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==} 1682 | engines: {node: '>=8.10.0'} 1683 | dependencies: 1684 | semver: 7.0.0 1685 | dev: true 1686 | 1687 | /smart-buffer/4.2.0: 1688 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 1689 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 1690 | dev: false 1691 | 1692 | /socks/2.7.1: 1693 | resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} 1694 | engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} 1695 | dependencies: 1696 | ip: 2.0.0 1697 | smart-buffer: 4.2.0 1698 | dev: false 1699 | 1700 | /sparse-bitfield/3.0.3: 1701 | resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} 1702 | dependencies: 1703 | memory-pager: 1.5.0 1704 | dev: false 1705 | optional: true 1706 | 1707 | /statuses/2.0.1: 1708 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1709 | engines: {node: '>= 0.8'} 1710 | dev: false 1711 | 1712 | /streamsearch/0.1.2: 1713 | resolution: {integrity: sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==} 1714 | engines: {node: '>=0.8.0'} 1715 | dev: false 1716 | 1717 | /string_decoder/0.10.31: 1718 | resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} 1719 | dev: false 1720 | 1721 | /string_decoder/1.1.1: 1722 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1723 | dependencies: 1724 | safe-buffer: 5.1.2 1725 | dev: false 1726 | 1727 | /strnum/1.0.5: 1728 | resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} 1729 | dev: false 1730 | optional: true 1731 | 1732 | /supports-color/5.5.0: 1733 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1734 | engines: {node: '>=4'} 1735 | dependencies: 1736 | has-flag: 3.0.0 1737 | dev: true 1738 | 1739 | /timeago.js/4.0.2: 1740 | resolution: {integrity: sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==} 1741 | dev: true 1742 | 1743 | /to-regex-range/5.0.1: 1744 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1745 | engines: {node: '>=8.0'} 1746 | dependencies: 1747 | is-number: 7.0.0 1748 | dev: true 1749 | 1750 | /toidentifier/1.0.1: 1751 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1752 | engines: {node: '>=0.6'} 1753 | dev: false 1754 | 1755 | /touch/3.1.0: 1756 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1757 | hasBin: true 1758 | dependencies: 1759 | nopt: 1.0.10 1760 | dev: true 1761 | 1762 | /tr46/3.0.0: 1763 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} 1764 | engines: {node: '>=12'} 1765 | dependencies: 1766 | punycode: 2.1.1 1767 | dev: false 1768 | 1769 | /tslib/1.14.1: 1770 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1771 | dev: false 1772 | optional: true 1773 | 1774 | /tslib/2.4.1: 1775 | resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} 1776 | dev: false 1777 | optional: true 1778 | 1779 | /type-is/1.6.18: 1780 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1781 | engines: {node: '>= 0.6'} 1782 | dependencies: 1783 | media-typer: 0.3.0 1784 | mime-types: 2.1.35 1785 | dev: false 1786 | 1787 | /typedarray/0.0.6: 1788 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 1789 | dev: false 1790 | 1791 | /undefsafe/2.0.5: 1792 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 1793 | dev: true 1794 | 1795 | /unpipe/1.0.0: 1796 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1797 | engines: {node: '>= 0.8'} 1798 | dev: false 1799 | 1800 | /util-deprecate/1.0.2: 1801 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1802 | dev: false 1803 | 1804 | /utils-merge/1.0.1: 1805 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1806 | engines: {node: '>= 0.4.0'} 1807 | dev: false 1808 | 1809 | /uuid/8.3.2: 1810 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 1811 | hasBin: true 1812 | dev: false 1813 | optional: true 1814 | 1815 | /vary/1.1.2: 1816 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1817 | engines: {node: '>= 0.8'} 1818 | dev: false 1819 | 1820 | /webidl-conversions/7.0.0: 1821 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 1822 | engines: {node: '>=12'} 1823 | dev: false 1824 | 1825 | /whatwg-url/11.0.0: 1826 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} 1827 | engines: {node: '>=12'} 1828 | dependencies: 1829 | tr46: 3.0.0 1830 | webidl-conversions: 7.0.0 1831 | dev: false 1832 | 1833 | /xtend/4.0.2: 1834 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1835 | engines: {node: '>=0.4'} 1836 | dev: false 1837 | -------------------------------------------------------------------------------- /requests/books.rest: -------------------------------------------------------------------------------- 1 | ### Get books 2 | GET http://localhost:4000/api/books 3 | 4 | ### create new book 5 | POST http://localhost:4000/api/books 6 | Content-Type: application/json 7 | 8 | { 9 | "title": "The Lord of the Rings", 10 | "author": "J.R.R. Tolkien", 11 | "isbn": "0-395-19395-8" 12 | } --------------------------------------------------------------------------------