├── .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 | 
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 |
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 |
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 |
--------------------------------------------------------------------------------