├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── packages ├── mcpctl │ ├── claude_config.ts │ ├── create_package.ts │ ├── index.ts │ ├── package.json │ ├── registry │ │ └── registry_manager.ts │ ├── term.ts │ └── types │ │ └── registry.ts └── registry │ ├── db │ ├── index.ts │ └── schema.ts │ ├── drizzle.config.ts │ ├── migrations │ ├── 0000_add_packages.sql │ └── meta │ │ ├── 0000_snapshot.json │ │ └── _journal.json │ ├── package-lock.json │ ├── package.json │ ├── src │ ├── authMiddleware.ts │ ├── index.ts │ └── server.ts │ └── tsconfig.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | 2 | # Contributor Covenant Code of Conduct 3 | 4 | ## Our Pledge 5 | 6 | We as members, contributors, and leaders pledge to make participation in our 7 | community a harassment-free experience for everyone, regardless of age, body 8 | size, visible or invisible disability, ethnicity, sex characteristics, gender 9 | identity and expression, level of experience, education, socio-economic status, 10 | nationality, personal appearance, race, caste, color, religion, or sexual 11 | identity and orientation. 12 | 13 | We pledge to act and interact in ways that contribute to an open, welcoming, 14 | diverse, inclusive, and healthy community. 15 | 16 | ## Our Standards 17 | 18 | Examples of behavior that contributes to a positive environment for our 19 | community include: 20 | 21 | * Demonstrating empathy and kindness toward other people 22 | * Being respectful of differing opinions, viewpoints, and experiences 23 | * Giving and gracefully accepting constructive feedback 24 | * Accepting responsibility and apologizing to those affected by our mistakes, 25 | and learning from the experience 26 | * Focusing on what is best not just for us as individuals, but for the overall 27 | community 28 | 29 | Examples of unacceptable behavior include: 30 | 31 | * The use of sexualized language or imagery, and sexual attention or advances of 32 | any kind 33 | * Trolling, insulting or derogatory comments, and personal or political attacks 34 | * Public or private harassment 35 | * Publishing others' private information, such as a physical or email address, 36 | without their explicit permission 37 | * Other conduct which could reasonably be considered inappropriate in a 38 | professional setting 39 | 40 | ## Enforcement Responsibilities 41 | 42 | Community leaders are responsible for clarifying and enforcing our standards of 43 | acceptable behavior and will take appropriate and fair corrective action in 44 | response to any behavior that they deem inappropriate, threatening, offensive, 45 | or harmful. 46 | 47 | Community leaders have the right and responsibility to remove, edit, or reject 48 | comments, commits, code, wiki edits, issues, and other contributions that are 49 | not aligned to this Code of Conduct, and will communicate reasons for moderation 50 | decisions when appropriate. 51 | 52 | ## Scope 53 | 54 | This Code of Conduct applies within all community spaces, and also applies when 55 | an individual is officially representing the community in public spaces. 56 | Examples of representing our community include using an official email address, 57 | posting via an official social media account, or acting as an appointed 58 | representative at an online or offline event. 59 | 60 | ## Enforcement 61 | 62 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 63 | reported to the community leaders responsible for enforcement to @cloudycotton. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series of 86 | actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or permanent 93 | ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within the 113 | community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.1, available at 119 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 120 | 121 | Community Impact Guidelines were inspired by 122 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 123 | 124 | For answers to common questions about this code of conduct, see the FAQ at 125 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at 126 | [https://www.contributor-covenant.org/translations][translations]. 127 | 128 | [homepage]: https://www.contributor-covenant.org 129 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 130 | [Mozilla CoC]: https://github.com/mozilla/diversity 131 | [FAQ]: https://www.contributor-covenant.org/faq 132 | [translations]: https://www.contributor-covenant.org/translations 133 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2025 cloudycotton 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # mcp_ctl 4 | 5 | ### A powerful package manager for MCP (Model Context Protocol) servers ✨ 6 | 7 | [![Discord](https://img.shields.io/badge/discord-purple.svg)](https://discord.gg/BcWWRCnap6) 8 | 9 | https://github.com/user-attachments/assets/eb618219-c638-4546-b2e3-865f46a4c3ab 10 | 11 |
12 | 13 | ## 📦 Installation 14 | 15 | ```sh 16 | npm install -g mcpctl 17 | ``` 18 | 19 | ## 🔧 Usage 20 | 21 | ```sh 22 | # 🔍 Install a server 23 | mcpctl install playwright # install playwright server 24 | 25 | # 🗑️ Remove a server 26 | mcpctl remove playwright # remove playwright server 27 | 28 | # 🔎 Search for servers 29 | mcpctl packages github # search for mcp server with specific name 30 | 31 | # 📋 List installed servers 32 | mcpctl list # show existing mcp servers installed on the device 33 | ``` 34 | 35 | 36 | ## 🛠 Development Setup 37 | 38 | 1. Clone the repository: 39 | git clone https://github.com/cloudycotton/mcp_ctl.git 40 | cd mcp_ctl 41 | 42 | 43 | 2. Install dependencies: 44 | npm install 45 | 46 | 47 | 4. Run development commands: 48 | 49 | # List packages 50 | npm run dev -- packages 51 | 52 | # Search for specific package 53 | npm run dev -- search github 54 | 55 | # Install a package 56 | npm run dev -- install playwright 57 | 58 | # List installed servers 59 | npm run dev -- list 60 | 61 | ## Adding your own package. 62 | 63 | 1. Clone the repo 64 | 2. Add your package to packages folder 65 | 3. Add import from it inside packages.ts 66 | 67 | 68 | ## 🌟 Features 69 | 70 | - 🔄 Simple installation and management of MCP servers 71 | - 🔍 Easy discovery of available packages 72 | - 📱 Cross-platform support 73 | - ⚡ Lightweight and fast 74 | - 🧩 Seamless integration with your workflow 75 | 76 | ## 📄 License 77 | 78 |
79 | 80 | This project is licensed under the [MIT License](LICENSE) 📝 81 | 82 | --- 83 | 84 | Made with ❤️ for the MCP community 85 | 86 |
87 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-monorepo", 3 | "private": true, 4 | "workspaces": [ 5 | "packages/mcpctl", 6 | "packages/registry" 7 | ], 8 | "scripts": { 9 | "build": "npm run build --workspaces", 10 | "dev": "npm run dev --workspaces" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/mcpctl/claude_config.ts: -------------------------------------------------------------------------------- 1 | import path from "node:path"; 2 | import os from "node:os"; 3 | import fs from "fs/promises"; 4 | 5 | // Config file management 6 | export function getClaudeConfigDir(): string { 7 | switch (os.platform()) { 8 | case "darwin": 9 | return path.join( 10 | os.homedir(), 11 | "Library", 12 | "Application Support", 13 | "Claude" 14 | ); 15 | case "win32": 16 | if (!process.env.APPDATA) { 17 | throw new Error("APPDATA environment variable is not set"); 18 | } 19 | return path.join(process.env.APPDATA, "Claude"); 20 | case "linux": 21 | return path.join(os.homedir(), ".config", "claude"); 22 | default: 23 | throw new Error( 24 | `Unsupported operating system for Claude configuration: ${os.platform()}` 25 | ); 26 | } 27 | } 28 | 29 | export async function readClaudeConfig() { 30 | const configDir = getClaudeConfigDir(); 31 | const configFile = path.join(configDir, "claude_desktop_config.json"); 32 | 33 | try { 34 | const rawConfig = await fs.readFile(configFile, "utf-8"); 35 | return JSON.parse(rawConfig); 36 | } catch (err: any) { 37 | if (err.code === "ENOENT") { 38 | // File doesn't exist, create initial config 39 | const initialConfig = { mcpServers: {} }; 40 | await fs.mkdir(configDir, { recursive: true }); 41 | await fs.writeFile(configFile, JSON.stringify(initialConfig, null, 2)); 42 | return initialConfig; 43 | } 44 | throw err; 45 | } 46 | } 47 | 48 | export async function writeClaudeConfig(config: any) { 49 | const configDir = getClaudeConfigDir(); 50 | const configFile = path.join(configDir, "claude_desktop_config.json"); 51 | await fs.mkdir(configDir, { recursive: true }); 52 | await fs.writeFile(configFile, JSON.stringify(config, null, 2)); 53 | } 54 | -------------------------------------------------------------------------------- /packages/mcpctl/create_package.ts: -------------------------------------------------------------------------------- 1 | export type InputType = "boolean" | "string" | "password"; 2 | 3 | export interface Input { 4 | name: string; 5 | description: string; 6 | required?: boolean; 7 | type: InputType; 8 | default?: string | boolean | number; 9 | } 10 | 11 | // Define a utility type to extract input names as a string union 12 | export type InputNames = T[number]["name"]; 13 | 14 | // Improved inference helper that properly handles required vs optional 15 | export type InferInputValues = { 16 | [K in InputNames]: Extract< 17 | T[number], 18 | { name: K } 19 | >["required"] extends false 20 | ? unknown | undefined 21 | : unknown; 22 | }; 23 | 24 | // Package interface that correctly infers input types 25 | export interface Package { 26 | name: string; 27 | aliases: string[]; 28 | dependsOn: string[]; 29 | inputs: T; 30 | buildConfig: (userInputs: InferInputValues) => MCPConfig; 31 | } 32 | 33 | export interface MCPConfig { 34 | command: string; 35 | args: string[]; 36 | env: Record; 37 | } 38 | 39 | // Helper function to create a properly typed package 40 | export function createPackage( 41 | packageDef: Omit, "buildConfig"> & { 42 | buildConfig: (userInputs: InferInputValues) => MCPConfig; 43 | } 44 | ): Package { 45 | return packageDef; 46 | } 47 | -------------------------------------------------------------------------------- /packages/mcpctl/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import yargs from "yargs"; 4 | import { hideBin } from "yargs/helpers"; 5 | import inquirer from "inquirer"; 6 | import { spawn } from "child_process"; 7 | import { readClaudeConfig, writeClaudeConfig } from "./claude_config"; 8 | import { term } from "./term"; 9 | import { InputType } from "./create_package"; 10 | import { RegistryManager } from "./registry/registry_manager"; 11 | import { PackageMetadata } from "./types/registry"; 12 | const registryManager = new RegistryManager({ 13 | 14 | baseUrl: process.env.BACKEND_URL || "https://mcpctl-production-8128.up.railway.app", 15 | }); 16 | 17 | async function formatPackage(pkg: PackageMetadata) { 18 | if (!pkg) return ""; 19 | 20 | return ` 21 | ${term.bold(pkg.name)} ${term.gray(`(${pkg.version})`)} 22 | ${term.dim("Dependencies:")} ${ 23 | pkg.dependencies.length ? pkg.dependencies.join(", ") : "None" 24 | } 25 | ${term.dim("Inputs:")} 26 | ${pkg.inputs 27 | .map( 28 | (input) => 29 | ` ${input.name}${input.required ? term.red("*") : ""}: ${ 30 | input.description 31 | }` 32 | ) 33 | .join("\n")} 34 | `; 35 | } 36 | 37 | // CLI Commands 38 | async function listServers() { 39 | const config = await readClaudeConfig(); 40 | 41 | if (!config.mcpServers || Object.keys(config.mcpServers).length === 0) { 42 | console.log(term.yellow("No MCP servers configured")); 43 | return; 44 | } 45 | 46 | console.log(term.bold("\nConfigured MCP Servers:")); 47 | Object.entries(config.mcpServers).forEach(([name, server]: [string, any]) => { 48 | console.log(` 49 | ${term.green(name)} 50 | Command: ${server.command} 51 | Args: ${server.args.join(" ")} 52 | `); 53 | }); 54 | } 55 | async function installPackage(packageName: string, serverName?: string) { 56 | let packages = await registryManager.listPackages(packageName, true); 57 | const pkg = packages[0]; 58 | 59 | if (pkg.dependencies.length > 0) { 60 | console.log( 61 | term.yellow(`Checking dependencies: ${pkg.dependencies.join(", ")}`) 62 | ); 63 | } 64 | if (pkg.instructions){ 65 | const instructions = pkg.instructions; 66 | console.log(term.red("Instructions:")); 67 | for (const instruction of instructions) { 68 | console.log(term.yellow(instruction)); 69 | } 70 | } 71 | 72 | let finalServerName = serverName; 73 | if (!finalServerName) { 74 | const answers = await inquirer.prompt([ 75 | { 76 | type: "input", 77 | name: "serverName", 78 | message: "Enter a name for this MCP server:", 79 | default: pkg.name, 80 | validate: (input) => 81 | input.trim() !== "" ? true : "Server name cannot be empty", 82 | }, 83 | ]); 84 | finalServerName = answers.serverName; 85 | } 86 | 87 | const inputs: Record = {}; 88 | for (const input of pkg.inputs) { 89 | const inputType = input.type as InputType; 90 | 91 | let promptType: string; 92 | switch (inputType) { 93 | case "boolean": 94 | promptType = "confirm"; 95 | break; 96 | case "password": 97 | promptType = "password"; 98 | break; 99 | case "string": 100 | default: 101 | promptType = "input"; 102 | break; 103 | } 104 | 105 | const promptConfig: any = { 106 | type: promptType, 107 | name: "value", 108 | message: `${input.description}${input.required ? " (required)" : ""}:`, 109 | }; 110 | 111 | if ((input as any).default) { 112 | promptConfig.default = (input as any).default; 113 | } 114 | 115 | promptConfig.validate = (value: any) => { 116 | if (input.required) { 117 | if (inputType === "boolean") { 118 | return true; 119 | } else if ( 120 | value === undefined || 121 | (typeof value === "string" && value.trim() === "") 122 | ) { 123 | return `${input.name} is required`; 124 | } 125 | } 126 | return true; 127 | }; 128 | 129 | const answers = await inquirer.prompt([promptConfig]); 130 | inputs[input.name] = answers.value; 131 | } 132 | 133 | const mcpConfig = await registryManager.buildConfig(packageName, inputs); 134 | 135 | await updateClaudeConfig({ 136 | name: finalServerName, 137 | command: mcpConfig.command, 138 | args: mcpConfig.args, 139 | env: mcpConfig.env, 140 | }); 141 | 142 | console.log( 143 | term.green(`✅ Successfully installed ${pkg.name} as "${finalServerName}"`) 144 | ); 145 | } 146 | 147 | async function updateClaudeConfig({ 148 | name, 149 | command, 150 | args, 151 | env, 152 | }: { 153 | name: string; 154 | command: string; 155 | args: string[]; 156 | env: Record; 157 | }) { 158 | try { 159 | const config = await readClaudeConfig(); 160 | 161 | if (!config.mcpServers) { 162 | config.mcpServers = {}; 163 | } 164 | 165 | if (config.mcpServers[name]) { 166 | const { replace } = await inquirer.prompt([ 167 | { 168 | type: "confirm", 169 | name: "replace", 170 | message: `An MCP server named "${name}" is already configured. Do you want to replace it?`, 171 | default: false, 172 | }, 173 | ]); 174 | 175 | if (!replace) { 176 | console.log( 177 | term.yellow( 178 | `⚠️ Skipped replacing config for existing MCP server "${name}"` 179 | ) 180 | ); 181 | return; 182 | } 183 | } 184 | 185 | config.mcpServers[name] = { 186 | command, 187 | args, 188 | env, 189 | }; 190 | 191 | await writeClaudeConfig(config); 192 | console.log( 193 | term.green("✅ Successfully added MCP server to Claude configuration") 194 | ); 195 | } catch (error) { 196 | console.error(term.red("⚠️ Failed to update Claude configuration"), error); 197 | } 198 | } 199 | 200 | async function removeServer(serverName: string) { 201 | const config = await readClaudeConfig(); 202 | 203 | if (!config.mcpServers || !config.mcpServers[serverName]) { 204 | console.log(term.yellow(`No MCP server named "${serverName}" found`)); 205 | return; 206 | } 207 | 208 | const { confirm } = await inquirer.prompt([ 209 | { 210 | type: "confirm", 211 | name: "confirm", 212 | message: `Are you sure you want to remove the MCP server "${serverName}"?`, 213 | default: false, 214 | }, 215 | ]); 216 | 217 | if (!confirm) { 218 | console.log(term.yellow("Operation cancelled")); 219 | return; 220 | } 221 | 222 | delete config.mcpServers[serverName]; 223 | await writeClaudeConfig(config); 224 | console.log(term.green(`✅ Successfully removed MCP server "${serverName}"`)); 225 | } 226 | 227 | async function startServer(serverName: string) { 228 | const config = await readClaudeConfig(); 229 | 230 | if (!config.mcpServers || !config.mcpServers[serverName]) { 231 | console.log(term.yellow(`No MCP server named "${serverName}" found`)); 232 | return; 233 | } 234 | 235 | const serverConfig = config.mcpServers[serverName]; 236 | 237 | console.log(term.green(`Starting MCP server "${serverName}"...`)); 238 | console.log( 239 | `Command: ${serverConfig.command} ${serverConfig.args.join(" ")}` 240 | ); 241 | 242 | try { 243 | const child = spawn(serverConfig.command, serverConfig.args, { 244 | stdio: "inherit", 245 | env: { ...process.env, ...serverConfig.env }, 246 | }); 247 | 248 | child.on("error", (error) => { 249 | console.error(term.red(`Failed to start server: ${error.message}`)); 250 | }); 251 | 252 | process.on("SIGINT", () => { 253 | console.log(term.yellow("\nStopping MCP server...")); 254 | child.kill("SIGINT"); 255 | }); 256 | 257 | console.log( 258 | term.green(`MCP server "${serverName}" is running (PID: ${child.pid})`) 259 | ); 260 | console.log(term.gray("Press Ctrl+C to stop the server")); 261 | 262 | await new Promise((resolve) => { 263 | child.on("close", (code) => { 264 | console.log(term.yellow(`MCP server exited with code ${code}`)); 265 | resolve(null); 266 | }); 267 | }); 268 | } catch (error: any) { 269 | console.error(term.red(`Failed to start server: ${error.message}`)); 270 | } 271 | } 272 | 273 | async function listPackages(searchTerm?: string) { 274 | let packages = await registryManager.listPackages(searchTerm); 275 | if (packages.length == 0) { 276 | console.log(term.red(`No packages found`)); 277 | return; 278 | } 279 | 280 | for (const pkg of packages) { 281 | console.log(await formatPackage(pkg)); 282 | } 283 | console.log(term.green(`Found ${packages.length} packages`)); 284 | } 285 | 286 | // Main CLI definition 287 | async function main() { 288 | return yargs(hideBin(process.argv)) 289 | .command("list", "List all configured MCP servers", {}, async () => { 290 | await listServers(); 291 | }) 292 | .command( 293 | "packages [search]", 294 | "List available packages", 295 | (yargs) => { 296 | return yargs.positional("search", { 297 | describe: "Search term to filter packages", 298 | type: "string", 299 | }); 300 | }, 301 | async (argv) => { 302 | await listPackages(argv.search as string | undefined); 303 | } 304 | ) 305 | .command( 306 | "install [name]", 307 | "Install and configure an MCP package", 308 | (yargs) => { 309 | return yargs 310 | .positional("package", { 311 | describe: "Package to install", 312 | type: "string", 313 | demandOption: true, 314 | }) 315 | .positional("name", { 316 | describe: "Name for the MCP server", 317 | type: "string", 318 | }); 319 | }, 320 | async (argv) => { 321 | await installPackage( 322 | argv.package as string, 323 | argv.name as string | undefined 324 | ); 325 | } 326 | ) 327 | .command( 328 | "remove ", 329 | "Remove a configured MCP server", 330 | (yargs) => { 331 | return yargs.positional("name", { 332 | describe: "Name of the MCP server to remove", 333 | type: "string", 334 | demandOption: true, 335 | }); 336 | }, 337 | async (argv) => { 338 | await removeServer(argv.name as string); 339 | } 340 | ) 341 | .command( 342 | "start ", 343 | "Start an MCP server", 344 | (yargs) => { 345 | return yargs.positional("name", { 346 | describe: "Name of the MCP server to start", 347 | type: "string", 348 | demandOption: true, 349 | }); 350 | }, 351 | async (argv) => { 352 | await startServer(argv.name as string); 353 | } 354 | ) 355 | .command( 356 | "search ", 357 | "Search for packages", 358 | (yargs) => { 359 | return yargs.positional("term", { 360 | describe: "Search term", 361 | type: "string", 362 | demandOption: true, 363 | }); 364 | }, 365 | async (argv) => { 366 | await listPackages(argv.term as string); 367 | } 368 | ) 369 | .example([ 370 | ["$0 packages", "List all available packages"], 371 | [ 372 | "$0 install github my-gh-server", 373 | 'Install the GitHub package as "my-gh-server"', 374 | ], 375 | ["$0 list", "List all configured MCP servers"], 376 | ["$0 start my-gh-server", 'Start the "my-gh-server" MCP server'], 377 | ["$0 search mongo", 'Search for packages matching "mongo"'], 378 | ]) 379 | .recommendCommands() 380 | .strict() 381 | .alias("h", "help") 382 | .alias("v", "version") 383 | .wrap(yargs().terminalWidth()) 384 | .epilogue("For more information, visit https://github.com/runablehq/mcpctl") 385 | .demandCommand(1, "Please specify a command") 386 | .parse(); 387 | } 388 | 389 | main().catch((error) => { 390 | console.error(term.red("Error:"), error.message); 391 | process.exit(1); 392 | }); 393 | -------------------------------------------------------------------------------- /packages/mcpctl/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcpctl", 3 | "version": "0.0.6", 4 | "main": "dist/index.js", 5 | "bin": { 6 | "mcpctl": "./dist/index.js" 7 | }, 8 | "scripts": { 9 | "build": "tsup index.ts", 10 | "dev": "tsx index.ts" 11 | }, 12 | "dependencies": { 13 | "chalk": "^5.4.1", 14 | "dotenv": "^16.5.0", 15 | "inquirer": "^12.5.2", 16 | "yargs": "^17.7.2" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^22.14.0", 20 | "@types/yargs": "^17.0.33", 21 | "tsup": "^8.4.0", 22 | "tsx": "^4.19.3", 23 | "typescript": "^5.8.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/mcpctl/registry/registry_manager.ts: -------------------------------------------------------------------------------- 1 | import { PackageMetadata } from "../types/registry"; 2 | interface RegistryOptions { 3 | baseUrl: string; 4 | } 5 | 6 | export class RegistryManager { 7 | baseUrl: string; 8 | 9 | constructor(options: RegistryOptions) { 10 | this.baseUrl = options.baseUrl; 11 | } 12 | 13 | async listPackages( 14 | searchTerm?: string, 15 | hard_search?: boolean 16 | ): Promise { 17 | try { 18 | const params = new URLSearchParams(); 19 | 20 | if (searchTerm) params.append("package_name", searchTerm); 21 | if (hard_search !== undefined) 22 | params.append("hard_search", String(hard_search)); 23 | 24 | const url = `${this.baseUrl}/search?${params.toString()}`; 25 | const response = await fetch(url); 26 | if (!response.ok) { 27 | throw new Error(`HTTP error! status: ${response.status}`); 28 | } 29 | const data = await response.json(); 30 | const packages = data.packages; 31 | 32 | if (!packages) return []; 33 | 34 | return packages.map((pkg: any) => ({ 35 | name: pkg.name, 36 | version: pkg.latest_version, 37 | description: pkg.description, 38 | repository: pkg.repository, 39 | maintainer: pkg.maintainer, 40 | inputs: pkg.manifest.inputs || [], 41 | buildConfig: pkg.manifest.buildConfig, 42 | instructions: pkg.manifest.instructions, 43 | dependencies: pkg.manifest.dependencies || [], 44 | })); 45 | } catch (error) { 46 | console.error("Error fetching packages:", error); 47 | return []; 48 | } 49 | } 50 | 51 | async buildConfig( 52 | name: string, 53 | inputs: Record 54 | ): Promise<{ 55 | command: string; 56 | args: string[]; 57 | env: Record; 58 | }> { 59 | let all_packages = await this.listPackages(name, true); 60 | const pkg = all_packages[0]; 61 | console.log("Install testing", pkg); 62 | if (!pkg || !pkg.buildConfig) { 63 | throw new Error(`No build configuration found for package ${name}`); 64 | } 65 | 66 | const config = { 67 | command: pkg.buildConfig.command, 68 | args: [...pkg.buildConfig.args], 69 | env: {} as Record, 70 | }; 71 | 72 | if (pkg.buildConfig.configOptions) { 73 | for (const [key, flag] of Object.entries(pkg.buildConfig.configOptions)) { 74 | if (inputs[key]) { 75 | config.args.push(flag as string); 76 | } 77 | } 78 | } 79 | 80 | pkg.inputs.forEach((input) => { 81 | if (inputs[input.name]) { 82 | config.env[input.name] = String(inputs[input.name]); 83 | } 84 | }); 85 | 86 | return config; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /packages/mcpctl/term.ts: -------------------------------------------------------------------------------- 1 | // Terminal styling utility (replacement for chalk) 2 | export const term = { 3 | bold: (text: string) => `\x1b[1m${text}\x1b[0m`, 4 | green: (text: string) => `\x1b[32m${text}\x1b[0m`, 5 | red: (text: string) => `\x1b[31m${text}\x1b[0m`, 6 | yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, 7 | gray: (text: string) => `\x1b[90m${text}\x1b[0m`, 8 | dim: (text: string) => `\x1b[2m${text}\x1b[0m`, 9 | }; 10 | -------------------------------------------------------------------------------- /packages/mcpctl/types/registry.ts: -------------------------------------------------------------------------------- 1 | export interface PackageInput { 2 | name: string; 3 | type: 'string' | 'boolean' | 'number'; 4 | required: boolean; 5 | description: string; 6 | } 7 | 8 | export interface BuildConfig { 9 | command: string; 10 | args: string[]; 11 | configOptions?: Record; 12 | } 13 | 14 | export interface PackageMetadata { 15 | name: string; 16 | aliases: string[]; 17 | version: string; 18 | description: string; 19 | repository: string; 20 | maintainer: string; 21 | inputs: PackageInput[]; 22 | dependencies: string[]; 23 | instructions: string[]; 24 | buildConfig: BuildConfig; 25 | } 26 | 27 | export interface Registry { 28 | registryVersion: string; 29 | lastUpdated: string; 30 | packages: Record; 31 | } -------------------------------------------------------------------------------- /packages/registry/db/index.ts: -------------------------------------------------------------------------------- 1 | import { drizzle } from "drizzle-orm/postgres-js"; 2 | import postgres from "postgres"; 3 | import * as schema from "./schema.js"; 4 | import dotenv from "dotenv"; 5 | dotenv.config(); 6 | const client = postgres(process.env.DATABASE_URL!, { 7 | prepare: false, 8 | }); 9 | 10 | export const database = drizzle(client, { schema }); -------------------------------------------------------------------------------- /packages/registry/db/schema.ts: -------------------------------------------------------------------------------- 1 | import { pgTable, text, jsonb, timestamp } from "drizzle-orm/pg-core"; 2 | 3 | export const Package = pgTable("packages", { 4 | id: text("id").notNull().primaryKey(), 5 | name: text("name").notNull(), 6 | latest_version: text("latest_version").notNull(), 7 | description: text("description"), 8 | repository: text("repository"), 9 | maintainer: text("maintainer"), 10 | manifest: jsonb("manifest").notNull(), 11 | createdAt: timestamp("created_at").defaultNow(), 12 | }).enableRLS(); 13 | -------------------------------------------------------------------------------- /packages/registry/drizzle.config.ts: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | import { defineConfig } from "drizzle-kit"; 3 | 4 | export default defineConfig({ 5 | out: "./migrations", 6 | schema: "./db/schema.ts", 7 | dialect: "postgresql", 8 | dbCredentials: { 9 | url: process.env.DATABASE_URL!, 10 | }, 11 | migrations: { 12 | table: "migration-history", 13 | schema: "public", 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /packages/registry/migrations/0000_add_packages.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "packages" ( 2 | "id" text PRIMARY KEY NOT NULL, 3 | "name" text NOT NULL, 4 | "latest_version" text NOT NULL, 5 | "description" text, 6 | "repository" text, 7 | "maintainer" text, 8 | "manifest" jsonb NOT NULL, 9 | "created_at" timestamp DEFAULT now() 10 | ); 11 | --> statement-breakpoint 12 | ALTER TABLE "packages" ENABLE ROW LEVEL SECURITY; -------------------------------------------------------------------------------- /packages/registry/migrations/meta/0000_snapshot.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c09833fb-07ad-4a6c-9ca7-b03e829b7945", 3 | "prevId": "00000000-0000-0000-0000-000000000000", 4 | "version": "7", 5 | "dialect": "postgresql", 6 | "tables": { 7 | "public.packages": { 8 | "name": "packages", 9 | "schema": "", 10 | "columns": { 11 | "id": { 12 | "name": "id", 13 | "type": "text", 14 | "primaryKey": true, 15 | "notNull": true 16 | }, 17 | "name": { 18 | "name": "name", 19 | "type": "text", 20 | "primaryKey": false, 21 | "notNull": true 22 | }, 23 | "latest_version": { 24 | "name": "latest_version", 25 | "type": "text", 26 | "primaryKey": false, 27 | "notNull": true 28 | }, 29 | "description": { 30 | "name": "description", 31 | "type": "text", 32 | "primaryKey": false, 33 | "notNull": false 34 | }, 35 | "repository": { 36 | "name": "repository", 37 | "type": "text", 38 | "primaryKey": false, 39 | "notNull": false 40 | }, 41 | "maintainer": { 42 | "name": "maintainer", 43 | "type": "text", 44 | "primaryKey": false, 45 | "notNull": false 46 | }, 47 | "manifest": { 48 | "name": "manifest", 49 | "type": "jsonb", 50 | "primaryKey": false, 51 | "notNull": true 52 | }, 53 | "created_at": { 54 | "name": "created_at", 55 | "type": "timestamp", 56 | "primaryKey": false, 57 | "notNull": false, 58 | "default": "now()" 59 | } 60 | }, 61 | "indexes": {}, 62 | "foreignKeys": {}, 63 | "compositePrimaryKeys": {}, 64 | "uniqueConstraints": {}, 65 | "policies": {}, 66 | "checkConstraints": {}, 67 | "isRLSEnabled": true 68 | } 69 | }, 70 | "enums": {}, 71 | "schemas": {}, 72 | "sequences": {}, 73 | "roles": {}, 74 | "policies": {}, 75 | "views": {}, 76 | "_meta": { 77 | "columns": {}, 78 | "schemas": {}, 79 | "tables": {} 80 | } 81 | } -------------------------------------------------------------------------------- /packages/registry/migrations/meta/_journal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "7", 3 | "dialect": "postgresql", 4 | "entries": [ 5 | { 6 | "idx": 0, 7 | "version": "7", 8 | "when": 1745413513339, 9 | "tag": "0000_add_packages", 10 | "breakpoints": true 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /packages/registry/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mcpctl/registry", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@mcpctl/registry", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "@hono/node-server": "^1.14.1", 12 | "dotenv": "^16.5.0", 13 | "drizzle-kit": "^0.31.0", 14 | "drizzle-orm": "^0.42.0", 15 | "hono": "^4.0.0", 16 | "postgres": "^3.4.5", 17 | "tsx": "^4.19.3" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^22.14.1", 21 | "tsup": "^8.4.0", 22 | "typescript": "^5.8.3" 23 | } 24 | }, 25 | "node_modules/@drizzle-team/brocli": { 26 | "version": "0.10.2", 27 | "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", 28 | "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==" 29 | }, 30 | "node_modules/@esbuild-kit/core-utils": { 31 | "version": "3.3.2", 32 | "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", 33 | "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", 34 | "deprecated": "Merged into tsx: https://tsx.is", 35 | "dependencies": { 36 | "esbuild": "~0.18.20", 37 | "source-map-support": "^0.5.21" 38 | } 39 | }, 40 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { 41 | "version": "0.18.20", 42 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 43 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 44 | "cpu": [ 45 | "arm" 46 | ], 47 | "optional": true, 48 | "os": [ 49 | "android" 50 | ], 51 | "engines": { 52 | "node": ">=12" 53 | } 54 | }, 55 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { 56 | "version": "0.18.20", 57 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 58 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 59 | "cpu": [ 60 | "arm64" 61 | ], 62 | "optional": true, 63 | "os": [ 64 | "android" 65 | ], 66 | "engines": { 67 | "node": ">=12" 68 | } 69 | }, 70 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { 71 | "version": "0.18.20", 72 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 73 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 74 | "cpu": [ 75 | "x64" 76 | ], 77 | "optional": true, 78 | "os": [ 79 | "android" 80 | ], 81 | "engines": { 82 | "node": ">=12" 83 | } 84 | }, 85 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { 86 | "version": "0.18.20", 87 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 88 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 89 | "cpu": [ 90 | "arm64" 91 | ], 92 | "optional": true, 93 | "os": [ 94 | "darwin" 95 | ], 96 | "engines": { 97 | "node": ">=12" 98 | } 99 | }, 100 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { 101 | "version": "0.18.20", 102 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 103 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 104 | "cpu": [ 105 | "x64" 106 | ], 107 | "optional": true, 108 | "os": [ 109 | "darwin" 110 | ], 111 | "engines": { 112 | "node": ">=12" 113 | } 114 | }, 115 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { 116 | "version": "0.18.20", 117 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 118 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 119 | "cpu": [ 120 | "arm64" 121 | ], 122 | "optional": true, 123 | "os": [ 124 | "freebsd" 125 | ], 126 | "engines": { 127 | "node": ">=12" 128 | } 129 | }, 130 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { 131 | "version": "0.18.20", 132 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 133 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 134 | "cpu": [ 135 | "x64" 136 | ], 137 | "optional": true, 138 | "os": [ 139 | "freebsd" 140 | ], 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { 146 | "version": "0.18.20", 147 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 148 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 149 | "cpu": [ 150 | "arm" 151 | ], 152 | "optional": true, 153 | "os": [ 154 | "linux" 155 | ], 156 | "engines": { 157 | "node": ">=12" 158 | } 159 | }, 160 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { 161 | "version": "0.18.20", 162 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 163 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 164 | "cpu": [ 165 | "arm64" 166 | ], 167 | "optional": true, 168 | "os": [ 169 | "linux" 170 | ], 171 | "engines": { 172 | "node": ">=12" 173 | } 174 | }, 175 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { 176 | "version": "0.18.20", 177 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 178 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 179 | "cpu": [ 180 | "ia32" 181 | ], 182 | "optional": true, 183 | "os": [ 184 | "linux" 185 | ], 186 | "engines": { 187 | "node": ">=12" 188 | } 189 | }, 190 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { 191 | "version": "0.18.20", 192 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 193 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 194 | "cpu": [ 195 | "loong64" 196 | ], 197 | "optional": true, 198 | "os": [ 199 | "linux" 200 | ], 201 | "engines": { 202 | "node": ">=12" 203 | } 204 | }, 205 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { 206 | "version": "0.18.20", 207 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 208 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 209 | "cpu": [ 210 | "mips64el" 211 | ], 212 | "optional": true, 213 | "os": [ 214 | "linux" 215 | ], 216 | "engines": { 217 | "node": ">=12" 218 | } 219 | }, 220 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { 221 | "version": "0.18.20", 222 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 223 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 224 | "cpu": [ 225 | "ppc64" 226 | ], 227 | "optional": true, 228 | "os": [ 229 | "linux" 230 | ], 231 | "engines": { 232 | "node": ">=12" 233 | } 234 | }, 235 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { 236 | "version": "0.18.20", 237 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 238 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 239 | "cpu": [ 240 | "riscv64" 241 | ], 242 | "optional": true, 243 | "os": [ 244 | "linux" 245 | ], 246 | "engines": { 247 | "node": ">=12" 248 | } 249 | }, 250 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { 251 | "version": "0.18.20", 252 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 253 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 254 | "cpu": [ 255 | "s390x" 256 | ], 257 | "optional": true, 258 | "os": [ 259 | "linux" 260 | ], 261 | "engines": { 262 | "node": ">=12" 263 | } 264 | }, 265 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { 266 | "version": "0.18.20", 267 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 268 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 269 | "cpu": [ 270 | "x64" 271 | ], 272 | "optional": true, 273 | "os": [ 274 | "linux" 275 | ], 276 | "engines": { 277 | "node": ">=12" 278 | } 279 | }, 280 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { 281 | "version": "0.18.20", 282 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 283 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 284 | "cpu": [ 285 | "x64" 286 | ], 287 | "optional": true, 288 | "os": [ 289 | "netbsd" 290 | ], 291 | "engines": { 292 | "node": ">=12" 293 | } 294 | }, 295 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { 296 | "version": "0.18.20", 297 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 298 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 299 | "cpu": [ 300 | "x64" 301 | ], 302 | "optional": true, 303 | "os": [ 304 | "openbsd" 305 | ], 306 | "engines": { 307 | "node": ">=12" 308 | } 309 | }, 310 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { 311 | "version": "0.18.20", 312 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 313 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 314 | "cpu": [ 315 | "x64" 316 | ], 317 | "optional": true, 318 | "os": [ 319 | "sunos" 320 | ], 321 | "engines": { 322 | "node": ">=12" 323 | } 324 | }, 325 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { 326 | "version": "0.18.20", 327 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 328 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 329 | "cpu": [ 330 | "arm64" 331 | ], 332 | "optional": true, 333 | "os": [ 334 | "win32" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { 341 | "version": "0.18.20", 342 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 343 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 344 | "cpu": [ 345 | "ia32" 346 | ], 347 | "optional": true, 348 | "os": [ 349 | "win32" 350 | ], 351 | "engines": { 352 | "node": ">=12" 353 | } 354 | }, 355 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { 356 | "version": "0.18.20", 357 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 358 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 359 | "cpu": [ 360 | "x64" 361 | ], 362 | "optional": true, 363 | "os": [ 364 | "win32" 365 | ], 366 | "engines": { 367 | "node": ">=12" 368 | } 369 | }, 370 | "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { 371 | "version": "0.18.20", 372 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 373 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 374 | "hasInstallScript": true, 375 | "bin": { 376 | "esbuild": "bin/esbuild" 377 | }, 378 | "engines": { 379 | "node": ">=12" 380 | }, 381 | "optionalDependencies": { 382 | "@esbuild/android-arm": "0.18.20", 383 | "@esbuild/android-arm64": "0.18.20", 384 | "@esbuild/android-x64": "0.18.20", 385 | "@esbuild/darwin-arm64": "0.18.20", 386 | "@esbuild/darwin-x64": "0.18.20", 387 | "@esbuild/freebsd-arm64": "0.18.20", 388 | "@esbuild/freebsd-x64": "0.18.20", 389 | "@esbuild/linux-arm": "0.18.20", 390 | "@esbuild/linux-arm64": "0.18.20", 391 | "@esbuild/linux-ia32": "0.18.20", 392 | "@esbuild/linux-loong64": "0.18.20", 393 | "@esbuild/linux-mips64el": "0.18.20", 394 | "@esbuild/linux-ppc64": "0.18.20", 395 | "@esbuild/linux-riscv64": "0.18.20", 396 | "@esbuild/linux-s390x": "0.18.20", 397 | "@esbuild/linux-x64": "0.18.20", 398 | "@esbuild/netbsd-x64": "0.18.20", 399 | "@esbuild/openbsd-x64": "0.18.20", 400 | "@esbuild/sunos-x64": "0.18.20", 401 | "@esbuild/win32-arm64": "0.18.20", 402 | "@esbuild/win32-ia32": "0.18.20", 403 | "@esbuild/win32-x64": "0.18.20" 404 | } 405 | }, 406 | "node_modules/@esbuild-kit/esm-loader": { 407 | "version": "2.6.5", 408 | "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", 409 | "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", 410 | "deprecated": "Merged into tsx: https://tsx.is", 411 | "dependencies": { 412 | "@esbuild-kit/core-utils": "^3.3.2", 413 | "get-tsconfig": "^4.7.0" 414 | } 415 | }, 416 | "node_modules/@esbuild/aix-ppc64": { 417 | "version": "0.25.2", 418 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", 419 | "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", 420 | "cpu": [ 421 | "ppc64" 422 | ], 423 | "optional": true, 424 | "os": [ 425 | "aix" 426 | ], 427 | "engines": { 428 | "node": ">=18" 429 | } 430 | }, 431 | "node_modules/@esbuild/android-arm": { 432 | "version": "0.25.2", 433 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", 434 | "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", 435 | "cpu": [ 436 | "arm" 437 | ], 438 | "optional": true, 439 | "os": [ 440 | "android" 441 | ], 442 | "engines": { 443 | "node": ">=18" 444 | } 445 | }, 446 | "node_modules/@esbuild/android-arm64": { 447 | "version": "0.25.2", 448 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", 449 | "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", 450 | "cpu": [ 451 | "arm64" 452 | ], 453 | "optional": true, 454 | "os": [ 455 | "android" 456 | ], 457 | "engines": { 458 | "node": ">=18" 459 | } 460 | }, 461 | "node_modules/@esbuild/android-x64": { 462 | "version": "0.25.2", 463 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", 464 | "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", 465 | "cpu": [ 466 | "x64" 467 | ], 468 | "optional": true, 469 | "os": [ 470 | "android" 471 | ], 472 | "engines": { 473 | "node": ">=18" 474 | } 475 | }, 476 | "node_modules/@esbuild/darwin-arm64": { 477 | "version": "0.25.2", 478 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", 479 | "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", 480 | "cpu": [ 481 | "arm64" 482 | ], 483 | "optional": true, 484 | "os": [ 485 | "darwin" 486 | ], 487 | "engines": { 488 | "node": ">=18" 489 | } 490 | }, 491 | "node_modules/@esbuild/darwin-x64": { 492 | "version": "0.25.2", 493 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", 494 | "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", 495 | "cpu": [ 496 | "x64" 497 | ], 498 | "optional": true, 499 | "os": [ 500 | "darwin" 501 | ], 502 | "engines": { 503 | "node": ">=18" 504 | } 505 | }, 506 | "node_modules/@esbuild/freebsd-arm64": { 507 | "version": "0.25.2", 508 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", 509 | "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", 510 | "cpu": [ 511 | "arm64" 512 | ], 513 | "optional": true, 514 | "os": [ 515 | "freebsd" 516 | ], 517 | "engines": { 518 | "node": ">=18" 519 | } 520 | }, 521 | "node_modules/@esbuild/freebsd-x64": { 522 | "version": "0.25.2", 523 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", 524 | "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", 525 | "cpu": [ 526 | "x64" 527 | ], 528 | "optional": true, 529 | "os": [ 530 | "freebsd" 531 | ], 532 | "engines": { 533 | "node": ">=18" 534 | } 535 | }, 536 | "node_modules/@esbuild/linux-arm": { 537 | "version": "0.25.2", 538 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", 539 | "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", 540 | "cpu": [ 541 | "arm" 542 | ], 543 | "optional": true, 544 | "os": [ 545 | "linux" 546 | ], 547 | "engines": { 548 | "node": ">=18" 549 | } 550 | }, 551 | "node_modules/@esbuild/linux-arm64": { 552 | "version": "0.25.2", 553 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", 554 | "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", 555 | "cpu": [ 556 | "arm64" 557 | ], 558 | "optional": true, 559 | "os": [ 560 | "linux" 561 | ], 562 | "engines": { 563 | "node": ">=18" 564 | } 565 | }, 566 | "node_modules/@esbuild/linux-ia32": { 567 | "version": "0.25.2", 568 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", 569 | "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", 570 | "cpu": [ 571 | "ia32" 572 | ], 573 | "optional": true, 574 | "os": [ 575 | "linux" 576 | ], 577 | "engines": { 578 | "node": ">=18" 579 | } 580 | }, 581 | "node_modules/@esbuild/linux-loong64": { 582 | "version": "0.25.2", 583 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", 584 | "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", 585 | "cpu": [ 586 | "loong64" 587 | ], 588 | "optional": true, 589 | "os": [ 590 | "linux" 591 | ], 592 | "engines": { 593 | "node": ">=18" 594 | } 595 | }, 596 | "node_modules/@esbuild/linux-mips64el": { 597 | "version": "0.25.2", 598 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", 599 | "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", 600 | "cpu": [ 601 | "mips64el" 602 | ], 603 | "optional": true, 604 | "os": [ 605 | "linux" 606 | ], 607 | "engines": { 608 | "node": ">=18" 609 | } 610 | }, 611 | "node_modules/@esbuild/linux-ppc64": { 612 | "version": "0.25.2", 613 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", 614 | "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", 615 | "cpu": [ 616 | "ppc64" 617 | ], 618 | "optional": true, 619 | "os": [ 620 | "linux" 621 | ], 622 | "engines": { 623 | "node": ">=18" 624 | } 625 | }, 626 | "node_modules/@esbuild/linux-riscv64": { 627 | "version": "0.25.2", 628 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", 629 | "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", 630 | "cpu": [ 631 | "riscv64" 632 | ], 633 | "optional": true, 634 | "os": [ 635 | "linux" 636 | ], 637 | "engines": { 638 | "node": ">=18" 639 | } 640 | }, 641 | "node_modules/@esbuild/linux-s390x": { 642 | "version": "0.25.2", 643 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", 644 | "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", 645 | "cpu": [ 646 | "s390x" 647 | ], 648 | "optional": true, 649 | "os": [ 650 | "linux" 651 | ], 652 | "engines": { 653 | "node": ">=18" 654 | } 655 | }, 656 | "node_modules/@esbuild/linux-x64": { 657 | "version": "0.25.2", 658 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", 659 | "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", 660 | "cpu": [ 661 | "x64" 662 | ], 663 | "optional": true, 664 | "os": [ 665 | "linux" 666 | ], 667 | "engines": { 668 | "node": ">=18" 669 | } 670 | }, 671 | "node_modules/@esbuild/netbsd-arm64": { 672 | "version": "0.25.2", 673 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", 674 | "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", 675 | "cpu": [ 676 | "arm64" 677 | ], 678 | "optional": true, 679 | "os": [ 680 | "netbsd" 681 | ], 682 | "engines": { 683 | "node": ">=18" 684 | } 685 | }, 686 | "node_modules/@esbuild/netbsd-x64": { 687 | "version": "0.25.2", 688 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", 689 | "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", 690 | "cpu": [ 691 | "x64" 692 | ], 693 | "optional": true, 694 | "os": [ 695 | "netbsd" 696 | ], 697 | "engines": { 698 | "node": ">=18" 699 | } 700 | }, 701 | "node_modules/@esbuild/openbsd-arm64": { 702 | "version": "0.25.2", 703 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", 704 | "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", 705 | "cpu": [ 706 | "arm64" 707 | ], 708 | "optional": true, 709 | "os": [ 710 | "openbsd" 711 | ], 712 | "engines": { 713 | "node": ">=18" 714 | } 715 | }, 716 | "node_modules/@esbuild/openbsd-x64": { 717 | "version": "0.25.2", 718 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", 719 | "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", 720 | "cpu": [ 721 | "x64" 722 | ], 723 | "optional": true, 724 | "os": [ 725 | "openbsd" 726 | ], 727 | "engines": { 728 | "node": ">=18" 729 | } 730 | }, 731 | "node_modules/@esbuild/sunos-x64": { 732 | "version": "0.25.2", 733 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", 734 | "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", 735 | "cpu": [ 736 | "x64" 737 | ], 738 | "optional": true, 739 | "os": [ 740 | "sunos" 741 | ], 742 | "engines": { 743 | "node": ">=18" 744 | } 745 | }, 746 | "node_modules/@esbuild/win32-arm64": { 747 | "version": "0.25.2", 748 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", 749 | "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", 750 | "cpu": [ 751 | "arm64" 752 | ], 753 | "optional": true, 754 | "os": [ 755 | "win32" 756 | ], 757 | "engines": { 758 | "node": ">=18" 759 | } 760 | }, 761 | "node_modules/@esbuild/win32-ia32": { 762 | "version": "0.25.2", 763 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", 764 | "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", 765 | "cpu": [ 766 | "ia32" 767 | ], 768 | "optional": true, 769 | "os": [ 770 | "win32" 771 | ], 772 | "engines": { 773 | "node": ">=18" 774 | } 775 | }, 776 | "node_modules/@esbuild/win32-x64": { 777 | "version": "0.25.2", 778 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", 779 | "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", 780 | "cpu": [ 781 | "x64" 782 | ], 783 | "optional": true, 784 | "os": [ 785 | "win32" 786 | ], 787 | "engines": { 788 | "node": ">=18" 789 | } 790 | }, 791 | "node_modules/@hono/node-server": { 792 | "version": "1.14.1", 793 | "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.14.1.tgz", 794 | "integrity": "sha512-vmbuM+HPinjWzPe7FFPWMMQMsbKE9gDPhaH0FFdqbGpkT5lp++tcWDTxwBl5EgS5y6JVgIaCdjeHRfQ4XRBRjQ==", 795 | "engines": { 796 | "node": ">=18.14.1" 797 | }, 798 | "peerDependencies": { 799 | "hono": "^4" 800 | } 801 | }, 802 | "node_modules/@isaacs/cliui": { 803 | "version": "8.0.2", 804 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 805 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 806 | "dev": true, 807 | "dependencies": { 808 | "string-width": "^5.1.2", 809 | "string-width-cjs": "npm:string-width@^4.2.0", 810 | "strip-ansi": "^7.0.1", 811 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 812 | "wrap-ansi": "^8.1.0", 813 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 814 | }, 815 | "engines": { 816 | "node": ">=12" 817 | } 818 | }, 819 | "node_modules/@jridgewell/gen-mapping": { 820 | "version": "0.3.8", 821 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 822 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 823 | "dev": true, 824 | "dependencies": { 825 | "@jridgewell/set-array": "^1.2.1", 826 | "@jridgewell/sourcemap-codec": "^1.4.10", 827 | "@jridgewell/trace-mapping": "^0.3.24" 828 | }, 829 | "engines": { 830 | "node": ">=6.0.0" 831 | } 832 | }, 833 | "node_modules/@jridgewell/resolve-uri": { 834 | "version": "3.1.2", 835 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 836 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 837 | "dev": true, 838 | "engines": { 839 | "node": ">=6.0.0" 840 | } 841 | }, 842 | "node_modules/@jridgewell/set-array": { 843 | "version": "1.2.1", 844 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 845 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 846 | "dev": true, 847 | "engines": { 848 | "node": ">=6.0.0" 849 | } 850 | }, 851 | "node_modules/@jridgewell/sourcemap-codec": { 852 | "version": "1.5.0", 853 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 854 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 855 | "dev": true 856 | }, 857 | "node_modules/@jridgewell/trace-mapping": { 858 | "version": "0.3.25", 859 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 860 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 861 | "dev": true, 862 | "dependencies": { 863 | "@jridgewell/resolve-uri": "^3.1.0", 864 | "@jridgewell/sourcemap-codec": "^1.4.14" 865 | } 866 | }, 867 | "node_modules/@pkgjs/parseargs": { 868 | "version": "0.11.0", 869 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 870 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 871 | "dev": true, 872 | "optional": true, 873 | "engines": { 874 | "node": ">=14" 875 | } 876 | }, 877 | "node_modules/@rollup/rollup-android-arm-eabi": { 878 | "version": "4.40.0", 879 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", 880 | "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", 881 | "cpu": [ 882 | "arm" 883 | ], 884 | "dev": true, 885 | "optional": true, 886 | "os": [ 887 | "android" 888 | ] 889 | }, 890 | "node_modules/@rollup/rollup-android-arm64": { 891 | "version": "4.40.0", 892 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", 893 | "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", 894 | "cpu": [ 895 | "arm64" 896 | ], 897 | "dev": true, 898 | "optional": true, 899 | "os": [ 900 | "android" 901 | ] 902 | }, 903 | "node_modules/@rollup/rollup-darwin-arm64": { 904 | "version": "4.40.0", 905 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", 906 | "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", 907 | "cpu": [ 908 | "arm64" 909 | ], 910 | "dev": true, 911 | "optional": true, 912 | "os": [ 913 | "darwin" 914 | ] 915 | }, 916 | "node_modules/@rollup/rollup-darwin-x64": { 917 | "version": "4.40.0", 918 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", 919 | "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", 920 | "cpu": [ 921 | "x64" 922 | ], 923 | "dev": true, 924 | "optional": true, 925 | "os": [ 926 | "darwin" 927 | ] 928 | }, 929 | "node_modules/@rollup/rollup-freebsd-arm64": { 930 | "version": "4.40.0", 931 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", 932 | "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", 933 | "cpu": [ 934 | "arm64" 935 | ], 936 | "dev": true, 937 | "optional": true, 938 | "os": [ 939 | "freebsd" 940 | ] 941 | }, 942 | "node_modules/@rollup/rollup-freebsd-x64": { 943 | "version": "4.40.0", 944 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", 945 | "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", 946 | "cpu": [ 947 | "x64" 948 | ], 949 | "dev": true, 950 | "optional": true, 951 | "os": [ 952 | "freebsd" 953 | ] 954 | }, 955 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 956 | "version": "4.40.0", 957 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", 958 | "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", 959 | "cpu": [ 960 | "arm" 961 | ], 962 | "dev": true, 963 | "optional": true, 964 | "os": [ 965 | "linux" 966 | ] 967 | }, 968 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 969 | "version": "4.40.0", 970 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", 971 | "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", 972 | "cpu": [ 973 | "arm" 974 | ], 975 | "dev": true, 976 | "optional": true, 977 | "os": [ 978 | "linux" 979 | ] 980 | }, 981 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 982 | "version": "4.40.0", 983 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", 984 | "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", 985 | "cpu": [ 986 | "arm64" 987 | ], 988 | "dev": true, 989 | "optional": true, 990 | "os": [ 991 | "linux" 992 | ] 993 | }, 994 | "node_modules/@rollup/rollup-linux-arm64-musl": { 995 | "version": "4.40.0", 996 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", 997 | "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", 998 | "cpu": [ 999 | "arm64" 1000 | ], 1001 | "dev": true, 1002 | "optional": true, 1003 | "os": [ 1004 | "linux" 1005 | ] 1006 | }, 1007 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1008 | "version": "4.40.0", 1009 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", 1010 | "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", 1011 | "cpu": [ 1012 | "loong64" 1013 | ], 1014 | "dev": true, 1015 | "optional": true, 1016 | "os": [ 1017 | "linux" 1018 | ] 1019 | }, 1020 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1021 | "version": "4.40.0", 1022 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", 1023 | "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", 1024 | "cpu": [ 1025 | "ppc64" 1026 | ], 1027 | "dev": true, 1028 | "optional": true, 1029 | "os": [ 1030 | "linux" 1031 | ] 1032 | }, 1033 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1034 | "version": "4.40.0", 1035 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", 1036 | "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", 1037 | "cpu": [ 1038 | "riscv64" 1039 | ], 1040 | "dev": true, 1041 | "optional": true, 1042 | "os": [ 1043 | "linux" 1044 | ] 1045 | }, 1046 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 1047 | "version": "4.40.0", 1048 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", 1049 | "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", 1050 | "cpu": [ 1051 | "riscv64" 1052 | ], 1053 | "dev": true, 1054 | "optional": true, 1055 | "os": [ 1056 | "linux" 1057 | ] 1058 | }, 1059 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1060 | "version": "4.40.0", 1061 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", 1062 | "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", 1063 | "cpu": [ 1064 | "s390x" 1065 | ], 1066 | "dev": true, 1067 | "optional": true, 1068 | "os": [ 1069 | "linux" 1070 | ] 1071 | }, 1072 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1073 | "version": "4.40.0", 1074 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", 1075 | "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", 1076 | "cpu": [ 1077 | "x64" 1078 | ], 1079 | "dev": true, 1080 | "optional": true, 1081 | "os": [ 1082 | "linux" 1083 | ] 1084 | }, 1085 | "node_modules/@rollup/rollup-linux-x64-musl": { 1086 | "version": "4.40.0", 1087 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", 1088 | "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", 1089 | "cpu": [ 1090 | "x64" 1091 | ], 1092 | "dev": true, 1093 | "optional": true, 1094 | "os": [ 1095 | "linux" 1096 | ] 1097 | }, 1098 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1099 | "version": "4.40.0", 1100 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", 1101 | "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", 1102 | "cpu": [ 1103 | "arm64" 1104 | ], 1105 | "dev": true, 1106 | "optional": true, 1107 | "os": [ 1108 | "win32" 1109 | ] 1110 | }, 1111 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1112 | "version": "4.40.0", 1113 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", 1114 | "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", 1115 | "cpu": [ 1116 | "ia32" 1117 | ], 1118 | "dev": true, 1119 | "optional": true, 1120 | "os": [ 1121 | "win32" 1122 | ] 1123 | }, 1124 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1125 | "version": "4.40.0", 1126 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", 1127 | "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", 1128 | "cpu": [ 1129 | "x64" 1130 | ], 1131 | "dev": true, 1132 | "optional": true, 1133 | "os": [ 1134 | "win32" 1135 | ] 1136 | }, 1137 | "node_modules/@types/estree": { 1138 | "version": "1.0.7", 1139 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 1140 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1141 | "dev": true 1142 | }, 1143 | "node_modules/@types/node": { 1144 | "version": "22.14.1", 1145 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", 1146 | "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", 1147 | "dev": true, 1148 | "dependencies": { 1149 | "undici-types": "~6.21.0" 1150 | } 1151 | }, 1152 | "node_modules/ansi-regex": { 1153 | "version": "6.1.0", 1154 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1155 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1156 | "dev": true, 1157 | "engines": { 1158 | "node": ">=12" 1159 | }, 1160 | "funding": { 1161 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1162 | } 1163 | }, 1164 | "node_modules/ansi-styles": { 1165 | "version": "6.2.1", 1166 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1167 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1168 | "dev": true, 1169 | "engines": { 1170 | "node": ">=12" 1171 | }, 1172 | "funding": { 1173 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1174 | } 1175 | }, 1176 | "node_modules/any-promise": { 1177 | "version": "1.3.0", 1178 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1179 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1180 | "dev": true 1181 | }, 1182 | "node_modules/balanced-match": { 1183 | "version": "1.0.2", 1184 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1185 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1186 | "dev": true 1187 | }, 1188 | "node_modules/brace-expansion": { 1189 | "version": "2.0.1", 1190 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1191 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1192 | "dev": true, 1193 | "dependencies": { 1194 | "balanced-match": "^1.0.0" 1195 | } 1196 | }, 1197 | "node_modules/buffer-from": { 1198 | "version": "1.1.2", 1199 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1200 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 1201 | }, 1202 | "node_modules/bundle-require": { 1203 | "version": "5.1.0", 1204 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", 1205 | "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "load-tsconfig": "^0.2.3" 1209 | }, 1210 | "engines": { 1211 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1212 | }, 1213 | "peerDependencies": { 1214 | "esbuild": ">=0.18" 1215 | } 1216 | }, 1217 | "node_modules/cac": { 1218 | "version": "6.7.14", 1219 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1220 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1221 | "dev": true, 1222 | "engines": { 1223 | "node": ">=8" 1224 | } 1225 | }, 1226 | "node_modules/chokidar": { 1227 | "version": "4.0.3", 1228 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1229 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1230 | "dev": true, 1231 | "dependencies": { 1232 | "readdirp": "^4.0.1" 1233 | }, 1234 | "engines": { 1235 | "node": ">= 14.16.0" 1236 | }, 1237 | "funding": { 1238 | "url": "https://paulmillr.com/funding/" 1239 | } 1240 | }, 1241 | "node_modules/color-convert": { 1242 | "version": "2.0.1", 1243 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1244 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1245 | "dev": true, 1246 | "dependencies": { 1247 | "color-name": "~1.1.4" 1248 | }, 1249 | "engines": { 1250 | "node": ">=7.0.0" 1251 | } 1252 | }, 1253 | "node_modules/color-name": { 1254 | "version": "1.1.4", 1255 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1256 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1257 | "dev": true 1258 | }, 1259 | "node_modules/commander": { 1260 | "version": "4.1.1", 1261 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1262 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1263 | "dev": true, 1264 | "engines": { 1265 | "node": ">= 6" 1266 | } 1267 | }, 1268 | "node_modules/consola": { 1269 | "version": "3.4.2", 1270 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", 1271 | "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", 1272 | "dev": true, 1273 | "engines": { 1274 | "node": "^14.18.0 || >=16.10.0" 1275 | } 1276 | }, 1277 | "node_modules/cross-spawn": { 1278 | "version": "7.0.6", 1279 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1280 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1281 | "dev": true, 1282 | "dependencies": { 1283 | "path-key": "^3.1.0", 1284 | "shebang-command": "^2.0.0", 1285 | "which": "^2.0.1" 1286 | }, 1287 | "engines": { 1288 | "node": ">= 8" 1289 | } 1290 | }, 1291 | "node_modules/debug": { 1292 | "version": "4.4.0", 1293 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1294 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1295 | "dependencies": { 1296 | "ms": "^2.1.3" 1297 | }, 1298 | "engines": { 1299 | "node": ">=6.0" 1300 | }, 1301 | "peerDependenciesMeta": { 1302 | "supports-color": { 1303 | "optional": true 1304 | } 1305 | } 1306 | }, 1307 | "node_modules/dotenv": { 1308 | "version": "16.5.0", 1309 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", 1310 | "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", 1311 | "engines": { 1312 | "node": ">=12" 1313 | }, 1314 | "funding": { 1315 | "url": "https://dotenvx.com" 1316 | } 1317 | }, 1318 | "node_modules/drizzle-kit": { 1319 | "version": "0.31.0", 1320 | "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.0.tgz", 1321 | "integrity": "sha512-pcKVT+GbfPA+bUovPIilgVOoq+onNBo/YQBG86sf3/GFHkN6lRJPm1l7dKN0IMAk57RQoIm4GUllRrasLlcaSg==", 1322 | "dependencies": { 1323 | "@drizzle-team/brocli": "^0.10.2", 1324 | "@esbuild-kit/esm-loader": "^2.5.5", 1325 | "esbuild": "^0.25.2", 1326 | "esbuild-register": "^3.5.0" 1327 | }, 1328 | "bin": { 1329 | "drizzle-kit": "bin.cjs" 1330 | } 1331 | }, 1332 | "node_modules/drizzle-orm": { 1333 | "version": "0.42.0", 1334 | "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.42.0.tgz", 1335 | "integrity": "sha512-pS8nNJm2kBNZwrOjTHJfdKkaU+KuUQmV/vk5D57NojDq4FG+0uAYGMulXtYT///HfgsMF0hnFFvu1ezI3OwOkg==", 1336 | "peerDependencies": { 1337 | "@aws-sdk/client-rds-data": ">=3", 1338 | "@cloudflare/workers-types": ">=4", 1339 | "@electric-sql/pglite": ">=0.2.0", 1340 | "@libsql/client": ">=0.10.0", 1341 | "@libsql/client-wasm": ">=0.10.0", 1342 | "@neondatabase/serverless": ">=0.10.0", 1343 | "@op-engineering/op-sqlite": ">=2", 1344 | "@opentelemetry/api": "^1.4.1", 1345 | "@planetscale/database": ">=1.13", 1346 | "@prisma/client": "*", 1347 | "@tidbcloud/serverless": "*", 1348 | "@types/better-sqlite3": "*", 1349 | "@types/pg": "*", 1350 | "@types/sql.js": "*", 1351 | "@vercel/postgres": ">=0.8.0", 1352 | "@xata.io/client": "*", 1353 | "better-sqlite3": ">=7", 1354 | "bun-types": "*", 1355 | "expo-sqlite": ">=14.0.0", 1356 | "gel": ">=2", 1357 | "knex": "*", 1358 | "kysely": "*", 1359 | "mysql2": ">=2", 1360 | "pg": ">=8", 1361 | "postgres": ">=3", 1362 | "sql.js": ">=1", 1363 | "sqlite3": ">=5" 1364 | }, 1365 | "peerDependenciesMeta": { 1366 | "@aws-sdk/client-rds-data": { 1367 | "optional": true 1368 | }, 1369 | "@cloudflare/workers-types": { 1370 | "optional": true 1371 | }, 1372 | "@electric-sql/pglite": { 1373 | "optional": true 1374 | }, 1375 | "@libsql/client": { 1376 | "optional": true 1377 | }, 1378 | "@libsql/client-wasm": { 1379 | "optional": true 1380 | }, 1381 | "@neondatabase/serverless": { 1382 | "optional": true 1383 | }, 1384 | "@op-engineering/op-sqlite": { 1385 | "optional": true 1386 | }, 1387 | "@opentelemetry/api": { 1388 | "optional": true 1389 | }, 1390 | "@planetscale/database": { 1391 | "optional": true 1392 | }, 1393 | "@prisma/client": { 1394 | "optional": true 1395 | }, 1396 | "@tidbcloud/serverless": { 1397 | "optional": true 1398 | }, 1399 | "@types/better-sqlite3": { 1400 | "optional": true 1401 | }, 1402 | "@types/pg": { 1403 | "optional": true 1404 | }, 1405 | "@types/sql.js": { 1406 | "optional": true 1407 | }, 1408 | "@vercel/postgres": { 1409 | "optional": true 1410 | }, 1411 | "@xata.io/client": { 1412 | "optional": true 1413 | }, 1414 | "better-sqlite3": { 1415 | "optional": true 1416 | }, 1417 | "bun-types": { 1418 | "optional": true 1419 | }, 1420 | "expo-sqlite": { 1421 | "optional": true 1422 | }, 1423 | "gel": { 1424 | "optional": true 1425 | }, 1426 | "knex": { 1427 | "optional": true 1428 | }, 1429 | "kysely": { 1430 | "optional": true 1431 | }, 1432 | "mysql2": { 1433 | "optional": true 1434 | }, 1435 | "pg": { 1436 | "optional": true 1437 | }, 1438 | "postgres": { 1439 | "optional": true 1440 | }, 1441 | "prisma": { 1442 | "optional": true 1443 | }, 1444 | "sql.js": { 1445 | "optional": true 1446 | }, 1447 | "sqlite3": { 1448 | "optional": true 1449 | } 1450 | } 1451 | }, 1452 | "node_modules/eastasianwidth": { 1453 | "version": "0.2.0", 1454 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1455 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1456 | "dev": true 1457 | }, 1458 | "node_modules/emoji-regex": { 1459 | "version": "9.2.2", 1460 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1461 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1462 | "dev": true 1463 | }, 1464 | "node_modules/esbuild": { 1465 | "version": "0.25.2", 1466 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", 1467 | "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", 1468 | "hasInstallScript": true, 1469 | "bin": { 1470 | "esbuild": "bin/esbuild" 1471 | }, 1472 | "engines": { 1473 | "node": ">=18" 1474 | }, 1475 | "optionalDependencies": { 1476 | "@esbuild/aix-ppc64": "0.25.2", 1477 | "@esbuild/android-arm": "0.25.2", 1478 | "@esbuild/android-arm64": "0.25.2", 1479 | "@esbuild/android-x64": "0.25.2", 1480 | "@esbuild/darwin-arm64": "0.25.2", 1481 | "@esbuild/darwin-x64": "0.25.2", 1482 | "@esbuild/freebsd-arm64": "0.25.2", 1483 | "@esbuild/freebsd-x64": "0.25.2", 1484 | "@esbuild/linux-arm": "0.25.2", 1485 | "@esbuild/linux-arm64": "0.25.2", 1486 | "@esbuild/linux-ia32": "0.25.2", 1487 | "@esbuild/linux-loong64": "0.25.2", 1488 | "@esbuild/linux-mips64el": "0.25.2", 1489 | "@esbuild/linux-ppc64": "0.25.2", 1490 | "@esbuild/linux-riscv64": "0.25.2", 1491 | "@esbuild/linux-s390x": "0.25.2", 1492 | "@esbuild/linux-x64": "0.25.2", 1493 | "@esbuild/netbsd-arm64": "0.25.2", 1494 | "@esbuild/netbsd-x64": "0.25.2", 1495 | "@esbuild/openbsd-arm64": "0.25.2", 1496 | "@esbuild/openbsd-x64": "0.25.2", 1497 | "@esbuild/sunos-x64": "0.25.2", 1498 | "@esbuild/win32-arm64": "0.25.2", 1499 | "@esbuild/win32-ia32": "0.25.2", 1500 | "@esbuild/win32-x64": "0.25.2" 1501 | } 1502 | }, 1503 | "node_modules/esbuild-register": { 1504 | "version": "3.6.0", 1505 | "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", 1506 | "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", 1507 | "dependencies": { 1508 | "debug": "^4.3.4" 1509 | }, 1510 | "peerDependencies": { 1511 | "esbuild": ">=0.12 <1" 1512 | } 1513 | }, 1514 | "node_modules/fdir": { 1515 | "version": "6.4.4", 1516 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 1517 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 1518 | "dev": true, 1519 | "peerDependencies": { 1520 | "picomatch": "^3 || ^4" 1521 | }, 1522 | "peerDependenciesMeta": { 1523 | "picomatch": { 1524 | "optional": true 1525 | } 1526 | } 1527 | }, 1528 | "node_modules/foreground-child": { 1529 | "version": "3.3.1", 1530 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 1531 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 1532 | "dev": true, 1533 | "dependencies": { 1534 | "cross-spawn": "^7.0.6", 1535 | "signal-exit": "^4.0.1" 1536 | }, 1537 | "engines": { 1538 | "node": ">=14" 1539 | }, 1540 | "funding": { 1541 | "url": "https://github.com/sponsors/isaacs" 1542 | } 1543 | }, 1544 | "node_modules/fsevents": { 1545 | "version": "2.3.3", 1546 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1547 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1548 | "hasInstallScript": true, 1549 | "optional": true, 1550 | "os": [ 1551 | "darwin" 1552 | ], 1553 | "engines": { 1554 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1555 | } 1556 | }, 1557 | "node_modules/get-tsconfig": { 1558 | "version": "4.10.0", 1559 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", 1560 | "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", 1561 | "dependencies": { 1562 | "resolve-pkg-maps": "^1.0.0" 1563 | }, 1564 | "funding": { 1565 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 1566 | } 1567 | }, 1568 | "node_modules/glob": { 1569 | "version": "10.4.5", 1570 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1571 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1572 | "dev": true, 1573 | "dependencies": { 1574 | "foreground-child": "^3.1.0", 1575 | "jackspeak": "^3.1.2", 1576 | "minimatch": "^9.0.4", 1577 | "minipass": "^7.1.2", 1578 | "package-json-from-dist": "^1.0.0", 1579 | "path-scurry": "^1.11.1" 1580 | }, 1581 | "bin": { 1582 | "glob": "dist/esm/bin.mjs" 1583 | }, 1584 | "funding": { 1585 | "url": "https://github.com/sponsors/isaacs" 1586 | } 1587 | }, 1588 | "node_modules/hono": { 1589 | "version": "4.7.7", 1590 | "resolved": "https://registry.npmjs.org/hono/-/hono-4.7.7.tgz", 1591 | "integrity": "sha512-2PCpQRbN87Crty8/L/7akZN3UyZIAopSoRxCwRbJgUuV1+MHNFHzYFxZTg4v/03cXUm+jce/qa2VSBZpKBm3Qw==", 1592 | "engines": { 1593 | "node": ">=16.9.0" 1594 | } 1595 | }, 1596 | "node_modules/is-fullwidth-code-point": { 1597 | "version": "3.0.0", 1598 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1599 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1600 | "dev": true, 1601 | "engines": { 1602 | "node": ">=8" 1603 | } 1604 | }, 1605 | "node_modules/isexe": { 1606 | "version": "2.0.0", 1607 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1608 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1609 | "dev": true 1610 | }, 1611 | "node_modules/jackspeak": { 1612 | "version": "3.4.3", 1613 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1614 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1615 | "dev": true, 1616 | "dependencies": { 1617 | "@isaacs/cliui": "^8.0.2" 1618 | }, 1619 | "funding": { 1620 | "url": "https://github.com/sponsors/isaacs" 1621 | }, 1622 | "optionalDependencies": { 1623 | "@pkgjs/parseargs": "^0.11.0" 1624 | } 1625 | }, 1626 | "node_modules/joycon": { 1627 | "version": "3.1.1", 1628 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 1629 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 1630 | "dev": true, 1631 | "engines": { 1632 | "node": ">=10" 1633 | } 1634 | }, 1635 | "node_modules/lilconfig": { 1636 | "version": "3.1.3", 1637 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 1638 | "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 1639 | "dev": true, 1640 | "engines": { 1641 | "node": ">=14" 1642 | }, 1643 | "funding": { 1644 | "url": "https://github.com/sponsors/antonk52" 1645 | } 1646 | }, 1647 | "node_modules/lines-and-columns": { 1648 | "version": "1.2.4", 1649 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1650 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1651 | "dev": true 1652 | }, 1653 | "node_modules/load-tsconfig": { 1654 | "version": "0.2.5", 1655 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", 1656 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", 1657 | "dev": true, 1658 | "engines": { 1659 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1660 | } 1661 | }, 1662 | "node_modules/lodash.sortby": { 1663 | "version": "4.7.0", 1664 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1665 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", 1666 | "dev": true 1667 | }, 1668 | "node_modules/lru-cache": { 1669 | "version": "10.4.3", 1670 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1671 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1672 | "dev": true 1673 | }, 1674 | "node_modules/minimatch": { 1675 | "version": "9.0.5", 1676 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1677 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1678 | "dev": true, 1679 | "dependencies": { 1680 | "brace-expansion": "^2.0.1" 1681 | }, 1682 | "engines": { 1683 | "node": ">=16 || 14 >=14.17" 1684 | }, 1685 | "funding": { 1686 | "url": "https://github.com/sponsors/isaacs" 1687 | } 1688 | }, 1689 | "node_modules/minipass": { 1690 | "version": "7.1.2", 1691 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1692 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1693 | "dev": true, 1694 | "engines": { 1695 | "node": ">=16 || 14 >=14.17" 1696 | } 1697 | }, 1698 | "node_modules/ms": { 1699 | "version": "2.1.3", 1700 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1701 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1702 | }, 1703 | "node_modules/mz": { 1704 | "version": "2.7.0", 1705 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1706 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1707 | "dev": true, 1708 | "dependencies": { 1709 | "any-promise": "^1.0.0", 1710 | "object-assign": "^4.0.1", 1711 | "thenify-all": "^1.0.0" 1712 | } 1713 | }, 1714 | "node_modules/object-assign": { 1715 | "version": "4.1.1", 1716 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1717 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1718 | "dev": true, 1719 | "engines": { 1720 | "node": ">=0.10.0" 1721 | } 1722 | }, 1723 | "node_modules/package-json-from-dist": { 1724 | "version": "1.0.1", 1725 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1726 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1727 | "dev": true 1728 | }, 1729 | "node_modules/path-key": { 1730 | "version": "3.1.1", 1731 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1732 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1733 | "dev": true, 1734 | "engines": { 1735 | "node": ">=8" 1736 | } 1737 | }, 1738 | "node_modules/path-scurry": { 1739 | "version": "1.11.1", 1740 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1741 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1742 | "dev": true, 1743 | "dependencies": { 1744 | "lru-cache": "^10.2.0", 1745 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1746 | }, 1747 | "engines": { 1748 | "node": ">=16 || 14 >=14.18" 1749 | }, 1750 | "funding": { 1751 | "url": "https://github.com/sponsors/isaacs" 1752 | } 1753 | }, 1754 | "node_modules/pg": { 1755 | "version": "8.14.1", 1756 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.1.tgz", 1757 | "integrity": "sha512-0TdbqfjwIun9Fm/r89oB7RFQ0bLgduAhiIqIXOsyKoiC/L54DbuAAzIEN/9Op0f1Po9X7iCPXGoa/Ah+2aI8Xw==", 1758 | "optional": true, 1759 | "peer": true, 1760 | "dependencies": { 1761 | "pg-connection-string": "^2.7.0", 1762 | "pg-pool": "^3.8.0", 1763 | "pg-protocol": "^1.8.0", 1764 | "pg-types": "^2.1.0", 1765 | "pgpass": "1.x" 1766 | }, 1767 | "engines": { 1768 | "node": ">= 8.0.0" 1769 | }, 1770 | "optionalDependencies": { 1771 | "pg-cloudflare": "^1.1.1" 1772 | }, 1773 | "peerDependencies": { 1774 | "pg-native": ">=3.0.1" 1775 | }, 1776 | "peerDependenciesMeta": { 1777 | "pg-native": { 1778 | "optional": true 1779 | } 1780 | } 1781 | }, 1782 | "node_modules/pg-cloudflare": { 1783 | "version": "1.1.1", 1784 | "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", 1785 | "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", 1786 | "optional": true, 1787 | "peer": true 1788 | }, 1789 | "node_modules/pg-connection-string": { 1790 | "version": "2.7.0", 1791 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", 1792 | "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", 1793 | "optional": true, 1794 | "peer": true 1795 | }, 1796 | "node_modules/pg-int8": { 1797 | "version": "1.0.1", 1798 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 1799 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 1800 | "optional": true, 1801 | "peer": true, 1802 | "engines": { 1803 | "node": ">=4.0.0" 1804 | } 1805 | }, 1806 | "node_modules/pg-pool": { 1807 | "version": "3.8.0", 1808 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz", 1809 | "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==", 1810 | "optional": true, 1811 | "peer": true, 1812 | "peerDependencies": { 1813 | "pg": ">=8.0" 1814 | } 1815 | }, 1816 | "node_modules/pg-protocol": { 1817 | "version": "1.8.0", 1818 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz", 1819 | "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==", 1820 | "optional": true, 1821 | "peer": true 1822 | }, 1823 | "node_modules/pg-types": { 1824 | "version": "2.2.0", 1825 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 1826 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 1827 | "optional": true, 1828 | "peer": true, 1829 | "dependencies": { 1830 | "pg-int8": "1.0.1", 1831 | "postgres-array": "~2.0.0", 1832 | "postgres-bytea": "~1.0.0", 1833 | "postgres-date": "~1.0.4", 1834 | "postgres-interval": "^1.1.0" 1835 | }, 1836 | "engines": { 1837 | "node": ">=4" 1838 | } 1839 | }, 1840 | "node_modules/pgpass": { 1841 | "version": "1.0.5", 1842 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 1843 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 1844 | "optional": true, 1845 | "peer": true, 1846 | "dependencies": { 1847 | "split2": "^4.1.0" 1848 | } 1849 | }, 1850 | "node_modules/picocolors": { 1851 | "version": "1.1.1", 1852 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1853 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1854 | "dev": true 1855 | }, 1856 | "node_modules/picomatch": { 1857 | "version": "4.0.2", 1858 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1859 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1860 | "dev": true, 1861 | "engines": { 1862 | "node": ">=12" 1863 | }, 1864 | "funding": { 1865 | "url": "https://github.com/sponsors/jonschlinkert" 1866 | } 1867 | }, 1868 | "node_modules/pirates": { 1869 | "version": "4.0.7", 1870 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", 1871 | "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", 1872 | "dev": true, 1873 | "engines": { 1874 | "node": ">= 6" 1875 | } 1876 | }, 1877 | "node_modules/postcss-load-config": { 1878 | "version": "6.0.1", 1879 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", 1880 | "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", 1881 | "dev": true, 1882 | "funding": [ 1883 | { 1884 | "type": "opencollective", 1885 | "url": "https://opencollective.com/postcss/" 1886 | }, 1887 | { 1888 | "type": "github", 1889 | "url": "https://github.com/sponsors/ai" 1890 | } 1891 | ], 1892 | "dependencies": { 1893 | "lilconfig": "^3.1.1" 1894 | }, 1895 | "engines": { 1896 | "node": ">= 18" 1897 | }, 1898 | "peerDependencies": { 1899 | "jiti": ">=1.21.0", 1900 | "postcss": ">=8.0.9", 1901 | "tsx": "^4.8.1", 1902 | "yaml": "^2.4.2" 1903 | }, 1904 | "peerDependenciesMeta": { 1905 | "jiti": { 1906 | "optional": true 1907 | }, 1908 | "postcss": { 1909 | "optional": true 1910 | }, 1911 | "tsx": { 1912 | "optional": true 1913 | }, 1914 | "yaml": { 1915 | "optional": true 1916 | } 1917 | } 1918 | }, 1919 | "node_modules/postgres": { 1920 | "version": "3.4.5", 1921 | "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.5.tgz", 1922 | "integrity": "sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==", 1923 | "engines": { 1924 | "node": ">=12" 1925 | }, 1926 | "funding": { 1927 | "type": "individual", 1928 | "url": "https://github.com/sponsors/porsager" 1929 | } 1930 | }, 1931 | "node_modules/postgres-array": { 1932 | "version": "2.0.0", 1933 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 1934 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 1935 | "optional": true, 1936 | "peer": true, 1937 | "engines": { 1938 | "node": ">=4" 1939 | } 1940 | }, 1941 | "node_modules/postgres-bytea": { 1942 | "version": "1.0.0", 1943 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 1944 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 1945 | "optional": true, 1946 | "peer": true, 1947 | "engines": { 1948 | "node": ">=0.10.0" 1949 | } 1950 | }, 1951 | "node_modules/postgres-date": { 1952 | "version": "1.0.7", 1953 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 1954 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 1955 | "optional": true, 1956 | "peer": true, 1957 | "engines": { 1958 | "node": ">=0.10.0" 1959 | } 1960 | }, 1961 | "node_modules/postgres-interval": { 1962 | "version": "1.2.0", 1963 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 1964 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 1965 | "optional": true, 1966 | "peer": true, 1967 | "dependencies": { 1968 | "xtend": "^4.0.0" 1969 | }, 1970 | "engines": { 1971 | "node": ">=0.10.0" 1972 | } 1973 | }, 1974 | "node_modules/punycode": { 1975 | "version": "2.3.1", 1976 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1977 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1978 | "dev": true, 1979 | "engines": { 1980 | "node": ">=6" 1981 | } 1982 | }, 1983 | "node_modules/readdirp": { 1984 | "version": "4.1.2", 1985 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 1986 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 1987 | "dev": true, 1988 | "engines": { 1989 | "node": ">= 14.18.0" 1990 | }, 1991 | "funding": { 1992 | "type": "individual", 1993 | "url": "https://paulmillr.com/funding/" 1994 | } 1995 | }, 1996 | "node_modules/resolve-from": { 1997 | "version": "5.0.0", 1998 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1999 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2000 | "dev": true, 2001 | "engines": { 2002 | "node": ">=8" 2003 | } 2004 | }, 2005 | "node_modules/resolve-pkg-maps": { 2006 | "version": "1.0.0", 2007 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 2008 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 2009 | "funding": { 2010 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 2011 | } 2012 | }, 2013 | "node_modules/rollup": { 2014 | "version": "4.40.0", 2015 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", 2016 | "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", 2017 | "dev": true, 2018 | "dependencies": { 2019 | "@types/estree": "1.0.7" 2020 | }, 2021 | "bin": { 2022 | "rollup": "dist/bin/rollup" 2023 | }, 2024 | "engines": { 2025 | "node": ">=18.0.0", 2026 | "npm": ">=8.0.0" 2027 | }, 2028 | "optionalDependencies": { 2029 | "@rollup/rollup-android-arm-eabi": "4.40.0", 2030 | "@rollup/rollup-android-arm64": "4.40.0", 2031 | "@rollup/rollup-darwin-arm64": "4.40.0", 2032 | "@rollup/rollup-darwin-x64": "4.40.0", 2033 | "@rollup/rollup-freebsd-arm64": "4.40.0", 2034 | "@rollup/rollup-freebsd-x64": "4.40.0", 2035 | "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", 2036 | "@rollup/rollup-linux-arm-musleabihf": "4.40.0", 2037 | "@rollup/rollup-linux-arm64-gnu": "4.40.0", 2038 | "@rollup/rollup-linux-arm64-musl": "4.40.0", 2039 | "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", 2040 | "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", 2041 | "@rollup/rollup-linux-riscv64-gnu": "4.40.0", 2042 | "@rollup/rollup-linux-riscv64-musl": "4.40.0", 2043 | "@rollup/rollup-linux-s390x-gnu": "4.40.0", 2044 | "@rollup/rollup-linux-x64-gnu": "4.40.0", 2045 | "@rollup/rollup-linux-x64-musl": "4.40.0", 2046 | "@rollup/rollup-win32-arm64-msvc": "4.40.0", 2047 | "@rollup/rollup-win32-ia32-msvc": "4.40.0", 2048 | "@rollup/rollup-win32-x64-msvc": "4.40.0", 2049 | "fsevents": "~2.3.2" 2050 | } 2051 | }, 2052 | "node_modules/shebang-command": { 2053 | "version": "2.0.0", 2054 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2055 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2056 | "dev": true, 2057 | "dependencies": { 2058 | "shebang-regex": "^3.0.0" 2059 | }, 2060 | "engines": { 2061 | "node": ">=8" 2062 | } 2063 | }, 2064 | "node_modules/shebang-regex": { 2065 | "version": "3.0.0", 2066 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2067 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2068 | "dev": true, 2069 | "engines": { 2070 | "node": ">=8" 2071 | } 2072 | }, 2073 | "node_modules/signal-exit": { 2074 | "version": "4.1.0", 2075 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2076 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2077 | "dev": true, 2078 | "engines": { 2079 | "node": ">=14" 2080 | }, 2081 | "funding": { 2082 | "url": "https://github.com/sponsors/isaacs" 2083 | } 2084 | }, 2085 | "node_modules/source-map": { 2086 | "version": "0.6.1", 2087 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2088 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2089 | "engines": { 2090 | "node": ">=0.10.0" 2091 | } 2092 | }, 2093 | "node_modules/source-map-support": { 2094 | "version": "0.5.21", 2095 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2096 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2097 | "dependencies": { 2098 | "buffer-from": "^1.0.0", 2099 | "source-map": "^0.6.0" 2100 | } 2101 | }, 2102 | "node_modules/split2": { 2103 | "version": "4.2.0", 2104 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 2105 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 2106 | "optional": true, 2107 | "peer": true, 2108 | "engines": { 2109 | "node": ">= 10.x" 2110 | } 2111 | }, 2112 | "node_modules/string-width": { 2113 | "version": "5.1.2", 2114 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2115 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2116 | "dev": true, 2117 | "dependencies": { 2118 | "eastasianwidth": "^0.2.0", 2119 | "emoji-regex": "^9.2.2", 2120 | "strip-ansi": "^7.0.1" 2121 | }, 2122 | "engines": { 2123 | "node": ">=12" 2124 | }, 2125 | "funding": { 2126 | "url": "https://github.com/sponsors/sindresorhus" 2127 | } 2128 | }, 2129 | "node_modules/string-width-cjs": { 2130 | "name": "string-width", 2131 | "version": "4.2.3", 2132 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2133 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2134 | "dev": true, 2135 | "dependencies": { 2136 | "emoji-regex": "^8.0.0", 2137 | "is-fullwidth-code-point": "^3.0.0", 2138 | "strip-ansi": "^6.0.1" 2139 | }, 2140 | "engines": { 2141 | "node": ">=8" 2142 | } 2143 | }, 2144 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2145 | "version": "5.0.1", 2146 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2147 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2148 | "dev": true, 2149 | "engines": { 2150 | "node": ">=8" 2151 | } 2152 | }, 2153 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2154 | "version": "8.0.0", 2155 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2156 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2157 | "dev": true 2158 | }, 2159 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2160 | "version": "6.0.1", 2161 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2162 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2163 | "dev": true, 2164 | "dependencies": { 2165 | "ansi-regex": "^5.0.1" 2166 | }, 2167 | "engines": { 2168 | "node": ">=8" 2169 | } 2170 | }, 2171 | "node_modules/strip-ansi": { 2172 | "version": "7.1.0", 2173 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2174 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2175 | "dev": true, 2176 | "dependencies": { 2177 | "ansi-regex": "^6.0.1" 2178 | }, 2179 | "engines": { 2180 | "node": ">=12" 2181 | }, 2182 | "funding": { 2183 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2184 | } 2185 | }, 2186 | "node_modules/strip-ansi-cjs": { 2187 | "name": "strip-ansi", 2188 | "version": "6.0.1", 2189 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2190 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2191 | "dev": true, 2192 | "dependencies": { 2193 | "ansi-regex": "^5.0.1" 2194 | }, 2195 | "engines": { 2196 | "node": ">=8" 2197 | } 2198 | }, 2199 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2200 | "version": "5.0.1", 2201 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2202 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2203 | "dev": true, 2204 | "engines": { 2205 | "node": ">=8" 2206 | } 2207 | }, 2208 | "node_modules/sucrase": { 2209 | "version": "3.35.0", 2210 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 2211 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 2212 | "dev": true, 2213 | "dependencies": { 2214 | "@jridgewell/gen-mapping": "^0.3.2", 2215 | "commander": "^4.0.0", 2216 | "glob": "^10.3.10", 2217 | "lines-and-columns": "^1.1.6", 2218 | "mz": "^2.7.0", 2219 | "pirates": "^4.0.1", 2220 | "ts-interface-checker": "^0.1.9" 2221 | }, 2222 | "bin": { 2223 | "sucrase": "bin/sucrase", 2224 | "sucrase-node": "bin/sucrase-node" 2225 | }, 2226 | "engines": { 2227 | "node": ">=16 || 14 >=14.17" 2228 | } 2229 | }, 2230 | "node_modules/thenify": { 2231 | "version": "3.3.1", 2232 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2233 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2234 | "dev": true, 2235 | "dependencies": { 2236 | "any-promise": "^1.0.0" 2237 | } 2238 | }, 2239 | "node_modules/thenify-all": { 2240 | "version": "1.6.0", 2241 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2242 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2243 | "dev": true, 2244 | "dependencies": { 2245 | "thenify": ">= 3.1.0 < 4" 2246 | }, 2247 | "engines": { 2248 | "node": ">=0.8" 2249 | } 2250 | }, 2251 | "node_modules/tinyexec": { 2252 | "version": "0.3.2", 2253 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 2254 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 2255 | "dev": true 2256 | }, 2257 | "node_modules/tinyglobby": { 2258 | "version": "0.2.13", 2259 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 2260 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 2261 | "dev": true, 2262 | "dependencies": { 2263 | "fdir": "^6.4.4", 2264 | "picomatch": "^4.0.2" 2265 | }, 2266 | "engines": { 2267 | "node": ">=12.0.0" 2268 | }, 2269 | "funding": { 2270 | "url": "https://github.com/sponsors/SuperchupuDev" 2271 | } 2272 | }, 2273 | "node_modules/tree-kill": { 2274 | "version": "1.2.2", 2275 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 2276 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 2277 | "dev": true, 2278 | "bin": { 2279 | "tree-kill": "cli.js" 2280 | } 2281 | }, 2282 | "node_modules/ts-interface-checker": { 2283 | "version": "0.1.13", 2284 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 2285 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 2286 | "dev": true 2287 | }, 2288 | "node_modules/tsup": { 2289 | "version": "8.4.0", 2290 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.4.0.tgz", 2291 | "integrity": "sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==", 2292 | "dev": true, 2293 | "dependencies": { 2294 | "bundle-require": "^5.1.0", 2295 | "cac": "^6.7.14", 2296 | "chokidar": "^4.0.3", 2297 | "consola": "^3.4.0", 2298 | "debug": "^4.4.0", 2299 | "esbuild": "^0.25.0", 2300 | "joycon": "^3.1.1", 2301 | "picocolors": "^1.1.1", 2302 | "postcss-load-config": "^6.0.1", 2303 | "resolve-from": "^5.0.0", 2304 | "rollup": "^4.34.8", 2305 | "source-map": "0.8.0-beta.0", 2306 | "sucrase": "^3.35.0", 2307 | "tinyexec": "^0.3.2", 2308 | "tinyglobby": "^0.2.11", 2309 | "tree-kill": "^1.2.2" 2310 | }, 2311 | "bin": { 2312 | "tsup": "dist/cli-default.js", 2313 | "tsup-node": "dist/cli-node.js" 2314 | }, 2315 | "engines": { 2316 | "node": ">=18" 2317 | }, 2318 | "peerDependencies": { 2319 | "@microsoft/api-extractor": "^7.36.0", 2320 | "@swc/core": "^1", 2321 | "postcss": "^8.4.12", 2322 | "typescript": ">=4.5.0" 2323 | }, 2324 | "peerDependenciesMeta": { 2325 | "@microsoft/api-extractor": { 2326 | "optional": true 2327 | }, 2328 | "@swc/core": { 2329 | "optional": true 2330 | }, 2331 | "postcss": { 2332 | "optional": true 2333 | }, 2334 | "typescript": { 2335 | "optional": true 2336 | } 2337 | } 2338 | }, 2339 | "node_modules/tsup/node_modules/source-map": { 2340 | "version": "0.8.0-beta.0", 2341 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 2342 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 2343 | "dev": true, 2344 | "dependencies": { 2345 | "whatwg-url": "^7.0.0" 2346 | }, 2347 | "engines": { 2348 | "node": ">= 8" 2349 | } 2350 | }, 2351 | "node_modules/tsup/node_modules/tr46": { 2352 | "version": "1.0.1", 2353 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 2354 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", 2355 | "dev": true, 2356 | "dependencies": { 2357 | "punycode": "^2.1.0" 2358 | } 2359 | }, 2360 | "node_modules/tsup/node_modules/webidl-conversions": { 2361 | "version": "4.0.2", 2362 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 2363 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 2364 | "dev": true 2365 | }, 2366 | "node_modules/tsup/node_modules/whatwg-url": { 2367 | "version": "7.1.0", 2368 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 2369 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 2370 | "dev": true, 2371 | "dependencies": { 2372 | "lodash.sortby": "^4.7.0", 2373 | "tr46": "^1.0.1", 2374 | "webidl-conversions": "^4.0.2" 2375 | } 2376 | }, 2377 | "node_modules/tsx": { 2378 | "version": "4.19.3", 2379 | "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", 2380 | "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", 2381 | "dependencies": { 2382 | "esbuild": "~0.25.0", 2383 | "get-tsconfig": "^4.7.5" 2384 | }, 2385 | "bin": { 2386 | "tsx": "dist/cli.mjs" 2387 | }, 2388 | "engines": { 2389 | "node": ">=18.0.0" 2390 | }, 2391 | "optionalDependencies": { 2392 | "fsevents": "~2.3.3" 2393 | } 2394 | }, 2395 | "node_modules/typescript": { 2396 | "version": "5.8.3", 2397 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 2398 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 2399 | "dev": true, 2400 | "bin": { 2401 | "tsc": "bin/tsc", 2402 | "tsserver": "bin/tsserver" 2403 | }, 2404 | "engines": { 2405 | "node": ">=14.17" 2406 | } 2407 | }, 2408 | "node_modules/undici-types": { 2409 | "version": "6.21.0", 2410 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 2411 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 2412 | "dev": true 2413 | }, 2414 | "node_modules/which": { 2415 | "version": "2.0.2", 2416 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2417 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2418 | "dev": true, 2419 | "dependencies": { 2420 | "isexe": "^2.0.0" 2421 | }, 2422 | "bin": { 2423 | "node-which": "bin/node-which" 2424 | }, 2425 | "engines": { 2426 | "node": ">= 8" 2427 | } 2428 | }, 2429 | "node_modules/wrap-ansi": { 2430 | "version": "8.1.0", 2431 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2432 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2433 | "dev": true, 2434 | "dependencies": { 2435 | "ansi-styles": "^6.1.0", 2436 | "string-width": "^5.0.1", 2437 | "strip-ansi": "^7.0.1" 2438 | }, 2439 | "engines": { 2440 | "node": ">=12" 2441 | }, 2442 | "funding": { 2443 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2444 | } 2445 | }, 2446 | "node_modules/wrap-ansi-cjs": { 2447 | "name": "wrap-ansi", 2448 | "version": "7.0.0", 2449 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2450 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2451 | "dev": true, 2452 | "dependencies": { 2453 | "ansi-styles": "^4.0.0", 2454 | "string-width": "^4.1.0", 2455 | "strip-ansi": "^6.0.0" 2456 | }, 2457 | "engines": { 2458 | "node": ">=10" 2459 | }, 2460 | "funding": { 2461 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2462 | } 2463 | }, 2464 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2465 | "version": "5.0.1", 2466 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2467 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2468 | "dev": true, 2469 | "engines": { 2470 | "node": ">=8" 2471 | } 2472 | }, 2473 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2474 | "version": "4.3.0", 2475 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2476 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2477 | "dev": true, 2478 | "dependencies": { 2479 | "color-convert": "^2.0.1" 2480 | }, 2481 | "engines": { 2482 | "node": ">=8" 2483 | }, 2484 | "funding": { 2485 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2486 | } 2487 | }, 2488 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2489 | "version": "8.0.0", 2490 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2491 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2492 | "dev": true 2493 | }, 2494 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2495 | "version": "4.2.3", 2496 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2497 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2498 | "dev": true, 2499 | "dependencies": { 2500 | "emoji-regex": "^8.0.0", 2501 | "is-fullwidth-code-point": "^3.0.0", 2502 | "strip-ansi": "^6.0.1" 2503 | }, 2504 | "engines": { 2505 | "node": ">=8" 2506 | } 2507 | }, 2508 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2509 | "version": "6.0.1", 2510 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2511 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2512 | "dev": true, 2513 | "dependencies": { 2514 | "ansi-regex": "^5.0.1" 2515 | }, 2516 | "engines": { 2517 | "node": ">=8" 2518 | } 2519 | }, 2520 | "node_modules/xtend": { 2521 | "version": "4.0.2", 2522 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2523 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2524 | "optional": true, 2525 | "peer": true, 2526 | "engines": { 2527 | "node": ">=0.4" 2528 | } 2529 | } 2530 | } 2531 | } 2532 | -------------------------------------------------------------------------------- /packages/registry/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mcpctl/registry", 3 | "version": "0.0.1", 4 | "private": false, 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "build": "tsup src/index.ts src/server.ts --dts", 9 | "dev": "tsx watch src/server.ts", 10 | "start": "node dist/server.js", 11 | "db:generate": "drizzle-kit generate:pg", 12 | "db:studio": "drizzle-kit studio" 13 | }, 14 | "dependencies": { 15 | "@hono/node-server": "^1.14.1", 16 | "dotenv": "^16.5.0", 17 | "drizzle-kit": "^0.31.0", 18 | "drizzle-orm": "^0.42.0", 19 | "hono": "^4.0.0", 20 | "postgres": "^3.4.5", 21 | "tsx": "^4.19.3" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "^22.14.1", 25 | "tsup": "^8.4.0", 26 | "typescript": "^5.8.3" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /packages/registry/src/authMiddleware.ts: -------------------------------------------------------------------------------- 1 | // authMiddleware.ts 2 | import { HTTPException } from 'hono/http-exception'; 3 | 4 | export const authMiddleware = (c: any, next: any) => { 5 | const authHeader = c.req.header('Authorization'); 6 | const expectedToken = process.env.AUTH_SECRET; 7 | if (!authHeader || authHeader !== `Bearer ${expectedToken}`) { 8 | throw new HTTPException(401, { message: 'Unauthorized' }); 9 | } 10 | 11 | return next(); 12 | }; 13 | -------------------------------------------------------------------------------- /packages/registry/src/index.ts: -------------------------------------------------------------------------------- 1 | import { Hono } from "hono"; 2 | import { cors } from 'hono/cors' 3 | import { database } from "../db/index.js"; 4 | import { Package } from "../db/schema.js"; 5 | import { eq, like } from "drizzle-orm"; 6 | import { authMiddleware } from "./authMiddleware.js"; 7 | 8 | const app = new Hono(); 9 | 10 | app.use('/*', cors({ 11 | origin: (origin) => origin || '', 12 | allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], 13 | allowHeaders: ['Content-Type', 'Authorization'], 14 | exposeHeaders: ['Content-Length', 'X-Requested-With'], 15 | maxAge: 86400, 16 | credentials: true, 17 | })) 18 | 19 | 20 | app.get("/", (c) => 21 | 22 | c.json({ message: `Pong! ${Date.now()}`, status: "running" }) 23 | ); 24 | 25 | app.get("/search", async (c) => { 26 | console.log("Search query:", c.req.query()); 27 | const { package_name, hard_search } = c.req.query(); 28 | try { 29 | const allUsers = await database 30 | .select() 31 | .from(Package) 32 | .where( 33 | package_name 34 | ? hard_search 35 | ? eq(Package.name, package_name) 36 | : like(Package.name, `%${package_name}%`) 37 | : undefined 38 | ); 39 | return c.json({ packages: allUsers }); 40 | } catch (error: any) { 41 | return c.json({ error: error?.message || "Unknown error occurred" }, 500); 42 | } 43 | 44 | }); 45 | app.get("/packages", async (c) => { 46 | console.log("Fetching all packages"); 47 | try { 48 | const packages = await database.select().from(Package); 49 | return c.json(packages); 50 | } catch (error: any) { 51 | return c.json({ error: error?.message || "Unknown error occurred" }, 500); 52 | } 53 | }); 54 | 55 | app.post("/packages", authMiddleware , async (c) => { 56 | try { 57 | const data = await c.req.json(); 58 | const id = Math.random().toString(36).substring(2, 15); 59 | console.log("Received data:", data); 60 | const newPackage = { 61 | id, 62 | name: data.name, 63 | latest_version: data.latest_version, 64 | description: data.description, 65 | repository: data.repository, 66 | maintainer: data.maintainer, 67 | manifest: data.manifest || {} 68 | }; 69 | 70 | const result = await database.insert(Package).values(newPackage); 71 | console.log("Insert result:", result); 72 | return c.json(newPackage, 201); 73 | } catch (error: any) { 74 | return c.json({ error: error?.message || "Unknown error occurred" }, 500); 75 | } 76 | }); 77 | 78 | export { app }; 79 | -------------------------------------------------------------------------------- /packages/registry/src/server.ts: -------------------------------------------------------------------------------- 1 | import { serve } from "@hono/node-server"; 2 | import { app } from "./index.js"; 3 | import dotenv from "dotenv"; 4 | 5 | dotenv.config(); 6 | 7 | const port = process.env.PORT || 3000; 8 | 9 | serve( 10 | { 11 | fetch: app.fetch, 12 | port: Number(port), 13 | }, 14 | () => { 15 | console.log(`🚀 Server is running `); 16 | } 17 | ); 18 | -------------------------------------------------------------------------------- /packages/registry/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "NodeNext", 5 | "moduleResolution": "nodenext", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "outDir": "dist", 10 | "baseUrl": ".", 11 | "resolveJsonModule": true, 12 | "allowJs": true, 13 | "declaration": true, 14 | "declarationMap": true, 15 | "noEmit": false 16 | }, 17 | "include": ["src", "db", "drizzle"], 18 | "exclude": ["node_modules", "dist"] 19 | } 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "target": "ES2022", 6 | "noImplicitAny": true, 7 | "moduleResolution": "node", 8 | "sourceMap": true, 9 | "outDir": "dist", 10 | "baseUrl": ".", 11 | "paths": { 12 | "*": ["node_modules/*", "lib/types/*"], 13 | "@/*": ["./*"] 14 | }, 15 | "skipLibCheck": true, 16 | "declaration": true 17 | }, 18 | "exclude": ["node_modules", "dist", ".eslintrc.cjs"] 19 | } --------------------------------------------------------------------------------