├── .gitignore ├── README.md ├── package.json ├── Dockerfile ├── LICENSE ├── public ├── api-client.js └── index.html ├── server.js ├── index.html └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-roulette 2 | A super simple roulette app with VueJS. 3 | 4 | Based on [this codepen](https://codepen.io/barney-parker/pen/OPyYqy) created by Barney Parker. 5 | 6 | Enhanced and converted to VueJS app. 7 | 8 | ### How to use : 9 | 10 | 1. Add prizes 11 | 2. Click `Spin Roulette` 12 | 3. ~~Profit~~ 13 | 14 | Curious? [See it in action](http://aqidd.github.io/vue-roulette/) 15 | 16 | ![screenshot](https://puu.sh/vHDEW/f63c79c8e9.png) 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-roulette-backend", 3 | "version": "1.0.0", 4 | "description": "Express backend with Gemini API for Vue Roulette", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js", 8 | "dev": "nodemon server.js" 9 | }, 10 | "dependencies": { 11 | "@google/generative-ai": "^0.1.3", 12 | "cors": "^2.8.5", 13 | "dotenv": "^16.3.1", 14 | "express": "^4.18.2" 15 | }, 16 | "devDependencies": { 17 | "nodemon": "^3.0.2" 18 | }, 19 | "packageManager": "pnpm@9.14.4+sha512.c8180b3fbe4e4bca02c94234717896b5529740a6cbadf19fa78254270403ea2f27d4e1d46a08a0f56c89b63dc8ebfd3ee53326da720273794e6200fcf0d184ab" 20 | } 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for Vue 3 app with Express backend and Gemini API 2 | # 2025-04-04: Updated to use Nginx for static files and Node.js for backend 3 | 4 | # Build stage for the Express backend 5 | FROM node:18-alpine AS backend 6 | 7 | WORKDIR /app 8 | 9 | # Copy package files and install dependencies 10 | COPY package*.json ./ 11 | RUN npm install 12 | 13 | # Copy server files 14 | COPY server.js ./ 15 | COPY .env ./ 16 | 17 | # Final stage 18 | FROM node:18-alpine 19 | 20 | WORKDIR /app 21 | 22 | # Copy from backend stage 23 | COPY --from=backend /app /app 24 | 25 | # Create public directory and copy frontend files 26 | RUN mkdir -p /app/public 27 | COPY modern.html /app/public/index.html 28 | COPY public/ /app/public/ 29 | COPY *.js /app/public/ 30 | COPY *.css /app/public/ 31 | 32 | EXPOSE 3000 33 | CMD ["node", "server.js"] 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Bukhori Muhammad Aqid 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /public/api-client.js: -------------------------------------------------------------------------------- 1 | // 2025-04-04: Created API client for Gemini integration 2 | // - Handles communication with Express backend 3 | // - Provides methods for text generation and prize suggestions 4 | // - Includes error handling and response formatting 5 | 6 | class ApiClient { 7 | constructor(baseUrl = 'http://localhost:3000/api') { 8 | this.baseUrl = baseUrl; 9 | } 10 | 11 | async generateText(prompt, maxTokens = 256) { 12 | try { 13 | const response = await fetch(`${this.baseUrl}/generate`, { 14 | method: 'POST', 15 | headers: { 16 | 'Content-Type': 'application/json', 17 | }, 18 | body: JSON.stringify({ prompt, maxTokens }), 19 | }); 20 | 21 | if (!response.ok) { 22 | const errorData = await response.json(); 23 | throw new Error(errorData.error || 'Failed to generate text'); 24 | } 25 | 26 | return await response.json(); 27 | } catch (error) { 28 | console.error('Error generating text:', error); 29 | throw error; 30 | } 31 | } 32 | 33 | async suggestPrizes(theme, count = 5) { 34 | try { 35 | const response = await fetch(`${this.baseUrl}/suggest-prizes`, { 36 | method: 'POST', 37 | headers: { 38 | 'Content-Type': 'application/json', 39 | }, 40 | body: JSON.stringify({ theme, count }), 41 | }); 42 | 43 | if (!response.ok) { 44 | const errorData = await response.json(); 45 | throw new Error(errorData.error || 'Failed to suggest prizes'); 46 | } 47 | 48 | return await response.json(); 49 | } catch (error) { 50 | console.error('Error suggesting prizes:', error); 51 | throw error; 52 | } 53 | } 54 | 55 | async checkHealth() { 56 | try { 57 | const response = await fetch(`${this.baseUrl}/health`); 58 | return response.ok; 59 | } catch (error) { 60 | console.error('Server health check failed:', error); 61 | return false; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // 2025-04-04: Created Express server with Gemini API integration 2 | // - Simple REST API for LLM capabilities 3 | // - Environment variables for API key security 4 | // - CORS enabled for frontend communication 5 | // - Error handling for API requests 6 | 7 | const express = require('express'); 8 | const cors = require('cors'); 9 | const dotenv = require('dotenv'); 10 | const { GoogleGenerativeAI } = require('@google/generative-ai'); 11 | 12 | // Load environment variables 13 | dotenv.config(); 14 | 15 | // Initialize Express app 16 | const app = express(); 17 | const PORT = process.env.PORT || 3000; 18 | const path = require('path'); 19 | 20 | // Middleware 21 | app.use(cors()); 22 | app.use(express.json()); 23 | app.use(express.static(path.join(__dirname, 'public'))); 24 | 25 | // Initialize Gemini API 26 | const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY); 27 | 28 | // Routes 29 | // Serve index.html for the root route 30 | app.get('/', (req, res) => { 31 | res.sendFile(path.join(__dirname, 'public', 'index.html')); 32 | }); 33 | 34 | app.get('/api/health', (req, res) => { 35 | res.status(200).json({ status: 'ok', message: 'Server is running' }); 36 | }); 37 | 38 | // Gemini text generation endpoint 39 | app.post('/api/generate', async (req, res) => { 40 | try { 41 | const { prompt, maxTokens = 256 } = req.body; 42 | 43 | if (!prompt) { 44 | return res.status(400).json({ error: 'Prompt is required' }); 45 | } 46 | 47 | // Get the generative model 48 | const model = genAI.getGenerativeModel({ model: process.env.GEMINI_MODEL }); 49 | 50 | // Generate content 51 | const result = await model.generateContent(prompt); 52 | const response = await result.response; 53 | const text = response.text(); 54 | 55 | res.status(200).json({ 56 | generated_text: text, 57 | model: process.env.GEMINI_MODEL 58 | }); 59 | } catch (error) { 60 | console.error('Error generating content:', error); 61 | res.status(500).json({ 62 | error: 'Failed to generate content', 63 | details: error.message 64 | }); 65 | } 66 | }); 67 | 68 | // Prize suggestion endpoint using Gemini 69 | app.post('/api/suggest-prizes', async (req, res) => { 70 | try { 71 | const { theme, count = 5 } = req.body; 72 | 73 | if (!theme) { 74 | return res.status(400).json({ error: 'Theme is required' }); 75 | } 76 | 77 | const model = genAI.getGenerativeModel({ model: process.env.GEMINI_MODEL }); 78 | 79 | const prompt = `Generate ${count} creative prize ideas for a roulette wheel with the theme: "${theme}". 80 | Return only the prize names as a JSON array of strings. No explanations or other text.`; 81 | 82 | const result = await model.generateContent(prompt); 83 | const response = await result.response; 84 | const text = response.text(); 85 | 86 | // Extract JSON array from response 87 | let prizes; 88 | try { 89 | // Try to extract JSON if the response is wrapped in code blocks or has extra text 90 | const jsonMatch = text.match(/\[[\s\S]*\]/); 91 | if (jsonMatch) { 92 | prizes = JSON.parse(jsonMatch[0]); 93 | } else { 94 | prizes = JSON.parse(text); 95 | } 96 | } catch (parseError) { 97 | console.error('Error parsing JSON from Gemini response:', parseError); 98 | // Fallback: split by commas or newlines if JSON parsing fails 99 | prizes = text.split(/[,\n]/).map(item => item.trim()).filter(Boolean); 100 | } 101 | 102 | res.status(200).json({ prizes }); 103 | } catch (error) { 104 | console.error('Error suggesting prizes:', error); 105 | res.status(500).json({ 106 | error: 'Failed to suggest prizes', 107 | details: error.message 108 | }); 109 | } 110 | }); 111 | 112 | // Catch-all route to redirect back to index.html (for SPA routing) 113 | app.get('*', (req, res) => { 114 | // Skip API routes 115 | if (!req.path.startsWith('/api/')) { 116 | res.sendFile(path.join(__dirname, 'public', 'index.html')); 117 | } else { 118 | res.status(404).json({ error: 'API endpoint not found' }); 119 | } 120 | }); 121 | 122 | // Start server 123 | app.listen(PORT, () => { 124 | console.log(`Server running on port ${PORT}`); 125 | console.log(`Visit http://localhost:${PORT} to view the application`); 126 | }); 127 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

15 | VueRoulette 16 |

17 |

18 | A simple roulette using VueJS 19 |

20 |
21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 |
29 | 30 |
31 |
32 | 33 |
34 |
35 |
36 |
37 |
38 |
39 | 40 |
41 |
42 |
43 | 44 |
45 |
46 | 47 | {{option}} 48 |
49 |
50 |
51 |
52 |
53 |
54 | 55 | 56 | 57 | 218 | 219 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | 17 | Vue Roulette 18 | 19 | 20 | 21 | 22 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |

VueRoulette

40 |

A simple roulette using Vue 3

41 |
42 |
43 | 44 |
45 |
46 |
47 |
48 | 54 |
55 | 56 |
57 |
58 |

{{ selectedOption }}

59 |
60 |
61 |
62 |
63 | 64 |
65 |
66 | 73 | 79 |
80 | 81 |
82 |
83 | 89 | 96 |
97 |

Powered by Gemini AI

98 |
99 | 100 |
101 |

AI Suggested Prizes:

102 |
103 | 112 |
113 |
114 | 115 |
116 |
121 | 127 | {{ option }} 128 |
129 |
130 |
131 |
132 |
133 |
134 | 135 | 352 | 353 | 354 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@google/generative-ai': 12 | specifier: ^0.1.3 13 | version: 0.1.3 14 | cors: 15 | specifier: ^2.8.5 16 | version: 2.8.5 17 | dotenv: 18 | specifier: ^16.3.1 19 | version: 16.4.7 20 | express: 21 | specifier: ^4.18.2 22 | version: 4.21.2 23 | devDependencies: 24 | nodemon: 25 | specifier: ^3.0.2 26 | version: 3.1.9 27 | 28 | packages: 29 | 30 | '@google/generative-ai@0.1.3': 31 | resolution: {integrity: sha512-Cm4uJX1sKarpm1mje/MiOIinM7zdUUrQp/5/qGPAgznbdd/B9zup5ehT6c1qGqycFcSopTA1J1HpqHS5kJR8hQ==} 32 | engines: {node: '>=18.0.0'} 33 | 34 | accepts@1.3.8: 35 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 36 | engines: {node: '>= 0.6'} 37 | 38 | anymatch@3.1.3: 39 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 40 | engines: {node: '>= 8'} 41 | 42 | array-flatten@1.1.1: 43 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 44 | 45 | balanced-match@1.0.2: 46 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 47 | 48 | binary-extensions@2.3.0: 49 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 50 | engines: {node: '>=8'} 51 | 52 | body-parser@1.20.3: 53 | resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} 54 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 55 | 56 | brace-expansion@1.1.11: 57 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 58 | 59 | braces@3.0.3: 60 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 61 | engines: {node: '>=8'} 62 | 63 | bytes@3.1.2: 64 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 65 | engines: {node: '>= 0.8'} 66 | 67 | call-bind-apply-helpers@1.0.2: 68 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 69 | engines: {node: '>= 0.4'} 70 | 71 | call-bound@1.0.4: 72 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 73 | engines: {node: '>= 0.4'} 74 | 75 | chokidar@3.6.0: 76 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 77 | engines: {node: '>= 8.10.0'} 78 | 79 | concat-map@0.0.1: 80 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 81 | 82 | content-disposition@0.5.4: 83 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 84 | engines: {node: '>= 0.6'} 85 | 86 | content-type@1.0.5: 87 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 88 | engines: {node: '>= 0.6'} 89 | 90 | cookie-signature@1.0.6: 91 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 92 | 93 | cookie@0.7.1: 94 | resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} 95 | engines: {node: '>= 0.6'} 96 | 97 | cors@2.8.5: 98 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 99 | engines: {node: '>= 0.10'} 100 | 101 | debug@2.6.9: 102 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 103 | peerDependencies: 104 | supports-color: '*' 105 | peerDependenciesMeta: 106 | supports-color: 107 | optional: true 108 | 109 | debug@4.4.0: 110 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 111 | engines: {node: '>=6.0'} 112 | peerDependencies: 113 | supports-color: '*' 114 | peerDependenciesMeta: 115 | supports-color: 116 | optional: true 117 | 118 | depd@2.0.0: 119 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 120 | engines: {node: '>= 0.8'} 121 | 122 | destroy@1.2.0: 123 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 124 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 125 | 126 | dotenv@16.4.7: 127 | resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} 128 | engines: {node: '>=12'} 129 | 130 | dunder-proto@1.0.1: 131 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 132 | engines: {node: '>= 0.4'} 133 | 134 | ee-first@1.1.1: 135 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 136 | 137 | encodeurl@1.0.2: 138 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 139 | engines: {node: '>= 0.8'} 140 | 141 | encodeurl@2.0.0: 142 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 143 | engines: {node: '>= 0.8'} 144 | 145 | es-define-property@1.0.1: 146 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 147 | engines: {node: '>= 0.4'} 148 | 149 | es-errors@1.3.0: 150 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 151 | engines: {node: '>= 0.4'} 152 | 153 | es-object-atoms@1.1.1: 154 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 155 | engines: {node: '>= 0.4'} 156 | 157 | escape-html@1.0.3: 158 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 159 | 160 | etag@1.8.1: 161 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 162 | engines: {node: '>= 0.6'} 163 | 164 | express@4.21.2: 165 | resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} 166 | engines: {node: '>= 0.10.0'} 167 | 168 | fill-range@7.1.1: 169 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 170 | engines: {node: '>=8'} 171 | 172 | finalhandler@1.3.1: 173 | resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} 174 | engines: {node: '>= 0.8'} 175 | 176 | forwarded@0.2.0: 177 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 178 | engines: {node: '>= 0.6'} 179 | 180 | fresh@0.5.2: 181 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 182 | engines: {node: '>= 0.6'} 183 | 184 | fsevents@2.3.3: 185 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 186 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 187 | os: [darwin] 188 | 189 | function-bind@1.1.2: 190 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 191 | 192 | get-intrinsic@1.3.0: 193 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 194 | engines: {node: '>= 0.4'} 195 | 196 | get-proto@1.0.1: 197 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 198 | engines: {node: '>= 0.4'} 199 | 200 | glob-parent@5.1.2: 201 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 202 | engines: {node: '>= 6'} 203 | 204 | gopd@1.2.0: 205 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 206 | engines: {node: '>= 0.4'} 207 | 208 | has-flag@3.0.0: 209 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 210 | engines: {node: '>=4'} 211 | 212 | has-symbols@1.1.0: 213 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 214 | engines: {node: '>= 0.4'} 215 | 216 | hasown@2.0.2: 217 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 218 | engines: {node: '>= 0.4'} 219 | 220 | http-errors@2.0.0: 221 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 222 | engines: {node: '>= 0.8'} 223 | 224 | iconv-lite@0.4.24: 225 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 226 | engines: {node: '>=0.10.0'} 227 | 228 | ignore-by-default@1.0.1: 229 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 230 | 231 | inherits@2.0.4: 232 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 233 | 234 | ipaddr.js@1.9.1: 235 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 236 | engines: {node: '>= 0.10'} 237 | 238 | is-binary-path@2.1.0: 239 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 240 | engines: {node: '>=8'} 241 | 242 | is-extglob@2.1.1: 243 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 244 | engines: {node: '>=0.10.0'} 245 | 246 | is-glob@4.0.3: 247 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 248 | engines: {node: '>=0.10.0'} 249 | 250 | is-number@7.0.0: 251 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 252 | engines: {node: '>=0.12.0'} 253 | 254 | math-intrinsics@1.1.0: 255 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 256 | engines: {node: '>= 0.4'} 257 | 258 | media-typer@0.3.0: 259 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 260 | engines: {node: '>= 0.6'} 261 | 262 | merge-descriptors@1.0.3: 263 | resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} 264 | 265 | methods@1.1.2: 266 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 267 | engines: {node: '>= 0.6'} 268 | 269 | mime-db@1.52.0: 270 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 271 | engines: {node: '>= 0.6'} 272 | 273 | mime-types@2.1.35: 274 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 275 | engines: {node: '>= 0.6'} 276 | 277 | mime@1.6.0: 278 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 279 | engines: {node: '>=4'} 280 | hasBin: true 281 | 282 | minimatch@3.1.2: 283 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 284 | 285 | ms@2.0.0: 286 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 287 | 288 | ms@2.1.3: 289 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 290 | 291 | negotiator@0.6.3: 292 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 293 | engines: {node: '>= 0.6'} 294 | 295 | nodemon@3.1.9: 296 | resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} 297 | engines: {node: '>=10'} 298 | hasBin: true 299 | 300 | normalize-path@3.0.0: 301 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 302 | engines: {node: '>=0.10.0'} 303 | 304 | object-assign@4.1.1: 305 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 306 | engines: {node: '>=0.10.0'} 307 | 308 | object-inspect@1.13.4: 309 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 310 | engines: {node: '>= 0.4'} 311 | 312 | on-finished@2.4.1: 313 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 314 | engines: {node: '>= 0.8'} 315 | 316 | parseurl@1.3.3: 317 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 318 | engines: {node: '>= 0.8'} 319 | 320 | path-to-regexp@0.1.12: 321 | resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} 322 | 323 | picomatch@2.3.1: 324 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 325 | engines: {node: '>=8.6'} 326 | 327 | proxy-addr@2.0.7: 328 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 329 | engines: {node: '>= 0.10'} 330 | 331 | pstree.remy@1.1.8: 332 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 333 | 334 | qs@6.13.0: 335 | resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} 336 | engines: {node: '>=0.6'} 337 | 338 | range-parser@1.2.1: 339 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 340 | engines: {node: '>= 0.6'} 341 | 342 | raw-body@2.5.2: 343 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 344 | engines: {node: '>= 0.8'} 345 | 346 | readdirp@3.6.0: 347 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 348 | engines: {node: '>=8.10.0'} 349 | 350 | safe-buffer@5.2.1: 351 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 352 | 353 | safer-buffer@2.1.2: 354 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 355 | 356 | semver@7.7.1: 357 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 358 | engines: {node: '>=10'} 359 | hasBin: true 360 | 361 | send@0.19.0: 362 | resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} 363 | engines: {node: '>= 0.8.0'} 364 | 365 | serve-static@1.16.2: 366 | resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} 367 | engines: {node: '>= 0.8.0'} 368 | 369 | setprototypeof@1.2.0: 370 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 371 | 372 | side-channel-list@1.0.0: 373 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 374 | engines: {node: '>= 0.4'} 375 | 376 | side-channel-map@1.0.1: 377 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 378 | engines: {node: '>= 0.4'} 379 | 380 | side-channel-weakmap@1.0.2: 381 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 382 | engines: {node: '>= 0.4'} 383 | 384 | side-channel@1.1.0: 385 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 386 | engines: {node: '>= 0.4'} 387 | 388 | simple-update-notifier@2.0.0: 389 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 390 | engines: {node: '>=10'} 391 | 392 | statuses@2.0.1: 393 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 394 | engines: {node: '>= 0.8'} 395 | 396 | supports-color@5.5.0: 397 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 398 | engines: {node: '>=4'} 399 | 400 | to-regex-range@5.0.1: 401 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 402 | engines: {node: '>=8.0'} 403 | 404 | toidentifier@1.0.1: 405 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 406 | engines: {node: '>=0.6'} 407 | 408 | touch@3.1.1: 409 | resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} 410 | hasBin: true 411 | 412 | type-is@1.6.18: 413 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 414 | engines: {node: '>= 0.6'} 415 | 416 | undefsafe@2.0.5: 417 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 418 | 419 | unpipe@1.0.0: 420 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 421 | engines: {node: '>= 0.8'} 422 | 423 | utils-merge@1.0.1: 424 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 425 | engines: {node: '>= 0.4.0'} 426 | 427 | vary@1.1.2: 428 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 429 | engines: {node: '>= 0.8'} 430 | 431 | snapshots: 432 | 433 | '@google/generative-ai@0.1.3': {} 434 | 435 | accepts@1.3.8: 436 | dependencies: 437 | mime-types: 2.1.35 438 | negotiator: 0.6.3 439 | 440 | anymatch@3.1.3: 441 | dependencies: 442 | normalize-path: 3.0.0 443 | picomatch: 2.3.1 444 | 445 | array-flatten@1.1.1: {} 446 | 447 | balanced-match@1.0.2: {} 448 | 449 | binary-extensions@2.3.0: {} 450 | 451 | body-parser@1.20.3: 452 | dependencies: 453 | bytes: 3.1.2 454 | content-type: 1.0.5 455 | debug: 2.6.9 456 | depd: 2.0.0 457 | destroy: 1.2.0 458 | http-errors: 2.0.0 459 | iconv-lite: 0.4.24 460 | on-finished: 2.4.1 461 | qs: 6.13.0 462 | raw-body: 2.5.2 463 | type-is: 1.6.18 464 | unpipe: 1.0.0 465 | transitivePeerDependencies: 466 | - supports-color 467 | 468 | brace-expansion@1.1.11: 469 | dependencies: 470 | balanced-match: 1.0.2 471 | concat-map: 0.0.1 472 | 473 | braces@3.0.3: 474 | dependencies: 475 | fill-range: 7.1.1 476 | 477 | bytes@3.1.2: {} 478 | 479 | call-bind-apply-helpers@1.0.2: 480 | dependencies: 481 | es-errors: 1.3.0 482 | function-bind: 1.1.2 483 | 484 | call-bound@1.0.4: 485 | dependencies: 486 | call-bind-apply-helpers: 1.0.2 487 | get-intrinsic: 1.3.0 488 | 489 | chokidar@3.6.0: 490 | dependencies: 491 | anymatch: 3.1.3 492 | braces: 3.0.3 493 | glob-parent: 5.1.2 494 | is-binary-path: 2.1.0 495 | is-glob: 4.0.3 496 | normalize-path: 3.0.0 497 | readdirp: 3.6.0 498 | optionalDependencies: 499 | fsevents: 2.3.3 500 | 501 | concat-map@0.0.1: {} 502 | 503 | content-disposition@0.5.4: 504 | dependencies: 505 | safe-buffer: 5.2.1 506 | 507 | content-type@1.0.5: {} 508 | 509 | cookie-signature@1.0.6: {} 510 | 511 | cookie@0.7.1: {} 512 | 513 | cors@2.8.5: 514 | dependencies: 515 | object-assign: 4.1.1 516 | vary: 1.1.2 517 | 518 | debug@2.6.9: 519 | dependencies: 520 | ms: 2.0.0 521 | 522 | debug@4.4.0(supports-color@5.5.0): 523 | dependencies: 524 | ms: 2.1.3 525 | optionalDependencies: 526 | supports-color: 5.5.0 527 | 528 | depd@2.0.0: {} 529 | 530 | destroy@1.2.0: {} 531 | 532 | dotenv@16.4.7: {} 533 | 534 | dunder-proto@1.0.1: 535 | dependencies: 536 | call-bind-apply-helpers: 1.0.2 537 | es-errors: 1.3.0 538 | gopd: 1.2.0 539 | 540 | ee-first@1.1.1: {} 541 | 542 | encodeurl@1.0.2: {} 543 | 544 | encodeurl@2.0.0: {} 545 | 546 | es-define-property@1.0.1: {} 547 | 548 | es-errors@1.3.0: {} 549 | 550 | es-object-atoms@1.1.1: 551 | dependencies: 552 | es-errors: 1.3.0 553 | 554 | escape-html@1.0.3: {} 555 | 556 | etag@1.8.1: {} 557 | 558 | express@4.21.2: 559 | dependencies: 560 | accepts: 1.3.8 561 | array-flatten: 1.1.1 562 | body-parser: 1.20.3 563 | content-disposition: 0.5.4 564 | content-type: 1.0.5 565 | cookie: 0.7.1 566 | cookie-signature: 1.0.6 567 | debug: 2.6.9 568 | depd: 2.0.0 569 | encodeurl: 2.0.0 570 | escape-html: 1.0.3 571 | etag: 1.8.1 572 | finalhandler: 1.3.1 573 | fresh: 0.5.2 574 | http-errors: 2.0.0 575 | merge-descriptors: 1.0.3 576 | methods: 1.1.2 577 | on-finished: 2.4.1 578 | parseurl: 1.3.3 579 | path-to-regexp: 0.1.12 580 | proxy-addr: 2.0.7 581 | qs: 6.13.0 582 | range-parser: 1.2.1 583 | safe-buffer: 5.2.1 584 | send: 0.19.0 585 | serve-static: 1.16.2 586 | setprototypeof: 1.2.0 587 | statuses: 2.0.1 588 | type-is: 1.6.18 589 | utils-merge: 1.0.1 590 | vary: 1.1.2 591 | transitivePeerDependencies: 592 | - supports-color 593 | 594 | fill-range@7.1.1: 595 | dependencies: 596 | to-regex-range: 5.0.1 597 | 598 | finalhandler@1.3.1: 599 | dependencies: 600 | debug: 2.6.9 601 | encodeurl: 2.0.0 602 | escape-html: 1.0.3 603 | on-finished: 2.4.1 604 | parseurl: 1.3.3 605 | statuses: 2.0.1 606 | unpipe: 1.0.0 607 | transitivePeerDependencies: 608 | - supports-color 609 | 610 | forwarded@0.2.0: {} 611 | 612 | fresh@0.5.2: {} 613 | 614 | fsevents@2.3.3: 615 | optional: true 616 | 617 | function-bind@1.1.2: {} 618 | 619 | get-intrinsic@1.3.0: 620 | dependencies: 621 | call-bind-apply-helpers: 1.0.2 622 | es-define-property: 1.0.1 623 | es-errors: 1.3.0 624 | es-object-atoms: 1.1.1 625 | function-bind: 1.1.2 626 | get-proto: 1.0.1 627 | gopd: 1.2.0 628 | has-symbols: 1.1.0 629 | hasown: 2.0.2 630 | math-intrinsics: 1.1.0 631 | 632 | get-proto@1.0.1: 633 | dependencies: 634 | dunder-proto: 1.0.1 635 | es-object-atoms: 1.1.1 636 | 637 | glob-parent@5.1.2: 638 | dependencies: 639 | is-glob: 4.0.3 640 | 641 | gopd@1.2.0: {} 642 | 643 | has-flag@3.0.0: {} 644 | 645 | has-symbols@1.1.0: {} 646 | 647 | hasown@2.0.2: 648 | dependencies: 649 | function-bind: 1.1.2 650 | 651 | http-errors@2.0.0: 652 | dependencies: 653 | depd: 2.0.0 654 | inherits: 2.0.4 655 | setprototypeof: 1.2.0 656 | statuses: 2.0.1 657 | toidentifier: 1.0.1 658 | 659 | iconv-lite@0.4.24: 660 | dependencies: 661 | safer-buffer: 2.1.2 662 | 663 | ignore-by-default@1.0.1: {} 664 | 665 | inherits@2.0.4: {} 666 | 667 | ipaddr.js@1.9.1: {} 668 | 669 | is-binary-path@2.1.0: 670 | dependencies: 671 | binary-extensions: 2.3.0 672 | 673 | is-extglob@2.1.1: {} 674 | 675 | is-glob@4.0.3: 676 | dependencies: 677 | is-extglob: 2.1.1 678 | 679 | is-number@7.0.0: {} 680 | 681 | math-intrinsics@1.1.0: {} 682 | 683 | media-typer@0.3.0: {} 684 | 685 | merge-descriptors@1.0.3: {} 686 | 687 | methods@1.1.2: {} 688 | 689 | mime-db@1.52.0: {} 690 | 691 | mime-types@2.1.35: 692 | dependencies: 693 | mime-db: 1.52.0 694 | 695 | mime@1.6.0: {} 696 | 697 | minimatch@3.1.2: 698 | dependencies: 699 | brace-expansion: 1.1.11 700 | 701 | ms@2.0.0: {} 702 | 703 | ms@2.1.3: {} 704 | 705 | negotiator@0.6.3: {} 706 | 707 | nodemon@3.1.9: 708 | dependencies: 709 | chokidar: 3.6.0 710 | debug: 4.4.0(supports-color@5.5.0) 711 | ignore-by-default: 1.0.1 712 | minimatch: 3.1.2 713 | pstree.remy: 1.1.8 714 | semver: 7.7.1 715 | simple-update-notifier: 2.0.0 716 | supports-color: 5.5.0 717 | touch: 3.1.1 718 | undefsafe: 2.0.5 719 | 720 | normalize-path@3.0.0: {} 721 | 722 | object-assign@4.1.1: {} 723 | 724 | object-inspect@1.13.4: {} 725 | 726 | on-finished@2.4.1: 727 | dependencies: 728 | ee-first: 1.1.1 729 | 730 | parseurl@1.3.3: {} 731 | 732 | path-to-regexp@0.1.12: {} 733 | 734 | picomatch@2.3.1: {} 735 | 736 | proxy-addr@2.0.7: 737 | dependencies: 738 | forwarded: 0.2.0 739 | ipaddr.js: 1.9.1 740 | 741 | pstree.remy@1.1.8: {} 742 | 743 | qs@6.13.0: 744 | dependencies: 745 | side-channel: 1.1.0 746 | 747 | range-parser@1.2.1: {} 748 | 749 | raw-body@2.5.2: 750 | dependencies: 751 | bytes: 3.1.2 752 | http-errors: 2.0.0 753 | iconv-lite: 0.4.24 754 | unpipe: 1.0.0 755 | 756 | readdirp@3.6.0: 757 | dependencies: 758 | picomatch: 2.3.1 759 | 760 | safe-buffer@5.2.1: {} 761 | 762 | safer-buffer@2.1.2: {} 763 | 764 | semver@7.7.1: {} 765 | 766 | send@0.19.0: 767 | dependencies: 768 | debug: 2.6.9 769 | depd: 2.0.0 770 | destroy: 1.2.0 771 | encodeurl: 1.0.2 772 | escape-html: 1.0.3 773 | etag: 1.8.1 774 | fresh: 0.5.2 775 | http-errors: 2.0.0 776 | mime: 1.6.0 777 | ms: 2.1.3 778 | on-finished: 2.4.1 779 | range-parser: 1.2.1 780 | statuses: 2.0.1 781 | transitivePeerDependencies: 782 | - supports-color 783 | 784 | serve-static@1.16.2: 785 | dependencies: 786 | encodeurl: 2.0.0 787 | escape-html: 1.0.3 788 | parseurl: 1.3.3 789 | send: 0.19.0 790 | transitivePeerDependencies: 791 | - supports-color 792 | 793 | setprototypeof@1.2.0: {} 794 | 795 | side-channel-list@1.0.0: 796 | dependencies: 797 | es-errors: 1.3.0 798 | object-inspect: 1.13.4 799 | 800 | side-channel-map@1.0.1: 801 | dependencies: 802 | call-bound: 1.0.4 803 | es-errors: 1.3.0 804 | get-intrinsic: 1.3.0 805 | object-inspect: 1.13.4 806 | 807 | side-channel-weakmap@1.0.2: 808 | dependencies: 809 | call-bound: 1.0.4 810 | es-errors: 1.3.0 811 | get-intrinsic: 1.3.0 812 | object-inspect: 1.13.4 813 | side-channel-map: 1.0.1 814 | 815 | side-channel@1.1.0: 816 | dependencies: 817 | es-errors: 1.3.0 818 | object-inspect: 1.13.4 819 | side-channel-list: 1.0.0 820 | side-channel-map: 1.0.1 821 | side-channel-weakmap: 1.0.2 822 | 823 | simple-update-notifier@2.0.0: 824 | dependencies: 825 | semver: 7.7.1 826 | 827 | statuses@2.0.1: {} 828 | 829 | supports-color@5.5.0: 830 | dependencies: 831 | has-flag: 3.0.0 832 | 833 | to-regex-range@5.0.1: 834 | dependencies: 835 | is-number: 7.0.0 836 | 837 | toidentifier@1.0.1: {} 838 | 839 | touch@3.1.1: {} 840 | 841 | type-is@1.6.18: 842 | dependencies: 843 | media-typer: 0.3.0 844 | mime-types: 2.1.35 845 | 846 | undefsafe@2.0.5: {} 847 | 848 | unpipe@1.0.0: {} 849 | 850 | utils-merge@1.0.1: {} 851 | 852 | vary@1.1.2: {} 853 | --------------------------------------------------------------------------------