├── APIMyLlama.js ├── LegacyVersions └── V1 │ ├── APIMyLlama-V1.js │ └── README-V1.md ├── License.txt ├── README.md ├── api.js ├── db.js ├── ollamaURL.conf ├── package-lock.json ├── package.json └── utils.js /APIMyLlama.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const { initializeDatabase, closeDatabase, getDb } = require('./db'); 3 | const { startServer, askForPort, askForOllamaURL, startCLI } = require('./utils'); 4 | const { setupRoutes } = require('./api'); 5 | const fs = require('fs'); 6 | 7 | const app = express(); 8 | app.use(express.json()); 9 | 10 | console.log('APIMyLlama V2 is being started. Thanks for choosing Gimer Studios.'); 11 | 12 | // Middleware for logging requests 13 | app.use((req, res, next) => { 14 | console.log(`Received a ${req.method} request at ${req.url}`); 15 | next(); 16 | }); 17 | 18 | // Initialize the database 19 | const db = initializeDatabase(); 20 | 21 | // Setup API routes 22 | setupRoutes(app, db); 23 | 24 | // Close the database connection when the application is closed 25 | process.on('SIGINT', () => { 26 | closeDatabase(); 27 | }); 28 | 29 | // Start the server 30 | setTimeout(() => { 31 | if (fs.existsSync('port.conf')) { 32 | fs.readFile('port.conf', 'utf8', (err, data) => { 33 | if (err) { 34 | console.error('Error reading port number from file:', err.message); 35 | askForPort(app, startServer, askForOllamaURL, startCLI, db); 36 | } else { 37 | const port = parseInt(data.trim()); 38 | if (isNaN(port)) { 39 | console.error('Invalid port number in port.conf'); 40 | askForPort(app, startServer, askForOllamaURL, startCLI, db); 41 | } else { 42 | if (fs.existsSync('ollamaURL.conf')) { 43 | fs.readFile('ollamaURL.conf', 'utf8', (err, data) => { 44 | if (err) { 45 | console.error('Error reading Ollama url from file:', err.message); 46 | askForOllamaURL(app, startServer, startCLI, port, db); 47 | } else { 48 | const ollamaURL = data.trim(); 49 | if (typeof ollamaURL !== 'string' || ollamaURL === '') { 50 | console.error('Invalid Ollama url in ollamaURL.conf'); 51 | askForOllamaURL(app, startServer, startCLI, port, db); 52 | } else { 53 | startServer(port, app); 54 | startCLI(db); 55 | } 56 | } 57 | }); 58 | } else { 59 | askForOllamaURL(app, startServer, startCLI, port, db); 60 | } 61 | } 62 | } 63 | }); 64 | } else { 65 | askForPort(app, startServer, askForOllamaURL, startCLI, db); 66 | } 67 | }, 1000); 68 | 69 | module.exports = app; 70 | -------------------------------------------------------------------------------- /LegacyVersions/V1/APIMyLlama-V1.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const crypto = require('crypto'); 3 | const axios = require('axios'); 4 | const sqlite3 = require('sqlite3').verbose(); 5 | const fs = require('fs'); 6 | const readline = require('readline'); 7 | const app = express(); 8 | app.use(express.json()); 9 | 10 | // Middleware for logging requests 11 | app.use((req, res, next) => { 12 | console.log(`Received a ${req.method} request at ${req.url}`); 13 | next(); 14 | }); 15 | 16 | // Open a database handle 17 | let db = new sqlite3.Database('./apiKeys.db', sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => { 18 | if (err) { 19 | console.error('Error connecting to the database:', err.message); 20 | } else { 21 | console.log('Connected to the apiKeys.db database.'); 22 | db.run(`CREATE TABLE IF NOT EXISTS apiKeys ( 23 | key TEXT PRIMARY KEY, 24 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 25 | usage_count INTEGER DEFAULT 0, 26 | last_used TIMESTAMP 27 | )`, (err) => { 28 | if (err) { 29 | console.error('Error creating apiKeys table:', err.message); 30 | } 31 | }); 32 | db.run(`CREATE TABLE IF NOT EXISTS apiUsage ( 33 | key TEXT, 34 | timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 35 | request_count INTEGER DEFAULT 1 36 | )`, (err) => { 37 | if (err) { 38 | console.error('Error creating apiUsage table:', err.message); 39 | } 40 | }); 41 | db.run(`CREATE TABLE IF NOT EXISTS webhooks ( 42 | id INTEGER PRIMARY KEY AUTOINCREMENT, 43 | url TEXT NOT NULL 44 | )`, (err) => { 45 | if (err) { 46 | console.error('Error creating webhooks table:', err.message); 47 | } 48 | }); 49 | } 50 | }); 51 | 52 | // Function to get Ollama server port from config file 53 | function getOllamaPort() { 54 | return new Promise((resolve, reject) => { 55 | if (fs.existsSync('ollamaPort.conf')) { 56 | fs.readFile('ollamaPort.conf', 'utf8', (err, data) => { 57 | if (err) { 58 | reject('Error reading Ollama port from file:', err.message); 59 | } else { 60 | const port = parseInt(data.trim()); 61 | if (isNaN(port)) { 62 | reject('Invalid Ollama port number in ollamaPort.conf'); 63 | } else { 64 | resolve(port); 65 | } 66 | } 67 | }); 68 | } else { 69 | reject('Ollama port configuration file not found'); 70 | } 71 | }); 72 | } 73 | 74 | // Function to send a notification to all webhooks 75 | function sendWebhookNotification(payload) { 76 | db.all('SELECT url FROM webhooks', [], (err, rows) => { 77 | if (err) { 78 | console.error('Error retrieving webhooks:', err.message); 79 | } else { 80 | rows.forEach(row => { 81 | const webhookPayload = { 82 | content: JSON.stringify(payload, null, 2) // Convert the payload to a pretty-printed JSON string 83 | }; 84 | 85 | axios.post(row.url, webhookPayload) 86 | .then(response => { 87 | console.log('Webhook notification sent successfully:', response.data); 88 | }) 89 | .catch(error => { 90 | console.error('Error sending webhook notification:', error.message); 91 | }); 92 | }); 93 | } 94 | }); 95 | } 96 | 97 | // Route for making a request to the Ollama API 98 | app.post('/generate', async (req, res) => { 99 | const { apikey, prompt, model, stream, images, raw } = req.body; 100 | 101 | // Log the received request body for debugging 102 | console.log('Request body:', req.body); 103 | 104 | if (!apikey) { 105 | return res.status(400).json({ error: 'API key is required' }); 106 | } 107 | 108 | // Check if the API key exists in the database 109 | db.get('SELECT key FROM apiKeys WHERE key = ?', [apikey], async (err, row) => { 110 | if (err) { 111 | console.error('Error checking API key:', err.message); 112 | return res.status(500).json({ error: 'Internal server error' }); 113 | } 114 | if (!row) { 115 | console.log('Invalid API key:', apikey); 116 | return res.status(403).json({ error: 'Invalid API Key' }); 117 | } 118 | 119 | try { 120 | const ollamaPort = await getOllamaPort(); 121 | const OLLAMA_API_URL = `http://localhost:${ollamaPort}/api/generate`; 122 | 123 | // Make request to Ollama if key is valid. 124 | axios.post(OLLAMA_API_URL, { model, prompt, stream, images, raw }) 125 | .then(response => { 126 | // Update usage count and last used timestamp 127 | db.run('UPDATE apiKeys SET usage_count = usage_count + 1, last_used = CURRENT_TIMESTAMP WHERE key = ?', [apikey], (err) => { 128 | if (err) console.error('Error updating usage count:', err.message); 129 | }); 130 | 131 | // Log usage in apiUsage table 132 | db.run('INSERT INTO apiUsage (key) VALUES (?)', [apikey], (err) => { 133 | if (err) console.error('Error logging API usage:', err.message); 134 | }); 135 | 136 | // Send webhook notifications 137 | sendWebhookNotification({ apikey, prompt, model, stream, images, raw, timestamp: new Date() }); 138 | 139 | res.json(response.data); 140 | }) 141 | .catch(error => { 142 | console.error('Error making request to Ollama API:', error.message); 143 | res.status(500).json({ error: 'Error making request to Ollama API' }); 144 | }); 145 | } catch (error) { 146 | console.error(error); 147 | res.status(500).json({ error: 'Error retrieving Ollama server port' }); 148 | } 149 | }); 150 | }); 151 | 152 | let server; 153 | let currentPort; 154 | 155 | function startServer(port) { 156 | currentPort = port; 157 | server = app.listen(currentPort, () => console.log(`Server running on port ${currentPort}`)); 158 | } 159 | 160 | // Close the database connection when the application is closed 161 | process.on('SIGINT', () => { 162 | db.close((err) => { 163 | if (err) { 164 | console.error('Error closing the database connection:', err.message); 165 | } else { 166 | console.log('Closed the database connection.'); 167 | } 168 | process.exit(0); 169 | }); 170 | }); 171 | 172 | // Create CLI 173 | const rl = readline.createInterface({ 174 | input: process.stdin, 175 | output: process.stdout 176 | }); 177 | 178 | function askForPort() { 179 | rl.question('Enter the port number for the server: ', (port) => { 180 | fs.writeFile('port.conf', port, (err) => { 181 | if (err) { 182 | console.error('Error saving port number:', err.message); 183 | } else { 184 | console.log(`Port number saved to port.conf: ${port}`); 185 | currentPort = parseInt(port); 186 | askForOllamaPort(); 187 | } 188 | }); 189 | }); 190 | } 191 | 192 | function askForOllamaPort() { 193 | rl.question('Enter the port number for the Ollama server (Port that your Ollama server is running on. By default it is 11434 so if you didnt change anything it should be that.): ', (port) => { 194 | fs.writeFile('ollamaPort.conf', port, (err) => { 195 | if (err) { 196 | console.error('Error saving Ollama port number:', err.message); 197 | } else { 198 | console.log(`Ollama port number saved to ollamaPort.conf: ${port}`); 199 | startServer(currentPort); 200 | startCLI(); 201 | } 202 | }); 203 | }); 204 | } 205 | 206 | function startCLI() { 207 | rl.on('line', (input) => { 208 | const [command, argument] = input.trim().split(' '); 209 | switch (command) { 210 | case 'generatekey': 211 | const apiKey = crypto.randomBytes(20).toString('hex'); 212 | db.run('INSERT INTO apiKeys(key) VALUES(?)', [apiKey], (err) => { 213 | if (err) { 214 | console.error('Error generating API key:', err.message); 215 | } else { 216 | console.log(`API key generated: ${apiKey}`); 217 | } 218 | }); 219 | break; 220 | case 'listkey': 221 | db.all('SELECT key FROM apiKeys', [], (err, rows) => { 222 | if (err) { 223 | console.error('Error listing API keys:', err.message); 224 | } else { 225 | console.log('API keys:', rows); 226 | } 227 | }); 228 | break; 229 | case 'removekey': 230 | db.run('DELETE FROM apiKeys WHERE key = ?', [argument], (err) => { 231 | if (err) { 232 | console.error('Error removing API key:', err.message); 233 | } else { 234 | console.log('API key removed'); 235 | } 236 | }); 237 | break; 238 | case 'addkey': 239 | console.log('Warning: Adding your own keys may be unsafe. It is recommended to generate keys using the generatekey command.'); 240 | db.run('INSERT INTO apiKeys(key) VALUES(?)', [argument], (err) => { 241 | if (err) { 242 | console.error('Error adding API key:', err.message); 243 | } else { 244 | console.log(`API key added: ${argument}`); 245 | } 246 | }); 247 | break; 248 | case 'changeport': 249 | if (!argument || isNaN(argument)) { 250 | console.log('Invalid port number'); 251 | } else { 252 | const newPort = parseInt(argument); 253 | server.close((err) => { 254 | if (err) { 255 | console.error('Error closing the server:', err.message); 256 | } else { 257 | console.log(`Server closed on port ${currentPort}`); 258 | fs.writeFile('port.conf', newPort.toString(), (err) => { 259 | if (err) { 260 | console.error('Error saving port number:', err.message); 261 | } else { 262 | console.log(`Port number saved to port.conf: ${newPort}`); 263 | startServer(newPort); 264 | } 265 | }); 266 | } 267 | }); 268 | } 269 | break; 270 | case 'changeollamaport': 271 | if (!argument || isNaN(argument)) { 272 | console.log('Invalid Ollama port number'); 273 | } else { 274 | const newPort = parseInt(argument); 275 | fs.writeFile('ollamaPort.conf', newPort.toString(), (err) => { 276 | if (err) { 277 | console.error('Error saving Ollama port number:', err.message); 278 | } else { 279 | console.log(`Ollama port number saved to ollamaPort.conf: ${newPort}`); 280 | } 281 | }); 282 | } 283 | break; 284 | case 'addwebhook': 285 | if (!argument) { 286 | console.log('Webhook URL is required'); 287 | } else { 288 | db.run('INSERT INTO webhooks (url) VALUES (?)', [argument], (err) => { 289 | if (err) { 290 | console.error('Error adding webhook:', err.message); 291 | } else { 292 | console.log(`Webhook added: ${argument}`); 293 | } 294 | }); 295 | } 296 | break; 297 | case 'deletewebhook': 298 | if (!argument) { 299 | console.log('Webhook ID is required'); 300 | } else { 301 | db.run('DELETE FROM webhooks WHERE id = ?', [argument], (err) => { 302 | if (err) { 303 | console.error('Error deleting webhook:', err.message); 304 | } else { 305 | console.log('Webhook deleted'); 306 | } 307 | }); 308 | } 309 | break; 310 | case 'listwebhooks': 311 | db.all('SELECT id, url FROM webhooks', [], (err, rows) => { 312 | if (err) { 313 | console.error('Error listing webhooks:', err.message); 314 | } else { 315 | console.log('Webhooks:', rows); 316 | } 317 | }); 318 | break; 319 | case 'exit': 320 | rl.close(); 321 | break; 322 | default: 323 | console.log('Unknown command'); 324 | } 325 | }); 326 | } 327 | 328 | setTimeout(() => { 329 | if (fs.existsSync('port.conf')) { 330 | fs.readFile('port.conf', 'utf8', (err, data) => { 331 | if (err) { 332 | console.error('Error reading port number from file:', err.message); 333 | askForPort(); 334 | } else { 335 | const port = parseInt(data.trim()); 336 | if (isNaN(port)) { 337 | console.error('Invalid port number in port.conf'); 338 | askForPort(); 339 | } else { 340 | currentPort = port; 341 | if (fs.existsSync('ollamaPort.conf')) { 342 | fs.readFile('ollamaPort.conf', 'utf8', (err, data) => { 343 | if (err) { 344 | console.error('Error reading Ollama port number from file:', err.message); 345 | askForOllamaPort(); 346 | } else { 347 | const ollamaPort = parseInt(data.trim()); 348 | if (isNaN(ollamaPort)) { 349 | console.error('Invalid Ollama port number in ollamaPort.conf'); 350 | askForOllamaPort(); 351 | } else { 352 | startServer(currentPort); 353 | startCLI(); 354 | } 355 | } 356 | }); 357 | } else { 358 | askForOllamaPort(); 359 | } 360 | } 361 | } 362 | }); 363 | } else { 364 | askForPort(); 365 | } 366 | }, 1000); 367 | -------------------------------------------------------------------------------- /LegacyVersions/V1/README-V1.md: -------------------------------------------------------------------------------- 1 | # APIMyLlama Documentation 2 | 3 | ## Overview 4 | 5 | APIMyLlama is a server application that provides an interface to interact with the Ollama API, a powerful AI tool to run LLMs. It allows users to run this alongside Ollama to easily distrubute API keys to create amazing things. 6 | 7 | # Installation 8 | 9 | ## Ollama Setup 10 | If you already have Ollama setup with the 'ollama serve' command and your desired model. You can skip this. If not i'll show you how to set it up. First install [Ollama](https://ollama.com/download) for your desired operating system. Once installed open a terminal instance and run the command below. 11 | ```bash 12 | ollama pull llama3 13 | ``` 14 | 15 | If done correctly you should now have the Meta's Llama3 LLM installed. You can use any model with the API but for this example we will use this model. Now you are gonna run this command after the install is complete. 16 | ```bash 17 | ollama serve 18 | ``` 19 | Now you have an Ollama server setup. Time for the next step. 20 | 21 | ## Hosting the API 22 | 23 | 24 | Install [Node.JS](https://nodejs.org/en/download/package-manager) on your server. Then clone the git repository. 25 | 26 | ```bash 27 | git clone https://github.com/Gimer-Studios/APIMyLlama.git 28 | cd APIMyLlama 29 | npm install 30 | node APIMyLlama.js 31 | ``` 32 | After cloning go into the cloned directory and installing all the needed dependencies by running the 'npm install' command. Then run the APIMyLlama.js file. 33 | On startup it will ask what port you want to use. 34 | ``` 35 | PS C:\Users\EXAMPLE\Documents\APIMyLlama> node APIMyLlama.js 36 | Connected to the apiKeys.db database. 37 | Enter the port number: 38 | Enter the port number for the Ollama server (Port that your Ollama server is running on. By default it is 11434 so if you didnt change anything it should be that.): 57 | ``` 58 | This command will remove any key from the database. 59 | 60 | ```bash 61 | addkey 62 | ``` 63 | You can add custom keys if wanted. (DO with CAUTION as it may be unsafe) 64 | 65 | ```bash 66 | changeport 67 | ``` 68 | You can change the servers port in realtime without having to restart the application. 69 | 70 | ```bash 71 | changeollamaport 72 | ``` 73 | You can change the Ollama Server port if you have a custom one set. By default it is 11434. 74 | 75 | ```bash 76 | addwebhook 77 | ``` 78 | You can add webhooks for alerts when a new request is made. EX. Discord Webhook 79 | 80 | ```bash 81 | listwebhooks 82 | ``` 83 | This command will list all the webhooks you have attachted to your system. 84 | 85 | ```bash 86 | deletewebhook 87 | ``` 88 | This command can be used to remove a webhook in your system. You can get the ID of the webhook using the 'listwebhooks' command. 89 | 90 | ## Working with the API 91 | Install APIMyLlama packages with NPM or PIP 92 | 93 | NPM Install 94 | ```bash 95 | cd PROJECT_NAME 96 | npm install apimyllama-node-package 97 | ``` 98 | PIP Install 99 | ```bash 100 | cd PROJECT_NAME 101 | pip install apimyllama 102 | ``` 103 | 104 | Node.JS example: 105 | ```bash 106 | const apiMyLlamaNodePackage = require('apimyllama-node-package'); 107 | 108 | // Intialize Parameters 109 | const apiKey = 'API_KEY'; 110 | const prompt = 'Hello!'; 111 | const model = 'llama3'; 112 | const ip = 'SERVER_IP'; 113 | const port = 'SERVER_PORT'; 114 | const stream = false; 115 | 116 | apiMyLlamaNodePackage.generate(apiKey, prompt, model, ip, port, stream) 117 | .then(response => console.log(response)) 118 | .catch(error => console.error(error)); 119 | ``` 120 | 121 | Python example: 122 | ```bash 123 | import requests 124 | from apimyllama import ApiMyLlama 125 | 126 | def main(): 127 | ip = "SERVER_IP" 128 | port = "PORT_NUMBER" 129 | apikey = "API_KEY" 130 | prompt = "Hello" 131 | model = "llama3" 132 | api = ApiMyLlama(ip, port) 133 | try: 134 | result = api.generate(apikey, prompt, model) 135 | print("API Response:", result) 136 | except requests.RequestException as e: 137 | print("An error occurred:", e) 138 | 139 | if __name__ == "__main__": 140 | main() 141 | ``` 142 | ## API References 143 | ``` 144 | ApiMyLlama(ip, port) 145 | ip: IP address of the APIMyLlama server. 146 | port: Port number on which the APIMyLlama server is running. 147 | ``` 148 | ``` 149 | api.generate(apiKey, prompt, model, stream) 150 | apiKey: API key for accessing the Ollama API. 151 | prompt: Text prompt to generate a response. 152 | model: Machine learning model to use for text generation. 153 | stream: Boolean indicating whether to stream the response. 154 | ``` 155 | # Support 156 | If there are any issues please make a Github Issue Report. To get quicker support join our discord server. 157 | -[Discord Server](https://discord.gg/r6XazGtKg7) If there are any feature requests you may request them in the discord server. PLEASE NOTE this project is still in EARLY BETA. 158 | 159 | ## FAQ 160 | 161 | #### 1. Why am I getting the module not found error? 162 | 163 | You most likely forgot to run the 'npm install' command after cloning the repository. 164 | 165 | #### 2. Why can't I use the API outside my network? 166 | 167 | You probably didn't port foward. And if you did your router may have not intialized the changes yet or applied them. 168 | 169 | #### 3. Ollama Serve command error "Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted." 170 | 171 | If you get this error just close the Ollama app through the system tray on Windows. And if your on Linux just use systemctl to stop the Ollama process. Once done you can try running the ollama serve command again. 172 | 173 | #### 4. error: 'Error making request to Ollama API' 174 | 175 | If you have a custom port set for your Ollama server this is a simple fix. Just run the 'changeollamaport ' and change it to the port your Ollama server is running on. By default it is 11434 but if you changed it you will need to do this. You can also fix this problem through changing the port in the ollamaPort.conf file. 176 | 177 | ## Authors 178 | 179 | - [@gimerstudios](https://github.com/Gimer-Studios) 180 | -------------------------------------------------------------------------------- /License.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimer-Studios/APIMyLlama/f9c672720808d1b2f62e4b54f0ffd4abb621f984/License.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # APIMyLlama V2 Documentation 2 | 3 | ## Overview 4 | 5 | [![APIMyLlama Video](https://img.youtube.com/vi/x_MSmGX3Vmc/hqdefault.jpg)](https://www.youtube.com/embed/x_MSmGX3Vmc) 6 | 7 | APIMyLlama is a server application that provides an interface to interact with the Ollama API, a powerful AI tool to run LLMs. It allows users to run this alongside Ollama to easily distrubute API keys to create amazing things. 8 | 9 | ### Support Us 10 | 11 | We now have a [Ko-fi](https://ko-fi.com/gimerstudios) open if you would like to help and donate to the project. We love to keep it free and open source when possible and donating helps a lot. 12 | 13 | [Donate through Ko-fi](https://ko-fi.com/gimerstudios) 14 | 15 | # Installation 16 | 17 | ## Ollama Setup 18 | If you already have Ollama setup with the 'ollama serve' command and your desired model. You can skip this. If not i'll show you how to set it up. First install [Ollama](https://ollama.com/download) for your desired operating system. Once installed open a terminal instance and run the command below. 19 | ```bash 20 | ollama pull llama3 21 | ``` 22 | 23 | If done correctly you should now have the Meta's Llama3 LLM installed. You can use any model with the API but for this example we will use this model. Now you are gonna run this command after the install is complete. 24 | ```bash 25 | ollama serve 26 | ``` 27 | Now you have an Ollama server setup. Time for the next step. 28 | 29 | ## Hosting the API 30 | 31 | 32 | Install [Node.JS](https://nodejs.org/en/download/package-manager) on your server. Then clone the git repository. 33 | 34 | ```bash 35 | git clone https://github.com/Gimer-Studios/APIMyLlama.git 36 | cd APIMyLlama 37 | npm install 38 | node APIMyLlama.js 39 | ``` 40 | After cloning go into the APIMyLlama directory and install all the needed dependencies by running the 'npm install' command. Then run the APIMyLlama.js file. 41 | On startup it will ask what port you want to use. 42 | ``` 43 | PS C:\Users\EXAMPLE\Documents\APIMyLlama> node APIMyLlama.js 44 | APIMyLlama V2 is being started. Thanks for choosing Gimer Studios. 45 | Connected to the apiKeys.db database. 46 | Enter the port number for the API server: 3000 47 | Port number saved to port.conf: 3000 48 | Enter the URL for the Ollama server (URL that your Ollama server is running on. By default it is "http://localhost:11434" so if you didnt change anything it should be that.): :11434'. If you changed the port then you can put your port here instead of '11434'. This last thing applies to running Ollama and APIMyLlama on 2 different systems. If you are doing this. You will NEED to run Ollama to listen on ALL interfaces. You can do this on Windows or Linux like shown below. 51 | 52 | ## Let Ollama Listen on all interfaces (Only applies if you are using 2 different systems for the APIMyLlama server and Ollama.) 53 | 54 | Windows: 55 | For Windows you can set a System Environment Variable. The variable and the value are listed below. 56 | ``` 57 | Variable: OLLAMA_HOST 58 | Value: 0.0.0.0 59 | ``` 60 | Linux: 61 | For Linux you can edit the service file for Ollama. Open /etc/systemd/system/ollama.service and add the following line inside the [Service] section 62 | ``` 63 | Environment="OLLAMA_HOST=0.0.0.0" 64 | ``` 65 | On Linux you can also just run the command below to listen on all interfaces if that is easier for you. However you will need to run Ollama with this command everytime you start it up if you want to use APIMyLlama. 66 | ``` 67 | OLLAMA_HOST=0.0.0.0 ollama serve 68 | ``` 69 | 70 | ## Commands 71 | These are the commands you can use in the APIMyLlama application 72 | 73 | ```bash 74 | generatekey 75 | ``` 76 | This command will generate a key using Cryptography and save it to the local database. 77 | 78 | ```bash 79 | listkey 80 | ``` 81 | This command will list all API Keys in the database. 82 | 83 | ```bash 84 | removekey 85 | ``` 86 | This command will remove any key from the database. 87 | 88 | ```bash 89 | addkey 90 | ``` 91 | You can add custom keys if wanted. (DO with CAUTION as it may be unsafe) 92 | 93 | ```bash 94 | changeport 95 | ``` 96 | You can change the servers port in realtime without having to restart the application. 97 | 98 | ```bash 99 | changeollamaurl 100 | ``` 101 | You can change the Ollama Server url if you have a custom one set. By default it is "http://localhost:11434". 102 | 103 | ```bash 104 | addwebhook 105 | ``` 106 | You can add webhooks for alerts when a new request is made. EX. Discord Webhook 107 | 108 | ```bash 109 | listwebhooks 110 | ``` 111 | This command will list all the webhooks you have attached to your system. 112 | 113 | ```bash 114 | deletewebhook 115 | ``` 116 | This command can be used to remove a webhook in your system. You can get the ID of the webhook using the 'listwebhooks' command. 117 | 118 | ```bash 119 | ratelimit 120 | ``` 121 | This command allows you to change the ratelimit on a key. By default it is 10. The rate limit is by minute. So for example the default allows 10 requests to the API per minute. 122 | 123 | ```bash 124 | deactivatekey 125 | ``` 126 | Allows you to deactivate an API key. This will make the key useless untill it is activated. 127 | 128 | ```bash 129 | activatekey 130 | ``` 131 | Activates a API key that has been deactivated in the past. 132 | 133 | ```bash 134 | addkeydescription 135 | ``` 136 | This command lets you add a description to a key to help you decipher what key does what. 137 | 138 | ```bash 139 | listkeydescription 140 | ``` 141 | This command lists the description of that key if it has a description. 142 | 143 | ```bash 144 | generatekeys 145 | ``` 146 | Quickly generate multiple new API keys. 147 | 148 | ```bash 149 | regeneratekey 150 | ``` 151 | Regenerate any specified API key without affecting other details. 152 | 153 | ```bash 154 | activateallkeys 155 | ``` 156 | Activate all your API keys with a single command. 157 | 158 | ```bash 159 | deactivateallkeys 160 | ``` 161 | Deactivate all your API keys with a single command. 162 | 163 | ```bash 164 | getkeyinfo 165 | ``` 166 | Retrieve detailed information about a specific API key. 167 | 168 | ```bash 169 | listactivekeys 170 | ``` 171 | Easily list all active API keys. 172 | 173 | ```bash 174 | listinactivekeys 175 | ``` 176 | Easily list all inactive API keys. 177 | 178 | ## Working with the API 179 | Install APIMyLlama packages with NPM (Node.JS), PIP (Python), Jitpack Repo+Gradle or Maven (Java), or from the Crates Repository (Rust) 180 | 181 | NPM Install (Node.JS) 182 | ```bash 183 | cd PROJECT_NAME 184 | npm install apimyllama-node-package 185 | ``` 186 | PIP Install (Python) 187 | ```bash 188 | cd PROJECT_NAME 189 | pip install apimyllama 190 | ``` 191 | Jitpack+Gradle Repository (Java IF YOUR USING GRADLE) 192 | ```bash 193 | dependencyResolutionManagement { 194 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 195 | repositories { 196 | mavenCentral() 197 | maven { url 'https://www.jitpack.io' } 198 | } 199 | } 200 | ``` 201 | 202 | Jitpack+Gradle Dependency (Java IF YOUR USING GRADLE) 203 | ```bash 204 | dependencies { 205 | implementation 'com.github.Gimer-Studios:APIMyLlama-Java-Package:V2.0.5' 206 | } 207 | ``` 208 | 209 | Jitpack+Maven Repository (Java IF YOUR USING MAVEN) 210 | ```bash 211 | 212 | 213 | jitpack.io 214 | https://www.jitpack.io 215 | 216 | 217 | ``` 218 | 219 | Jitpack+Maven Dependency (Java IF YOUR USING MAVEN) 220 | ```bash 221 | 222 | com.github.Gimer-Studios 223 | APIMyLlama-Java-Package 224 | V2.0.5 225 | 226 | ``` 227 | Crate Repository (Rust) 228 | ```bash 229 | [dependencies] 230 | apimyllama = "2.0.7" 231 | tokio = { version = "1", features = ["full"] } 232 | ``` 233 | 234 | # Examples to get response from API 235 | 236 | Node.JS example: 237 | ```bash 238 | const apiMyLlamaNodePackage = require('apimyllama-node-package'); 239 | 240 | // Intialize Parameters 241 | const apikey = 'API_KEY'; 242 | const prompt = 'Hello!'; 243 | const model = 'llama3'; 244 | const ip = 'SERVER_IP'; 245 | const port = 'SERVER_PORT'; 246 | const stream = false; 247 | 248 | apiMyLlamaNodePackage.generate(apikey, prompt, model, ip, port, stream) 249 | .then(response => console.log(response)) 250 | .catch(error => console.error(error)); 251 | ``` 252 | 253 | Python example: 254 | ```bash 255 | import requests 256 | from apimyllama import ApiMyLlama 257 | 258 | def main(): 259 | ip = "SERVER_IP" 260 | port = "PORT_NUMBER" 261 | apikey = "API_KEY" 262 | prompt = "Hello" 263 | model = "llama3" 264 | api = ApiMyLlama(ip, port) 265 | try: 266 | result = api.generate(apikey, prompt, model) 267 | print("API Response:", result) 268 | except requests.RequestException as e: 269 | print("An error occurred:", e) 270 | 271 | if __name__ == "__main__": 272 | main() 273 | ``` 274 | 275 | Java Example: 276 | ```bash 277 | import com.gimerstudios.apimyllama.ApiMyLlama; 278 | import java.io.IOException; 279 | 280 | public class TestAPIMyLlama { 281 | 282 | public static void main(String[] args) { 283 | String serverIp = "SERVER_IP"; 284 | int serverPort = SERVER_PORT; 285 | String apiKey = "API_KEY"; 286 | String prompt = "Hello!"; 287 | String model = "llama3"; 288 | boolean stream = false; 289 | 290 | ApiMyLlama apiMyLlama = new ApiMyLlama(serverIp, serverPort); 291 | 292 | try { 293 | String response = apiMyLlama.generate(apiKey, prompt, model, stream); 294 | System.out.println("Generate Response: " + response); 295 | } catch (IOException | InterruptedException e) { 296 | e.printStackTrace(); 297 | } 298 | } 299 | } 300 | ``` 301 | 302 | Rust Example: 303 | ```bash 304 | use apimyllama::ApiMyLlama; 305 | use std::error::Error; 306 | 307 | #[tokio::main] 308 | async fn main() -> Result<(), Box> { 309 | let server_ip = "127.0.0.1".to_string(); 310 | let server_port = 3000; 311 | let api_key = "api"; 312 | let api = ApiMyLlama::new(server_ip, server_port); 313 | let prompt = "Hello!"; 314 | let model = "llama3"; 315 | 316 | match api.generate(api_key, prompt, model, false).await { 317 | Ok(response) => { 318 | println!("Response: {}", response.response); 319 | println!("Model: {}", response.model); 320 | println!("Created At: {}", response.created_at); 321 | println!("Done: {}", response.done); 322 | println!("Done Reason: {}", response.done_reason); 323 | println!("Context: {:?}", response.context); 324 | println!("Total Duration: {}", response.total_duration); 325 | println!("Load Duration: {}", response.load_duration); 326 | println!("Prompt Eval Duration: {}", response.prompt_eval_duration); 327 | println!("Eval Count: {}", response.eval_count); 328 | println!("Eval Duration: {}", response.eval_duration); 329 | } 330 | Err(e) => println!("Text generation failed: {}", e), 331 | } 332 | 333 | Ok(()) 334 | } 335 | ``` 336 | 337 | ## Checking API Health 338 | The packages have built in health checking command (AS OF V2) 339 | If you already have the Node.js or Python packages installed then you can just copy and paste the code below to test. 340 | 341 | Node.JS example: 342 | ```bash 343 | const apiMyLlamaNodePackage = require('apimyllama-node-package'); 344 | 345 | // Intialize Parameters 346 | const apikey = 'API_KEY'; 347 | const ip = 'SERVER_IP'; 348 | const port = 'SERVER_PORT'; 349 | 350 | 351 | apiMyLlamaNodePackage.getHealth(apikey, ip, port) 352 | .then(response => console.log('Health Check Response:', response)) 353 | .catch(error => console.error('Error:', error)); 354 | ``` 355 | 356 | Python example: 357 | ```bash 358 | import requests 359 | from apimyllama import ApiMyLlama 360 | 361 | ip = 'YOUR_SERVER_IP' 362 | port = 'YOUR_SERVER_PORT' 363 | apikey = 'YOUR_API_KEY' 364 | 365 | api = ApiMyLlama(ip, port) 366 | 367 | try: 368 | health = api.get_health(apikey) 369 | print("Health Check Response:", health) 370 | except requests.RequestException as error: 371 | print("Error:", error) 372 | ``` 373 | 374 | Java example: 375 | ```bash 376 | import com.gimerstudios.apimyllama.ApiMyLlama; 377 | import java.io.IOException; 378 | import java.util.Map; 379 | 380 | public class TestAPIMyLlama { 381 | 382 | public static void main(String[] args) { 383 | String serverIp = "SERVER_IP"; 384 | int serverPort = SERVER_PORT; 385 | String apiKey = "API_KEY"; 386 | 387 | ApiMyLlama apiMyLlama = new ApiMyLlama(serverIp, serverPort); 388 | 389 | try { 390 | Map healthStatus = apiMyLlama.getHealth(apiKey); 391 | System.out.println("Health Status: " + healthStatus); 392 | } catch (IOException | InterruptedException e) { 393 | e.printStackTrace(); 394 | } 395 | } 396 | } 397 | ``` 398 | 399 | Rust Example: 400 | ```bash 401 | use apimyllama::ApiMyLlama; 402 | use std::error::Error; 403 | 404 | #[tokio::main] 405 | async fn main() -> Result<(), Box> { 406 | let server_ip = "127.0.0.1".to_string(); 407 | let server_port = 3000; 408 | let api_key = "api"; 409 | let api = ApiMyLlama::new(server_ip, server_port); 410 | 411 | match api.get_health(api_key).await { 412 | Ok(response) => { 413 | println!("API Health Status: {}", response.status); 414 | println!("Timestamp: {}", response.timestamp); 415 | } 416 | Err(e) => println!("Health check failed: {}", e), 417 | } 418 | 419 | Ok(()) 420 | } 421 | ``` 422 | 423 | ## API References 424 | ``` 425 | ApiMyLlama(ip, port) 426 | ip: IP address of the APIMyLlama server. 427 | port: Port number on which the APIMyLlama server is running. 428 | ``` 429 | ``` 430 | api.generate(apiKey, prompt, model, stream) 431 | api.get_health(apikey) 432 | apiKey: API key for accessing the Ollama API. 433 | prompt: Text prompt to generate a response. 434 | model: Machine learning model to use for text generation. 435 | stream: Boolean indicating whether to stream the response. 436 | ``` 437 | # Support 438 | If there are any issues please make a Github Issue Report. To get quicker support join our discord server. 439 | -[Discord Server](https://discord.gg/r6XazGtKg7) If there are any feature requests you may request them in the discord server. PLEASE NOTE this project is still in EARLY BETA. 440 | 441 | ### Support Us 442 | 443 | We now have a [Ko-fi](https://ko-fi.com/gimerstudios) open if you would like to help and donate to the project. We love to keep it free and open source when possible and donating helps a lot. 444 | 445 | [Donate through Ko-fi](https://ko-fi.com/gimerstudios) 446 | 447 | 448 | ## FAQ 449 | 450 | #### 1. Why am I getting the module not found error? 451 | 452 | You most likely forgot to run the 'npm install' command after cloning the repository. 453 | 454 | #### 2. Why can't I use the API outside my network? 455 | 456 | You probably didn't port foward. And if you did your router may have not intialized the changes yet or applied them. 457 | 458 | #### 3. Ollama Serve command error "Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted." 459 | 460 | If you get this error just close the Ollama app through the system tray on Windows. And if your on Linux just use systemctl to stop the Ollama process. Once done you can try running the ollama serve command again. 461 | 462 | #### 4. error: 'Error making request to Ollama API' 463 | 464 | If you have a custom port set for your Ollama server this is a simple fix. Just run the 'changeollamaurl ' and change it to the url your Ollama server is running on. By default it is "http://localhost:11434" but if you changed it you will need to do this. You can also fix this problem through changing the port in the ollamaURL.conf file. 465 | 466 | ## Authors 467 | 468 | - [@gimerstudios](https://github.com/Gimer-Studios) 469 | -------------------------------------------------------------------------------- /api.js: -------------------------------------------------------------------------------- 1 | const { getOllamaURL, sendWebhookNotification } = require('./utils'); 2 | const axios = require('axios'); 3 | 4 | const rateLimits = new Map(); 5 | 6 | function setupRoutes(app, db) { 7 | app.use((req, res, next) => rateLimitMiddleware(req, res, next, db)); 8 | app.get('/health', (req, res) => healthCheck(req, res, db)); 9 | app.post('/generate', (req, res) => generateResponse(req, res, db)); 10 | } 11 | 12 | function rateLimitMiddleware(req, res, next, db) { 13 | const { apikey } = req.body; 14 | if (!apikey) return next(); 15 | 16 | db.get('SELECT tokens, last_used, rate_limit, active FROM apiKeys WHERE key = ?', [apikey], (err, row) => { 17 | if (err) { 18 | console.error('Error checking API key for rate limit:', err.message); 19 | return res.status(500).json({ error: 'Internal server error' }); 20 | } 21 | 22 | if (row) { 23 | if (row.active === 0) { 24 | return res.status(403).json({ error: 'API key is deactivated' }); 25 | } 26 | 27 | const currentTime = Date.now(); 28 | const minute = 60000; 29 | const rateLimit = row.rate_limit; 30 | 31 | if (!rateLimits.has(apikey)) { 32 | rateLimits.set(apikey, { tokens: row.tokens, lastUsed: new Date(row.last_used).getTime() }); 33 | } 34 | 35 | const rateLimitInfo = rateLimits.get(apikey); 36 | const timeElapsed = currentTime - rateLimitInfo.lastUsed; 37 | 38 | if (timeElapsed >= minute) { 39 | rateLimitInfo.tokens = rateLimit; 40 | } 41 | 42 | if (rateLimitInfo.tokens > 0) { 43 | rateLimitInfo.tokens -= 1; 44 | rateLimitInfo.lastUsed = currentTime; 45 | rateLimits.set(apikey, rateLimitInfo); 46 | 47 | db.run('UPDATE apiKeys SET tokens = ?, last_used = ? WHERE key = ?', [rateLimitInfo.tokens, new Date(rateLimitInfo.lastUsed).toISOString(), apikey], (err) => { 48 | if (err) { 49 | console.error('Error updating tokens and last_used:', err.message); 50 | return res.status(500).json({ error: 'Internal server error' }); 51 | } 52 | next(); 53 | }); 54 | } else { 55 | return res.status(429).json({ error: 'Rate limit exceeded. Try again later.' }); 56 | } 57 | } else { 58 | return res.status(403).json({ error: 'Invalid API key' }); 59 | } 60 | }); 61 | } 62 | 63 | function healthCheck(req, res, db) { 64 | const apikey = req.query.apikey; 65 | 66 | if (!apikey) { 67 | return res.status(400).json({ error: 'API key is required' }); 68 | } 69 | 70 | db.get('SELECT key FROM apiKeys WHERE key = ?', [apikey], (err, row) => { 71 | if (err) { 72 | console.error('Error checking API key:', err.message); 73 | return res.status(500).json({ error: 'Internal server error' }); 74 | } 75 | if (!row) { 76 | console.log('Invalid API key:', apikey); 77 | return res.status(403).json({ error: 'Invalid API Key' }); 78 | } 79 | 80 | res.json({ status: 'API is healthy', timestamp: new Date() }); 81 | }); 82 | } 83 | 84 | async function generateResponse(req, res, db) { 85 | const { apikey, prompt, model, stream, images, raw } = req.body; 86 | 87 | console.log('Request body:', req.body); 88 | 89 | if (!apikey) { 90 | return res.status(400).json({ error: 'API key is required' }); 91 | } 92 | 93 | db.get('SELECT key FROM apiKeys WHERE key = ?', [apikey], async (err, row) => { 94 | if (err) { 95 | console.error('Error checking API key:', err.message); 96 | return res.status(500).json({ error: 'Internal server error' }); 97 | } 98 | if (!row) { 99 | console.log('Invalid API key:', apikey); 100 | return res.status(403).json({ error: 'Invalid API Key' }); 101 | } 102 | 103 | try { 104 | const ollamaURL = await getOllamaURL(); 105 | const OLLAMA_API_URL = `${ollamaURL}/api/generate`; 106 | 107 | axios.post(OLLAMA_API_URL, { model, prompt, stream, images, raw }) 108 | .then(response => { 109 | db.run('INSERT INTO apiUsage (key) VALUES (?)', [apikey], (err) => { 110 | if (err) console.error('Error logging API usage:', err.message); 111 | }); 112 | 113 | sendWebhookNotification(db, { apikey, prompt, model, stream, images, raw, timestamp: new Date() }); 114 | 115 | res.json(response.data); 116 | }) 117 | .catch(error => { 118 | console.error('Error making request to Ollama API:', error.message); 119 | res.status(500).json({ error: 'Error making request to Ollama API' }); 120 | }); 121 | } catch (error) { 122 | console.error(error); 123 | res.status(500).json({ error: 'Error retrieving Ollama server port' }); 124 | } 125 | }); 126 | } 127 | 128 | module.exports = { 129 | setupRoutes 130 | }; 131 | -------------------------------------------------------------------------------- /db.js: -------------------------------------------------------------------------------- 1 | const sqlite3 = require('sqlite3').verbose(); 2 | 3 | let db; 4 | 5 | function initializeDatabase() { 6 | db = new sqlite3.Database('./apiKeys.db', sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => { 7 | if (err) { 8 | console.error('Error connecting to the database:', err.message); 9 | } else { 10 | console.log('Connected to the apiKeys.db database.'); 11 | createTables(); 12 | } 13 | }); 14 | return db; 15 | } 16 | 17 | // Function to create the tables even if they do not exist in the database 18 | function createTables() { 19 | db.run(`CREATE TABLE IF NOT EXISTS apiKeys ( 20 | key TEXT PRIMARY KEY, 21 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 22 | last_used TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 23 | tokens INTEGER DEFAULT 10, 24 | rate_limit INTEGER DEFAULT 10, 25 | active INTEGER DEFAULT 1, 26 | description TEXT 27 | )`, (err) => { 28 | if (err) { 29 | console.error('Error creating apiKeys table:', err.message); 30 | } 31 | }); 32 | 33 | db.run(`CREATE TABLE IF NOT EXISTS apiUsage ( 34 | key TEXT, 35 | timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP 36 | )`, (err) => { 37 | if (err) { 38 | console.error('Error creating apiUsage table:', err.message); 39 | } 40 | }); 41 | 42 | db.run(`CREATE TABLE IF NOT EXISTS webhooks ( 43 | id INTEGER PRIMARY KEY AUTOINCREMENT, 44 | url TEXT NOT NULL 45 | )`, (err) => { 46 | if (err) { 47 | console.error('Error creating webhooks table:', err.message); 48 | } 49 | }); 50 | 51 | ensureColumns(); 52 | } 53 | 54 | function ensureColumns() { 55 | db.all("PRAGMA table_info(apiKeys)", (err, rows) => { 56 | if (err) { 57 | console.error('Error checking table info:', err.message); 58 | } else { 59 | const columns = rows.map(row => row.name); 60 | if (!columns.includes('active')) { 61 | db.run("ALTER TABLE apiKeys ADD COLUMN active INTEGER DEFAULT 1", (err) => { 62 | if (err) { 63 | console.error('Error adding active column:', err.message); 64 | } else { 65 | console.log("Added 'active' column to 'apiKeys' table."); 66 | } 67 | }); 68 | } 69 | if (!columns.includes('description')) { 70 | db.run("ALTER TABLE apiKeys ADD COLUMN description TEXT", (err) => { 71 | if (err) { 72 | console.error('Error adding description column:', err.message); 73 | } else { 74 | console.log("Added 'description' column to 'apiKeys' table."); 75 | } 76 | }); 77 | } 78 | } 79 | }); 80 | } 81 | 82 | function closeDatabase() { 83 | db.close((err) => { 84 | if (err) { 85 | console.error('Error closing the database connection:', err.message); 86 | } else { 87 | console.log('Closed the database connection.'); 88 | } 89 | process.exit(0); 90 | }); 91 | } 92 | 93 | function getDb() { 94 | return db; 95 | } 96 | 97 | module.exports = { 98 | initializeDatabase, 99 | closeDatabase, 100 | getDb 101 | }; -------------------------------------------------------------------------------- /ollamaURL.conf: -------------------------------------------------------------------------------- 1 | http://127.0.0.1:11434 -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "APIMyLlama", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "axios": ">=1.8.2", 9 | "express": ">=4.21.2", 10 | "sqlite3": "^5.1.7" 11 | } 12 | }, 13 | "node_modules/@gar/promisify": { 14 | "version": "1.1.3", 15 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 16 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 17 | "license": "MIT", 18 | "optional": true 19 | }, 20 | "node_modules/@npmcli/fs": { 21 | "version": "1.1.1", 22 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", 23 | "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", 24 | "license": "ISC", 25 | "optional": true, 26 | "dependencies": { 27 | "@gar/promisify": "^1.0.1", 28 | "semver": "^7.3.5" 29 | } 30 | }, 31 | "node_modules/@npmcli/move-file": { 32 | "version": "1.1.2", 33 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", 34 | "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", 35 | "deprecated": "This functionality has been moved to @npmcli/fs", 36 | "license": "MIT", 37 | "optional": true, 38 | "dependencies": { 39 | "mkdirp": "^1.0.4", 40 | "rimraf": "^3.0.2" 41 | }, 42 | "engines": { 43 | "node": ">=10" 44 | } 45 | }, 46 | "node_modules/@tootallnate/once": { 47 | "version": "1.1.2", 48 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 49 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 50 | "license": "MIT", 51 | "optional": true, 52 | "engines": { 53 | "node": ">= 6" 54 | } 55 | }, 56 | "node_modules/abbrev": { 57 | "version": "1.1.1", 58 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 59 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 60 | "license": "ISC", 61 | "optional": true 62 | }, 63 | "node_modules/accepts": { 64 | "version": "1.3.8", 65 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 66 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 67 | "license": "MIT", 68 | "dependencies": { 69 | "mime-types": "~2.1.34", 70 | "negotiator": "0.6.3" 71 | }, 72 | "engines": { 73 | "node": ">= 0.6" 74 | } 75 | }, 76 | "node_modules/agent-base": { 77 | "version": "6.0.2", 78 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 79 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 80 | "license": "MIT", 81 | "optional": true, 82 | "dependencies": { 83 | "debug": "4" 84 | }, 85 | "engines": { 86 | "node": ">= 6.0.0" 87 | } 88 | }, 89 | "node_modules/agent-base/node_modules/debug": { 90 | "version": "4.3.7", 91 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 92 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 93 | "license": "MIT", 94 | "optional": true, 95 | "dependencies": { 96 | "ms": "^2.1.3" 97 | }, 98 | "engines": { 99 | "node": ">=6.0" 100 | }, 101 | "peerDependenciesMeta": { 102 | "supports-color": { 103 | "optional": true 104 | } 105 | } 106 | }, 107 | "node_modules/agent-base/node_modules/ms": { 108 | "version": "2.1.3", 109 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 110 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 111 | "license": "MIT", 112 | "optional": true 113 | }, 114 | "node_modules/agentkeepalive": { 115 | "version": "4.5.0", 116 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 117 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 118 | "license": "MIT", 119 | "optional": true, 120 | "dependencies": { 121 | "humanize-ms": "^1.2.1" 122 | }, 123 | "engines": { 124 | "node": ">= 8.0.0" 125 | } 126 | }, 127 | "node_modules/aggregate-error": { 128 | "version": "3.1.0", 129 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 130 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 131 | "license": "MIT", 132 | "optional": true, 133 | "dependencies": { 134 | "clean-stack": "^2.0.0", 135 | "indent-string": "^4.0.0" 136 | }, 137 | "engines": { 138 | "node": ">=8" 139 | } 140 | }, 141 | "node_modules/ansi-regex": { 142 | "version": "5.0.1", 143 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 144 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 145 | "license": "MIT", 146 | "optional": true, 147 | "engines": { 148 | "node": ">=8" 149 | } 150 | }, 151 | "node_modules/aproba": { 152 | "version": "2.0.0", 153 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 154 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", 155 | "license": "ISC", 156 | "optional": true 157 | }, 158 | "node_modules/are-we-there-yet": { 159 | "version": "3.0.1", 160 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 161 | "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 162 | "deprecated": "This package is no longer supported.", 163 | "license": "ISC", 164 | "optional": true, 165 | "dependencies": { 166 | "delegates": "^1.0.0", 167 | "readable-stream": "^3.6.0" 168 | }, 169 | "engines": { 170 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 171 | } 172 | }, 173 | "node_modules/array-flatten": { 174 | "version": "1.1.1", 175 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 176 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 177 | "license": "MIT" 178 | }, 179 | "node_modules/asynckit": { 180 | "version": "0.4.0", 181 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 182 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 183 | "license": "MIT" 184 | }, 185 | "node_modules/axios": { 186 | "version": "1.8.2", 187 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", 188 | "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", 189 | "license": "MIT", 190 | "dependencies": { 191 | "follow-redirects": "^1.15.6", 192 | "form-data": "^4.0.0", 193 | "proxy-from-env": "^1.1.0" 194 | } 195 | }, 196 | "node_modules/balanced-match": { 197 | "version": "1.0.2", 198 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 199 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 200 | "license": "MIT", 201 | "optional": true 202 | }, 203 | "node_modules/base64-js": { 204 | "version": "1.5.1", 205 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 206 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 207 | "funding": [ 208 | { 209 | "type": "github", 210 | "url": "https://github.com/sponsors/feross" 211 | }, 212 | { 213 | "type": "patreon", 214 | "url": "https://www.patreon.com/feross" 215 | }, 216 | { 217 | "type": "consulting", 218 | "url": "https://feross.org/support" 219 | } 220 | ], 221 | "license": "MIT" 222 | }, 223 | "node_modules/bindings": { 224 | "version": "1.5.0", 225 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 226 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 227 | "license": "MIT", 228 | "dependencies": { 229 | "file-uri-to-path": "1.0.0" 230 | } 231 | }, 232 | "node_modules/bl": { 233 | "version": "4.1.0", 234 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 235 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 236 | "license": "MIT", 237 | "dependencies": { 238 | "buffer": "^5.5.0", 239 | "inherits": "^2.0.4", 240 | "readable-stream": "^3.4.0" 241 | } 242 | }, 243 | "node_modules/body-parser": { 244 | "version": "1.20.3", 245 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 246 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 247 | "license": "MIT", 248 | "dependencies": { 249 | "bytes": "3.1.2", 250 | "content-type": "~1.0.5", 251 | "debug": "2.6.9", 252 | "depd": "2.0.0", 253 | "destroy": "1.2.0", 254 | "http-errors": "2.0.0", 255 | "iconv-lite": "0.4.24", 256 | "on-finished": "2.4.1", 257 | "qs": "6.13.0", 258 | "raw-body": "2.5.2", 259 | "type-is": "~1.6.18", 260 | "unpipe": "1.0.0" 261 | }, 262 | "engines": { 263 | "node": ">= 0.8", 264 | "npm": "1.2.8000 || >= 1.4.16" 265 | } 266 | }, 267 | "node_modules/brace-expansion": { 268 | "version": "1.1.11", 269 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 270 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 271 | "license": "MIT", 272 | "optional": true, 273 | "dependencies": { 274 | "balanced-match": "^1.0.0", 275 | "concat-map": "0.0.1" 276 | } 277 | }, 278 | "node_modules/buffer": { 279 | "version": "5.7.1", 280 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 281 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 282 | "funding": [ 283 | { 284 | "type": "github", 285 | "url": "https://github.com/sponsors/feross" 286 | }, 287 | { 288 | "type": "patreon", 289 | "url": "https://www.patreon.com/feross" 290 | }, 291 | { 292 | "type": "consulting", 293 | "url": "https://feross.org/support" 294 | } 295 | ], 296 | "license": "MIT", 297 | "dependencies": { 298 | "base64-js": "^1.3.1", 299 | "ieee754": "^1.1.13" 300 | } 301 | }, 302 | "node_modules/bytes": { 303 | "version": "3.1.2", 304 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 305 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 306 | "license": "MIT", 307 | "engines": { 308 | "node": ">= 0.8" 309 | } 310 | }, 311 | "node_modules/cacache": { 312 | "version": "15.3.0", 313 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", 314 | "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", 315 | "license": "ISC", 316 | "optional": true, 317 | "dependencies": { 318 | "@npmcli/fs": "^1.0.0", 319 | "@npmcli/move-file": "^1.0.1", 320 | "chownr": "^2.0.0", 321 | "fs-minipass": "^2.0.0", 322 | "glob": "^7.1.4", 323 | "infer-owner": "^1.0.4", 324 | "lru-cache": "^6.0.0", 325 | "minipass": "^3.1.1", 326 | "minipass-collect": "^1.0.2", 327 | "minipass-flush": "^1.0.5", 328 | "minipass-pipeline": "^1.2.2", 329 | "mkdirp": "^1.0.3", 330 | "p-map": "^4.0.0", 331 | "promise-inflight": "^1.0.1", 332 | "rimraf": "^3.0.2", 333 | "ssri": "^8.0.1", 334 | "tar": "^6.0.2", 335 | "unique-filename": "^1.1.1" 336 | }, 337 | "engines": { 338 | "node": ">= 10" 339 | } 340 | }, 341 | "node_modules/call-bind": { 342 | "version": "1.0.7", 343 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 344 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 345 | "license": "MIT", 346 | "dependencies": { 347 | "es-define-property": "^1.0.0", 348 | "es-errors": "^1.3.0", 349 | "function-bind": "^1.1.2", 350 | "get-intrinsic": "^1.2.4", 351 | "set-function-length": "^1.2.1" 352 | }, 353 | "engines": { 354 | "node": ">= 0.4" 355 | }, 356 | "funding": { 357 | "url": "https://github.com/sponsors/ljharb" 358 | } 359 | }, 360 | "node_modules/chownr": { 361 | "version": "2.0.0", 362 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 363 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 364 | "license": "ISC", 365 | "engines": { 366 | "node": ">=10" 367 | } 368 | }, 369 | "node_modules/clean-stack": { 370 | "version": "2.2.0", 371 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 372 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 373 | "license": "MIT", 374 | "optional": true, 375 | "engines": { 376 | "node": ">=6" 377 | } 378 | }, 379 | "node_modules/color-support": { 380 | "version": "1.1.3", 381 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 382 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 383 | "license": "ISC", 384 | "optional": true, 385 | "bin": { 386 | "color-support": "bin.js" 387 | } 388 | }, 389 | "node_modules/combined-stream": { 390 | "version": "1.0.8", 391 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 392 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 393 | "license": "MIT", 394 | "dependencies": { 395 | "delayed-stream": "~1.0.0" 396 | }, 397 | "engines": { 398 | "node": ">= 0.8" 399 | } 400 | }, 401 | "node_modules/concat-map": { 402 | "version": "0.0.1", 403 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 404 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 405 | "license": "MIT", 406 | "optional": true 407 | }, 408 | "node_modules/console-control-strings": { 409 | "version": "1.1.0", 410 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 411 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", 412 | "license": "ISC", 413 | "optional": true 414 | }, 415 | "node_modules/content-disposition": { 416 | "version": "0.5.4", 417 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 418 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 419 | "license": "MIT", 420 | "dependencies": { 421 | "safe-buffer": "5.2.1" 422 | }, 423 | "engines": { 424 | "node": ">= 0.6" 425 | } 426 | }, 427 | "node_modules/content-type": { 428 | "version": "1.0.5", 429 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 430 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 431 | "license": "MIT", 432 | "engines": { 433 | "node": ">= 0.6" 434 | } 435 | }, 436 | "node_modules/cookie": { 437 | "version": "0.7.1", 438 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 439 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 440 | "engines": { 441 | "node": ">= 0.6" 442 | } 443 | }, 444 | "node_modules/cookie-signature": { 445 | "version": "1.0.6", 446 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 447 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 448 | "license": "MIT" 449 | }, 450 | "node_modules/debug": { 451 | "version": "2.6.9", 452 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 453 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 454 | "license": "MIT", 455 | "dependencies": { 456 | "ms": "2.0.0" 457 | } 458 | }, 459 | "node_modules/decompress-response": { 460 | "version": "6.0.0", 461 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 462 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 463 | "license": "MIT", 464 | "dependencies": { 465 | "mimic-response": "^3.1.0" 466 | }, 467 | "engines": { 468 | "node": ">=10" 469 | }, 470 | "funding": { 471 | "url": "https://github.com/sponsors/sindresorhus" 472 | } 473 | }, 474 | "node_modules/deep-extend": { 475 | "version": "0.6.0", 476 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 477 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 478 | "license": "MIT", 479 | "engines": { 480 | "node": ">=4.0.0" 481 | } 482 | }, 483 | "node_modules/define-data-property": { 484 | "version": "1.1.4", 485 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 486 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 487 | "license": "MIT", 488 | "dependencies": { 489 | "es-define-property": "^1.0.0", 490 | "es-errors": "^1.3.0", 491 | "gopd": "^1.0.1" 492 | }, 493 | "engines": { 494 | "node": ">= 0.4" 495 | }, 496 | "funding": { 497 | "url": "https://github.com/sponsors/ljharb" 498 | } 499 | }, 500 | "node_modules/delayed-stream": { 501 | "version": "1.0.0", 502 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 503 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 504 | "license": "MIT", 505 | "engines": { 506 | "node": ">=0.4.0" 507 | } 508 | }, 509 | "node_modules/delegates": { 510 | "version": "1.0.0", 511 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 512 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", 513 | "license": "MIT", 514 | "optional": true 515 | }, 516 | "node_modules/depd": { 517 | "version": "2.0.0", 518 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 519 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 520 | "license": "MIT", 521 | "engines": { 522 | "node": ">= 0.8" 523 | } 524 | }, 525 | "node_modules/destroy": { 526 | "version": "1.2.0", 527 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 528 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 529 | "license": "MIT", 530 | "engines": { 531 | "node": ">= 0.8", 532 | "npm": "1.2.8000 || >= 1.4.16" 533 | } 534 | }, 535 | "node_modules/detect-libc": { 536 | "version": "2.0.3", 537 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 538 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 539 | "license": "Apache-2.0", 540 | "engines": { 541 | "node": ">=8" 542 | } 543 | }, 544 | "node_modules/ee-first": { 545 | "version": "1.1.1", 546 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 547 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 548 | "license": "MIT" 549 | }, 550 | "node_modules/emoji-regex": { 551 | "version": "8.0.0", 552 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 553 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 554 | "license": "MIT", 555 | "optional": true 556 | }, 557 | "node_modules/encodeurl": { 558 | "version": "2.0.0", 559 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 560 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 561 | "license": "MIT", 562 | "engines": { 563 | "node": ">= 0.8" 564 | } 565 | }, 566 | "node_modules/encoding": { 567 | "version": "0.1.13", 568 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 569 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 570 | "license": "MIT", 571 | "optional": true, 572 | "dependencies": { 573 | "iconv-lite": "^0.6.2" 574 | } 575 | }, 576 | "node_modules/encoding/node_modules/iconv-lite": { 577 | "version": "0.6.3", 578 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 579 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 580 | "license": "MIT", 581 | "optional": true, 582 | "dependencies": { 583 | "safer-buffer": ">= 2.1.2 < 3.0.0" 584 | }, 585 | "engines": { 586 | "node": ">=0.10.0" 587 | } 588 | }, 589 | "node_modules/end-of-stream": { 590 | "version": "1.4.4", 591 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 592 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 593 | "license": "MIT", 594 | "dependencies": { 595 | "once": "^1.4.0" 596 | } 597 | }, 598 | "node_modules/env-paths": { 599 | "version": "2.2.1", 600 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 601 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 602 | "license": "MIT", 603 | "optional": true, 604 | "engines": { 605 | "node": ">=6" 606 | } 607 | }, 608 | "node_modules/err-code": { 609 | "version": "2.0.3", 610 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 611 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 612 | "license": "MIT", 613 | "optional": true 614 | }, 615 | "node_modules/es-define-property": { 616 | "version": "1.0.0", 617 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 618 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 619 | "license": "MIT", 620 | "dependencies": { 621 | "get-intrinsic": "^1.2.4" 622 | }, 623 | "engines": { 624 | "node": ">= 0.4" 625 | } 626 | }, 627 | "node_modules/es-errors": { 628 | "version": "1.3.0", 629 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 630 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 631 | "license": "MIT", 632 | "engines": { 633 | "node": ">= 0.4" 634 | } 635 | }, 636 | "node_modules/escape-html": { 637 | "version": "1.0.3", 638 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 639 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 640 | "license": "MIT" 641 | }, 642 | "node_modules/etag": { 643 | "version": "1.8.1", 644 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 645 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 646 | "license": "MIT", 647 | "engines": { 648 | "node": ">= 0.6" 649 | } 650 | }, 651 | "node_modules/expand-template": { 652 | "version": "2.0.3", 653 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 654 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 655 | "license": "(MIT OR WTFPL)", 656 | "engines": { 657 | "node": ">=6" 658 | } 659 | }, 660 | "node_modules/express": { 661 | "version": "4.21.2", 662 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", 663 | "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", 664 | "dependencies": { 665 | "accepts": "~1.3.8", 666 | "array-flatten": "1.1.1", 667 | "body-parser": "1.20.3", 668 | "content-disposition": "0.5.4", 669 | "content-type": "~1.0.4", 670 | "cookie": "0.7.1", 671 | "cookie-signature": "1.0.6", 672 | "debug": "2.6.9", 673 | "depd": "2.0.0", 674 | "encodeurl": "~2.0.0", 675 | "escape-html": "~1.0.3", 676 | "etag": "~1.8.1", 677 | "finalhandler": "1.3.1", 678 | "fresh": "0.5.2", 679 | "http-errors": "2.0.0", 680 | "merge-descriptors": "1.0.3", 681 | "methods": "~1.1.2", 682 | "on-finished": "2.4.1", 683 | "parseurl": "~1.3.3", 684 | "path-to-regexp": "0.1.12", 685 | "proxy-addr": "~2.0.7", 686 | "qs": "6.13.0", 687 | "range-parser": "~1.2.1", 688 | "safe-buffer": "5.2.1", 689 | "send": "0.19.0", 690 | "serve-static": "1.16.2", 691 | "setprototypeof": "1.2.0", 692 | "statuses": "2.0.1", 693 | "type-is": "~1.6.18", 694 | "utils-merge": "1.0.1", 695 | "vary": "~1.1.2" 696 | }, 697 | "engines": { 698 | "node": ">= 0.10.0" 699 | }, 700 | "funding": { 701 | "type": "opencollective", 702 | "url": "https://opencollective.com/express" 703 | } 704 | }, 705 | "node_modules/file-uri-to-path": { 706 | "version": "1.0.0", 707 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 708 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 709 | "license": "MIT" 710 | }, 711 | "node_modules/finalhandler": { 712 | "version": "1.3.1", 713 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 714 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 715 | "license": "MIT", 716 | "dependencies": { 717 | "debug": "2.6.9", 718 | "encodeurl": "~2.0.0", 719 | "escape-html": "~1.0.3", 720 | "on-finished": "2.4.1", 721 | "parseurl": "~1.3.3", 722 | "statuses": "2.0.1", 723 | "unpipe": "~1.0.0" 724 | }, 725 | "engines": { 726 | "node": ">= 0.8" 727 | } 728 | }, 729 | "node_modules/follow-redirects": { 730 | "version": "1.15.9", 731 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 732 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 733 | "funding": [ 734 | { 735 | "type": "individual", 736 | "url": "https://github.com/sponsors/RubenVerborgh" 737 | } 738 | ], 739 | "license": "MIT", 740 | "engines": { 741 | "node": ">=4.0" 742 | }, 743 | "peerDependenciesMeta": { 744 | "debug": { 745 | "optional": true 746 | } 747 | } 748 | }, 749 | "node_modules/form-data": { 750 | "version": "4.0.0", 751 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 752 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 753 | "license": "MIT", 754 | "dependencies": { 755 | "asynckit": "^0.4.0", 756 | "combined-stream": "^1.0.8", 757 | "mime-types": "^2.1.12" 758 | }, 759 | "engines": { 760 | "node": ">= 6" 761 | } 762 | }, 763 | "node_modules/forwarded": { 764 | "version": "0.2.0", 765 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 766 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 767 | "license": "MIT", 768 | "engines": { 769 | "node": ">= 0.6" 770 | } 771 | }, 772 | "node_modules/fresh": { 773 | "version": "0.5.2", 774 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 775 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 776 | "license": "MIT", 777 | "engines": { 778 | "node": ">= 0.6" 779 | } 780 | }, 781 | "node_modules/fs-constants": { 782 | "version": "1.0.0", 783 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 784 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 785 | "license": "MIT" 786 | }, 787 | "node_modules/fs-minipass": { 788 | "version": "2.1.0", 789 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 790 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 791 | "license": "ISC", 792 | "dependencies": { 793 | "minipass": "^3.0.0" 794 | }, 795 | "engines": { 796 | "node": ">= 8" 797 | } 798 | }, 799 | "node_modules/fs.realpath": { 800 | "version": "1.0.0", 801 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 802 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 803 | "license": "ISC", 804 | "optional": true 805 | }, 806 | "node_modules/function-bind": { 807 | "version": "1.1.2", 808 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 809 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 810 | "license": "MIT", 811 | "funding": { 812 | "url": "https://github.com/sponsors/ljharb" 813 | } 814 | }, 815 | "node_modules/gauge": { 816 | "version": "4.0.4", 817 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 818 | "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 819 | "deprecated": "This package is no longer supported.", 820 | "license": "ISC", 821 | "optional": true, 822 | "dependencies": { 823 | "aproba": "^1.0.3 || ^2.0.0", 824 | "color-support": "^1.1.3", 825 | "console-control-strings": "^1.1.0", 826 | "has-unicode": "^2.0.1", 827 | "signal-exit": "^3.0.7", 828 | "string-width": "^4.2.3", 829 | "strip-ansi": "^6.0.1", 830 | "wide-align": "^1.1.5" 831 | }, 832 | "engines": { 833 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 834 | } 835 | }, 836 | "node_modules/get-intrinsic": { 837 | "version": "1.2.4", 838 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 839 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 840 | "license": "MIT", 841 | "dependencies": { 842 | "es-errors": "^1.3.0", 843 | "function-bind": "^1.1.2", 844 | "has-proto": "^1.0.1", 845 | "has-symbols": "^1.0.3", 846 | "hasown": "^2.0.0" 847 | }, 848 | "engines": { 849 | "node": ">= 0.4" 850 | }, 851 | "funding": { 852 | "url": "https://github.com/sponsors/ljharb" 853 | } 854 | }, 855 | "node_modules/github-from-package": { 856 | "version": "0.0.0", 857 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 858 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 859 | "license": "MIT" 860 | }, 861 | "node_modules/glob": { 862 | "version": "7.2.3", 863 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 864 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 865 | "deprecated": "Glob versions prior to v9 are no longer supported", 866 | "license": "ISC", 867 | "optional": true, 868 | "dependencies": { 869 | "fs.realpath": "^1.0.0", 870 | "inflight": "^1.0.4", 871 | "inherits": "2", 872 | "minimatch": "^3.1.1", 873 | "once": "^1.3.0", 874 | "path-is-absolute": "^1.0.0" 875 | }, 876 | "engines": { 877 | "node": "*" 878 | }, 879 | "funding": { 880 | "url": "https://github.com/sponsors/isaacs" 881 | } 882 | }, 883 | "node_modules/gopd": { 884 | "version": "1.0.1", 885 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 886 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 887 | "license": "MIT", 888 | "dependencies": { 889 | "get-intrinsic": "^1.1.3" 890 | }, 891 | "funding": { 892 | "url": "https://github.com/sponsors/ljharb" 893 | } 894 | }, 895 | "node_modules/graceful-fs": { 896 | "version": "4.2.11", 897 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 898 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 899 | "license": "ISC", 900 | "optional": true 901 | }, 902 | "node_modules/has-property-descriptors": { 903 | "version": "1.0.2", 904 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 905 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 906 | "license": "MIT", 907 | "dependencies": { 908 | "es-define-property": "^1.0.0" 909 | }, 910 | "funding": { 911 | "url": "https://github.com/sponsors/ljharb" 912 | } 913 | }, 914 | "node_modules/has-proto": { 915 | "version": "1.0.3", 916 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 917 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 918 | "license": "MIT", 919 | "engines": { 920 | "node": ">= 0.4" 921 | }, 922 | "funding": { 923 | "url": "https://github.com/sponsors/ljharb" 924 | } 925 | }, 926 | "node_modules/has-symbols": { 927 | "version": "1.0.3", 928 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 929 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 930 | "license": "MIT", 931 | "engines": { 932 | "node": ">= 0.4" 933 | }, 934 | "funding": { 935 | "url": "https://github.com/sponsors/ljharb" 936 | } 937 | }, 938 | "node_modules/has-unicode": { 939 | "version": "2.0.1", 940 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 941 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", 942 | "license": "ISC", 943 | "optional": true 944 | }, 945 | "node_modules/hasown": { 946 | "version": "2.0.2", 947 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 948 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 949 | "license": "MIT", 950 | "dependencies": { 951 | "function-bind": "^1.1.2" 952 | }, 953 | "engines": { 954 | "node": ">= 0.4" 955 | } 956 | }, 957 | "node_modules/http-cache-semantics": { 958 | "version": "4.1.1", 959 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 960 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 961 | "license": "BSD-2-Clause", 962 | "optional": true 963 | }, 964 | "node_modules/http-errors": { 965 | "version": "2.0.0", 966 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 967 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 968 | "license": "MIT", 969 | "dependencies": { 970 | "depd": "2.0.0", 971 | "inherits": "2.0.4", 972 | "setprototypeof": "1.2.0", 973 | "statuses": "2.0.1", 974 | "toidentifier": "1.0.1" 975 | }, 976 | "engines": { 977 | "node": ">= 0.8" 978 | } 979 | }, 980 | "node_modules/http-proxy-agent": { 981 | "version": "4.0.1", 982 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 983 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 984 | "license": "MIT", 985 | "optional": true, 986 | "dependencies": { 987 | "@tootallnate/once": "1", 988 | "agent-base": "6", 989 | "debug": "4" 990 | }, 991 | "engines": { 992 | "node": ">= 6" 993 | } 994 | }, 995 | "node_modules/http-proxy-agent/node_modules/debug": { 996 | "version": "4.3.7", 997 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 998 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 999 | "license": "MIT", 1000 | "optional": true, 1001 | "dependencies": { 1002 | "ms": "^2.1.3" 1003 | }, 1004 | "engines": { 1005 | "node": ">=6.0" 1006 | }, 1007 | "peerDependenciesMeta": { 1008 | "supports-color": { 1009 | "optional": true 1010 | } 1011 | } 1012 | }, 1013 | "node_modules/http-proxy-agent/node_modules/ms": { 1014 | "version": "2.1.3", 1015 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1016 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1017 | "license": "MIT", 1018 | "optional": true 1019 | }, 1020 | "node_modules/https-proxy-agent": { 1021 | "version": "5.0.1", 1022 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1023 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1024 | "license": "MIT", 1025 | "optional": true, 1026 | "dependencies": { 1027 | "agent-base": "6", 1028 | "debug": "4" 1029 | }, 1030 | "engines": { 1031 | "node": ">= 6" 1032 | } 1033 | }, 1034 | "node_modules/https-proxy-agent/node_modules/debug": { 1035 | "version": "4.3.7", 1036 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1037 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1038 | "license": "MIT", 1039 | "optional": true, 1040 | "dependencies": { 1041 | "ms": "^2.1.3" 1042 | }, 1043 | "engines": { 1044 | "node": ">=6.0" 1045 | }, 1046 | "peerDependenciesMeta": { 1047 | "supports-color": { 1048 | "optional": true 1049 | } 1050 | } 1051 | }, 1052 | "node_modules/https-proxy-agent/node_modules/ms": { 1053 | "version": "2.1.3", 1054 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1055 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1056 | "license": "MIT", 1057 | "optional": true 1058 | }, 1059 | "node_modules/humanize-ms": { 1060 | "version": "1.2.1", 1061 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1062 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1063 | "license": "MIT", 1064 | "optional": true, 1065 | "dependencies": { 1066 | "ms": "^2.0.0" 1067 | } 1068 | }, 1069 | "node_modules/iconv-lite": { 1070 | "version": "0.4.24", 1071 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1072 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1073 | "license": "MIT", 1074 | "dependencies": { 1075 | "safer-buffer": ">= 2.1.2 < 3" 1076 | }, 1077 | "engines": { 1078 | "node": ">=0.10.0" 1079 | } 1080 | }, 1081 | "node_modules/ieee754": { 1082 | "version": "1.2.1", 1083 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1084 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1085 | "funding": [ 1086 | { 1087 | "type": "github", 1088 | "url": "https://github.com/sponsors/feross" 1089 | }, 1090 | { 1091 | "type": "patreon", 1092 | "url": "https://www.patreon.com/feross" 1093 | }, 1094 | { 1095 | "type": "consulting", 1096 | "url": "https://feross.org/support" 1097 | } 1098 | ], 1099 | "license": "BSD-3-Clause" 1100 | }, 1101 | "node_modules/imurmurhash": { 1102 | "version": "0.1.4", 1103 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1104 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1105 | "license": "MIT", 1106 | "optional": true, 1107 | "engines": { 1108 | "node": ">=0.8.19" 1109 | } 1110 | }, 1111 | "node_modules/indent-string": { 1112 | "version": "4.0.0", 1113 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1114 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1115 | "license": "MIT", 1116 | "optional": true, 1117 | "engines": { 1118 | "node": ">=8" 1119 | } 1120 | }, 1121 | "node_modules/infer-owner": { 1122 | "version": "1.0.4", 1123 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 1124 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 1125 | "license": "ISC", 1126 | "optional": true 1127 | }, 1128 | "node_modules/inflight": { 1129 | "version": "1.0.6", 1130 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1131 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1132 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1133 | "license": "ISC", 1134 | "optional": true, 1135 | "dependencies": { 1136 | "once": "^1.3.0", 1137 | "wrappy": "1" 1138 | } 1139 | }, 1140 | "node_modules/inherits": { 1141 | "version": "2.0.4", 1142 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1143 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1144 | "license": "ISC" 1145 | }, 1146 | "node_modules/ini": { 1147 | "version": "1.3.8", 1148 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1149 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 1150 | "license": "ISC" 1151 | }, 1152 | "node_modules/ip-address": { 1153 | "version": "9.0.5", 1154 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 1155 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 1156 | "license": "MIT", 1157 | "optional": true, 1158 | "dependencies": { 1159 | "jsbn": "1.1.0", 1160 | "sprintf-js": "^1.1.3" 1161 | }, 1162 | "engines": { 1163 | "node": ">= 12" 1164 | } 1165 | }, 1166 | "node_modules/ipaddr.js": { 1167 | "version": "1.9.1", 1168 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1169 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1170 | "license": "MIT", 1171 | "engines": { 1172 | "node": ">= 0.10" 1173 | } 1174 | }, 1175 | "node_modules/is-fullwidth-code-point": { 1176 | "version": "3.0.0", 1177 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1178 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1179 | "license": "MIT", 1180 | "optional": true, 1181 | "engines": { 1182 | "node": ">=8" 1183 | } 1184 | }, 1185 | "node_modules/is-lambda": { 1186 | "version": "1.0.1", 1187 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 1188 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 1189 | "license": "MIT", 1190 | "optional": true 1191 | }, 1192 | "node_modules/isexe": { 1193 | "version": "2.0.0", 1194 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1195 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1196 | "license": "ISC", 1197 | "optional": true 1198 | }, 1199 | "node_modules/jsbn": { 1200 | "version": "1.1.0", 1201 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 1202 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 1203 | "license": "MIT", 1204 | "optional": true 1205 | }, 1206 | "node_modules/lru-cache": { 1207 | "version": "6.0.0", 1208 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1209 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1210 | "license": "ISC", 1211 | "optional": true, 1212 | "dependencies": { 1213 | "yallist": "^4.0.0" 1214 | }, 1215 | "engines": { 1216 | "node": ">=10" 1217 | } 1218 | }, 1219 | "node_modules/make-fetch-happen": { 1220 | "version": "9.1.0", 1221 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", 1222 | "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", 1223 | "license": "ISC", 1224 | "optional": true, 1225 | "dependencies": { 1226 | "agentkeepalive": "^4.1.3", 1227 | "cacache": "^15.2.0", 1228 | "http-cache-semantics": "^4.1.0", 1229 | "http-proxy-agent": "^4.0.1", 1230 | "https-proxy-agent": "^5.0.0", 1231 | "is-lambda": "^1.0.1", 1232 | "lru-cache": "^6.0.0", 1233 | "minipass": "^3.1.3", 1234 | "minipass-collect": "^1.0.2", 1235 | "minipass-fetch": "^1.3.2", 1236 | "minipass-flush": "^1.0.5", 1237 | "minipass-pipeline": "^1.2.4", 1238 | "negotiator": "^0.6.2", 1239 | "promise-retry": "^2.0.1", 1240 | "socks-proxy-agent": "^6.0.0", 1241 | "ssri": "^8.0.0" 1242 | }, 1243 | "engines": { 1244 | "node": ">= 10" 1245 | } 1246 | }, 1247 | "node_modules/media-typer": { 1248 | "version": "0.3.0", 1249 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1250 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1251 | "license": "MIT", 1252 | "engines": { 1253 | "node": ">= 0.6" 1254 | } 1255 | }, 1256 | "node_modules/merge-descriptors": { 1257 | "version": "1.0.3", 1258 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1259 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 1260 | "license": "MIT", 1261 | "funding": { 1262 | "url": "https://github.com/sponsors/sindresorhus" 1263 | } 1264 | }, 1265 | "node_modules/methods": { 1266 | "version": "1.1.2", 1267 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1268 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1269 | "license": "MIT", 1270 | "engines": { 1271 | "node": ">= 0.6" 1272 | } 1273 | }, 1274 | "node_modules/mime": { 1275 | "version": "1.6.0", 1276 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1277 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1278 | "license": "MIT", 1279 | "bin": { 1280 | "mime": "cli.js" 1281 | }, 1282 | "engines": { 1283 | "node": ">=4" 1284 | } 1285 | }, 1286 | "node_modules/mime-db": { 1287 | "version": "1.52.0", 1288 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1289 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1290 | "license": "MIT", 1291 | "engines": { 1292 | "node": ">= 0.6" 1293 | } 1294 | }, 1295 | "node_modules/mime-types": { 1296 | "version": "2.1.35", 1297 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1298 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1299 | "license": "MIT", 1300 | "dependencies": { 1301 | "mime-db": "1.52.0" 1302 | }, 1303 | "engines": { 1304 | "node": ">= 0.6" 1305 | } 1306 | }, 1307 | "node_modules/mimic-response": { 1308 | "version": "3.1.0", 1309 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1310 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1311 | "license": "MIT", 1312 | "engines": { 1313 | "node": ">=10" 1314 | }, 1315 | "funding": { 1316 | "url": "https://github.com/sponsors/sindresorhus" 1317 | } 1318 | }, 1319 | "node_modules/minimatch": { 1320 | "version": "3.1.2", 1321 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1322 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1323 | "license": "ISC", 1324 | "optional": true, 1325 | "dependencies": { 1326 | "brace-expansion": "^1.1.7" 1327 | }, 1328 | "engines": { 1329 | "node": "*" 1330 | } 1331 | }, 1332 | "node_modules/minimist": { 1333 | "version": "1.2.8", 1334 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1335 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1336 | "license": "MIT", 1337 | "funding": { 1338 | "url": "https://github.com/sponsors/ljharb" 1339 | } 1340 | }, 1341 | "node_modules/minipass": { 1342 | "version": "3.3.6", 1343 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1344 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1345 | "license": "ISC", 1346 | "dependencies": { 1347 | "yallist": "^4.0.0" 1348 | }, 1349 | "engines": { 1350 | "node": ">=8" 1351 | } 1352 | }, 1353 | "node_modules/minipass-collect": { 1354 | "version": "1.0.2", 1355 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1356 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1357 | "license": "ISC", 1358 | "optional": true, 1359 | "dependencies": { 1360 | "minipass": "^3.0.0" 1361 | }, 1362 | "engines": { 1363 | "node": ">= 8" 1364 | } 1365 | }, 1366 | "node_modules/minipass-fetch": { 1367 | "version": "1.4.1", 1368 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", 1369 | "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", 1370 | "license": "MIT", 1371 | "optional": true, 1372 | "dependencies": { 1373 | "minipass": "^3.1.0", 1374 | "minipass-sized": "^1.0.3", 1375 | "minizlib": "^2.0.0" 1376 | }, 1377 | "engines": { 1378 | "node": ">=8" 1379 | }, 1380 | "optionalDependencies": { 1381 | "encoding": "^0.1.12" 1382 | } 1383 | }, 1384 | "node_modules/minipass-flush": { 1385 | "version": "1.0.5", 1386 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1387 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1388 | "license": "ISC", 1389 | "optional": true, 1390 | "dependencies": { 1391 | "minipass": "^3.0.0" 1392 | }, 1393 | "engines": { 1394 | "node": ">= 8" 1395 | } 1396 | }, 1397 | "node_modules/minipass-pipeline": { 1398 | "version": "1.2.4", 1399 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1400 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1401 | "license": "ISC", 1402 | "optional": true, 1403 | "dependencies": { 1404 | "minipass": "^3.0.0" 1405 | }, 1406 | "engines": { 1407 | "node": ">=8" 1408 | } 1409 | }, 1410 | "node_modules/minipass-sized": { 1411 | "version": "1.0.3", 1412 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1413 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1414 | "license": "ISC", 1415 | "optional": true, 1416 | "dependencies": { 1417 | "minipass": "^3.0.0" 1418 | }, 1419 | "engines": { 1420 | "node": ">=8" 1421 | } 1422 | }, 1423 | "node_modules/minizlib": { 1424 | "version": "2.1.2", 1425 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1426 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1427 | "license": "MIT", 1428 | "dependencies": { 1429 | "minipass": "^3.0.0", 1430 | "yallist": "^4.0.0" 1431 | }, 1432 | "engines": { 1433 | "node": ">= 8" 1434 | } 1435 | }, 1436 | "node_modules/mkdirp": { 1437 | "version": "1.0.4", 1438 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1439 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1440 | "license": "MIT", 1441 | "bin": { 1442 | "mkdirp": "bin/cmd.js" 1443 | }, 1444 | "engines": { 1445 | "node": ">=10" 1446 | } 1447 | }, 1448 | "node_modules/mkdirp-classic": { 1449 | "version": "0.5.3", 1450 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1451 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1452 | "license": "MIT" 1453 | }, 1454 | "node_modules/ms": { 1455 | "version": "2.0.0", 1456 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1457 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1458 | "license": "MIT" 1459 | }, 1460 | "node_modules/napi-build-utils": { 1461 | "version": "1.0.2", 1462 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1463 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 1464 | "license": "MIT" 1465 | }, 1466 | "node_modules/negotiator": { 1467 | "version": "0.6.3", 1468 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1469 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1470 | "license": "MIT", 1471 | "engines": { 1472 | "node": ">= 0.6" 1473 | } 1474 | }, 1475 | "node_modules/node-abi": { 1476 | "version": "3.68.0", 1477 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", 1478 | "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", 1479 | "license": "MIT", 1480 | "dependencies": { 1481 | "semver": "^7.3.5" 1482 | }, 1483 | "engines": { 1484 | "node": ">=10" 1485 | } 1486 | }, 1487 | "node_modules/node-addon-api": { 1488 | "version": "7.1.1", 1489 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 1490 | "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 1491 | "license": "MIT" 1492 | }, 1493 | "node_modules/node-gyp": { 1494 | "version": "8.4.1", 1495 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", 1496 | "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", 1497 | "license": "MIT", 1498 | "optional": true, 1499 | "dependencies": { 1500 | "env-paths": "^2.2.0", 1501 | "glob": "^7.1.4", 1502 | "graceful-fs": "^4.2.6", 1503 | "make-fetch-happen": "^9.1.0", 1504 | "nopt": "^5.0.0", 1505 | "npmlog": "^6.0.0", 1506 | "rimraf": "^3.0.2", 1507 | "semver": "^7.3.5", 1508 | "tar": "^6.1.2", 1509 | "which": "^2.0.2" 1510 | }, 1511 | "bin": { 1512 | "node-gyp": "bin/node-gyp.js" 1513 | }, 1514 | "engines": { 1515 | "node": ">= 10.12.0" 1516 | } 1517 | }, 1518 | "node_modules/nopt": { 1519 | "version": "5.0.0", 1520 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1521 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1522 | "license": "ISC", 1523 | "optional": true, 1524 | "dependencies": { 1525 | "abbrev": "1" 1526 | }, 1527 | "bin": { 1528 | "nopt": "bin/nopt.js" 1529 | }, 1530 | "engines": { 1531 | "node": ">=6" 1532 | } 1533 | }, 1534 | "node_modules/npmlog": { 1535 | "version": "6.0.2", 1536 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 1537 | "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 1538 | "deprecated": "This package is no longer supported.", 1539 | "license": "ISC", 1540 | "optional": true, 1541 | "dependencies": { 1542 | "are-we-there-yet": "^3.0.0", 1543 | "console-control-strings": "^1.1.0", 1544 | "gauge": "^4.0.3", 1545 | "set-blocking": "^2.0.0" 1546 | }, 1547 | "engines": { 1548 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1549 | } 1550 | }, 1551 | "node_modules/object-inspect": { 1552 | "version": "1.13.2", 1553 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1554 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1555 | "license": "MIT", 1556 | "engines": { 1557 | "node": ">= 0.4" 1558 | }, 1559 | "funding": { 1560 | "url": "https://github.com/sponsors/ljharb" 1561 | } 1562 | }, 1563 | "node_modules/on-finished": { 1564 | "version": "2.4.1", 1565 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1566 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1567 | "license": "MIT", 1568 | "dependencies": { 1569 | "ee-first": "1.1.1" 1570 | }, 1571 | "engines": { 1572 | "node": ">= 0.8" 1573 | } 1574 | }, 1575 | "node_modules/once": { 1576 | "version": "1.4.0", 1577 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1578 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1579 | "license": "ISC", 1580 | "dependencies": { 1581 | "wrappy": "1" 1582 | } 1583 | }, 1584 | "node_modules/p-map": { 1585 | "version": "4.0.0", 1586 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1587 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1588 | "license": "MIT", 1589 | "optional": true, 1590 | "dependencies": { 1591 | "aggregate-error": "^3.0.0" 1592 | }, 1593 | "engines": { 1594 | "node": ">=10" 1595 | }, 1596 | "funding": { 1597 | "url": "https://github.com/sponsors/sindresorhus" 1598 | } 1599 | }, 1600 | "node_modules/parseurl": { 1601 | "version": "1.3.3", 1602 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1603 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1604 | "license": "MIT", 1605 | "engines": { 1606 | "node": ">= 0.8" 1607 | } 1608 | }, 1609 | "node_modules/path-is-absolute": { 1610 | "version": "1.0.1", 1611 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1612 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1613 | "license": "MIT", 1614 | "optional": true, 1615 | "engines": { 1616 | "node": ">=0.10.0" 1617 | } 1618 | }, 1619 | "node_modules/path-to-regexp": { 1620 | "version": "0.1.12", 1621 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", 1622 | "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" 1623 | }, 1624 | "node_modules/prebuild-install": { 1625 | "version": "7.1.2", 1626 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1627 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1628 | "license": "MIT", 1629 | "dependencies": { 1630 | "detect-libc": "^2.0.0", 1631 | "expand-template": "^2.0.3", 1632 | "github-from-package": "0.0.0", 1633 | "minimist": "^1.2.3", 1634 | "mkdirp-classic": "^0.5.3", 1635 | "napi-build-utils": "^1.0.1", 1636 | "node-abi": "^3.3.0", 1637 | "pump": "^3.0.0", 1638 | "rc": "^1.2.7", 1639 | "simple-get": "^4.0.0", 1640 | "tar-fs": "^2.0.0", 1641 | "tunnel-agent": "^0.6.0" 1642 | }, 1643 | "bin": { 1644 | "prebuild-install": "bin.js" 1645 | }, 1646 | "engines": { 1647 | "node": ">=10" 1648 | } 1649 | }, 1650 | "node_modules/promise-inflight": { 1651 | "version": "1.0.1", 1652 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1653 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1654 | "license": "ISC", 1655 | "optional": true 1656 | }, 1657 | "node_modules/promise-retry": { 1658 | "version": "2.0.1", 1659 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1660 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1661 | "license": "MIT", 1662 | "optional": true, 1663 | "dependencies": { 1664 | "err-code": "^2.0.2", 1665 | "retry": "^0.12.0" 1666 | }, 1667 | "engines": { 1668 | "node": ">=10" 1669 | } 1670 | }, 1671 | "node_modules/proxy-addr": { 1672 | "version": "2.0.7", 1673 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1674 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1675 | "license": "MIT", 1676 | "dependencies": { 1677 | "forwarded": "0.2.0", 1678 | "ipaddr.js": "1.9.1" 1679 | }, 1680 | "engines": { 1681 | "node": ">= 0.10" 1682 | } 1683 | }, 1684 | "node_modules/proxy-from-env": { 1685 | "version": "1.1.0", 1686 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1687 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 1688 | "license": "MIT" 1689 | }, 1690 | "node_modules/pump": { 1691 | "version": "3.0.2", 1692 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1693 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1694 | "license": "MIT", 1695 | "dependencies": { 1696 | "end-of-stream": "^1.1.0", 1697 | "once": "^1.3.1" 1698 | } 1699 | }, 1700 | "node_modules/qs": { 1701 | "version": "6.13.0", 1702 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1703 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1704 | "license": "BSD-3-Clause", 1705 | "dependencies": { 1706 | "side-channel": "^1.0.6" 1707 | }, 1708 | "engines": { 1709 | "node": ">=0.6" 1710 | }, 1711 | "funding": { 1712 | "url": "https://github.com/sponsors/ljharb" 1713 | } 1714 | }, 1715 | "node_modules/range-parser": { 1716 | "version": "1.2.1", 1717 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1718 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1719 | "license": "MIT", 1720 | "engines": { 1721 | "node": ">= 0.6" 1722 | } 1723 | }, 1724 | "node_modules/raw-body": { 1725 | "version": "2.5.2", 1726 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1727 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1728 | "license": "MIT", 1729 | "dependencies": { 1730 | "bytes": "3.1.2", 1731 | "http-errors": "2.0.0", 1732 | "iconv-lite": "0.4.24", 1733 | "unpipe": "1.0.0" 1734 | }, 1735 | "engines": { 1736 | "node": ">= 0.8" 1737 | } 1738 | }, 1739 | "node_modules/rc": { 1740 | "version": "1.2.8", 1741 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1742 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1743 | "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", 1744 | "dependencies": { 1745 | "deep-extend": "^0.6.0", 1746 | "ini": "~1.3.0", 1747 | "minimist": "^1.2.0", 1748 | "strip-json-comments": "~2.0.1" 1749 | }, 1750 | "bin": { 1751 | "rc": "cli.js" 1752 | } 1753 | }, 1754 | "node_modules/readable-stream": { 1755 | "version": "3.6.2", 1756 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1757 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1758 | "license": "MIT", 1759 | "dependencies": { 1760 | "inherits": "^2.0.3", 1761 | "string_decoder": "^1.1.1", 1762 | "util-deprecate": "^1.0.1" 1763 | }, 1764 | "engines": { 1765 | "node": ">= 6" 1766 | } 1767 | }, 1768 | "node_modules/retry": { 1769 | "version": "0.12.0", 1770 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1771 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1772 | "license": "MIT", 1773 | "optional": true, 1774 | "engines": { 1775 | "node": ">= 4" 1776 | } 1777 | }, 1778 | "node_modules/rimraf": { 1779 | "version": "3.0.2", 1780 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1781 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1782 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1783 | "license": "ISC", 1784 | "optional": true, 1785 | "dependencies": { 1786 | "glob": "^7.1.3" 1787 | }, 1788 | "bin": { 1789 | "rimraf": "bin.js" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/sponsors/isaacs" 1793 | } 1794 | }, 1795 | "node_modules/safe-buffer": { 1796 | "version": "5.2.1", 1797 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1798 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1799 | "funding": [ 1800 | { 1801 | "type": "github", 1802 | "url": "https://github.com/sponsors/feross" 1803 | }, 1804 | { 1805 | "type": "patreon", 1806 | "url": "https://www.patreon.com/feross" 1807 | }, 1808 | { 1809 | "type": "consulting", 1810 | "url": "https://feross.org/support" 1811 | } 1812 | ], 1813 | "license": "MIT" 1814 | }, 1815 | "node_modules/safer-buffer": { 1816 | "version": "2.1.2", 1817 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1818 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1819 | "license": "MIT" 1820 | }, 1821 | "node_modules/semver": { 1822 | "version": "7.6.3", 1823 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1824 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1825 | "license": "ISC", 1826 | "bin": { 1827 | "semver": "bin/semver.js" 1828 | }, 1829 | "engines": { 1830 | "node": ">=10" 1831 | } 1832 | }, 1833 | "node_modules/send": { 1834 | "version": "0.19.0", 1835 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 1836 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 1837 | "license": "MIT", 1838 | "dependencies": { 1839 | "debug": "2.6.9", 1840 | "depd": "2.0.0", 1841 | "destroy": "1.2.0", 1842 | "encodeurl": "~1.0.2", 1843 | "escape-html": "~1.0.3", 1844 | "etag": "~1.8.1", 1845 | "fresh": "0.5.2", 1846 | "http-errors": "2.0.0", 1847 | "mime": "1.6.0", 1848 | "ms": "2.1.3", 1849 | "on-finished": "2.4.1", 1850 | "range-parser": "~1.2.1", 1851 | "statuses": "2.0.1" 1852 | }, 1853 | "engines": { 1854 | "node": ">= 0.8.0" 1855 | } 1856 | }, 1857 | "node_modules/send/node_modules/encodeurl": { 1858 | "version": "1.0.2", 1859 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1860 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1861 | "license": "MIT", 1862 | "engines": { 1863 | "node": ">= 0.8" 1864 | } 1865 | }, 1866 | "node_modules/send/node_modules/ms": { 1867 | "version": "2.1.3", 1868 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1869 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1870 | "license": "MIT" 1871 | }, 1872 | "node_modules/serve-static": { 1873 | "version": "1.16.2", 1874 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 1875 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 1876 | "license": "MIT", 1877 | "dependencies": { 1878 | "encodeurl": "~2.0.0", 1879 | "escape-html": "~1.0.3", 1880 | "parseurl": "~1.3.3", 1881 | "send": "0.19.0" 1882 | }, 1883 | "engines": { 1884 | "node": ">= 0.8.0" 1885 | } 1886 | }, 1887 | "node_modules/set-blocking": { 1888 | "version": "2.0.0", 1889 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1890 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 1891 | "license": "ISC", 1892 | "optional": true 1893 | }, 1894 | "node_modules/set-function-length": { 1895 | "version": "1.2.2", 1896 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1897 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1898 | "license": "MIT", 1899 | "dependencies": { 1900 | "define-data-property": "^1.1.4", 1901 | "es-errors": "^1.3.0", 1902 | "function-bind": "^1.1.2", 1903 | "get-intrinsic": "^1.2.4", 1904 | "gopd": "^1.0.1", 1905 | "has-property-descriptors": "^1.0.2" 1906 | }, 1907 | "engines": { 1908 | "node": ">= 0.4" 1909 | } 1910 | }, 1911 | "node_modules/setprototypeof": { 1912 | "version": "1.2.0", 1913 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1914 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1915 | "license": "ISC" 1916 | }, 1917 | "node_modules/side-channel": { 1918 | "version": "1.0.6", 1919 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1920 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1921 | "license": "MIT", 1922 | "dependencies": { 1923 | "call-bind": "^1.0.7", 1924 | "es-errors": "^1.3.0", 1925 | "get-intrinsic": "^1.2.4", 1926 | "object-inspect": "^1.13.1" 1927 | }, 1928 | "engines": { 1929 | "node": ">= 0.4" 1930 | }, 1931 | "funding": { 1932 | "url": "https://github.com/sponsors/ljharb" 1933 | } 1934 | }, 1935 | "node_modules/signal-exit": { 1936 | "version": "3.0.7", 1937 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1938 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1939 | "license": "ISC", 1940 | "optional": true 1941 | }, 1942 | "node_modules/simple-concat": { 1943 | "version": "1.0.1", 1944 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1945 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1946 | "funding": [ 1947 | { 1948 | "type": "github", 1949 | "url": "https://github.com/sponsors/feross" 1950 | }, 1951 | { 1952 | "type": "patreon", 1953 | "url": "https://www.patreon.com/feross" 1954 | }, 1955 | { 1956 | "type": "consulting", 1957 | "url": "https://feross.org/support" 1958 | } 1959 | ], 1960 | "license": "MIT" 1961 | }, 1962 | "node_modules/simple-get": { 1963 | "version": "4.0.1", 1964 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1965 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1966 | "funding": [ 1967 | { 1968 | "type": "github", 1969 | "url": "https://github.com/sponsors/feross" 1970 | }, 1971 | { 1972 | "type": "patreon", 1973 | "url": "https://www.patreon.com/feross" 1974 | }, 1975 | { 1976 | "type": "consulting", 1977 | "url": "https://feross.org/support" 1978 | } 1979 | ], 1980 | "license": "MIT", 1981 | "dependencies": { 1982 | "decompress-response": "^6.0.0", 1983 | "once": "^1.3.1", 1984 | "simple-concat": "^1.0.0" 1985 | } 1986 | }, 1987 | "node_modules/smart-buffer": { 1988 | "version": "4.2.0", 1989 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1990 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1991 | "license": "MIT", 1992 | "optional": true, 1993 | "engines": { 1994 | "node": ">= 6.0.0", 1995 | "npm": ">= 3.0.0" 1996 | } 1997 | }, 1998 | "node_modules/socks": { 1999 | "version": "2.8.3", 2000 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 2001 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 2002 | "license": "MIT", 2003 | "optional": true, 2004 | "dependencies": { 2005 | "ip-address": "^9.0.5", 2006 | "smart-buffer": "^4.2.0" 2007 | }, 2008 | "engines": { 2009 | "node": ">= 10.0.0", 2010 | "npm": ">= 3.0.0" 2011 | } 2012 | }, 2013 | "node_modules/socks-proxy-agent": { 2014 | "version": "6.2.1", 2015 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", 2016 | "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", 2017 | "license": "MIT", 2018 | "optional": true, 2019 | "dependencies": { 2020 | "agent-base": "^6.0.2", 2021 | "debug": "^4.3.3", 2022 | "socks": "^2.6.2" 2023 | }, 2024 | "engines": { 2025 | "node": ">= 10" 2026 | } 2027 | }, 2028 | "node_modules/socks-proxy-agent/node_modules/debug": { 2029 | "version": "4.3.7", 2030 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 2031 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 2032 | "license": "MIT", 2033 | "optional": true, 2034 | "dependencies": { 2035 | "ms": "^2.1.3" 2036 | }, 2037 | "engines": { 2038 | "node": ">=6.0" 2039 | }, 2040 | "peerDependenciesMeta": { 2041 | "supports-color": { 2042 | "optional": true 2043 | } 2044 | } 2045 | }, 2046 | "node_modules/socks-proxy-agent/node_modules/ms": { 2047 | "version": "2.1.3", 2048 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2049 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2050 | "license": "MIT", 2051 | "optional": true 2052 | }, 2053 | "node_modules/sprintf-js": { 2054 | "version": "1.1.3", 2055 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 2056 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 2057 | "license": "BSD-3-Clause", 2058 | "optional": true 2059 | }, 2060 | "node_modules/sqlite3": { 2061 | "version": "5.1.7", 2062 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", 2063 | "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", 2064 | "hasInstallScript": true, 2065 | "license": "BSD-3-Clause", 2066 | "dependencies": { 2067 | "bindings": "^1.5.0", 2068 | "node-addon-api": "^7.0.0", 2069 | "prebuild-install": "^7.1.1", 2070 | "tar": "^6.1.11" 2071 | }, 2072 | "optionalDependencies": { 2073 | "node-gyp": "8.x" 2074 | }, 2075 | "peerDependencies": { 2076 | "node-gyp": "8.x" 2077 | }, 2078 | "peerDependenciesMeta": { 2079 | "node-gyp": { 2080 | "optional": true 2081 | } 2082 | } 2083 | }, 2084 | "node_modules/ssri": { 2085 | "version": "8.0.1", 2086 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", 2087 | "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", 2088 | "license": "ISC", 2089 | "optional": true, 2090 | "dependencies": { 2091 | "minipass": "^3.1.1" 2092 | }, 2093 | "engines": { 2094 | "node": ">= 8" 2095 | } 2096 | }, 2097 | "node_modules/statuses": { 2098 | "version": "2.0.1", 2099 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2100 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2101 | "license": "MIT", 2102 | "engines": { 2103 | "node": ">= 0.8" 2104 | } 2105 | }, 2106 | "node_modules/string_decoder": { 2107 | "version": "1.3.0", 2108 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2109 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2110 | "license": "MIT", 2111 | "dependencies": { 2112 | "safe-buffer": "~5.2.0" 2113 | } 2114 | }, 2115 | "node_modules/string-width": { 2116 | "version": "4.2.3", 2117 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2118 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2119 | "license": "MIT", 2120 | "optional": true, 2121 | "dependencies": { 2122 | "emoji-regex": "^8.0.0", 2123 | "is-fullwidth-code-point": "^3.0.0", 2124 | "strip-ansi": "^6.0.1" 2125 | }, 2126 | "engines": { 2127 | "node": ">=8" 2128 | } 2129 | }, 2130 | "node_modules/strip-ansi": { 2131 | "version": "6.0.1", 2132 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2133 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2134 | "license": "MIT", 2135 | "optional": true, 2136 | "dependencies": { 2137 | "ansi-regex": "^5.0.1" 2138 | }, 2139 | "engines": { 2140 | "node": ">=8" 2141 | } 2142 | }, 2143 | "node_modules/strip-json-comments": { 2144 | "version": "2.0.1", 2145 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2146 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2147 | "license": "MIT", 2148 | "engines": { 2149 | "node": ">=0.10.0" 2150 | } 2151 | }, 2152 | "node_modules/tar": { 2153 | "version": "6.2.1", 2154 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 2155 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 2156 | "license": "ISC", 2157 | "dependencies": { 2158 | "chownr": "^2.0.0", 2159 | "fs-minipass": "^2.0.0", 2160 | "minipass": "^5.0.0", 2161 | "minizlib": "^2.1.1", 2162 | "mkdirp": "^1.0.3", 2163 | "yallist": "^4.0.0" 2164 | }, 2165 | "engines": { 2166 | "node": ">=10" 2167 | } 2168 | }, 2169 | "node_modules/tar-fs": { 2170 | "version": "2.1.3", 2171 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", 2172 | "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", 2173 | "license": "MIT", 2174 | "dependencies": { 2175 | "chownr": "^1.1.1", 2176 | "mkdirp-classic": "^0.5.2", 2177 | "pump": "^3.0.0", 2178 | "tar-stream": "^2.1.4" 2179 | } 2180 | }, 2181 | "node_modules/tar-fs/node_modules/chownr": { 2182 | "version": "1.1.4", 2183 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 2184 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 2185 | "license": "ISC" 2186 | }, 2187 | "node_modules/tar-stream": { 2188 | "version": "2.2.0", 2189 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2190 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2191 | "license": "MIT", 2192 | "dependencies": { 2193 | "bl": "^4.0.3", 2194 | "end-of-stream": "^1.4.1", 2195 | "fs-constants": "^1.0.0", 2196 | "inherits": "^2.0.3", 2197 | "readable-stream": "^3.1.1" 2198 | }, 2199 | "engines": { 2200 | "node": ">=6" 2201 | } 2202 | }, 2203 | "node_modules/tar/node_modules/minipass": { 2204 | "version": "5.0.0", 2205 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2206 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2207 | "license": "ISC", 2208 | "engines": { 2209 | "node": ">=8" 2210 | } 2211 | }, 2212 | "node_modules/toidentifier": { 2213 | "version": "1.0.1", 2214 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2215 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2216 | "license": "MIT", 2217 | "engines": { 2218 | "node": ">=0.6" 2219 | } 2220 | }, 2221 | "node_modules/tunnel-agent": { 2222 | "version": "0.6.0", 2223 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2224 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2225 | "license": "Apache-2.0", 2226 | "dependencies": { 2227 | "safe-buffer": "^5.0.1" 2228 | }, 2229 | "engines": { 2230 | "node": "*" 2231 | } 2232 | }, 2233 | "node_modules/type-is": { 2234 | "version": "1.6.18", 2235 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2236 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2237 | "license": "MIT", 2238 | "dependencies": { 2239 | "media-typer": "0.3.0", 2240 | "mime-types": "~2.1.24" 2241 | }, 2242 | "engines": { 2243 | "node": ">= 0.6" 2244 | } 2245 | }, 2246 | "node_modules/unique-filename": { 2247 | "version": "1.1.1", 2248 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 2249 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 2250 | "license": "ISC", 2251 | "optional": true, 2252 | "dependencies": { 2253 | "unique-slug": "^2.0.0" 2254 | } 2255 | }, 2256 | "node_modules/unique-slug": { 2257 | "version": "2.0.2", 2258 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 2259 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 2260 | "license": "ISC", 2261 | "optional": true, 2262 | "dependencies": { 2263 | "imurmurhash": "^0.1.4" 2264 | } 2265 | }, 2266 | "node_modules/unpipe": { 2267 | "version": "1.0.0", 2268 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2269 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2270 | "license": "MIT", 2271 | "engines": { 2272 | "node": ">= 0.8" 2273 | } 2274 | }, 2275 | "node_modules/util-deprecate": { 2276 | "version": "1.0.2", 2277 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2278 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2279 | "license": "MIT" 2280 | }, 2281 | "node_modules/utils-merge": { 2282 | "version": "1.0.1", 2283 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2284 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2285 | "license": "MIT", 2286 | "engines": { 2287 | "node": ">= 0.4.0" 2288 | } 2289 | }, 2290 | "node_modules/vary": { 2291 | "version": "1.1.2", 2292 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2293 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2294 | "license": "MIT", 2295 | "engines": { 2296 | "node": ">= 0.8" 2297 | } 2298 | }, 2299 | "node_modules/which": { 2300 | "version": "2.0.2", 2301 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2302 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2303 | "license": "ISC", 2304 | "optional": true, 2305 | "dependencies": { 2306 | "isexe": "^2.0.0" 2307 | }, 2308 | "bin": { 2309 | "node-which": "bin/node-which" 2310 | }, 2311 | "engines": { 2312 | "node": ">= 8" 2313 | } 2314 | }, 2315 | "node_modules/wide-align": { 2316 | "version": "1.1.5", 2317 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 2318 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 2319 | "license": "ISC", 2320 | "optional": true, 2321 | "dependencies": { 2322 | "string-width": "^1.0.2 || 2 || 3 || 4" 2323 | } 2324 | }, 2325 | "node_modules/wrappy": { 2326 | "version": "1.0.2", 2327 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2328 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2329 | "license": "ISC" 2330 | }, 2331 | "node_modules/yallist": { 2332 | "version": "4.0.0", 2333 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2334 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2335 | "license": "ISC" 2336 | } 2337 | } 2338 | } 2339 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "axios": ">=1.8.2", 4 | "express": ">=4.21.2", 5 | "sqlite3": "^5.1.7" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /utils.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const readline = require('readline'); 3 | const crypto = require('crypto'); 4 | const axios = require('axios'); 5 | const { getDb } = require('./db'); 6 | 7 | let server; 8 | let currentPort; 9 | let expressApp; 10 | 11 | function startServer(port, app) { 12 | currentPort = port; 13 | expressApp = app; // Store the app object 14 | server = expressApp.listen(currentPort, () => console.log(`Server running on port ${currentPort}`)); 15 | } 16 | 17 | function askForPort(app, startServerCallback, askForOllamaURLCallback, startCLICallback, db) { 18 | const rl = readline.createInterface({ 19 | input: process.stdin, 20 | output: process.stdout 21 | }); 22 | 23 | rl.question('Enter the port number for the API server: ', (port) => { 24 | fs.writeFile('port.conf', port, (err) => { 25 | if (err) { 26 | console.error('Error saving port number:', err.message); 27 | } else { 28 | console.log(`Port number saved to port.conf: ${port}`); 29 | currentPort = parseInt(port); 30 | askForOllamaURLCallback(app, startServerCallback, startCLICallback, currentPort, db); 31 | } 32 | }); 33 | rl.close(); 34 | }); 35 | } 36 | 37 | function askForOllamaURL(app, startServerCallback, startCLICallback, port, db) { 38 | const rl = readline.createInterface({ 39 | input: process.stdin, 40 | output: process.stdout 41 | }); 42 | 43 | rl.question('Enter the URL for the Ollama server (URL that your Ollama server is running on. By default it is "http://localhost:11434" so if you didnt change anything it should be that.): ', (ollamaURL) => { 44 | fs.writeFile('ollamaURL.conf', ollamaURL, (err) => { 45 | if (err) { 46 | console.error('Error saving Ollama url:', err.message); 47 | } else { 48 | console.log(`Ollama url saved to ollamaURL.conf: ${ollamaURL}`); 49 | startServerCallback(port, app); 50 | startCLICallback(db); 51 | } 52 | }); 53 | rl.close(); 54 | }); 55 | } 56 | 57 | function startCLI(db) { 58 | const rl = readline.createInterface({ 59 | input: process.stdin, 60 | output: process.stdout 61 | }); 62 | 63 | rl.on('line', (input) => { 64 | const [command, argument, ...rest] = input.trim().split(' '); 65 | const description = rest.join(' '); 66 | 67 | switch (command) { 68 | case 'generatekey': 69 | generateKey(db); 70 | break; 71 | case 'generatekeys': 72 | generateKeys(db, argument); 73 | break; 74 | case 'listkey': 75 | listKeys(db); 76 | break; 77 | case 'removekey': 78 | removeKey(db, argument); 79 | break; 80 | case 'addkey': 81 | addKey(db, argument); 82 | break; 83 | case 'changeport': 84 | changePort(argument); 85 | break; 86 | case 'changeollamaurl': 87 | changeOllamaURL(argument); 88 | break; 89 | case 'ratelimit': 90 | setRateLimit(db, argument, rest[0]); 91 | break; 92 | case 'addwebhook': 93 | addWebhook(db, argument); 94 | break; 95 | case 'deletewebhook': 96 | deleteWebhook(db, argument); 97 | break; 98 | case 'listwebhooks': 99 | listWebhooks(db); 100 | break; 101 | case 'activatekey': 102 | activateKey(db, argument); 103 | break; 104 | case 'deactivatekey': 105 | deactivateKey(db, argument); 106 | break; 107 | case 'addkeydescription': 108 | addKeyDescription(db, argument, description); 109 | break; 110 | case 'listkeydescription': 111 | listKeyDescription(db, argument); 112 | break; 113 | case 'regeneratekey': 114 | regenerateKey(db, argument); 115 | break; 116 | case 'activateallkeys': 117 | activateAllKeys(db); 118 | break; 119 | case 'deactivateallkeys': 120 | deactivateAllKeys(db); 121 | break; 122 | case 'getkeyinfo': 123 | getKeyInfo(db, argument); 124 | break; 125 | case 'listinactivekeys': 126 | listInactiveKeys(db); 127 | break; 128 | case 'listactivekeys': 129 | listActiveKeys(db); 130 | break; 131 | case 'exit': 132 | rl.close(); 133 | process.exit(0); 134 | break; 135 | default: 136 | console.log('Unknown command'); 137 | } 138 | }); 139 | } 140 | 141 | function generateKey(db) { 142 | const apiKey = crypto.randomBytes(20).toString('hex'); 143 | db.run('INSERT INTO apiKeys(key, rate_limit) VALUES(?, 10)', [apiKey], (err) => { 144 | if (err) { 145 | console.error('Error generating API key:', err.message); 146 | } else { 147 | console.log(`API key generated: ${apiKey}`); 148 | } 149 | }); 150 | } 151 | 152 | function generateKeys(db, count) { 153 | if (!count || isNaN(count)) { 154 | console.log('Invalid number of keys'); 155 | return; 156 | } 157 | const numberOfKeys = parseInt(count); 158 | for (let i = 0; i < numberOfKeys; i++) { 159 | generateKey(db); 160 | } 161 | } 162 | 163 | function listKeys(db) { 164 | db.all('SELECT key, active, description FROM apiKeys', [], (err, rows) => { 165 | if (err) { 166 | console.error('Error listing API keys:', err.message); 167 | } else { 168 | console.log('API keys:', rows); 169 | } 170 | }); 171 | } 172 | 173 | function removeKey(db, key) { 174 | db.run('DELETE FROM apiKeys WHERE key = ?', [key], (err) => { 175 | if (err) { 176 | console.error('Error removing API key:', err.message); 177 | } else { 178 | console.log('API key removed'); 179 | } 180 | }); 181 | } 182 | 183 | function addKey(db, key) { 184 | console.log('Warning: Adding your own keys may be unsafe. It is recommended to generate keys using the generatekey command.'); 185 | db.run('INSERT INTO apiKeys(key, rate_limit) VALUES(?, 10)', [key], (err) => { 186 | if (err) { 187 | console.error('Error adding API key:', err.message); 188 | } else { 189 | console.log(`API key added: ${key}`); 190 | } 191 | }); 192 | } 193 | 194 | function changePort(newPort) { 195 | if (!newPort || isNaN(newPort)) { 196 | console.log('Invalid port number'); 197 | return; 198 | } 199 | const port = parseInt(newPort); 200 | if (server) { 201 | server.close((err) => { 202 | if (err) { 203 | console.error('Error closing the server:', err.message); 204 | } else { 205 | console.log(`Server closed on port ${currentPort}`); 206 | updatePortAndRestart(port); 207 | } 208 | }); 209 | } else { 210 | updatePortAndRestart(port); 211 | } 212 | } 213 | 214 | function updatePortAndRestart(port) { 215 | fs.writeFile('port.conf', port.toString(), (err) => { 216 | if (err) { 217 | console.error('Error saving port number:', err.message); 218 | } else { 219 | console.log(`Port number saved to port.conf: ${port}`); 220 | if (expressApp) { 221 | startServer(port, expressApp); 222 | } else { 223 | console.error('Express app not available. Unable to restart server.'); 224 | } 225 | } 226 | }); 227 | } 228 | 229 | function changeOllamaURL(newURL) { 230 | const urlPattern = /^(http|https):\/\/[^\s$.?#].[^\s]*$/gm; 231 | if (!newURL || !urlPattern.test(newURL)) { 232 | console.log('Invalid Ollama URL'); 233 | return; 234 | } 235 | const URL = newURL; 236 | fs.writeFile('ollamaURL.conf', URL, (err) => { 237 | if (err) { 238 | console.error('Error saving Ollama URL:', err.message); 239 | } else { 240 | console.log(`Ollama URL saved to ollamaURL.conf: ${URL}`); 241 | } 242 | }); 243 | } 244 | 245 | function setRateLimit(db, key, limit) { 246 | if (!key || !limit || isNaN(limit)) { 247 | console.log('Invalid API key or rate limit number'); 248 | return; 249 | } 250 | const rateLimit = parseInt(limit); 251 | db.run('UPDATE apiKeys SET rate_limit = ? WHERE key = ?', [rateLimit, key], (err) => { 252 | if (err) { 253 | console.error('Error setting rate limit:', err.message); 254 | } else { 255 | console.log(`Rate limit set to ${rateLimit} requests per minute for API key: ${key}`); 256 | } 257 | }); 258 | } 259 | 260 | function addWebhook(db, url) { 261 | if (!url) { 262 | console.log('Webhook URL is required'); 263 | return; 264 | } 265 | db.run('INSERT INTO webhooks (url) VALUES (?)', [url], (err) => { 266 | if (err) { 267 | console.error('Error adding webhook:', err.message); 268 | } else { 269 | console.log(`Webhook added: ${url}`); 270 | } 271 | }); 272 | } 273 | 274 | function deleteWebhook(db, id) { 275 | if (!id) { 276 | console.log('Webhook ID is required'); 277 | return; 278 | } 279 | db.run('DELETE FROM webhooks WHERE id = ?', [id], (err) => { 280 | if (err) { 281 | console.error('Error deleting webhook:', err.message); 282 | } else { 283 | console.log('Webhook deleted'); 284 | } 285 | }); 286 | } 287 | 288 | function listWebhooks(db) { 289 | db.all('SELECT id, url FROM webhooks', [], (err, rows) => { 290 | if (err) { 291 | console.error('Error listing webhooks:', err.message); 292 | } else { 293 | console.log('Webhooks:', rows); 294 | } 295 | }); 296 | } 297 | 298 | function activateKey(db, key) { 299 | db.run('UPDATE apiKeys SET active = 1 WHERE key = ?', [key], (err) => { 300 | if (err) { 301 | console.error('Error activating API key:', err.message); 302 | } else { 303 | console.log(`API key ${key} activated`); 304 | } 305 | }); 306 | } 307 | 308 | function deactivateKey(db, key) { 309 | db.run('UPDATE apiKeys SET active = 0 WHERE key = ?', [key], (err) => { 310 | if (err) { 311 | console.error('Error deactivating API key:', err.message); 312 | } else { 313 | console.log(`API key ${key} deactivated`); 314 | } 315 | }); 316 | } 317 | 318 | function addKeyDescription(db, key, description) { 319 | if (!key || !description) { 320 | console.log('Invalid API key or description'); 321 | return; 322 | } 323 | db.run('UPDATE apiKeys SET description = ? WHERE key = ?', [description, key], (err) => { 324 | if (err) { 325 | console.error('Error adding description:', err.message); 326 | } else { 327 | console.log(`Description added to API key ${key}`); 328 | } 329 | }); 330 | } 331 | 332 | function listKeyDescription(db, key) { 333 | if (!key) { 334 | console.log('Invalid API key'); 335 | return; 336 | } 337 | db.get('SELECT description FROM apiKeys WHERE key = ?', [key], (err, row) => { 338 | if (err) { 339 | console.error('Error retrieving description:', err.message); 340 | } else { 341 | if (row) { 342 | console.log(`Description for API key ${key}: ${row.description}`); 343 | } else { 344 | console.log(`No description found for API key ${key}`); 345 | } 346 | } 347 | }); 348 | } 349 | 350 | function regenerateKey(db, oldKey) { 351 | if (!oldKey) { 352 | console.log('Invalid API key'); 353 | return; 354 | } 355 | const newApiKey = crypto.randomBytes(20).toString('hex'); 356 | db.run('UPDATE apiKeys SET key = ? WHERE key = ?', [newApiKey, oldKey], (err) => { 357 | if (err) { 358 | console.error('Error regenerating API key:', err.message); 359 | } else { 360 | console.log(`API key regenerated. New API key: ${newApiKey}`); 361 | } 362 | }); 363 | } 364 | 365 | function activateAllKeys(db) { 366 | db.run('UPDATE apiKeys SET active = 1', (err) => { 367 | if (err) { 368 | console.error('Error activating all API keys:', err.message); 369 | } else { 370 | console.log('All API keys activated'); 371 | } 372 | }); 373 | } 374 | 375 | function deactivateAllKeys(db) { 376 | db.run('UPDATE apiKeys SET active = 0', (err) => { 377 | if (err) { 378 | console.error('Error deactivating all API keys:', err.message); 379 | } else { 380 | console.log('All API keys deactivated'); 381 | } 382 | }); 383 | } 384 | 385 | function getKeyInfo(db, key) { 386 | db.get('SELECT * FROM apiKeys WHERE key = ?', [key], (err, row) => { 387 | if (err) { 388 | console.error('Error retrieving API key info:', err.message); 389 | } else if (row) { 390 | console.log('API key info:', row); 391 | } else { 392 | console.log('No API key found with the given key.'); 393 | } 394 | }); 395 | } 396 | 397 | function listInactiveKeys(db) { 398 | db.all('SELECT key FROM apiKeys WHERE active = 0', [], (err, rows) => { 399 | if (err) { 400 | console.error('Error listing inactive API keys:', err.message); 401 | } else { 402 | console.log('Inactive API keys:', rows); 403 | } 404 | }); 405 | } 406 | 407 | function listActiveKeys(db) { 408 | db.all('SELECT key FROM apiKeys WHERE active = 1', [], (err, rows) => { 409 | if (err) { 410 | console.error('Error listing active API keys:', err.message); 411 | } else { 412 | console.log('Active API keys:', rows); 413 | } 414 | }); 415 | } 416 | 417 | function getOllamaURL() { 418 | return new Promise((resolve, reject) => { 419 | if (fs.existsSync('ollamaURL.conf')) { 420 | fs.readFile('ollamaURL.conf', 'utf8', (err, data) => { 421 | if (err) { 422 | reject('Error reading Ollama url from file:', err.message); 423 | } else { 424 | const ollamaURL = data.trim(); 425 | if (typeof ollamaURL !== 'string' || ollamaURL === '') { 426 | reject('Invalid Ollama url in ollamaURL.conf'); 427 | } else { 428 | resolve(ollamaURL); 429 | } 430 | } 431 | }); 432 | } else { 433 | reject('Ollama url configuration file not found'); 434 | } 435 | }); 436 | } 437 | 438 | function sendWebhookNotification(db, payload) { 439 | db.all('SELECT url FROM webhooks', [], (err, rows) => { 440 | if (err) { 441 | console.error('Error retrieving webhooks:', err.message); 442 | } else { 443 | rows.forEach(row => { 444 | const webhookPayload = { 445 | content: JSON.stringify(payload, null, 2) 446 | }; 447 | 448 | axios.post(row.url, webhookPayload) 449 | .then(response => { 450 | console.log('Webhook notification sent successfully:', response.data); 451 | }) 452 | .catch(error => { 453 | console.error('Error sending webhook notification:', error.message); 454 | }); 455 | }); 456 | } 457 | }); 458 | } 459 | 460 | module.exports = { 461 | startServer, 462 | askForPort, 463 | askForOllamaURL, 464 | startCLI, 465 | getOllamaURL, 466 | sendWebhookNotification, 467 | updatePortAndRestart 468 | }; 469 | --------------------------------------------------------------------------------