From 8fbd61f0912759f8f756b6201665349299f54b8d Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sat, 14 Feb 2026 23:33:53 +0200 Subject: [PATCH 01/13] feat: project skeleton (WIP) --- README.md | 150 +++- api/languages.ts | 81 ++ api/repo.ts | 144 +++ api/stats.ts | 63 ++ lib/card.ts | 148 +++ lib/github.ts | 111 +++ lib/languages.ts | 78 ++ package.json | 26 + pnpm-lock.yaml | 2221 ++++++++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 17 + vercel.json | 23 + 11 files changed, 3060 insertions(+), 2 deletions(-) create mode 100644 api/languages.ts create mode 100644 api/repo.ts create mode 100644 api/stats.ts create mode 100644 lib/card.ts create mode 100644 lib/github.ts create mode 100644 lib/languages.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 tsconfig.json create mode 100644 vercel.json diff --git a/README.md b/README.md index 217252d..86c5f90 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,148 @@ -# github-flex -Flex your GitHub stats with customizable SVG badges for your profile. Because your GitHub profile deserves to look as good as your code...right?! +# GitHub Stats Badges + +Dynamic, customizable GitHub stats badges for your profile README. Built with TypeScript and deployed on Vercel. + +## Features + +- 📊 **Stats Badge** - Display your GitHub statistics (stars, commits, PRs, issues) +- 🎨 **Language Stats** - Show your most used programming languages +- 📦 **Repository Card** - Showcase individual repository stats +- 🌈 **Multiple Themes** - Choose from 6 beautiful themes +- ⚡ **Fast & Cached** - Optimized with 4-hour caching +- 🔧 **Customizable** - Use URL parameters to customize appearance + +## Usage + +### Stats Badge + +Add to your GitHub profile README: + +```markdown +![GitHub Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME) +``` + +#### Parameters + +- `username` (required) - Your GitHub username +- `theme` - Theme name (default: `default`) + - Options: `default`, `dark`, `radical`, `merko`, `gruvbox`, `tokyonight` +- `hide_border` - Hide the card border (default: `false`) +- `hide_title` - Hide the title (default: `false`) + +#### Examples + +```markdown + +![GitHub Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME&theme=dark) + + +![GitHub Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME&theme=tokyonight&hide_border=true) +``` + +### Language Stats Badge + +```markdown +![Top Languages](https://your-app.vercel.app/api/languages?username=YOUR_USERNAME) +``` + +#### Parameters + +- `username` (required) - Your GitHub username +- `theme` - Theme name (default: `default`) +- `langs_count` - Number of languages to show (default: `5`) +- `hide_border` - Hide the card border (default: `false`) +- `hide_title` - Hide the title (default: `false`) + +#### Examples + +```markdown + +![Top Languages](https://your-app.vercel.app/api/languages?username=YOUR_USERNAME&theme=gruvbox&langs_count=8) +``` + +### Repository Card + +```markdown +![Repo Card](https://your-app.vercel.app/api/repo?username=YOUR_USERNAME&repo=REPO_NAME) +``` + +#### Parameters + +- `username` (required) - Repository owner username +- `repo` (required) - Repository name +- `theme` - Theme name (default: `default`) +- `hide_border` - Hide the card border (default: `false`) + +#### Examples + +```markdown + +![Repo Card](https://your-app.vercel.app/api/repo?username=YOUR_USERNAME&repo=your-awesome-project&theme=dark) +``` + +## Deployment + +### Deploy to Vercel + +1. Fork this repository +2. Create a [Vercel account](https://vercel.com) +3. Import your forked repository +4. (Optional) Add a `GITHUB_TOKEN` environment variable for higher rate limits: + - Go to [GitHub Settings > Developer settings > Personal access tokens](https://github.com/settings/tokens) + - Generate a new token (no scopes needed for public data) + - Add it to Vercel as `GITHUB_TOKEN` environment variable + +### Local Development + +```bash +# Install dependencies +npm install + +# Start development server +npm run dev + +# Visit http://localhost:3000/api/stats?username=YOUR_USERNAME +``` + +## Available Themes + +- **default** - Clean white theme +- **dark** - Dark mode friendly +- **radical** - Pink and cyan +- **merko** - Green terminal vibes +- **gruvbox** - Retro warm colors +- **tokyonight** - Cyberpunk aesthetics + +## How It Works + +This project uses Vercel serverless functions to: + +1. Fetch data from the GitHub API +2. Calculate statistics and aggregate data +3. Generate SVG images dynamically +4. Return cacheable images that can be embedded in markdown + +## Rate Limits + +GitHub API has rate limits: +- **Without token**: 60 requests/hour +- **With token**: 5,000 requests/hour + +For production use, it's recommended to add a `GITHUB_TOKEN` environment variable. + +## Contributing + +Contributions are welcome! Feel free to: + +- Add new badge types +- Create new themes +- Improve statistics calculation +- Fix bugs + +## License + +MIT + +## Inspiration + +Inspired by [github-readme-stats](https://github.com/anuraghazra/github-readme-stats) diff --git a/api/languages.ts b/api/languages.ts new file mode 100644 index 0000000..ccabccc --- /dev/null +++ b/api/languages.ts @@ -0,0 +1,81 @@ +import { VercelRequest, VercelResponse } from '@vercel/node'; +import { fetchLanguageStats, getTopLanguages } from '../lib/languages'; +import { generateCard, ThemeName, themes, escapeXml } from '../lib/card'; + +export default async function handler(req: VercelRequest, res: VercelResponse) { + const { username, theme = 'default', hide_border, hide_title, langs_count = '5' } = req.query; + + // Validate username + if (!username || typeof username !== 'string') { + return res.status(400).json({ error: 'Username is required' }); + } + + // Validate theme + const selectedTheme = typeof theme === 'string' && theme in themes ? theme as ThemeName : 'default'; + const langsCount = parseInt(typeof langs_count === 'string' ? langs_count : '5', 10); + + try { + // Get GitHub token from environment variable + const githubToken = process.env.GITHUB_TOKEN; + + // Fetch language stats + const stats = await fetchLanguageStats(username, githubToken); + const topLanguages = getTopLanguages(stats, langsCount); + + if (topLanguages.length === 0) { + throw new Error('No languages found'); + } + + // Get theme colors + const colors = themes[selectedTheme]; + + // Generate language bars + const languageBars = topLanguages.map((lang, index) => { + const yOffset = 60 + index * 40; + const barWidth = (lang.percent / 100) * 300; + + return ` + + ${escapeXml(lang.name)} + ${lang.percent.toFixed(1)}% + + + + `; + }).join(''); + + // Calculate card height based on number of languages + const cardHeight = 100 + topLanguages.length * 40; + + // Generate the card + const svg = generateCard(languageBars, { + title: hide_title === 'true' ? '' : 'Most Used Languages', + width: 450, + height: cardHeight, + theme: selectedTheme, + hideBorder: hide_border === 'true', + }); + + // Set cache headers (cache for 4 hours) + res.setHeader('Content-Type', 'image/svg+xml'); + res.setHeader('Cache-Control', 'public, max-age=14400'); + + return res.status(200).send(svg); + } catch (error) { + console.error('Error generating language badge:', error); + + // Return error SVG + const errorSvg = generateCard( + `Failed to fetch language stats`, + { + title: 'Most Used Languages', + width: 450, + height: 120, + theme: selectedTheme, + } + ); + + res.setHeader('Content-Type', 'image/svg+xml'); + return res.status(500).send(errorSvg); + } +} diff --git a/api/repo.ts b/api/repo.ts new file mode 100644 index 0000000..77eb59b --- /dev/null +++ b/api/repo.ts @@ -0,0 +1,144 @@ +import { VercelRequest, VercelResponse } from '@vercel/node'; +import { generateCard, ThemeName, themes, escapeXml } from '../lib/card'; + +interface RepoData { + name: string; + description: string; + stars: number; + forks: number; + language: string; + openIssues: number; +} + +interface GitHubRepoResponse { + name: string; + description: string | null; + stargazers_count: number; + forks_count: number; + language: string | null; + open_issues_count: number; +} + +async function fetchRepoStats(owner: string, repo: string, token?: string): Promise { + const headers: HeadersInit = { + 'Accept': 'application/vnd.github+json', + }; + + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + + const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`, { headers }); + + if (!response.ok) { + throw new Error(`GitHub API error: ${response.status}`); + } + + const data = await response.json() as GitHubRepoResponse; + + return { + name: data.name, + description: data.description || 'No description provided', + stars: data.stargazers_count, + forks: data.forks_count, + language: data.language || 'Unknown', + openIssues: data.open_issues_count, + }; +} + +export default async function handler(req: VercelRequest, res: VercelResponse) { + const { username, repo, theme = 'default', hide_border } = req.query; + + // Validate parameters + if (!username || typeof username !== 'string') { + return res.status(400).json({ error: 'Username is required' }); + } + + if (!repo || typeof repo !== 'string') { + return res.status(400).json({ error: 'Repository name is required' }); + } + + // Validate theme + const selectedTheme = typeof theme === 'string' && theme in themes ? theme as ThemeName : 'default'; + + try { + // Get GitHub token from environment variable + const githubToken = process.env.GITHUB_TOKEN; + + // Fetch repo stats + const repoData = await fetchRepoStats(username, repo, githubToken); + + // Get theme colors + const colors = themes[selectedTheme]; + + // Generate repo card content + const truncatedDesc = repoData.description.substring(0, 60); + const content = ` + + + ${escapeXml(truncatedDesc)}${repoData.description.length > 60 ? '...' : ''} + + + + + + + + ${repoData.stars.toLocaleString()} stars + + + + + + + ${repoData.forks.toLocaleString()} forks + + + + + + + ${escapeXml(repoData.language)} + + + + + + + + ${repoData.openIssues.toLocaleString()} open issues + + `; + + // Generate the card (title will be escaped inside generateCard) + const svg = generateCard(content, { + title: repoData.name, + width: 450, + height: 210, + theme: selectedTheme, + hideBorder: hide_border === 'true', + }); + + // Set cache headers (cache for 4 hours) + res.setHeader('Content-Type', 'image/svg+xml'); + res.setHeader('Cache-Control', 'public, max-age=14400'); + + return res.status(200).send(svg); + } catch (error) { + console.error('Error generating repo card:', error); + + // Return error SVG + const errorSvg = generateCard( + `Failed to fetch repository stats`, + { + title: 'Repository Stats', + width: 450, + height: 120, + theme: selectedTheme, + } + ); + + res.setHeader('Content-Type', 'image/svg+xml'); + return res.status(500).send(errorSvg); + } +} diff --git a/api/stats.ts b/api/stats.ts new file mode 100644 index 0000000..9a9b8b4 --- /dev/null +++ b/api/stats.ts @@ -0,0 +1,63 @@ +import { VercelRequest, VercelResponse } from '@vercel/node'; +import { fetchGitHubStats } from '../lib/github'; +import { generateCard, generateStatItem, ThemeName, themes } from '../lib/card'; + +export default async function handler(req: VercelRequest, res: VercelResponse) { + const { username, theme = 'default', hide_border, hide_title } = req.query; + + // Validate username + if (!username || typeof username !== 'string') { + return res.status(400).json({ error: 'Username is required' }); + } + + // Validate theme + const selectedTheme = typeof theme === 'string' && theme in themes ? theme as ThemeName : 'default'; + + try { + // Get GitHub token from environment variable (optional but recommended for higher rate limits) + const githubToken = process.env.GITHUB_TOKEN; + + // Fetch GitHub stats + const stats = await fetchGitHubStats(username, githubToken); + + // Generate stat items + const statItems = [ + generateStatItem('Total Stars', stats.totalStars.toLocaleString(), 0), + generateStatItem('Total Commits', stats.totalCommits.toLocaleString(), 1), + generateStatItem('Total PRs', stats.totalPRs.toLocaleString(), 2), + generateStatItem('Total Issues', stats.totalIssues.toLocaleString(), 3), + generateStatItem('Total Repos', stats.contributedTo.toLocaleString(), 4), + ].join(''); + + // Generate the card + const svg = generateCard(statItems, { + title: hide_title === 'true' ? '' : `${username}'s GitHub Stats`, + width: 495, + height: 195, + theme: selectedTheme, + hideBorder: hide_border === 'true', + }); + + // Set cache headers (cache for 4 hours) + res.setHeader('Content-Type', 'image/svg+xml'); + res.setHeader('Cache-Control', 'public, max-age=14400'); + + return res.status(200).send(svg); + } catch (error) { + console.error('Error generating stats badge:', error); + + // Return error SVG + const errorSvg = generateCard( + generateStatItem('Error', 'Failed to fetch stats', 0, false), + { + title: 'GitHub Stats', + width: 495, + height: 120, + theme: selectedTheme, + } + ); + + res.setHeader('Content-Type', 'image/svg+xml'); + return res.status(500).send(errorSvg); + } +} diff --git a/lib/card.ts b/lib/card.ts new file mode 100644 index 0000000..f959c37 --- /dev/null +++ b/lib/card.ts @@ -0,0 +1,148 @@ +/** + * Color themes for the badges + */ +export const themes = { + default: { + bg: '#ffffff', + title: '#2f80ed', + text: '#434d58', + icon: '#4c71f2', + border: '#e4e2e2', + }, + dark: { + bg: '#151515', + title: '#fff', + text: '#9f9f9f', + icon: '#79ff97', + border: '#404040', + }, + radical: { + bg: '#141321', + title: '#fe428e', + text: '#a9fef7', + icon: '#f8d847', + border: '#fe428e', + }, + merko: { + bg: '#0a0f0d', + title: '#abd200', + text: '#68b587', + icon: '#b7d364', + border: '#abd200', + }, + gruvbox: { + bg: '#282828', + title: '#fabd2f', + text: '#8ec07c', + icon: '#fe8019', + border: '#fabd2f', + }, + tokyonight: { + bg: '#1a1b27', + title: '#70a5fd', + text: '#38bdae', + icon: '#bf91f3', + border: '#70a5fd', + }, +}; + +export type ThemeName = keyof typeof themes; + +export interface CardOptions { + title: string; + width?: number; + height?: number; + theme?: ThemeName; + borderRadius?: number; + hideBorder?: boolean; +} + +/** + * Generates an SVG card wrapper + */ +export function generateCard(content: string, options: CardOptions): string { + const { + title, + width = 500, + height = 200, + theme = 'default', + borderRadius = 4.5, + hideBorder = false, + } = options; + + const colors = themes[theme]; + const border = hideBorder ? '' : `stroke="${colors.border}" stroke-width="1"`; + + return ` + + ${escapeXml(title)} + + + + + + + + ${escapeXml(title)} + + + ${content} + + `; +} + +/** + * Generates a stat item for the card + */ +export function generateStatItem( + label: string, + value: string | number, + index: number, + bold = true +): string { + const yOffset = 60 + index * 25; + const valueWeight = bold ? '600' : '400'; + + return ` + + + ${label}: + ${value} + + + `; +} + +/** + * Escapes text for safe use in SVG + */ +export function escapeXml(text: string): string { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** + * Generates an icon + */ +export function generateIcon(iconName: string, color: string): string { + const icons: Record = { + star: ``, + fork: ``, + }; + + return icons[iconName] || ''; +} diff --git a/lib/github.ts b/lib/github.ts new file mode 100644 index 0000000..f1ce0e9 --- /dev/null +++ b/lib/github.ts @@ -0,0 +1,111 @@ +export interface GitHubStats { + username: string; + totalStars: number; + totalCommits: number; + totalPRs: number; + totalIssues: number; + contributedTo: number; + rank: string; +} + +export interface GitHubRepo { + name: string; + stargazers_count: number; + forks_count: number; +} + +interface GitHubSearchResponse { + total_count: number; + incomplete_results: boolean; + items: unknown[]; +} + +/** + * Fetches GitHub user statistics + */ +export async function fetchGitHubStats(username: string, token?: string): Promise { + const headers: HeadersInit = { + 'Accept': 'application/vnd.github+json', + }; + + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + + try { + // Fetch user data + const userResponse = await fetch(`https://api.github.com/users/${username}`, { headers }); + if (!userResponse.ok) { + throw new Error(`GitHub API error: ${userResponse.status}`); + } + + // Fetch user repositories + const reposResponse = await fetch( + `https://api.github.com/users/${username}/repos?per_page=100&type=owner`, + { headers } + ); + + if (!reposResponse.ok) { + throw new Error(`GitHub API error: ${reposResponse.status}`); + } + + const repos: GitHubRepo[] = await reposResponse.json(); + + // Calculate total stars + const totalStars = repos.reduce((acc, repo) => acc + repo.stargazers_count, 0); + + // Fetch commit count (this is an approximation using search API) + let totalCommits = 0; + const commitsResponse = await fetch( + `https://api.github.com/search/commits?q=author:${username}`, + { headers } + ); + if (commitsResponse.ok) { + const commitsData = await commitsResponse.json() as GitHubSearchResponse; + totalCommits = commitsData.total_count || 0; + } + + // Fetch PRs + let totalPRs = 0; + const prsResponse = await fetch( + `https://api.github.com/search/issues?q=author:${username}+type:pr`, + { headers } + ); + if (prsResponse.ok) { + const prsData = await prsResponse.json() as GitHubSearchResponse; + totalPRs = prsData.total_count || 0; + } + + // Fetch Issues + let totalIssues = 0; + const issuesResponse = await fetch( + `https://api.github.com/search/issues?q=author:${username}+type:issue`, + { headers } + ); + if (issuesResponse.ok) { + const issuesData = await issuesResponse.json() as GitHubSearchResponse; + totalIssues = issuesData.total_count || 0; + } + + // Calculate rank based on total stars + let rank = 'C'; + if (totalStars >= 1000) rank = 'S'; + else if (totalStars >= 500) rank = 'A+'; + else if (totalStars >= 200) rank = 'A'; + else if (totalStars >= 100) rank = 'B+'; + else if (totalStars >= 50) rank = 'B'; + + return { + username, + totalStars, + totalCommits, + totalPRs, + totalIssues, + contributedTo: repos.length, // This represents total owned repos, not repos contributed to + rank, + }; + } catch (error) { + console.error('Error fetching GitHub stats:', error); + throw error; + } +} diff --git a/lib/languages.ts b/lib/languages.ts new file mode 100644 index 0000000..718a89c --- /dev/null +++ b/lib/languages.ts @@ -0,0 +1,78 @@ +export interface LanguageStats { + [language: string]: number; +} + +interface GitHubRepoItem { + name: string; + fork: boolean; + languages_url: string; +} + +/** + * Fetches language statistics for a GitHub user + */ +export async function fetchLanguageStats(username: string, token?: string): Promise { + const headers: HeadersInit = { + 'Accept': 'application/vnd.github+json', + }; + + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + + try { + // Fetch user repositories + const reposResponse = await fetch( + `https://api.github.com/users/${username}/repos?per_page=100&type=owner`, + { headers } + ); + + if (!reposResponse.ok) { + throw new Error(`GitHub API error: ${reposResponse.status}`); + } + + const repos = await reposResponse.json() as GitHubRepoItem[]; + + // Aggregate language stats + const languageStats: LanguageStats = {}; + + for (const repo of repos) { + if (repo.fork) continue; // Skip forked repos + + // Fetch languages for each repo + const langResponse = await fetch(repo.languages_url, { headers }); + + if (!langResponse.ok) { + console.warn(`Failed to fetch languages for repo ${repo.name}`); + continue; + } + + const languages = await langResponse.json() as Record; + + for (const [lang, bytes] of Object.entries(languages)) { + languageStats[lang] = (languageStats[lang] || 0) + bytes; + } + } + + return languageStats; + } catch (error) { + console.error('Error fetching language stats:', error); + throw error; + } +} + +/** + * Get top N languages by bytes + */ +export function getTopLanguages(stats: LanguageStats, limit = 5): Array<{ name: string; percent: number; bytes: number }> { + const total = Object.values(stats).reduce((sum, bytes) => sum + bytes, 0); + + return Object.entries(stats) + .map(([name, bytes]) => ({ + name, + bytes, + percent: (bytes / total) * 100, + })) + .sort((a, b) => b.bytes - a.bytes) + .slice(0, limit); +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..02648ad --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "github-stats-badges", + "version": "1.0.0", + "description": "Dynamic GitHub stats badges for your profile README", + "main": "index.js", + "scripts": { + "dev": "vercel dev", + "build": "tsc" + }, + "keywords": [ + "github", + "stats", + "badges", + "vercel" + ], + "author": "", + "license": "MIT", + "dependencies": { + "@vercel/node": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "typescript": "^5.3.0", + "vercel": "^33.0.0" + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..8101a49 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2221 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@vercel/node': + specifier: ^3.0.0 + version: 3.2.29 + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.19.33 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + vercel: + specifier: ^33.0.0 + version: 33.7.1 + +packages: + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@edge-runtime/format@2.2.1': + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + + '@edge-runtime/node-utils@2.3.0': + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + + '@edge-runtime/ponyfill@2.4.2': + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + + '@edge-runtime/primitives@4.1.0': + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + + '@edge-runtime/vm@3.2.0': + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@sinclair/typebox@0.25.24': + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@ts-morph/common@0.11.1': + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@14.18.33': + resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} + + '@types/node@16.18.11': + resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} + + '@types/node@20.19.33': + resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} + + '@vercel/build-utils@7.11.0': + resolution: {integrity: sha512-UFrx1hNIjNJJkd0NZrYfaOrmcWhQmrVsbKe9o3L9jX9J1iufG685wIZ9tFCKKC0Fa2HWbNDNzNxrE5SCAS2lyA==} + + '@vercel/build-utils@8.7.0': + resolution: {integrity: sha512-ofZX+ABiW76u5khIyYyH5xK5KSuiAteqRu5hz2k1a2WHLwF7VpeBg8gdFR+HwbVnNkHtkMA64ya5Dd/lNoABkw==} + + '@vercel/error-utils@2.0.2': + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} + + '@vercel/error-utils@2.0.3': + resolution: {integrity: sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==} + + '@vercel/fun@1.1.0': + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + + '@vercel/gatsby-plugin-vercel-builder@2.0.24': + resolution: {integrity: sha512-b02ifu8WCmz4ARjkC9AyuOxpXa0Tmh0uIbDDYvyvDRpvohQY53eC3sXKVOejnmQbi9KojkaJsQRvMTBRh9BUHA==} + + '@vercel/go@3.1.1': + resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} + + '@vercel/hydrogen@1.0.2': + resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} + + '@vercel/next@4.2.0': + resolution: {integrity: sha512-2KSXdPHpfPWaf0tKTBxOWvdc8e9TPNARjmqtgYUsrl1TVaBNFsZ0GV0kWaVLEw4o7CWfREt8ZY064sNVb1BcAQ==} + + '@vercel/nft@0.26.4': + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} + hasBin: true + + '@vercel/nft@0.27.3': + resolution: {integrity: sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==} + engines: {node: '>=16'} + hasBin: true + + '@vercel/node@3.0.26': + resolution: {integrity: sha512-PoyacnoylwpE3+7RFUVHJlbPqtneTCEJVXXx4n8g9ARgUDSRSCwFpJOhiFQon2sS2YtfCzsJa29Z9dAZQedDcQ==} + + '@vercel/node@3.2.29': + resolution: {integrity: sha512-WRVYidBqtRyYUw36v/WyUB2v97PsiV2+LepUiOPWcW9UpszQGGT2DAzsXOYqWveXMJKFhx0aETR6Nn6i+Yps1Q==} + + '@vercel/python@4.1.1': + resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} + + '@vercel/redwood@2.0.8': + resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} + + '@vercel/remix-builder@2.1.5': + resolution: {integrity: sha512-VaDhsNg/1lZ7h6GJnaykActeZTRtFQz45qDNwKrHM+Nw5/ocwTun9sCJZY/ziECUNuQEJv95z3wUDhNweG+/9w==} + + '@vercel/routing-utils@3.1.0': + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + + '@vercel/ruby@2.0.5': + resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} + + '@vercel/static-build@2.4.6': + resolution: {integrity: sha512-LCmEBXRse7Bt46fo4OUzkq6RL1Q26oMWvmbFsW5uKi6bkT8asU1U5/zw9PQTeFQjGRL2vkUi22fGXF6XHuuqsA==} + + '@vercel/static-config@3.0.0': + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + + async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + + async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + + chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + + convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + + execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + + http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + deprecated: This package is archived and no longer maintained. For support, visit https://github.com/expressjs/express/discussions + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + + stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} + engines: {node: '>=14.0'} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vercel@33.7.1: + resolution: {integrity: sha512-6VFasn9euV13r6T4q0o5twCopkvm1hYzOJIvS2PAJuNEYcf1tk6gT2Ym0RrXd5sXaWtW1PNHdNVvberkDdsnMA==} + engines: {node: '>= 16'} + hasBin: true + + web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + + yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + +snapshots: + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@edge-runtime/format@2.2.1': {} + + '@edge-runtime/node-utils@2.3.0': {} + + '@edge-runtime/ponyfill@2.4.2': {} + + '@edge-runtime/primitives@4.1.0': {} + + '@edge-runtime/vm@3.2.0': + dependencies: + '@edge-runtime/primitives': 4.1.0 + + '@fastify/busboy@2.1.1': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.1.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.9 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.7.4 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@sinclair/typebox@0.25.24': {} + + '@tootallnate/once@2.0.0': {} + + '@ts-morph/common@0.11.1': + dependencies: + fast-glob: 3.3.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@14.18.33': {} + + '@types/node@16.18.11': {} + + '@types/node@20.19.33': + dependencies: + undici-types: 6.21.0 + + '@vercel/build-utils@7.11.0': {} + + '@vercel/build-utils@8.7.0': {} + + '@vercel/error-utils@2.0.2': {} + + '@vercel/error-utils@2.0.3': {} + + '@vercel/fun@1.1.0': + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': + dependencies: + web-vitals: 0.2.4 + + '@vercel/gatsby-plugin-vercel-builder@2.0.24': + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 7.11.0 + '@vercel/routing-utils': 3.1.0 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 + + '@vercel/go@3.1.1': {} + + '@vercel/hydrogen@1.0.2': + dependencies: + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + + '@vercel/next@4.2.0': + dependencies: + '@vercel/nft': 0.26.4 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/nft@0.26.4': + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + node-gyp-build: 4.8.4 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/nft@0.27.3': + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + node-gyp-build: 4.8.4 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/node@3.0.26': + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 14.18.33 + '@vercel/build-utils': 7.11.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.26.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + + '@vercel/node@3.2.29': + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 16.18.11 + '@vercel/build-utils': 8.7.0 + '@vercel/error-utils': 2.0.3 + '@vercel/nft': 0.27.3 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.28.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + + '@vercel/python@4.1.1': {} + + '@vercel/redwood@2.0.8': + dependencies: + '@vercel/nft': 0.26.4 + '@vercel/routing-utils': 3.1.0 + semver: 6.3.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/remix-builder@2.1.5': + dependencies: + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/routing-utils@3.1.0': + dependencies: + path-to-regexp: 6.1.0 + optionalDependencies: + ajv: 6.12.6 + + '@vercel/ruby@2.0.5': {} + + '@vercel/static-build@2.4.6': + dependencies: + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.24 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + + '@vercel/static-config@3.0.0': + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + + abbrev@1.1.1: {} + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + optional: true + + ajv@8.6.3: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aproba@2.1.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + arg@4.1.0: {} + + arg@4.1.3: {} + + async-listen@1.2.0: {} + + async-listen@3.0.0: {} + + async-listen@3.0.1: {} + + async-sema@3.1.1: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-crc32@0.2.13: {} + + bytes@3.1.0: {} + + chokidar@3.3.1: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + cjs-module-lexer@1.2.3: {} + + code-block-writer@10.1.1: {} + + color-support@1.1.3: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: {} + + content-type@1.0.4: {} + + convert-hrtime@3.0.0: {} + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.1.1: + dependencies: + ms: 2.1.1 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + delegates@1.0.0: {} + + depd@1.1.2: {} + + detect-libc@2.1.2: {} + + diff@4.0.4: {} + + edge-runtime@2.5.9: + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + + emoji-regex@8.0.0: {} + + end-of-stream@1.1.0: + dependencies: + once: 1.3.3 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + es-module-lexer@1.4.1: {} + + esbuild-android-64@0.14.47: + optional: true + + esbuild-android-arm64@0.14.47: + optional: true + + esbuild-darwin-64@0.14.47: + optional: true + + esbuild-darwin-arm64@0.14.47: + optional: true + + esbuild-freebsd-64@0.14.47: + optional: true + + esbuild-freebsd-arm64@0.14.47: + optional: true + + esbuild-linux-32@0.14.47: + optional: true + + esbuild-linux-64@0.14.47: + optional: true + + esbuild-linux-arm64@0.14.47: + optional: true + + esbuild-linux-arm@0.14.47: + optional: true + + esbuild-linux-mips64le@0.14.47: + optional: true + + esbuild-linux-ppc64le@0.14.47: + optional: true + + esbuild-linux-riscv64@0.14.47: + optional: true + + esbuild-linux-s390x@0.14.47: + optional: true + + esbuild-netbsd-64@0.14.47: + optional: true + + esbuild-openbsd-64@0.14.47: + optional: true + + esbuild-sunos-64@0.14.47: + optional: true + + esbuild-windows-32@0.14.47: + optional: true + + esbuild-windows-64@0.14.47: + optional: true + + esbuild-windows-arm64@0.14.47: + optional: true + + esbuild@0.14.47: + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + + estree-walker@2.0.2: {} + + etag@1.8.1: {} + + events-intercept@2.0.0: {} + + execa@3.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: + optional: true + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fs-extra@11.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@1.2.7: + dependencies: + minipass: 2.9.0 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.1.3: + optional: true + + gauge@3.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + generic-pool@3.4.2: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + graceful-fs@4.2.11: {} + + has-unicode@2.0.1: {} + + http-errors@1.4.0: + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + + http-errors@1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@1.1.1: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.1: {} + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-stream@2.0.1: {} + + isarray@0.0.1: {} + + isexe@2.0.0: {} + + json-schema-to-ts@1.6.4: + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + + json-schema-traverse@0.4.1: + optional: true + + json-schema-traverse@1.0.0: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-error@1.3.6: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micro@9.3.5-canary.3: + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimist@1.2.8: {} + + minipass@2.9.0: + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@1.3.3: + dependencies: + minipass: 2.9.0 + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + + mri@1.2.0: {} + + ms@2.1.1: {} + + ms@2.1.3: {} + + node-fetch@2.6.7: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@2.6.9: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + object-assign@4.1.1: {} + + once@1.3.3: + dependencies: + wrappy: 1.0.2 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + os-paths@4.4.0: {} + + p-finally@2.0.1: {} + + parse-ms@2.1.0: {} + + path-browserify@1.0.1: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-match@1.2.4: + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.9.0 + + path-to-regexp@1.9.0: + dependencies: + isarray: 0.0.1 + + path-to-regexp@6.1.0: {} + + path-to-regexp@6.2.1: {} + + pend@1.2.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + promisepipe@3.0.0: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + raw-body@2.4.1: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.3.0: + dependencies: + picomatch: 2.3.1 + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.3.5: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.4: {} + + set-blocking@2.0.0: {} + + setprototypeof@1.1.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.0.2: {} + + stat-mode@0.3.0: {} + + statuses@1.5.0: {} + + stream-to-array@2.3.0: + dependencies: + any-promise: 1.3.0 + + stream-to-promise@2.2.0: + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-final-newline@2.0.0: {} + + tar@4.4.18: + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + time-span@4.0.0: + dependencies: + convert-hrtime: 3.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.0: {} + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + ts-morph@12.0.0: + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + + ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.18.33 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.11 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-toolbelt@6.15.5: {} + + typescript@4.9.5: {} + + typescript@5.9.3: {} + + uid-promise@1.0.0: {} + + undici-types@6.21.0: {} + + undici@5.26.5: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@3.3.2: {} + + v8-compile-cache-lib@3.0.1: {} + + vercel@33.7.1: + dependencies: + '@vercel/build-utils': 7.11.0 + '@vercel/fun': 1.1.0 + '@vercel/go': 3.1.1 + '@vercel/hydrogen': 1.0.2 + '@vercel/next': 4.2.0 + '@vercel/node': 3.0.26 + '@vercel/python': 4.1.1 + '@vercel/redwood': 2.0.8 + '@vercel/remix-builder': 2.1.5 + '@vercel/ruby': 2.0.5 + '@vercel/static-build': 2.4.6 + chokidar: 3.3.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + + web-vitals@0.2.4: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + wrappy@1.0.2: {} + + xdg-app-paths@5.1.0: + dependencies: + xdg-portable: 7.3.0 + + xdg-portable@7.3.0: + dependencies: + os-paths: 4.4.0 + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yauzl-clone@1.0.4: + dependencies: + events-intercept: 2.0.0 + + yauzl-promise@2.1.3: + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yn@3.1.1: {} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0d2d3a8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["ES2020", "DOM"], + "outDir": "./dist", + "rootDir": "./", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "moduleResolution": "node" + }, + "include": ["api/**/*", "lib/**/*"], + "exclude": ["node_modules"] +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..cff7613 --- /dev/null +++ b/vercel.json @@ -0,0 +1,23 @@ +{ + "functions": { + "api/**/*.ts": { + "memory": 1024, + "maxDuration": 10 + } + }, + "headers": [ + { + "source": "/api/(.*)", + "headers": [ + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "Access-Control-Allow-Methods", + "value": "GET" + } + ] + } + ] +} From 4775114232427899062b674558f5262a52e62d5f Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sat, 14 Feb 2026 23:35:41 +0200 Subject: [PATCH 02/13] feat: add prettier --- .prettierc.json | 10 +++++ .prettierignore | 5 +++ api/languages.ts | 64 +++++++++++++++++----------- api/repo.ts | 62 +++++++++++++++------------ api/stats.ts | 53 ++++++++++++----------- lib/card.ts | 80 +++++++++++++++++------------------ lib/github.ts | 48 ++++++++++++--------- lib/languages.ts | 108 +++++++++++++++++++++++++---------------------- package.json | 7 ++- pnpm-lock.yaml | 10 +++++ 10 files changed, 259 insertions(+), 188 deletions(-) create mode 100644 .prettierc.json create mode 100644 .prettierignore diff --git a/.prettierc.json b/.prettierc.json new file mode 100644 index 0000000..5731c95 --- /dev/null +++ b/.prettierc.json @@ -0,0 +1,10 @@ +{ + "semi": false, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "es5", + "printWidth": 100, + "bracketSpacing": true, + "arrowParens": "avoid", + "endOfLine": "lf" +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..a4db8df --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +package.json +package-lock.json +pnpm-lock.yaml +README.md +.github/** diff --git a/api/languages.ts b/api/languages.ts index ccabccc..4c29f49 100644 --- a/api/languages.ts +++ b/api/languages.ts @@ -1,18 +1,30 @@ -import { VercelRequest, VercelResponse } from '@vercel/node'; -import { fetchLanguageStats, getTopLanguages } from '../lib/languages'; -import { generateCard, ThemeName, themes, escapeXml } from '../lib/card'; +import { VercelRequest, VercelResponse } from "@vercel/node"; +import { fetchLanguageStats, getTopLanguages } from "../lib/languages"; +import { generateCard, ThemeName, themes, escapeXml } from "../lib/card"; export default async function handler(req: VercelRequest, res: VercelResponse) { - const { username, theme = 'default', hide_border, hide_title, langs_count = '5' } = req.query; + const { + username, + theme = "default", + hide_border, + hide_title, + langs_count = "5", + } = req.query; // Validate username - if (!username || typeof username !== 'string') { - return res.status(400).json({ error: 'Username is required' }); + if (!username || typeof username !== "string") { + return res.status(400).json({ error: "Username is required" }); } // Validate theme - const selectedTheme = typeof theme === 'string' && theme in themes ? theme as ThemeName : 'default'; - const langsCount = parseInt(typeof langs_count === 'string' ? langs_count : '5', 10); + const selectedTheme = + typeof theme === "string" && theme in themes + ? (theme as ThemeName) + : "default"; + const langsCount = parseInt( + typeof langs_count === "string" ? langs_count : "5", + 10, + ); try { // Get GitHub token from environment variable @@ -23,18 +35,19 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { const topLanguages = getTopLanguages(stats, langsCount); if (topLanguages.length === 0) { - throw new Error('No languages found'); + throw new Error("No languages found"); } // Get theme colors const colors = themes[selectedTheme]; // Generate language bars - const languageBars = topLanguages.map((lang, index) => { - const yOffset = 60 + index * 40; - const barWidth = (lang.percent / 100) * 300; + const languageBars = topLanguages + .map((lang, index) => { + const yOffset = 60 + index * 40; + const barWidth = (lang.percent / 100) * 300; - return ` + return ` ${escapeXml(lang.name)} ${lang.percent.toFixed(1)}% @@ -42,40 +55,41 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { `; - }).join(''); + }) + .join(""); // Calculate card height based on number of languages const cardHeight = 100 + topLanguages.length * 40; // Generate the card const svg = generateCard(languageBars, { - title: hide_title === 'true' ? '' : 'Most Used Languages', + title: hide_title === "true" ? "" : "Most Used Languages", width: 450, height: cardHeight, theme: selectedTheme, - hideBorder: hide_border === 'true', + hideBorder: hide_border === "true", }); // Set cache headers (cache for 4 hours) - res.setHeader('Content-Type', 'image/svg+xml'); - res.setHeader('Cache-Control', 'public, max-age=14400'); - + res.setHeader("Content-Type", "image/svg+xml"); + res.setHeader("Cache-Control", "public, max-age=14400"); + return res.status(200).send(svg); } catch (error) { - console.error('Error generating language badge:', error); - + console.error("Error generating language badge:", error); + // Return error SVG const errorSvg = generateCard( `Failed to fetch language stats`, { - title: 'Most Used Languages', + title: "Most Used Languages", width: 450, height: 120, theme: selectedTheme, - } + }, ); - - res.setHeader('Content-Type', 'image/svg+xml'); + + res.setHeader("Content-Type", "image/svg+xml"); return res.status(500).send(errorSvg); } } diff --git a/api/repo.ts b/api/repo.ts index 77eb59b..b90ad92 100644 --- a/api/repo.ts +++ b/api/repo.ts @@ -1,5 +1,5 @@ -import { VercelRequest, VercelResponse } from '@vercel/node'; -import { generateCard, ThemeName, themes, escapeXml } from '../lib/card'; +import { VercelRequest, VercelResponse } from "@vercel/node"; +import { generateCard, ThemeName, themes, escapeXml } from "../lib/card"; interface RepoData { name: string; @@ -19,47 +19,57 @@ interface GitHubRepoResponse { open_issues_count: number; } -async function fetchRepoStats(owner: string, repo: string, token?: string): Promise { +async function fetchRepoStats( + owner: string, + repo: string, + token?: string, +): Promise { const headers: HeadersInit = { - 'Accept': 'application/vnd.github+json', + Accept: "application/vnd.github+json", }; if (token) { - headers['Authorization'] = `Bearer ${token}`; + headers["Authorization"] = `Bearer ${token}`; } - const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`, { headers }); + const response = await fetch( + `https://api.github.com/repos/${owner}/${repo}`, + { headers }, + ); if (!response.ok) { throw new Error(`GitHub API error: ${response.status}`); } - const data = await response.json() as GitHubRepoResponse; + const data = (await response.json()) as GitHubRepoResponse; return { name: data.name, - description: data.description || 'No description provided', + description: data.description || "No description provided", stars: data.stargazers_count, forks: data.forks_count, - language: data.language || 'Unknown', + language: data.language || "Unknown", openIssues: data.open_issues_count, }; } export default async function handler(req: VercelRequest, res: VercelResponse) { - const { username, repo, theme = 'default', hide_border } = req.query; + const { username, repo, theme = "default", hide_border } = req.query; // Validate parameters - if (!username || typeof username !== 'string') { - return res.status(400).json({ error: 'Username is required' }); + if (!username || typeof username !== "string") { + return res.status(400).json({ error: "Username is required" }); } - if (!repo || typeof repo !== 'string') { - return res.status(400).json({ error: 'Repository name is required' }); + if (!repo || typeof repo !== "string") { + return res.status(400).json({ error: "Repository name is required" }); } // Validate theme - const selectedTheme = typeof theme === 'string' && theme in themes ? theme as ThemeName : 'default'; + const selectedTheme = + typeof theme === "string" && theme in themes + ? (theme as ThemeName) + : "default"; try { // Get GitHub token from environment variable @@ -76,7 +86,7 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { const content = ` - ${escapeXml(truncatedDesc)}${repoData.description.length > 60 ? '...' : ''} + ${escapeXml(truncatedDesc)}${repoData.description.length > 60 ? "..." : ""} @@ -116,29 +126,29 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { width: 450, height: 210, theme: selectedTheme, - hideBorder: hide_border === 'true', + hideBorder: hide_border === "true", }); // Set cache headers (cache for 4 hours) - res.setHeader('Content-Type', 'image/svg+xml'); - res.setHeader('Cache-Control', 'public, max-age=14400'); - + res.setHeader("Content-Type", "image/svg+xml"); + res.setHeader("Cache-Control", "public, max-age=14400"); + return res.status(200).send(svg); } catch (error) { - console.error('Error generating repo card:', error); - + console.error("Error generating repo card:", error); + // Return error SVG const errorSvg = generateCard( `Failed to fetch repository stats`, { - title: 'Repository Stats', + title: "Repository Stats", width: 450, height: 120, theme: selectedTheme, - } + }, ); - - res.setHeader('Content-Type', 'image/svg+xml'); + + res.setHeader("Content-Type", "image/svg+xml"); return res.status(500).send(errorSvg); } } diff --git a/api/stats.ts b/api/stats.ts index 9a9b8b4..536d356 100644 --- a/api/stats.ts +++ b/api/stats.ts @@ -1,17 +1,20 @@ -import { VercelRequest, VercelResponse } from '@vercel/node'; -import { fetchGitHubStats } from '../lib/github'; -import { generateCard, generateStatItem, ThemeName, themes } from '../lib/card'; +import { VercelRequest, VercelResponse } from "@vercel/node"; +import { fetchGitHubStats } from "../lib/github"; +import { generateCard, generateStatItem, ThemeName, themes } from "../lib/card"; export default async function handler(req: VercelRequest, res: VercelResponse) { - const { username, theme = 'default', hide_border, hide_title } = req.query; + const { username, theme = "default", hide_border, hide_title } = req.query; // Validate username - if (!username || typeof username !== 'string') { - return res.status(400).json({ error: 'Username is required' }); + if (!username || typeof username !== "string") { + return res.status(400).json({ error: "Username is required" }); } // Validate theme - const selectedTheme = typeof theme === 'string' && theme in themes ? theme as ThemeName : 'default'; + const selectedTheme = + typeof theme === "string" && theme in themes + ? (theme as ThemeName) + : "default"; try { // Get GitHub token from environment variable (optional but recommended for higher rate limits) @@ -22,42 +25,42 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { // Generate stat items const statItems = [ - generateStatItem('Total Stars', stats.totalStars.toLocaleString(), 0), - generateStatItem('Total Commits', stats.totalCommits.toLocaleString(), 1), - generateStatItem('Total PRs', stats.totalPRs.toLocaleString(), 2), - generateStatItem('Total Issues', stats.totalIssues.toLocaleString(), 3), - generateStatItem('Total Repos', stats.contributedTo.toLocaleString(), 4), - ].join(''); + generateStatItem("Total Stars", stats.totalStars.toLocaleString(), 0), + generateStatItem("Total Commits", stats.totalCommits.toLocaleString(), 1), + generateStatItem("Total PRs", stats.totalPRs.toLocaleString(), 2), + generateStatItem("Total Issues", stats.totalIssues.toLocaleString(), 3), + generateStatItem("Total Repos", stats.contributedTo.toLocaleString(), 4), + ].join(""); // Generate the card const svg = generateCard(statItems, { - title: hide_title === 'true' ? '' : `${username}'s GitHub Stats`, + title: hide_title === "true" ? "" : `${username}'s GitHub Stats`, width: 495, height: 195, theme: selectedTheme, - hideBorder: hide_border === 'true', + hideBorder: hide_border === "true", }); // Set cache headers (cache for 4 hours) - res.setHeader('Content-Type', 'image/svg+xml'); - res.setHeader('Cache-Control', 'public, max-age=14400'); - + res.setHeader("Content-Type", "image/svg+xml"); + res.setHeader("Cache-Control", "public, max-age=14400"); + return res.status(200).send(svg); } catch (error) { - console.error('Error generating stats badge:', error); - + console.error("Error generating stats badge:", error); + // Return error SVG const errorSvg = generateCard( - generateStatItem('Error', 'Failed to fetch stats', 0, false), + generateStatItem("Error", "Failed to fetch stats", 0, false), { - title: 'GitHub Stats', + title: "GitHub Stats", width: 495, height: 120, theme: selectedTheme, - } + }, ); - - res.setHeader('Content-Type', 'image/svg+xml'); + + res.setHeader("Content-Type", "image/svg+xml"); return res.status(500).send(errorSvg); } } diff --git a/lib/card.ts b/lib/card.ts index f959c37..09d967b 100644 --- a/lib/card.ts +++ b/lib/card.ts @@ -3,46 +3,46 @@ */ export const themes = { default: { - bg: '#ffffff', - title: '#2f80ed', - text: '#434d58', - icon: '#4c71f2', - border: '#e4e2e2', + bg: "#ffffff", + title: "#2f80ed", + text: "#434d58", + icon: "#4c71f2", + border: "#e4e2e2", }, dark: { - bg: '#151515', - title: '#fff', - text: '#9f9f9f', - icon: '#79ff97', - border: '#404040', + bg: "#151515", + title: "#fff", + text: "#9f9f9f", + icon: "#79ff97", + border: "#404040", }, radical: { - bg: '#141321', - title: '#fe428e', - text: '#a9fef7', - icon: '#f8d847', - border: '#fe428e', + bg: "#141321", + title: "#fe428e", + text: "#a9fef7", + icon: "#f8d847", + border: "#fe428e", }, merko: { - bg: '#0a0f0d', - title: '#abd200', - text: '#68b587', - icon: '#b7d364', - border: '#abd200', + bg: "#0a0f0d", + title: "#abd200", + text: "#68b587", + icon: "#b7d364", + border: "#abd200", }, gruvbox: { - bg: '#282828', - title: '#fabd2f', - text: '#8ec07c', - icon: '#fe8019', - border: '#fabd2f', + bg: "#282828", + title: "#fabd2f", + text: "#8ec07c", + icon: "#fe8019", + border: "#fabd2f", }, tokyonight: { - bg: '#1a1b27', - title: '#70a5fd', - text: '#38bdae', - icon: '#bf91f3', - border: '#70a5fd', + bg: "#1a1b27", + title: "#70a5fd", + text: "#38bdae", + icon: "#bf91f3", + border: "#70a5fd", }, }; @@ -65,13 +65,13 @@ export function generateCard(content: string, options: CardOptions): string { title, width = 500, height = 200, - theme = 'default', + theme = "default", borderRadius = 4.5, hideBorder = false, } = options; const colors = themes[theme]; - const border = hideBorder ? '' : `stroke="${colors.border}" stroke-width="1"`; + const border = hideBorder ? "" : `stroke="${colors.border}" stroke-width="1"`; return ` @@ -128,11 +128,11 @@ export function generateStatItem( */ export function escapeXml(text: string): string { return text - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); } /** @@ -144,5 +144,5 @@ export function generateIcon(iconName: string, color: string): string { fork: ``, }; - return icons[iconName] || ''; + return icons[iconName] || ""; } diff --git a/lib/github.ts b/lib/github.ts index f1ce0e9..17c8d3c 100644 --- a/lib/github.ts +++ b/lib/github.ts @@ -23,18 +23,24 @@ interface GitHubSearchResponse { /** * Fetches GitHub user statistics */ -export async function fetchGitHubStats(username: string, token?: string): Promise { +export async function fetchGitHubStats( + username: string, + token?: string, +): Promise { const headers: HeadersInit = { - 'Accept': 'application/vnd.github+json', + Accept: "application/vnd.github+json", }; if (token) { - headers['Authorization'] = `Bearer ${token}`; + headers["Authorization"] = `Bearer ${token}`; } try { // Fetch user data - const userResponse = await fetch(`https://api.github.com/users/${username}`, { headers }); + const userResponse = await fetch( + `https://api.github.com/users/${username}`, + { headers }, + ); if (!userResponse.ok) { throw new Error(`GitHub API error: ${userResponse.status}`); } @@ -42,7 +48,7 @@ export async function fetchGitHubStats(username: string, token?: string): Promis // Fetch user repositories const reposResponse = await fetch( `https://api.github.com/users/${username}/repos?per_page=100&type=owner`, - { headers } + { headers }, ); if (!reposResponse.ok) { @@ -52,16 +58,20 @@ export async function fetchGitHubStats(username: string, token?: string): Promis const repos: GitHubRepo[] = await reposResponse.json(); // Calculate total stars - const totalStars = repos.reduce((acc, repo) => acc + repo.stargazers_count, 0); + const totalStars = repos.reduce( + (acc, repo) => acc + repo.stargazers_count, + 0, + ); // Fetch commit count (this is an approximation using search API) let totalCommits = 0; const commitsResponse = await fetch( `https://api.github.com/search/commits?q=author:${username}`, - { headers } + { headers }, ); if (commitsResponse.ok) { - const commitsData = await commitsResponse.json() as GitHubSearchResponse; + const commitsData = + (await commitsResponse.json()) as GitHubSearchResponse; totalCommits = commitsData.total_count || 0; } @@ -69,10 +79,10 @@ export async function fetchGitHubStats(username: string, token?: string): Promis let totalPRs = 0; const prsResponse = await fetch( `https://api.github.com/search/issues?q=author:${username}+type:pr`, - { headers } + { headers }, ); if (prsResponse.ok) { - const prsData = await prsResponse.json() as GitHubSearchResponse; + const prsData = (await prsResponse.json()) as GitHubSearchResponse; totalPRs = prsData.total_count || 0; } @@ -80,20 +90,20 @@ export async function fetchGitHubStats(username: string, token?: string): Promis let totalIssues = 0; const issuesResponse = await fetch( `https://api.github.com/search/issues?q=author:${username}+type:issue`, - { headers } + { headers }, ); if (issuesResponse.ok) { - const issuesData = await issuesResponse.json() as GitHubSearchResponse; + const issuesData = (await issuesResponse.json()) as GitHubSearchResponse; totalIssues = issuesData.total_count || 0; } // Calculate rank based on total stars - let rank = 'C'; - if (totalStars >= 1000) rank = 'S'; - else if (totalStars >= 500) rank = 'A+'; - else if (totalStars >= 200) rank = 'A'; - else if (totalStars >= 100) rank = 'B+'; - else if (totalStars >= 50) rank = 'B'; + let rank = "C"; + if (totalStars >= 1000) rank = "S"; + else if (totalStars >= 500) rank = "A+"; + else if (totalStars >= 200) rank = "A"; + else if (totalStars >= 100) rank = "B+"; + else if (totalStars >= 50) rank = "B"; return { username, @@ -105,7 +115,7 @@ export async function fetchGitHubStats(username: string, token?: string): Promis rank, }; } catch (error) { - console.error('Error fetching GitHub stats:', error); + console.error("Error fetching GitHub stats:", error); throw error; } } diff --git a/lib/languages.ts b/lib/languages.ts index 718a89c..066edef 100644 --- a/lib/languages.ts +++ b/lib/languages.ts @@ -1,78 +1,84 @@ export interface LanguageStats { - [language: string]: number; + [language: string]: number; } interface GitHubRepoItem { - name: string; - fork: boolean; - languages_url: string; + name: string; + fork: boolean; + languages_url: string; } /** * Fetches language statistics for a GitHub user */ -export async function fetchLanguageStats(username: string, token?: string): Promise { - const headers: HeadersInit = { - 'Accept': 'application/vnd.github+json', - }; +export async function fetchLanguageStats( + username: string, + token?: string, +): Promise { + const headers: HeadersInit = { + Accept: "application/vnd.github+json", + }; - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - try { - // Fetch user repositories - const reposResponse = await fetch( - `https://api.github.com/users/${username}/repos?per_page=100&type=owner`, - { headers } - ); + if (token) { + headers["Authorization"] = `Bearer ${token}`; + } - if (!reposResponse.ok) { - throw new Error(`GitHub API error: ${reposResponse.status}`); - } + try { + // Fetch user repositories + const reposResponse = await fetch( + `https://api.github.com/users/${username}/repos?per_page=100&type=owner`, + { headers }, + ); - const repos = await reposResponse.json() as GitHubRepoItem[]; + if (!reposResponse.ok) { + throw new Error(`GitHub API error: ${reposResponse.status}`); + } - // Aggregate language stats - const languageStats: LanguageStats = {}; + const repos = (await reposResponse.json()) as GitHubRepoItem[]; - for (const repo of repos) { - if (repo.fork) continue; // Skip forked repos + // Aggregate language stats + const languageStats: LanguageStats = {}; - // Fetch languages for each repo - const langResponse = await fetch(repo.languages_url, { headers }); + for (const repo of repos) { + if (repo.fork) continue; // Skip forked repos - if (!langResponse.ok) { - console.warn(`Failed to fetch languages for repo ${repo.name}`); - continue; - } + // Fetch languages for each repo + const langResponse = await fetch(repo.languages_url, { headers }); - const languages = await langResponse.json() as Record; + if (!langResponse.ok) { + console.warn(`Failed to fetch languages for repo ${repo.name}`); + continue; + } - for (const [lang, bytes] of Object.entries(languages)) { - languageStats[lang] = (languageStats[lang] || 0) + bytes; - } - } + const languages = (await langResponse.json()) as Record; - return languageStats; - } catch (error) { - console.error('Error fetching language stats:', error); - throw error; + for (const [lang, bytes] of Object.entries(languages)) { + languageStats[lang] = (languageStats[lang] || 0) + bytes; + } } + + return languageStats; + } catch (error) { + console.error("Error fetching language stats:", error); + throw error; + } } /** * Get top N languages by bytes */ -export function getTopLanguages(stats: LanguageStats, limit = 5): Array<{ name: string; percent: number; bytes: number }> { - const total = Object.values(stats).reduce((sum, bytes) => sum + bytes, 0); +export function getTopLanguages( + stats: LanguageStats, + limit = 5, +): Array<{ name: string; percent: number; bytes: number }> { + const total = Object.values(stats).reduce((sum, bytes) => sum + bytes, 0); - return Object.entries(stats) - .map(([name, bytes]) => ({ - name, - bytes, - percent: (bytes / total) * 100, - })) - .sort((a, b) => b.bytes - a.bytes) - .slice(0, limit); + return Object.entries(stats) + .map(([name, bytes]) => ({ + name, + bytes, + percent: (bytes / total) * 100, + })) + .sort((a, b) => b.bytes - a.bytes) + .slice(0, limit); } diff --git a/package.json b/package.json index 02648ad..bee0a76 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "dev": "vercel dev", - "build": "tsc" + "build": "tsc", + "format:check": "prettier --check .", + "format:write": "prettier --write ." }, "keywords": [ "github", @@ -21,6 +23,7 @@ "devDependencies": { "@types/node": "^20.10.0", "typescript": "^5.3.0", - "vercel": "^33.0.0" + "vercel": "^33.0.0", + "prettier": "3.8.0" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8101a49..04c1f16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ importers: '@types/node': specifier: ^20.10.0 version: 20.19.33 + prettier: + specifier: 3.8.0 + version: 3.8.0 typescript: specifier: ^5.3.0 version: 5.9.3 @@ -826,6 +829,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + prettier@3.8.0: + resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} + engines: {node: '>=14'} + hasBin: true + pretty-ms@7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} @@ -1943,6 +1951,8 @@ snapshots: picomatch@2.3.1: {} + prettier@3.8.0: {} + pretty-ms@7.0.1: dependencies: parse-ms: 2.1.0 From a82c01df35b2745a76329b989258037696d4d324 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sat, 14 Feb 2026 23:50:00 +0200 Subject: [PATCH 03/13] feat: add test scripts for generating cards --- .env.example | 4 + .gitignore | 3 + README.md | 173 +++++++++++--------------------------- package.json | 10 ++- sandbox/README.md | 133 +++++++++++++++++++++++++++++ sandbox/test-languages.js | 55 ++++++++++++ sandbox/test-stats.js | 45 ++++++++++ sandbox/test-svg.js | 55 ++++++++++++ 8 files changed, 351 insertions(+), 127 deletions(-) create mode 100644 .env.example create mode 100644 sandbox/README.md create mode 100644 sandbox/test-languages.js create mode 100644 sandbox/test-stats.js create mode 100644 sandbox/test-svg.js diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..108e3da --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +# GitHub Personal Access Token (optional, but recommended for higher rate limits) +# Generate one at: https://github.com/settings/tokens +# No scopes are needed for public data +GITHUB_TOKEN=your_github_token_here diff --git a/.gitignore b/.gitignore index 9a5aced..4e8d2f1 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,6 @@ dist # Vite logs files vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# Sandbox test outputs +sandbox/output-*.svg diff --git a/README.md b/README.md index 86c5f90..9bb652e 100644 --- a/README.md +++ b/README.md @@ -1,148 +1,73 @@ -# GitHub Stats Badges +# GitHub Flex -Dynamic, customizable GitHub stats badges for your profile README. Built with TypeScript and deployed on Vercel. +Flex your GitHub stats with customizable SVG badges for your profile. Because your GitHub profile deserves to look as +good as your code...right?! -## Features - -- 📊 **Stats Badge** - Display your GitHub statistics (stars, commits, PRs, issues) -- 🎨 **Language Stats** - Show your most used programming languages -- 📦 **Repository Card** - Showcase individual repository stats -- 🌈 **Multiple Themes** - Choose from 6 beautiful themes -- ⚡ **Fast & Cached** - Optimized with 4-hour caching -- 🔧 **Customizable** - Use URL parameters to customize appearance - -## Usage - -### Stats Badge - -Add to your GitHub profile README: - -```markdown -![GitHub Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME) -``` - -#### Parameters - -- `username` (required) - Your GitHub username -- `theme` - Theme name (default: `default`) - - Options: `default`, `dark`, `radical`, `merko`, `gruvbox`, `tokyonight` -- `hide_border` - Hide the card border (default: `false`) -- `hide_title` - Hide the title (default: `false`) - -#### Examples +## 🚀 Quick Start ```markdown - -![GitHub Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME&theme=dark) - - -![GitHub Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME&theme=tokyonight&hide_border=true) +![Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME&theme=dark) +![Languages](https://your-app.vercel.app/api/languages?username=YOUR_USERNAME) +![Repo](https://your-app.vercel.app/api/repo?username=OWNER&repo=REPO_NAME) ``` -### Language Stats Badge - -```markdown -![Top Languages](https://your-app.vercel.app/api/languages?username=YOUR_USERNAME) -``` - -#### Parameters - -- `username` (required) - Your GitHub username -- `theme` - Theme name (default: `default`) -- `langs_count` - Number of languages to show (default: `5`) -- `hide_border` - Hide the card border (default: `false`) -- `hide_title` - Hide the title (default: `false`) - -#### Examples - -```markdown - -![Top Languages](https://your-app.vercel.app/api/languages?username=YOUR_USERNAME&theme=gruvbox&langs_count=8) -``` +## 🔌 Available Endpoints -### Repository Card +### `/api/stats` -```markdown -![Repo Card](https://your-app.vercel.app/api/repo?username=YOUR_USERNAME&repo=REPO_NAME) -``` +**Parameters:** -#### Parameters +- `username` (required) +- `theme` - `default`, `dark`, `radical`, `merko`, `gruvbox`, `tokyonight` +- `hide_border` - `true` or `false` +- `hide_title` - `true` or `false` -- `username` (required) - Repository owner username -- `repo` (required) - Repository name -- `theme` - Theme name (default: `default`) -- `hide_border` - Hide the card border (default: `false`) +### `/api/languages` -#### Examples +**Parameters:** -```markdown - -![Repo Card](https://your-app.vercel.app/api/repo?username=YOUR_USERNAME&repo=your-awesome-project&theme=dark) -``` +- `username` (required) +- `theme` - same as above +- `langs_count` - number (default: 5) +- `hide_border`, `hide_title` -## Deployment +### `/api/repo` -### Deploy to Vercel +**Parameters:** -1. Fork this repository -2. Create a [Vercel account](https://vercel.com) -3. Import your forked repository -4. (Optional) Add a `GITHUB_TOKEN` environment variable for higher rate limits: - - Go to [GitHub Settings > Developer settings > Personal access tokens](https://github.com/settings/tokens) - - Generate a new token (no scopes needed for public data) - - Add it to Vercel as `GITHUB_TOKEN` environment variable +- `username` (required) +- `repo` (required) +- `theme`, `hide_border` -### Local Development +## 💻 Local Development ```bash -# Install dependencies -npm install - -# Start development server -npm run dev - -# Visit http://localhost:3000/api/stats?username=YOUR_USERNAME +# Install +pnpm install +# or: npm install + +# Build +pnpm build +# or: npm run build + +# Run with Vercel CLI +pnpm dev +# or: npm run dev + +# Test without Vercel CLI +node sandbox/test-stats.js torvalds +node sandbox/test-languages.js torvalds 8 +node sandbox/test-svg.js torvalds dark ``` -## Available Themes - -- **default** - Clean white theme -- **dark** - Dark mode friendly -- **radical** - Pink and cyan -- **merko** - Green terminal vibes -- **gruvbox** - Retro warm colors -- **tokyonight** - Cyberpunk aesthetics - -## How It Works - -This project uses Vercel serverless functions to: - -1. Fetch data from the GitHub API -2. Calculate statistics and aggregate data -3. Generate SVG images dynamically -4. Return cacheable images that can be embedded in markdown - -## Rate Limits - -GitHub API has rate limits: -- **Without token**: 60 requests/hour -- **With token**: 5,000 requests/hour - -For production use, it's recommended to add a `GITHUB_TOKEN` environment variable. - -## Contributing - -Contributions are welcome! Feel free to: - -- Add new badge types -- Create new themes -- Improve statistics calculation -- Fix bugs +Visit `http://localhost:3000/api/stats?username=torvalds` -## License +## ☁️ Deploy to Vercel -MIT +1. Fork this repo +2. Connect to [Vercel](https://vercel.com) +3. (Optional) Add `GITHUB_TOKEN` env variable for higher rate limits -## Inspiration +## 📜 License -Inspired by [github-readme-stats](https://github.com/anuraghazra/github-readme-stats) +This project is licensed under the [MIT License](LICENSE). diff --git a/package.json b/package.json index bee0a76..32e228d 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { - "name": "github-stats-badges", + "name": "github-flex", "version": "1.0.0", - "description": "Dynamic GitHub stats badges for your profile README", + "description": "Dynamic GitHub stats visualization as SVG badges - show your GitHub stats, languages, and repository info with customizable themes", "main": "index.js", "scripts": { "dev": "vercel dev", "build": "tsc", + "type-check": "tsc --noEmit", "format:check": "prettier --check .", "format:write": "prettier --write ." }, @@ -13,7 +14,10 @@ "github", "stats", "badges", - "vercel" + "svg", + "visualization", + "vercel", + "serverless" ], "author": "", "license": "MIT", diff --git a/sandbox/README.md b/sandbox/README.md new file mode 100644 index 0000000..04321a1 --- /dev/null +++ b/sandbox/README.md @@ -0,0 +1,133 @@ +# Sandbox Testing Scripts + +This folder contains standalone test scripts to validate the GitHub Flex functionality without deploying to Vercel. + +## ⚙️ Prerequisites + +1. Build the TypeScript code first: + ```bash + pnpm build + # or: npm run build + ``` + +2. (Optional) Set your GitHub token: + ```bash + export GITHUB_TOKEN=your_token_here + ``` + +## 🧪 Available Test Scripts + +### 1. Test Stats Fetcher + +Tests the GitHub stats fetching functionality: + +```bash +node sandbox/test-stats.js [username] +``` + +**Examples:** + +```bash +node sandbox/test-stats.js torvalds +node sandbox/test-stats.js octocat +``` + +--- + +### 2. Test Language Stats + +Tests the language statistics fetching: + +```bash +node sandbox/test-languages.js [username] [count] +``` + +**Examples:** + +```bash +node sandbox/test-languages.js torvalds +node sandbox/test-languages.js octocat 8 +``` + +**Output:** + +- Top N languages by bytes +- Percentage breakdown + +--- + +### 3. Test SVG Generation + +Generates actual SVG files that you can open in a browser: + +```bash +node sandbox/test-svg.js [username] [theme] +``` + +**Examples:** + +```bash +node sandbox/test-svg.js torvalds dark +node sandbox/test-svg.js octocat tokyonight +``` + +**Available themes:** + +- `default` - Clean white theme +- `dark` - Dark mode friendly +- `radical` - Pink and cyan +- `merko` - Green terminal vibes +- `gruvbox` - Retro warm colors +- `tokyonight` - Cyberpunk aesthetics + +**Output:** + +- SVG file saved to `sandbox/output-{username}-{theme}.svg` +- Open the file in any web browser to view the badge + +--- + +## 🔧 Troubleshooting + +### "Cannot find module" error + +Make sure you've built the TypeScript code: + +```bash +pnpm build +# or: npm run build +``` + +### Rate limit errors + +Set a GitHub token to increase rate limits: + +```bash +export GITHUB_TOKEN=your_token_here +``` + +Or create a `.env` file in the project root: + +``` +GITHUB_TOKEN=your_token_here +``` + +### Module type errors + +If you get ES module errors, ensure your `package.json` has `"type": "module"` or rename scripts to `.mjs`. + +--- + +## 🎯 Next Steps + +Once you've verified everything works locally with these test scripts, you can: + +1. **Run with Vercel CLI** for full endpoint testing: + ```bash + pnpm dev + # or: npm run dev + ``` + +2. **Deploy to Vercel** for production use + +3. **Use the badges** in your GitHub profile README diff --git a/sandbox/test-languages.js b/sandbox/test-languages.js new file mode 100644 index 0000000..ea884ca --- /dev/null +++ b/sandbox/test-languages.js @@ -0,0 +1,55 @@ +/** + * Test script for language stats functionality + * Run with: node sandbox/test-languages.js + */ + +import { fetchLanguageStats, getTopLanguages } from "../dist/lib/languages.js"; + +async function testLanguageStats() { + console.log("Testing Language Stats Fetcher\n"); + console.log("=".repeat(50)); + + const username = process.argv[2] || "torvalds"; + const count = parseInt(process.argv[3]) || 5; + const token = process.env.GITHUB_TOKEN; + + console.log(`\nFetching language stats for: ${username}`); + console.log(`Top languages to show: ${count}`); + + if (token) { + console.log("Using GitHub token for higher rate limits"); + } else { + console.log("No GitHub token found - using unauthenticated requests"); + console.log( + "Set GITHUB_TOKEN environment variable for higher rate limits\n", + ); + } + + try { + const startTime = Date.now(); + const stats = await fetchLanguageStats(username, token); + const topLanguages = getTopLanguages(stats, count); + const endTime = Date.now(); + + console.log( + "\n✅ Success! Language stats fetched in", + endTime - startTime, + "ms\n", + ); + console.log("Top Languages:"); + + topLanguages.forEach((lang, index) => { + console.log(` ${index + 1}. ${lang.name}`); + console.log( + ` ${lang.percent.toFixed(2)}% (${lang.bytes.toLocaleString()} bytes)`, + ); + }); + + console.log(`\nTotal languages found: ${Object.keys(stats).length}`); + } catch (error) { + console.error("\n❌ Error:", error.message); + process.exit(1); + } +} + +testLanguageStats(); diff --git a/sandbox/test-stats.js b/sandbox/test-stats.js new file mode 100644 index 0000000..c4def31 --- /dev/null +++ b/sandbox/test-stats.js @@ -0,0 +1,45 @@ +/** + * Test script for GitHub stats functionality + * Run with: node sandbox/test-stats.js + */ + +import { fetchGitHubStats } from "../dist/lib/github.js"; + +async function testStats() { + console.log("Testing GitHub Stats Fetcher\n"); + console.log("=".repeat(50)); + + const username = process.argv[2] || "torvalds"; + const token = process.env.GITHUB_TOKEN; + + console.log(`\nFetching stats for: ${username}`); + if (token) { + console.log("Using GitHub token for higher rate limits"); + } else { + console.log("No GitHub token found - using unauthenticated requests"); + console.log( + "Set GITHUB_TOKEN environment variable for higher rate limits\n", + ); + } + + try { + const startTime = Date.now(); + const stats = await fetchGitHubStats(username, token); + const endTime = Date.now(); + + console.log("\n✅ Success! Stats fetched in", endTime - startTime, "ms\n"); + console.log("Results:"); + console.log(" Username:", stats.username); + console.log(" Total Stars:", stats.totalStars.toLocaleString()); + console.log(" Total Commits:", stats.totalCommits.toLocaleString()); + console.log(" Total PRs:", stats.totalPRs.toLocaleString()); + console.log(" Total Issues:", stats.totalIssues.toLocaleString()); + console.log(" Total Repos:", stats.contributedTo.toLocaleString()); + console.log(" Rank:", stats.rank); + } catch (error) { + console.error("\n❌ Error:", error.message); + process.exit(1); + } +} + +testStats(); diff --git a/sandbox/test-svg.js b/sandbox/test-svg.js new file mode 100644 index 0000000..519f3fc --- /dev/null +++ b/sandbox/test-svg.js @@ -0,0 +1,55 @@ +/** + * Test script for SVG card generation + * Run with: node sandbox/test-svg.js + * + * This will generate SVG files that you can open in a browser + */ + +import { writeFileSync } from "fs"; +import { fetchGitHubStats } from "../dist/lib/github.js"; +import { generateCard, generateStatItem } from "../dist/lib/card.js"; + +async function testSVGGeneration() { + console.log("Testing SVG Card Generation\n"); + console.log("=".repeat(50)); + + const username = process.argv[2] || "torvalds"; + const theme = process.argv[3] || "default"; + const token = process.env.GITHUB_TOKEN; + + console.log(`\nGenerating stats card for: ${username}`); + console.log(`Theme: ${theme}`); + + try { + console.log("\nFetching GitHub stats..."); + const stats = await fetchGitHubStats(username, token); + + console.log("Generating SVG card..."); + const statItems = [ + generateStatItem("Total Stars", stats.totalStars.toLocaleString(), 0), + generateStatItem("Total Commits", stats.totalCommits.toLocaleString(), 1), + generateStatItem("Total PRs", stats.totalPRs.toLocaleString(), 2), + generateStatItem("Total Issues", stats.totalIssues.toLocaleString(), 3), + generateStatItem("Total Repos", stats.contributedTo.toLocaleString(), 4), + ].join(""); + + const svg = generateCard(statItems, { + title: `${username}'s GitHub Stats`, + width: 495, + height: 195, + theme: theme, + hideBorder: false, + }); + + const filename = `sandbox/output-${username}-${theme}.svg`; + writeFileSync(filename, svg); + + console.log(`\n✅ Success! SVG saved to: ${filename}`); + console.log("Open this file in a browser to view the badge\n"); + } catch (error) { + console.error("\n❌ Error:", error.message); + process.exit(1); + } +} + +testSVGGeneration(); From 6a7744b2922c4afa54b85b3266b1f84a9a514524 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 00:26:29 +0200 Subject: [PATCH 04/13] feat: improvements --- .gitignore | 1 + README.md | 2 + api/languages.ts | 16 ++++++- api/repo.ts | 8 ++++ api/stats.ts | 8 ++++ lib/languages.ts | 13 ++++++ sandbox/README.md | 24 ++++++++++- sandbox/test-languages-svg.js | 79 +++++++++++++++++++++++++++++++++++ 8 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 sandbox/test-languages-svg.js diff --git a/.gitignore b/.gitignore index 4e8d2f1..ab7b419 100644 --- a/.gitignore +++ b/.gitignore @@ -140,3 +140,4 @@ vite.config.ts.timestamp-* # Sandbox test outputs sandbox/output-*.svg +sandbox/output-*-languages-*.svg diff --git a/README.md b/README.md index 9bb652e..51d7a23 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ good as your code...right?! - `username` (required) - `theme` - same as above - `langs_count` - number (default: 5) +- `exclude` - comma-separated languages to exclude (e.g., `HTML,CSS`) - `hide_border`, `hide_title` ### `/api/repo` @@ -58,6 +59,7 @@ pnpm dev node sandbox/test-stats.js torvalds node sandbox/test-languages.js torvalds 8 node sandbox/test-svg.js torvalds dark +node sandbox/test-languages-svg.js torvalds dark 8 ``` Visit `http://localhost:3000/api/stats?username=torvalds` diff --git a/api/languages.ts b/api/languages.ts index 4c29f49..ca52dd4 100644 --- a/api/languages.ts +++ b/api/languages.ts @@ -2,6 +2,16 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; import { fetchLanguageStats, getTopLanguages } from "../lib/languages"; import { generateCard, ThemeName, themes, escapeXml } from "../lib/card"; +/** + * API handler to generate a GitHub languages badge. + * Accepts query parameters: + * - username (required): GitHub username + * - theme (optional): Card theme (default: "default") + * - hide_border (optional): Whether to hide the card border (true/false) + * - hide_title (optional): Whether to hide the card title (true/false) + * - langs_count (optional): Number of top languages to display (default: 5) + * - exclude (optional): Comma-separated list of languages to exclude (e.g., "HTML,CSS") + */ export default async function handler(req: VercelRequest, res: VercelResponse) { const { username, @@ -9,6 +19,7 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { hide_border, hide_title, langs_count = "5", + exclude, } = req.query; // Validate username @@ -30,8 +41,11 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { // Get GitHub token from environment variable const githubToken = process.env.GITHUB_TOKEN; + // Get excluded languages + const excludeParam = typeof exclude === "string" ? exclude : undefined; + // Fetch language stats - const stats = await fetchLanguageStats(username, githubToken); + const stats = await fetchLanguageStats(username, githubToken, excludeParam); const topLanguages = getTopLanguages(stats, langsCount); if (topLanguages.length === 0) { diff --git a/api/repo.ts b/api/repo.ts index b90ad92..0093200 100644 --- a/api/repo.ts +++ b/api/repo.ts @@ -53,6 +53,14 @@ async function fetchRepoStats( }; } +/** + * API handler to generate a GitHub repository stats card. + * Accepts query parameters: + * - username (required): GitHub username + * - repo (required): Repository name + * - theme (optional): Card theme (default: "default") + * - hide_border (optional): Whether to hide the card border (true/false) + */ export default async function handler(req: VercelRequest, res: VercelResponse) { const { username, repo, theme = "default", hide_border } = req.query; diff --git a/api/stats.ts b/api/stats.ts index 536d356..71b4885 100644 --- a/api/stats.ts +++ b/api/stats.ts @@ -2,6 +2,14 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; import { fetchGitHubStats } from "../lib/github"; import { generateCard, generateStatItem, ThemeName, themes } from "../lib/card"; +/** + * API handler to generate a GitHub stats badge. + * Accepts query parameters: + * - username (required): GitHub username + * - theme (optional): Card theme (default: "default") + * - hide_border (optional): Whether to hide the card border (true/false) + * - hide_title (optional): Whether to hide the card title (true/false) + */ export default async function handler(req: VercelRequest, res: VercelResponse) { const { username, theme = "default", hide_border, hide_title } = req.query; diff --git a/lib/languages.ts b/lib/languages.ts index 066edef..59ed326 100644 --- a/lib/languages.ts +++ b/lib/languages.ts @@ -10,10 +10,14 @@ interface GitHubRepoItem { /** * Fetches language statistics for a GitHub user + * @param username GitHub username + * @param token Optional GitHub token for higher rate limits + * @param exclude Comma-separated list of languages to exclude (e.g., "HTML,CSS") */ export async function fetchLanguageStats( username: string, token?: string, + exclude?: string, ): Promise { const headers: HeadersInit = { Accept: "application/vnd.github+json", @@ -36,6 +40,11 @@ export async function fetchLanguageStats( const repos = (await reposResponse.json()) as GitHubRepoItem[]; + // Parse excluded languages + const excludedLanguages = exclude + ? exclude.split(",").map((lang) => lang.trim().toLowerCase()) + : []; + // Aggregate language stats const languageStats: LanguageStats = {}; @@ -53,6 +62,10 @@ export async function fetchLanguageStats( const languages = (await langResponse.json()) as Record; for (const [lang, bytes] of Object.entries(languages)) { + // Skip excluded languages + if (excludedLanguages.includes(lang.toLowerCase())) { + continue; + } languageStats[lang] = (languageStats[lang] || 0) + bytes; } } diff --git a/sandbox/README.md b/sandbox/README.md index 04321a1..fde4faa 100644 --- a/sandbox/README.md +++ b/sandbox/README.md @@ -56,7 +56,29 @@ node sandbox/test-languages.js octocat 8 --- -### 3. Test SVG Generation +### 3. Test Language SVG Generation + +Generates language stats SVG files that you can open in a browser: + +```bash +node sandbox/test-languages-svg.js [username] [theme] [count] [exclude] +``` + +**Examples:** + +```bash +node sandbox/test-languages-svg.js torvalds dark 8 +node sandbox/test-languages-svg.js octocat tokyonight 5 "HTML,CSS" +``` + +**Output:** + +- SVG file saved to `sandbox/output-{username}-languages-{theme}.svg` +- Open the file in any web browser to view the badge + +--- + +### 4. Test SVG Generation Generates actual SVG files that you can open in a browser: diff --git a/sandbox/test-languages-svg.js b/sandbox/test-languages-svg.js new file mode 100644 index 0000000..7162a93 --- /dev/null +++ b/sandbox/test-languages-svg.js @@ -0,0 +1,79 @@ +/** + * Test script for language stats SVG card generation + * Run with: node sandbox/test-languages-svg.js + * + * This will generate SVG files that you can open in a browser + */ + +import { writeFileSync } from "fs"; +import { fetchLanguageStats, getTopLanguages } from "../dist/lib/languages.js"; +import { generateCard, themes, escapeXml } from "../dist/lib/card.js"; + +async function testLanguagesSVG() { + console.log("Testing Language Stats SVG Generation\n"); + console.log("=".repeat(50)); + + const username = process.argv[2] || "torvalds"; + const theme = process.argv[3] || "default"; + const count = parseInt(process.argv[4]) || 5; + const exclude = process.argv[5] || ""; + const token = process.env.GITHUB_TOKEN; + + console.log(`\nGenerating language stats card for: ${username}`); + console.log(`Theme: ${theme}`); + console.log(`Languages to show: ${count}`); + if (exclude) { + console.log(`Excluding: ${exclude}`); + } + + try { + console.log("\nFetching language stats..."); + const stats = await fetchLanguageStats(username, token, exclude); + const topLanguages = getTopLanguages(stats, count); + + if (topLanguages.length === 0) { + throw new Error("No languages found"); + } + + console.log("Generating SVG card..."); + const colors = themes[theme]; + + // Generate language bars + const languageBars = topLanguages + .map((lang, index) => { + const yOffset = 60 + index * 40; + const barWidth = (lang.percent / 100) * 300; + + return ` + + ${escapeXml(lang.name)} + ${lang.percent.toFixed(1)}% + + + + `; + }) + .join(""); + + const cardHeight = 100 + topLanguages.length * 40; + + const svg = generateCard(languageBars, { + title: "Most Used Languages", + width: 450, + height: cardHeight, + theme: theme, + hideBorder: false, + }); + + const filename = `sandbox/output-${username}-languages-${theme}.svg`; + writeFileSync(filename, svg); + + console.log(`\n✅ Success! SVG saved to: ${filename}`); + console.log("Open this file in a browser to view the badge\n"); + } catch (error) { + console.error("\n❌ Error:", error.message); + process.exit(1); + } +} + +testLanguagesSVG(); From fb12a1d3f2e89ce9d33fb06c5dcf8dcb29526f36 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 09:43:13 +0200 Subject: [PATCH 05/13] feat: improvements --- api/stats.ts | 6 +- lib/card.ts | 185 +++++++++++++++++++++++++++++-------- sandbox/README.md | 28 ++++-- sandbox/test-stats-mock.js | 37 ++++++++ sandbox/test-svg.js | 4 +- 5 files changed, 210 insertions(+), 50 deletions(-) create mode 100644 sandbox/test-stats-mock.js diff --git a/api/stats.ts b/api/stats.ts index 71b4885..50aad23 100644 --- a/api/stats.ts +++ b/api/stats.ts @@ -40,11 +40,11 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { generateStatItem("Total Repos", stats.contributedTo.toLocaleString(), 4), ].join(""); - // Generate the card + // Generate the card with adjusted dimensions for 2-column layout const svg = generateCard(statItems, { title: hide_title === "true" ? "" : `${username}'s GitHub Stats`, - width: 495, - height: 195, + width: 500, + height: 240, theme: selectedTheme, hideBorder: hide_border === "true", }); diff --git a/lib/card.ts b/lib/card.ts index 09d967b..c17aad8 100644 --- a/lib/card.ts +++ b/lib/card.ts @@ -1,34 +1,34 @@ /** - * Color themes for the badges + * Color themes for the badges - Playful and vibrant */ export const themes = { default: { - bg: "#ffffff", - title: "#2f80ed", - text: "#434d58", - icon: "#4c71f2", - border: "#e4e2e2", + bg: "#fffef9", + title: "#ff6b6b", + text: "#5f6368", + icon: "#4ecdc4", + border: "#ff6b6b", }, dark: { - bg: "#151515", - title: "#fff", - text: "#9f9f9f", - icon: "#79ff97", - border: "#404040", + bg: "#1a1a2e", + title: "#f4d35e", + text: "#e8e8e8", + icon: "#95e1d3", + border: "#f4d35e", }, radical: { bg: "#141321", - title: "#fe428e", + title: "#ff6bcb", text: "#a9fef7", - icon: "#f8d847", - border: "#fe428e", + icon: "#ffd93d", + border: "#ff6bcb", }, merko: { - bg: "#0a0f0d", - title: "#abd200", + bg: "#0f1c14", + title: "#c1ff72", text: "#68b587", - icon: "#b7d364", - border: "#abd200", + icon: "#ffeb3b", + border: "#c1ff72", }, gruvbox: { bg: "#282828", @@ -44,6 +44,20 @@ export const themes = { icon: "#bf91f3", border: "#70a5fd", }, + bubblegum: { + bg: "#fff0f5", + title: "#ff1493", + text: "#8b4789", + icon: "#ff69b4", + border: "#ff69b4", + }, + ocean: { + bg: "#e0f7ff", + title: "#0077be", + text: "#2c5f7c", + icon: "#00d4ff", + border: "#00a8e8", + }, }; export type ThemeName = keyof typeof themes; @@ -71,7 +85,14 @@ export function generateCard(content: string, options: CardOptions): string { } = options; const colors = themes[theme]; - const border = hideBorder ? "" : `stroke="${colors.border}" stroke-width="1"`; + + // Hand-drawn sketch effect using SVG filter + const sketchFilter = ` + + + + + `; return ` ${escapeXml(title)} + ${sketchFilter} - - - + + ${ + hideBorder + ? `` + : ` + + ` + } + + + ${escapeXml(title)} + + + + + + + ${content} - - ${content} `; } /** - * Generates a stat item for the card + * Generates a stat item for the card with a playful card-style layout + * FIXED VERSION - Nested transforms properly */ export function generateStatItem( label: string, @@ -110,15 +186,48 @@ export function generateStatItem( index: number, bold = true, ): string { - const yOffset = 60 + index * 25; - const valueWeight = bold ? "600" : "400"; + // Arrange stats in a 2-column grid layout with playful rotations + const col = index % 2; + const row = Math.floor(index / 2); + + const xOffset = 20 + col * 240; + const yOffset = 65 + row * 60; + + // Playful rotations alternating between slight angles + const rotations = [-1.5, 1.2, 0.8, -1, 1.5]; + const rotation = rotations[index % rotations.length]; + + // Decorative shapes/doodles for visual interest + const doodles = [ + ``, + ``, + ``, + ``, + ``, + ]; return ` - - - ${label}: - ${value} - + + + + + + + + ${doodles[index % doodles.length]} + + + + ${escapeXml(label)} + + + ${escapeXml(String(value))} + `; } diff --git a/sandbox/README.md b/sandbox/README.md index fde4faa..d929b9c 100644 --- a/sandbox/README.md +++ b/sandbox/README.md @@ -95,12 +95,14 @@ node sandbox/test-svg.js octocat tokyonight **Available themes:** -- `default` - Clean white theme -- `dark` - Dark mode friendly -- `radical` - Pink and cyan +- `default` - Warm playful theme with hand-written feel +- `dark` - Dark mode with vibrant accents +- `radical` - Pink and cyan cyberpunk - `merko` - Green terminal vibes - `gruvbox` - Retro warm colors - `tokyonight` - Cyberpunk aesthetics +- `bubblegum` - Pink and purple playful +- `ocean` - Blue aquatic theme **Output:** @@ -109,6 +111,22 @@ node sandbox/test-svg.js octocat tokyonight --- +### 5. Test Mock Stats SVG (No API Required) + +Generates stats SVG files with mock data (useful when GitHub API is rate-limited): + +```bash +node sandbox/test-stats-mock.js +``` + +**Output:** + +- Generates SVG files for all themes with mock data +- No GitHub API calls required +- Perfect for testing styling changes + +--- + ## 🔧 Troubleshooting ### "Cannot find module" error @@ -134,10 +152,6 @@ Or create a `.env` file in the project root: GITHUB_TOKEN=your_token_here ``` -### Module type errors - -If you get ES module errors, ensure your `package.json` has `"type": "module"` or rename scripts to `.mjs`. - --- ## 🎯 Next Steps diff --git a/sandbox/test-stats-mock.js b/sandbox/test-stats-mock.js new file mode 100644 index 0000000..a4313bf --- /dev/null +++ b/sandbox/test-stats-mock.js @@ -0,0 +1,37 @@ +/** + * Test script for stats SVG generation with mock data + * Run with: node sandbox/test-stats-mock.js + */ + +import { writeFileSync } from "fs"; +import { generateCard, generateStatItem } from "../dist/lib/card.js"; + +console.log("Generating mock stats card...\n"); + +// Mock stats data +const statItems = [ + generateStatItem("Total Stars", "1,234", 0), + generateStatItem("Total Commits", "5,678", 1), + generateStatItem("Total PRs", "432", 2), + generateStatItem("Total Issues", "89", 3), + generateStatItem("Total Repos", "56", 4), +].join(""); + +// Test with different themes +const themes = ["default", "dark", "bubblegum", "ocean"]; + +themes.forEach((theme) => { + const svg = generateCard(statItems, { + title: `Test User's GitHub Stats`, + width: 500, + height: 240, + theme: theme, + hideBorder: false, + }); + + const filename = `sandbox/output-mock-stats-${theme}.svg`; + writeFileSync(filename, svg); + console.log(`✅ Generated: ${filename}`); +}); + +console.log("\n✨ Done! Open the SVG files in your browser to view them.\n"); diff --git a/sandbox/test-svg.js b/sandbox/test-svg.js index 519f3fc..0f50fe7 100644 --- a/sandbox/test-svg.js +++ b/sandbox/test-svg.js @@ -35,8 +35,8 @@ async function testSVGGeneration() { const svg = generateCard(statItems, { title: `${username}'s GitHub Stats`, - width: 495, - height: 195, + width: 500, + height: 240, theme: theme, hideBorder: false, }); From 775b5bc10b1f28d831d747c4c3fb12f9f253d4c9 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 09:51:25 +0200 Subject: [PATCH 06/13] feat: improvements --- api/languages.ts | 39 ++++++++++++++-------------- lib/card.ts | 49 +++++++++++++++++++++++++++++++++-- sandbox/test-languages-svg.js | 36 ++++++++++++------------- 3 files changed, 85 insertions(+), 39 deletions(-) diff --git a/api/languages.ts b/api/languages.ts index ca52dd4..a466ef0 100644 --- a/api/languages.ts +++ b/api/languages.ts @@ -1,6 +1,11 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; import { fetchLanguageStats, getTopLanguages } from "../lib/languages"; -import { generateCard, ThemeName, themes, escapeXml } from "../lib/card"; +import { + generateCard, + generateLanguageItem, + ThemeName, + themes, +} from "../lib/card"; /** * API handler to generate a GitHub languages badge. @@ -55,28 +60,24 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { // Get theme colors const colors = themes[selectedTheme]; - // Generate language bars - const languageBars = topLanguages - .map((lang, index) => { - const yOffset = 60 + index * 40; - const barWidth = (lang.percent / 100) * 300; - - return ` - - ${escapeXml(lang.name)} - ${lang.percent.toFixed(1)}% - - - - `; - }) + // Generate language items with playful card styling + const languageItems = topLanguages + .map((lang, index) => + generateLanguageItem( + lang.name, + lang.percent, + index, + colors.icon, + colors.border, + ), + ) .join(""); - // Calculate card height based on number of languages - const cardHeight = 100 + topLanguages.length * 40; + // Calculate card height based on number of languages (adjusted for new layout) + const cardHeight = 90 + topLanguages.length * 50; // Generate the card - const svg = generateCard(languageBars, { + const svg = generateCard(languageItems, { title: hide_title === "true" ? "" : "Most Used Languages", width: 450, height: cardHeight, diff --git a/lib/card.ts b/lib/card.ts index c17aad8..0e6e79c 100644 --- a/lib/card.ts +++ b/lib/card.ts @@ -191,7 +191,7 @@ export function generateStatItem( const row = Math.floor(index / 2); const xOffset = 20 + col * 240; - const yOffset = 65 + row * 60; + const yOffset = 55 + row * 60; // Playful rotations alternating between slight angles const rotations = [-1.5, 1.2, 0.8, -1, 1.5]; @@ -232,6 +232,51 @@ export function generateStatItem( `; } +/** + * Generates a language stat item with playful card styling + */ +export function generateLanguageItem( + name: string, + percent: number, + index: number, + color: string, + borderColor: string, +): string { + const yOffset = 55 + index * 50; + const barWidth = (percent / 100) * 360; + + return ` + + + + + + + ${escapeXml(name)} + ${percent.toFixed(1)}% + + + + + + + + + `; +} + /** * Escapes text for safe use in SVG */ @@ -239,7 +284,7 @@ export function escapeXml(text: string): string { return text .replace(/&/g, "&") .replace(//g, ">") + .replace(/ { - const yOffset = 60 + index * 40; - const barWidth = (lang.percent / 100) * 300; - - return ` - - ${escapeXml(lang.name)} - ${lang.percent.toFixed(1)}% - - - - `; - }) + // Generate language items with playful card styling + const languageItems = topLanguages + .map((lang, index) => + generateLanguageItem( + lang.name, + lang.percent, + index, + colors.icon, + colors.border, + ), + ) .join(""); - const cardHeight = 100 + topLanguages.length * 40; + const cardHeight = 90 + topLanguages.length * 50; - const svg = generateCard(languageBars, { + const svg = generateCard(languageItems, { title: "Most Used Languages", width: 450, height: cardHeight, From e74faa76ada302ffd5f1aec45712c3fe3ed98600 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 10:04:42 +0200 Subject: [PATCH 07/13] feat: improvements --- lib/card.ts | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/lib/card.ts b/lib/card.ts index 0e6e79c..dc079e3 100644 --- a/lib/card.ts +++ b/lib/card.ts @@ -176,6 +176,29 @@ export function generateCard(content: string, options: CardOptions): string { `; } +/** + * Gets the appropriate icon SVG for a given stat type + */ +function getStatIcon(label: string): string { + const icons: Record = { + star: ``, + commits: ``, + prs: ``, + issues: ``, + contribs: ``, + }; + + const iconMap: Record = { + "Total Stars": icons.star, + "Total Commits": icons.commits, + "Total PRs": icons.prs, + "Total Issues": icons.issues, + "Total Repos": icons.contribs, + }; + + return iconMap[label] || icons.star; // Default to star if not found +} + /** * Generates a stat item for the card with a playful card-style layout * FIXED VERSION - Nested transforms properly @@ -197,14 +220,7 @@ export function generateStatItem( const rotations = [-1.5, 1.2, 0.8, -1, 1.5]; const rotation = rotations[index % rotations.length]; - // Decorative shapes/doodles for visual interest - const doodles = [ - ``, - ``, - ``, - ``, - ``, - ]; + const icon = getStatIcon(label); return ` @@ -217,16 +233,16 @@ export function generateStatItem( stroke-dasharray="3,3" opacity="0.4"/> - - - ${doodles[index % doodles.length]} - + + + ${icon} + - ${escapeXml(label)} + ${escapeXml(label)} - ${escapeXml(String(value))} + ${escapeXml(String(value))} `; From da25d2f85f331c17013358ebc44f7dac72689bf9 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 10:19:09 +0200 Subject: [PATCH 08/13] feat: improvements --- api/languages.ts | 16 +++-- api/repo.ts | 29 +++------ api/stats.ts | 15 +++-- lib/card.ts | 74 ++-------------------- lib/github.ts | 24 ++------ lib/languages.ts | 14 ++--- lib/themes.ts | 67 ++++++++++++++++++++ lib/types.ts | 113 ++++++++++++++++++++++++++++++++++ sandbox/test-languages-svg.js | 13 ++-- sandbox/test-stats-mock.js | 8 ++- sandbox/test-svg.js | 6 +- 11 files changed, 237 insertions(+), 142 deletions(-) create mode 100644 lib/themes.ts create mode 100644 lib/types.ts diff --git a/api/languages.ts b/api/languages.ts index a466ef0..a2d7168 100644 --- a/api/languages.ts +++ b/api/languages.ts @@ -1,11 +1,8 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; import { fetchLanguageStats, getTopLanguages } from "../lib/languages"; -import { - generateCard, - generateLanguageItem, - ThemeName, - themes, -} from "../lib/card"; +import { generateCard, generateLanguageItem } from "../lib/card"; +import { ThemeName } from "../lib/types"; +import { themes } from "../lib/themes"; /** * API handler to generate a GitHub languages badge. @@ -20,7 +17,7 @@ import { export default async function handler(req: VercelRequest, res: VercelResponse) { const { username, - theme = "default", + theme = ThemeName.Default, hide_border, hide_title, langs_count = "5", @@ -34,9 +31,10 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { // Validate theme const selectedTheme = - typeof theme === "string" && theme in themes + typeof theme === "string" && + Object.values(ThemeName).includes(theme as ThemeName) ? (theme as ThemeName) - : "default"; + : ThemeName.Default; const langsCount = parseInt( typeof langs_count === "string" ? langs_count : "5", 10, diff --git a/api/repo.ts b/api/repo.ts index 0093200..136a9c6 100644 --- a/api/repo.ts +++ b/api/repo.ts @@ -1,23 +1,7 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; -import { generateCard, ThemeName, themes, escapeXml } from "../lib/card"; - -interface RepoData { - name: string; - description: string; - stars: number; - forks: number; - language: string; - openIssues: number; -} - -interface GitHubRepoResponse { - name: string; - description: string | null; - stargazers_count: number; - forks_count: number; - language: string | null; - open_issues_count: number; -} +import { generateCard, escapeXml } from "../lib/card"; +import { ThemeName, RepoData, GitHubRepoResponse } from "../lib/types"; +import { themes } from "../lib/themes"; async function fetchRepoStats( owner: string, @@ -62,7 +46,7 @@ async function fetchRepoStats( * - hide_border (optional): Whether to hide the card border (true/false) */ export default async function handler(req: VercelRequest, res: VercelResponse) { - const { username, repo, theme = "default", hide_border } = req.query; + const { username, repo, theme = ThemeName.Default, hide_border } = req.query; // Validate parameters if (!username || typeof username !== "string") { @@ -75,9 +59,10 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { // Validate theme const selectedTheme = - typeof theme === "string" && theme in themes + typeof theme === "string" && + Object.values(ThemeName).includes(theme as ThemeName) ? (theme as ThemeName) - : "default"; + : ThemeName.Default; try { // Get GitHub token from environment variable diff --git a/api/stats.ts b/api/stats.ts index 50aad23..04e0580 100644 --- a/api/stats.ts +++ b/api/stats.ts @@ -1,6 +1,7 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; import { fetchGitHubStats } from "../lib/github"; -import { generateCard, generateStatItem, ThemeName, themes } from "../lib/card"; +import { generateCard, generateStatItem } from "../lib/card"; +import { ThemeName } from "../lib/types"; /** * API handler to generate a GitHub stats badge. @@ -11,7 +12,12 @@ import { generateCard, generateStatItem, ThemeName, themes } from "../lib/card"; * - hide_title (optional): Whether to hide the card title (true/false) */ export default async function handler(req: VercelRequest, res: VercelResponse) { - const { username, theme = "default", hide_border, hide_title } = req.query; + const { + username, + theme = ThemeName.Default, + hide_border, + hide_title, + } = req.query; // Validate username if (!username || typeof username !== "string") { @@ -20,9 +26,10 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { // Validate theme const selectedTheme = - typeof theme === "string" && theme in themes + typeof theme === "string" && + Object.values(ThemeName).includes(theme as ThemeName) ? (theme as ThemeName) - : "default"; + : ThemeName.Default; try { // Get GitHub token from environment variable (optional but recommended for higher rate limits) diff --git a/lib/card.ts b/lib/card.ts index dc079e3..c56d6c2 100644 --- a/lib/card.ts +++ b/lib/card.ts @@ -1,75 +1,9 @@ /** - * Color themes for the badges - Playful and vibrant + * Card generation utilities for GitHub Flex badges */ -export const themes = { - default: { - bg: "#fffef9", - title: "#ff6b6b", - text: "#5f6368", - icon: "#4ecdc4", - border: "#ff6b6b", - }, - dark: { - bg: "#1a1a2e", - title: "#f4d35e", - text: "#e8e8e8", - icon: "#95e1d3", - border: "#f4d35e", - }, - radical: { - bg: "#141321", - title: "#ff6bcb", - text: "#a9fef7", - icon: "#ffd93d", - border: "#ff6bcb", - }, - merko: { - bg: "#0f1c14", - title: "#c1ff72", - text: "#68b587", - icon: "#ffeb3b", - border: "#c1ff72", - }, - gruvbox: { - bg: "#282828", - title: "#fabd2f", - text: "#8ec07c", - icon: "#fe8019", - border: "#fabd2f", - }, - tokyonight: { - bg: "#1a1b27", - title: "#70a5fd", - text: "#38bdae", - icon: "#bf91f3", - border: "#70a5fd", - }, - bubblegum: { - bg: "#fff0f5", - title: "#ff1493", - text: "#8b4789", - icon: "#ff69b4", - border: "#ff69b4", - }, - ocean: { - bg: "#e0f7ff", - title: "#0077be", - text: "#2c5f7c", - icon: "#00d4ff", - border: "#00a8e8", - }, -}; -export type ThemeName = keyof typeof themes; - -export interface CardOptions { - title: string; - width?: number; - height?: number; - theme?: ThemeName; - borderRadius?: number; - hideBorder?: boolean; -} +import { CardOptions, ThemeName } from "./types"; +import { themes } from "./themes"; /** * Generates an SVG card wrapper @@ -79,7 +13,7 @@ export function generateCard(content: string, options: CardOptions): string { title, width = 500, height = 200, - theme = "default", + theme = ThemeName.Default, borderRadius = 4.5, hideBorder = false, } = options; diff --git a/lib/github.ts b/lib/github.ts index 17c8d3c..c1c80e3 100644 --- a/lib/github.ts +++ b/lib/github.ts @@ -1,24 +1,8 @@ -export interface GitHubStats { - username: string; - totalStars: number; - totalCommits: number; - totalPRs: number; - totalIssues: number; - contributedTo: number; - rank: string; -} - -export interface GitHubRepo { - name: string; - stargazers_count: number; - forks_count: number; -} +/** + * GitHub API utilities for fetching user statistics + */ -interface GitHubSearchResponse { - total_count: number; - incomplete_results: boolean; - items: unknown[]; -} +import { GitHubStats, GitHubRepo, GitHubSearchResponse } from "./types"; /** * Fetches GitHub user statistics diff --git a/lib/languages.ts b/lib/languages.ts index 59ed326..f2502e1 100644 --- a/lib/languages.ts +++ b/lib/languages.ts @@ -1,12 +1,8 @@ -export interface LanguageStats { - [language: string]: number; -} +/** + * Language statistics utilities for GitHub users + */ -interface GitHubRepoItem { - name: string; - fork: boolean; - languages_url: string; -} +import { LanguageStats, LanguageData, GitHubRepoItem } from "./types"; /** * Fetches language statistics for a GitHub user @@ -83,7 +79,7 @@ export async function fetchLanguageStats( export function getTopLanguages( stats: LanguageStats, limit = 5, -): Array<{ name: string; percent: number; bytes: number }> { +): LanguageData[] { const total = Object.values(stats).reduce((sum, bytes) => sum + bytes, 0); return Object.entries(stats) diff --git a/lib/themes.ts b/lib/themes.ts new file mode 100644 index 0000000..37ddd8e --- /dev/null +++ b/lib/themes.ts @@ -0,0 +1,67 @@ +/** + * Theme definitions for GitHub Flex badges + */ + +import { Theme, ThemeName } from "./types"; + +/** + * Available themes with color configurations + */ +export const themes: Record = { + [ThemeName.Default]: { + bg: "#fffef9", + title: "#ff6b6b", + text: "#5f6368", + icon: "#4ecdc4", + border: "#ff6b6b", + }, + [ThemeName.Dark]: { + bg: "#1a1a2e", + title: "#f4d35e", + text: "#e8e8e8", + icon: "#95e1d3", + border: "#f4d35e", + }, + [ThemeName.Radical]: { + bg: "#141321", + title: "#ff6bcb", + text: "#a9fef7", + icon: "#ffd93d", + border: "#ff6bcb", + }, + [ThemeName.Merko]: { + bg: "#0f1c14", + title: "#c1ff72", + text: "#68b587", + icon: "#ffeb3b", + border: "#c1ff72", + }, + [ThemeName.Gruvbox]: { + bg: "#282828", + title: "#fabd2f", + text: "#8ec07c", + icon: "#fe8019", + border: "#fabd2f", + }, + [ThemeName.TokyoNight]: { + bg: "#1a1b27", + title: "#70a5fd", + text: "#38bdae", + icon: "#bf91f3", + border: "#70a5fd", + }, + [ThemeName.Bubblegum]: { + bg: "#fff0f5", + title: "#ff1493", + text: "#8b4789", + icon: "#ff69b4", + border: "#ff69b4", + }, + [ThemeName.Ocean]: { + bg: "#e0f7ff", + title: "#0077be", + text: "#2c5f7c", + icon: "#00d4ff", + border: "#00a8e8", + }, +}; diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 0000000..f4bf543 --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,113 @@ +/** + * Theme names enum + */ +export enum ThemeName { + Default = "default", + Dark = "dark", + Radical = "radical", + Merko = "merko", + Gruvbox = "gruvbox", + TokyoNight = "tokyonight", + Bubblegum = "bubblegum", + Ocean = "ocean", +} + +/** + * Theme color configuration + */ +export interface Theme { + bg: string; + title: string; + text: string; + icon: string; + border: string; +} + +/** + * Card generation options + */ +export interface CardOptions { + title: string; + width?: number; + height?: number; + theme?: ThemeName; + borderRadius?: number; + hideBorder?: boolean; +} + +/** + * GitHub user statistics + */ +export interface GitHubStats { + username: string; + totalStars: number; + totalCommits: number; + totalPRs: number; + totalIssues: number; + contributedTo: number; + rank: string; +} + +/** + * GitHub repository data + */ +export interface GitHubRepo { + name: string; + stargazers_count: number; + forks_count: number; +} + +/** + * Language statistics (language name -> bytes) + */ +export interface LanguageStats { + [language: string]: number; +} + +/** + * Language data with percentage + */ +export interface LanguageData { + name: string; + percent: number; + bytes: number; +} + +/** + * Internal GitHub API types + */ +export interface GitHubSearchResponse { + total_count: number; + incomplete_results: boolean; + items: unknown[]; +} + +export interface GitHubRepoItem { + name: string; + fork: boolean; + languages_url: string; +} + +/** + * Repository data for display + */ +export interface RepoData { + name: string; + description: string; + stars: number; + forks: number; + language: string; + openIssues: number; +} + +/** + * GitHub API repository response + */ +export interface GitHubRepoResponse { + name: string; + description: string | null; + stargazers_count: number; + forks_count: number; + language: string | null; + open_issues_count: number; +} diff --git a/sandbox/test-languages-svg.js b/sandbox/test-languages-svg.js index 314d7d3..ee78929 100644 --- a/sandbox/test-languages-svg.js +++ b/sandbox/test-languages-svg.js @@ -7,18 +7,19 @@ import { writeFileSync } from "fs"; import { fetchLanguageStats, getTopLanguages } from "../dist/lib/languages.js"; -import { - generateCard, - generateLanguageItem, - themes, -} from "../dist/lib/card.js"; +import { generateCard, generateLanguageItem } from "../dist/lib/card.js"; +import { ThemeName } from "../dist/lib/types.js"; +import { themes } from "../dist/lib/themes.js"; async function testLanguagesSVG() { console.log("Testing Language Stats SVG Generation\n"); console.log("=".repeat(50)); const username = process.argv[2] || "torvalds"; - const theme = process.argv[3] || "default"; + const themeArg = process.argv[3] || "default"; + const theme = Object.values(ThemeName).includes(themeArg) + ? themeArg + : ThemeName.Default; const count = parseInt(process.argv[4]) || 5; const exclude = process.argv[5] || ""; const token = process.env.GITHUB_TOKEN; diff --git a/sandbox/test-stats-mock.js b/sandbox/test-stats-mock.js index a4313bf..d242a22 100644 --- a/sandbox/test-stats-mock.js +++ b/sandbox/test-stats-mock.js @@ -5,6 +5,7 @@ import { writeFileSync } from "fs"; import { generateCard, generateStatItem } from "../dist/lib/card.js"; +import { ThemeName } from "../dist/lib/types.js"; console.log("Generating mock stats card...\n"); @@ -18,7 +19,12 @@ const statItems = [ ].join(""); // Test with different themes -const themes = ["default", "dark", "bubblegum", "ocean"]; +const themes = [ + ThemeName.Default, + ThemeName.Dark, + ThemeName.Bubblegum, + ThemeName.Ocean, +]; themes.forEach((theme) => { const svg = generateCard(statItems, { diff --git a/sandbox/test-svg.js b/sandbox/test-svg.js index 0f50fe7..ee4522b 100644 --- a/sandbox/test-svg.js +++ b/sandbox/test-svg.js @@ -8,13 +8,17 @@ import { writeFileSync } from "fs"; import { fetchGitHubStats } from "../dist/lib/github.js"; import { generateCard, generateStatItem } from "../dist/lib/card.js"; +import { ThemeName } from "../dist/lib/types.js"; async function testSVGGeneration() { console.log("Testing SVG Card Generation\n"); console.log("=".repeat(50)); const username = process.argv[2] || "torvalds"; - const theme = process.argv[3] || "default"; + const themeArg = process.argv[3] || "default"; + const theme = Object.values(ThemeName).includes(themeArg) + ? themeArg + : ThemeName.Default; const token = process.env.GITHUB_TOKEN; console.log(`\nGenerating stats card for: ${username}`); From 52bd66f955e45f2924ec32bc3ff583ea3309dcb7 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 10:31:46 +0200 Subject: [PATCH 09/13] feat: type and module improvements --- api/languages.ts | 8 ++++---- api/repo.ts | 6 +++--- api/stats.ts | 6 +++--- lib/card.ts | 16 ++-------------- lib/github.ts | 2 +- lib/languages.ts | 2 +- lib/themes.ts | 2 +- package.json | 18 ++++++++++++++---- sandbox/test-languages.js | 2 +- sandbox/test-stats.js | 2 +- sandbox/test-svg.js | 6 +++--- tsconfig.json | 2 +- 12 files changed, 35 insertions(+), 37 deletions(-) diff --git a/api/languages.ts b/api/languages.ts index a2d7168..3ed990b 100644 --- a/api/languages.ts +++ b/api/languages.ts @@ -1,8 +1,8 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; -import { fetchLanguageStats, getTopLanguages } from "../lib/languages"; -import { generateCard, generateLanguageItem } from "../lib/card"; -import { ThemeName } from "../lib/types"; -import { themes } from "../lib/themes"; +import { fetchLanguageStats, getTopLanguages } from "../lib/languages.js"; +import { generateCard, generateLanguageItem } from "../lib/card.js"; +import { ThemeName } from "../lib/types.js"; +import { themes } from "../lib/themes.js"; /** * API handler to generate a GitHub languages badge. diff --git a/api/repo.ts b/api/repo.ts index 136a9c6..944d4e4 100644 --- a/api/repo.ts +++ b/api/repo.ts @@ -1,7 +1,7 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; -import { generateCard, escapeXml } from "../lib/card"; -import { ThemeName, RepoData, GitHubRepoResponse } from "../lib/types"; -import { themes } from "../lib/themes"; +import { generateCard, escapeXml } from "../lib/card.js"; +import { ThemeName, RepoData, GitHubRepoResponse } from "../lib/types.js"; +import { themes } from "../lib/themes.js"; async function fetchRepoStats( owner: string, diff --git a/api/stats.ts b/api/stats.ts index 04e0580..bfcb993 100644 --- a/api/stats.ts +++ b/api/stats.ts @@ -1,7 +1,7 @@ import { VercelRequest, VercelResponse } from "@vercel/node"; -import { fetchGitHubStats } from "../lib/github"; -import { generateCard, generateStatItem } from "../lib/card"; -import { ThemeName } from "../lib/types"; +import { fetchGitHubStats } from "../lib/github.js"; +import { generateCard, generateStatItem } from "../lib/card.js"; +import { ThemeName } from "../lib/types.js"; /** * API handler to generate a GitHub stats badge. diff --git a/lib/card.ts b/lib/card.ts index c56d6c2..66e73b8 100644 --- a/lib/card.ts +++ b/lib/card.ts @@ -2,8 +2,8 @@ * Card generation utilities for GitHub Flex badges */ -import { CardOptions, ThemeName } from "./types"; -import { themes } from "./themes"; +import { CardOptions, ThemeName } from "./types.js"; +import { themes } from "./themes.js"; /** * Generates an SVG card wrapper @@ -238,15 +238,3 @@ export function escapeXml(text: string): string { .replace(/"/g, """) .replace(/'/g, "'"); } - -/** - * Generates an icon - */ -export function generateIcon(iconName: string, color: string): string { - const icons: Record = { - star: ``, - fork: ``, - }; - - return icons[iconName] || ""; -} diff --git a/lib/github.ts b/lib/github.ts index c1c80e3..ab11115 100644 --- a/lib/github.ts +++ b/lib/github.ts @@ -2,7 +2,7 @@ * GitHub API utilities for fetching user statistics */ -import { GitHubStats, GitHubRepo, GitHubSearchResponse } from "./types"; +import { GitHubStats, GitHubRepo, GitHubSearchResponse } from "./types.js"; /** * Fetches GitHub user statistics diff --git a/lib/languages.ts b/lib/languages.ts index f2502e1..06648f3 100644 --- a/lib/languages.ts +++ b/lib/languages.ts @@ -2,7 +2,7 @@ * Language statistics utilities for GitHub users */ -import { LanguageStats, LanguageData, GitHubRepoItem } from "./types"; +import { LanguageStats, LanguageData, GitHubRepoItem } from "./types.js"; /** * Fetches language statistics for a GitHub user diff --git a/lib/themes.ts b/lib/themes.ts index 37ddd8e..49eb5c8 100644 --- a/lib/themes.ts +++ b/lib/themes.ts @@ -2,7 +2,7 @@ * Theme definitions for GitHub Flex badges */ -import { Theme, ThemeName } from "./types"; +import { Theme, ThemeName } from "./types.js"; /** * Available themes with color configurations diff --git a/package.json b/package.json index 32e228d..fb29622 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "github-flex", - "version": "1.0.0", + "version": "0.1.0", + "type": "module", "description": "Dynamic GitHub stats visualization as SVG badges - show your GitHub stats, languages, and repository info with customizable themes", "main": "index.js", "scripts": { @@ -17,9 +18,18 @@ "svg", "visualization", "vercel", - "serverless" + "serverless", + "node", + "typescript", + "api", + "customizable", + "themes", + "languages", + "repositories", + "open-source" ], - "author": "", + "author": "Alexandru Moraru", + "homepage": "https://github.com/alemoraru/github-flex", "license": "MIT", "dependencies": { "@vercel/node": "^3.0.0" @@ -30,4 +40,4 @@ "vercel": "^33.0.0", "prettier": "3.8.0" } -} \ No newline at end of file +} diff --git a/sandbox/test-languages.js b/sandbox/test-languages.js index ea884ca..2dde977 100644 --- a/sandbox/test-languages.js +++ b/sandbox/test-languages.js @@ -3,7 +3,7 @@ * Run with: node sandbox/test-languages.js */ -import { fetchLanguageStats, getTopLanguages } from "../dist/lib/languages.js"; +import { fetchLanguageStats, getTopLanguages } from "../lib/languages.js"; async function testLanguageStats() { console.log("Testing Language Stats Fetcher\n"); diff --git a/sandbox/test-stats.js b/sandbox/test-stats.js index c4def31..b72c746 100644 --- a/sandbox/test-stats.js +++ b/sandbox/test-stats.js @@ -3,7 +3,7 @@ * Run with: node sandbox/test-stats.js */ -import { fetchGitHubStats } from "../dist/lib/github.js"; +import { fetchGitHubStats } from "../lib/github.js"; async function testStats() { console.log("Testing GitHub Stats Fetcher\n"); diff --git a/sandbox/test-svg.js b/sandbox/test-svg.js index ee4522b..96b5b36 100644 --- a/sandbox/test-svg.js +++ b/sandbox/test-svg.js @@ -6,9 +6,9 @@ */ import { writeFileSync } from "fs"; -import { fetchGitHubStats } from "../dist/lib/github.js"; -import { generateCard, generateStatItem } from "../dist/lib/card.js"; -import { ThemeName } from "../dist/lib/types.js"; +import { fetchGitHubStats } from "../lib/github.js"; +import { generateCard, generateStatItem } from "../lib/card.js"; +import { ThemeName } from "../lib/types.js"; async function testSVGGeneration() { console.log("Testing SVG Card Generation\n"); diff --git a/tsconfig.json b/tsconfig.json index 0d2d3a8..c4bc463 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020", - "module": "commonjs", + "module": "ES2020", "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./", From 6207f93927524fea4074669f6c3d0068469fd644 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 11:30:36 +0200 Subject: [PATCH 10/13] feat: add eslint --- eslint.config.mjs | 85 +++ lib/github.ts | 16 +- lib/languages.ts | 4 +- package.json | 27 +- pnpm-lock.yaml | 1374 ++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 1416 insertions(+), 90 deletions(-) create mode 100644 eslint.config.mjs diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..dab5697 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,85 @@ +import js from "@eslint/js"; +import tsPlugin from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import globals from "globals"; + +export default [ + // Ignore patterns + { + ignores: [ + "node_modules/**", + "dist/**", + "sandbox/output-*.svg", + ".vercel/**", + ".github/**", + ], + }, + + // JavaScript files (sandbox scripts) + { + files: ["sandbox/**/*.js"], + languageOptions: { + ecmaVersion: 2020, + sourceType: "module", + globals: { + ...globals.node, + }, + }, + rules: { + ...js.configs.recommended.rules, + "no-unused-vars": "warn", + "no-console": "off", // Allow console in sandbox scripts + }, + }, + + // TypeScript files (lib and api) + { + files: ["lib/**/*.ts", "api/**/*.ts"], + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + project: "./tsconfig.json", + }, + globals: { + ...globals.node, + }, + }, + plugins: { + "@typescript-eslint": tsPlugin, + }, + rules: { + ...js.configs.recommended.rules, + ...tsPlugin.configs.recommended.rules, + + // TypeScript specific rules + "@typescript-eslint/no-unused-vars": [ + "warn", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/no-non-null-assertion": "warn", + + // General rules + "no-console": ["warn", { allow: ["warn", "error"] }], + "prefer-const": "error", + "no-var": "error", + eqeqeq: ["error", "always"], + curly: ["error", "all"], + }, + }, + + // Vercel serverless functions + { + files: ["api/**/*.ts"], + rules: { + "no-console": "off", // Allow console in serverless functions for logging + }, + }, +]; diff --git a/lib/github.ts b/lib/github.ts index ab11115..df2b2fa 100644 --- a/lib/github.ts +++ b/lib/github.ts @@ -83,11 +83,17 @@ export async function fetchGitHubStats( // Calculate rank based on total stars let rank = "C"; - if (totalStars >= 1000) rank = "S"; - else if (totalStars >= 500) rank = "A+"; - else if (totalStars >= 200) rank = "A"; - else if (totalStars >= 100) rank = "B+"; - else if (totalStars >= 50) rank = "B"; + if (totalStars >= 1000) { + rank = "S"; + } else if (totalStars >= 500) { + rank = "A+"; + } else if (totalStars >= 200) { + rank = "A"; + } else if (totalStars >= 100) { + rank = "B+"; + } else if (totalStars >= 50) { + rank = "B"; + } return { username, diff --git a/lib/languages.ts b/lib/languages.ts index 06648f3..2155bb7 100644 --- a/lib/languages.ts +++ b/lib/languages.ts @@ -45,7 +45,9 @@ export async function fetchLanguageStats( const languageStats: LanguageStats = {}; for (const repo of repos) { - if (repo.fork) continue; // Skip forked repos + if (repo.fork) { + continue; + } // Skip forked repos // Fetch languages for each repo const langResponse = await fetch(repo.languages_url, { headers }); diff --git a/package.json b/package.json index fb29622..f7b36c5 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,16 @@ "name": "github-flex", "version": "0.1.0", "type": "module", - "description": "Dynamic GitHub stats visualization as SVG badges - show your GitHub stats, languages, and repository info with customizable themes", + "description": "Flex your GitHub stats with customizable SVG badges for your profile. Because your GitHub profile deserves to look as good as your code...right?!", "main": "index.js", "scripts": { "dev": "vercel dev", "build": "tsc", "type-check": "tsc --noEmit", "format:check": "prettier --check .", - "format:write": "prettier --write ." + "format:write": "prettier --write .", + "lint:check": "eslint .", + "lint:fix": "eslint . --fix" }, "keywords": [ "github", @@ -30,14 +32,25 @@ ], "author": "Alexandru Moraru", "homepage": "https://github.com/alemoraru/github-flex", + "bugs": { + "url": "https://github.com/alemoraru/github-flex/issues" + }, "license": "MIT", "dependencies": { - "@vercel/node": "^3.0.0" + "@vercel/node": "^5.6.3" }, "devDependencies": { - "@types/node": "^20.10.0", - "typescript": "^5.3.0", - "vercel": "^33.0.0", - "prettier": "3.8.0" + "@eslint/js": "^10.0.0", + "@types/node": "^25.2.3", + "@typescript-eslint/eslint-plugin": "^8.55.0", + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^10.0.0", + "globals": "^17.3.0", + "prettier": "3.8.0", + "typescript": "^5.9.3", + "vercel": "^33.0.0" + }, + "engines": { + "node": ">=23" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04c1f16..38c035f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,32 @@ importers: .: dependencies: '@vercel/node': - specifier: ^3.0.0 - version: 3.2.29 + specifier: ^5.6.3 + version: 5.6.3 devDependencies: + '@eslint/js': + specifier: ^10.0.0 + version: 10.0.1(eslint@10.0.0) '@types/node': - specifier: ^20.10.0 - version: 20.19.33 + specifier: ^25.2.3 + version: 25.2.3 + '@typescript-eslint/eslint-plugin': + specifier: ^8.55.0 + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@10.0.0)(typescript@5.9.3))(eslint@10.0.0)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.55.0 + version: 8.55.0(eslint@10.0.0)(typescript@5.9.3) + eslint: + specifier: ^10.0.0 + version: 10.0.0 + globals: + specifier: ^17.3.0 + version: 17.3.0 prettier: specifier: 3.8.0 version: 3.8.0 typescript: - specifier: ^5.3.0 + specifier: ^5.9.3 version: 5.9.3 vercel: specifier: ^33.0.0 @@ -27,6 +42,9 @@ importers: packages: + '@bytecodealliance/preview2-shim@0.17.6': + resolution: {integrity: sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -51,10 +69,237 @@ packages: resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.1': + resolution: {integrity: sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.5.2': + resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.1.0': + resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.1': + resolution: {integrity: sha512-P9cq2dpr+LU8j3qbLygLcSZrl2/ds/pUpfnHNNuk5HW7mnngHs+6WSq5C9mO3rqRX8A1poxqLTC9cu0KOyJlBg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.6.0': + resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -69,6 +314,11 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -81,10 +331,23 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@renovatebot/pep440@4.2.1': + resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} + engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} + '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@sinclair/typebox@0.25.24': resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} @@ -107,24 +370,89 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/node@14.18.33': resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} - '@types/node@16.18.11': - resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} + '@types/node@20.11.0': + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} + + '@types/node@25.2.3': + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + + '@typescript-eslint/eslint-plugin@8.55.0': + resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.55.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.55.0': + resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.55.0': + resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.55.0': + resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.55.0': + resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.55.0': + resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.55.0': + resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.55.0': + resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.55.0': + resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.55.0': + resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@types/node@20.19.33': - resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} + '@vercel/build-utils@13.4.0': + resolution: {integrity: sha512-hGBYt+olxUtDZu0W8DKl4NjY8tQC1eJUxDpkJdOhcugap4NnHeHZQ33vEKs0Z72bYlqotgu0AoEOv+ri5rlh4w==} '@vercel/build-utils@7.11.0': resolution: {integrity: sha512-UFrx1hNIjNJJkd0NZrYfaOrmcWhQmrVsbKe9o3L9jX9J1iufG685wIZ9tFCKKC0Fa2HWbNDNzNxrE5SCAS2lyA==} - '@vercel/build-utils@8.7.0': - resolution: {integrity: sha512-ofZX+ABiW76u5khIyYyH5xK5KSuiAteqRu5hz2k1a2WHLwF7VpeBg8gdFR+HwbVnNkHtkMA64ya5Dd/lNoABkw==} - '@vercel/error-utils@2.0.2': resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} @@ -155,16 +483,19 @@ packages: engines: {node: '>=16'} hasBin: true - '@vercel/nft@0.27.3': - resolution: {integrity: sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==} - engines: {node: '>=16'} + '@vercel/nft@1.1.1': + resolution: {integrity: sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==} + engines: {node: '>=20'} hasBin: true '@vercel/node@3.0.26': resolution: {integrity: sha512-PoyacnoylwpE3+7RFUVHJlbPqtneTCEJVXXx4n8g9ARgUDSRSCwFpJOhiFQon2sS2YtfCzsJa29Z9dAZQedDcQ==} - '@vercel/node@3.2.29': - resolution: {integrity: sha512-WRVYidBqtRyYUw36v/WyUB2v97PsiV2+LepUiOPWcW9UpszQGGT2DAzsXOYqWveXMJKFhx0aETR6Nn6i+Yps1Q==} + '@vercel/node@5.6.3': + resolution: {integrity: sha512-sordxYoSnYquTxQ2sSIubukhZtAThSAjT+A+ACFac9nkOWyPfW83eQINPWBD/xotdNm3w+1v/afkt427GbXfNg==} + + '@vercel/python-analysis@0.4.1': + resolution: {integrity: sha512-Ae6zayRNAO//z9ULOV+T8sjJFJLfA0OU540/BDkaVWHWhlqElIA7uyi71WuD7Ls06CDVpKYNRysv3keJaVbwow==} '@vercel/python@4.1.1': resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} @@ -187,14 +518,26 @@ packages: '@vercel/static-config@3.0.0': resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + '@vercel/static-config@3.1.2': + resolution: {integrity: sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} @@ -208,6 +551,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -239,6 +586,9 @@ packages: arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + async-listen@1.2.0: resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} @@ -256,6 +606,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -266,6 +620,13 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -288,6 +649,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} @@ -301,6 +666,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -337,6 +706,9 @@ packages: supports-color: optional: true + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -494,9 +866,64 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@9.1.0: + resolution: {integrity: sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.0.0: + resolution: {integrity: sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.1.0: + resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -518,12 +945,28 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -531,10 +974,25 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + fs-extra@11.1.0: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} engines: {node: '>=14.14'} + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -554,6 +1012,11 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -567,14 +1030,29 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@13.0.3: + resolution: {integrity: sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + globals@17.3.0: + resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} + engines: {node: '>=18'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -593,6 +1071,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -601,6 +1083,18 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -641,6 +1135,17 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-schema-to-ts@1.6.4: resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} @@ -650,12 +1155,30 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -683,13 +1206,33 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@10.2.0: + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -704,6 +1247,10 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} @@ -711,6 +1258,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -730,6 +1281,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -757,6 +1311,11 @@ packages: engines: {node: '>=6'} hasBin: true + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -773,6 +1332,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + ohm-js@17.5.0: + resolution: {integrity: sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==} + engines: {node: '>=0.12.1'} + once@1.3.3: resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} @@ -783,6 +1346,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + os-paths@4.4.0: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} @@ -791,6 +1358,14 @@ packages: resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} engines: {node: '>=8'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -798,6 +1373,10 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -810,6 +1389,10 @@ packages: resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} deprecated: This package is archived and no longer maintained. For support, visit https://github.com/expressjs/express/discussions + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} @@ -819,6 +1402,9 @@ packages: path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -829,6 +1415,17 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pip-requirements-js@1.0.2: + resolution: {integrity: sha512-awqoNOSOl4Blu4E4Hzp7jL0g8WKEhCwO+s7C2ibtIW3CAJMwspgoTXd4vnHd21UmhdrsI44Pn8FFSuA8QKrzvg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prettier@3.8.0: resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} engines: {node: '>=14'} @@ -871,6 +1468,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -924,6 +1524,10 @@ packages: resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} engines: {node: '>=14'} + smol-toml@1.5.2: + resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} + engines: {node: '>= 18'} + stat-mode@0.3.0: resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} @@ -962,10 +1566,18 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + time-span@4.0.0: resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} engines: {node: '>=10'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -981,6 +1593,12 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-morph@12.0.0: resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} @@ -1001,6 +1619,15 @@ packages: ts-toolbelt@6.15.5: resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -1014,8 +1641,11 @@ packages: uid-promise@1.0.0: resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} undici@5.26.5: resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} @@ -1073,6 +1703,10 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -1090,6 +1724,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yauzl-clone@1.0.4: resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} engines: {node: '>=6'} @@ -1105,8 +1743,17 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + snapshots: + '@bytecodealliance/preview2-shim@0.17.6': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -1123,24 +1770,159 @@ snapshots: dependencies: '@edge-runtime/primitives': 4.1.0 - '@fastify/busboy@2.1.1': {} + '@esbuild/aix-ppc64@0.27.0': + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@esbuild/android-arm64@0.27.0': + optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} + '@esbuild/android-arm@0.27.0': + optional: true - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@esbuild/android-x64@0.27.0': + optional: true - '@mapbox/node-pre-gyp@1.0.11': - dependencies: - detect-libc: 2.1.2 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.6.9 - nopt: 5.0.0 + '@esbuild/darwin-arm64@0.27.0': + optional: true + + '@esbuild/darwin-x64@0.27.0': + optional: true + + '@esbuild/freebsd-arm64@0.27.0': + optional: true + + '@esbuild/freebsd-x64@0.27.0': + optional: true + + '@esbuild/linux-arm64@0.27.0': + optional: true + + '@esbuild/linux-arm@0.27.0': + optional: true + + '@esbuild/linux-ia32@0.27.0': + optional: true + + '@esbuild/linux-loong64@0.27.0': + optional: true + + '@esbuild/linux-mips64el@0.27.0': + optional: true + + '@esbuild/linux-ppc64@0.27.0': + optional: true + + '@esbuild/linux-riscv64@0.27.0': + optional: true + + '@esbuild/linux-s390x@0.27.0': + optional: true + + '@esbuild/linux-x64@0.27.0': + optional: true + + '@esbuild/netbsd-arm64@0.27.0': + optional: true + + '@esbuild/netbsd-x64@0.27.0': + optional: true + + '@esbuild/openbsd-arm64@0.27.0': + optional: true + + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + + '@esbuild/sunos-x64@0.27.0': + optional: true + + '@esbuild/win32-arm64@0.27.0': + optional: true + + '@esbuild/win32-ia32@0.27.0': + optional: true + + '@esbuild/win32-x64@0.27.0': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.0)': + dependencies: + eslint: 10.0.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.1': + dependencies: + '@eslint/object-schema': 3.0.1 + debug: 4.4.3 + minimatch: 10.2.0 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.2': + dependencies: + '@eslint/core': 1.1.0 + + '@eslint/core@1.1.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.0.0)': + optionalDependencies: + eslint: 10.0.0 + + '@eslint/object-schema@3.0.1': {} + + '@eslint/plugin-kit@0.6.0': + dependencies: + '@eslint/core': 1.1.0 + levn: 0.4.1 + + '@fastify/busboy@2.1.1': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@9.0.0': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.1.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.9 + nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 semver: 7.7.4 @@ -1149,6 +1931,19 @@ snapshots: - encoding - supports-color + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.6.9 + nopt: 8.1.0 + semver: 7.7.4 + tar: 7.5.7 + transitivePeerDependencies: + - encoding + - supports-color + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1161,11 +1956,19 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@renovatebot/pep440@4.2.1': {} + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 + '@rollup/pluginutils@5.3.0': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + '@sinclair/typebox@0.25.24': {} '@tootallnate/once@2.0.0': {} @@ -1185,19 +1988,118 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.8': {} + '@types/json-schema@7.0.15': {} '@types/node@14.18.33': {} - '@types/node@16.18.11': {} + '@types/node@20.11.0': + dependencies: + undici-types: 5.26.5 - '@types/node@20.19.33': + '@types/node@25.2.3': dependencies: - undici-types: 6.21.0 + undici-types: 7.16.0 - '@vercel/build-utils@7.11.0': {} + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@10.0.0)(typescript@5.9.3))(eslint@10.0.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.55.0(eslint@10.0.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/type-utils': 8.55.0(eslint@10.0.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@10.0.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 + eslint: 10.0.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@vercel/build-utils@8.7.0': {} + '@typescript-eslint/parser@8.55.0(eslint@10.0.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 + debug: 4.4.3 + eslint: 10.0.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.55.0': + dependencies: + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 + + '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.55.0(eslint@10.0.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@10.0.0)(typescript@5.9.3) + debug: 4.4.3 + eslint: 10.0.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.55.0': {} + + '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.55.0(eslint@10.0.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + eslint: 10.0.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.55.0': + dependencies: + '@typescript-eslint/types': 8.55.0 + eslint-visitor-keys: 4.2.1 + + '@vercel/build-utils@13.4.0': + dependencies: + '@vercel/python-analysis': 0.4.1 + + '@vercel/build-utils@7.11.0': {} '@vercel/error-utils@2.0.2': {} @@ -1274,22 +2176,23 @@ snapshots: - encoding - supports-color - '@vercel/nft@0.27.3': + '@vercel/nft@1.1.1': dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - '@rollup/pluginutils': 4.2.1 + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0 acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 7.2.3 + glob: 13.0.3 graceful-fs: 4.2.11 - micromatch: 4.0.8 node-gyp-build: 4.8.4 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding + - rollup - supports-color '@vercel/node@3.0.26': @@ -1320,34 +2223,46 @@ snapshots: - encoding - supports-color - '@vercel/node@3.2.29': + '@vercel/node@5.6.3': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 '@edge-runtime/vm': 3.2.0 - '@types/node': 16.18.11 - '@vercel/build-utils': 8.7.0 + '@types/node': 20.11.0 + '@vercel/build-utils': 13.4.0 '@vercel/error-utils': 2.0.3 - '@vercel/nft': 0.27.3 - '@vercel/static-config': 3.0.0 + '@vercel/nft': 1.1.1 + '@vercel/static-config': 3.1.2 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 edge-runtime: 2.5.9 es-module-lexer: 1.4.1 - esbuild: 0.14.47 + esbuild: 0.27.0 etag: 1.8.1 + mime-types: 2.1.35 node-fetch: 2.6.9 - path-to-regexp: 6.2.1 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 - ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) - typescript: 4.9.5 + tsx: 4.21.0 + typescript: 5.9.3 undici: 5.28.4 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding + - rollup - supports-color + '@vercel/python-analysis@0.4.1': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.6 + '@renovatebot/pep440': 4.2.1 + fs-extra: 11.1.1 + js-yaml: 4.1.1 + minimatch: 10.1.1 + pip-requirements-js: 1.0.2 + smol-toml: 1.5.2 + zod: 3.22.4 + '@vercel/python@4.1.1': {} '@vercel/redwood@2.0.8': @@ -1390,12 +2305,24 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 + '@vercel/static-config@3.1.2': + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + abbrev@1.1.1: {} + abbrev@3.0.1: {} + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-walk@8.3.4: dependencies: acorn: 8.15.0 @@ -1408,13 +2335,14 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - optional: true ajv@8.6.3: dependencies: @@ -1443,6 +2371,8 @@ snapshots: arg@4.1.3: {} + argparse@2.0.1: {} + async-listen@1.2.0: {} async-listen@3.0.0: {} @@ -1453,6 +2383,10 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + binary-extensions@2.3.0: {} bindings@1.5.0: @@ -1464,6 +2398,14 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -1488,6 +2430,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + cjs-module-lexer@1.2.3: {} code-block-writer@10.1.1: {} @@ -1496,6 +2440,8 @@ snapshots: concat-map@0.0.1: {} + consola@3.4.2: {} + console-control-strings@1.1.0: {} content-type@1.0.4: {} @@ -1518,6 +2464,8 @@ snapshots: dependencies: ms: 2.1.3 + deep-is@0.1.4: {} + delegates@1.0.0: {} depd@1.1.2: {} @@ -1633,8 +2581,105 @@ snapshots: esbuild-windows-64: 0.14.47 esbuild-windows-arm64: 0.14.47 + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + + escape-string-regexp@4.0.0: {} + + eslint-scope@9.1.0: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.0: {} + + eslint@10.0.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.1 + '@eslint/config-helpers': 0.5.2 + '@eslint/core': 1.1.0 + '@eslint/plugin-kit': 0.6.0 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.0 + eslint-visitor-keys: 5.0.0 + espree: 11.1.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.0 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@11.1.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 5.0.0 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} + etag@1.8.1: {} events-intercept@2.0.0: {} @@ -1662,8 +2707,9 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: - optional: true + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} fastq@1.20.1: dependencies: @@ -1673,18 +2719,44 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-uri-to-path@1.0.0: {} fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + fs-extra@11.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 universalify: 2.0.1 + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -1704,6 +2776,9 @@ snapshots: fsevents@2.1.3: optional: true + fsevents@2.3.3: + optional: true + gauge@3.0.2: dependencies: aproba: 2.1.0 @@ -1722,10 +2797,24 @@ snapshots: dependencies: pump: 3.0.3 + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@13.0.3: + dependencies: + minimatch: 10.2.0 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -1735,6 +2824,8 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + globals@17.3.0: {} + graceful-fs@4.2.11: {} has-unicode@2.0.1: {} @@ -1759,12 +2850,25 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@1.1.1: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -1794,16 +2898,27 @@ snapshots: isexe@2.0.0: {} + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + json-schema-to-ts@1.6.4: dependencies: '@types/json-schema': 7.0.15 ts-toolbelt: 6.15.5 - json-schema-traverse@0.4.1: - optional: true + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -1814,6 +2929,21 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lru-cache@11.2.6: {} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -1839,12 +2969,30 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mimic-fn@2.1.0: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.1 + + minimatch@10.2.0: + dependencies: + brace-expansion: 5.0.2 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + minimist@1.2.8: {} minipass@2.9.0: @@ -1858,6 +3006,8 @@ snapshots: minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@1.3.3: dependencies: minipass: 2.9.0 @@ -1867,6 +3017,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -1879,6 +3033,8 @@ snapshots: ms@2.1.3: {} + natural-compare@1.4.0: {} + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 @@ -1893,6 +3049,10 @@ snapshots: dependencies: abbrev: 1.1.1 + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-path@3.0.0: {} npm-run-path@4.0.1: @@ -1908,6 +3068,8 @@ snapshots: object-assign@4.1.1: {} + ohm-js@17.5.0: {} + once@1.3.3: dependencies: wrappy: 1.0.2 @@ -1920,14 +3082,33 @@ snapshots: dependencies: mimic-fn: 2.1.0 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + os-paths@4.4.0: {} p-finally@2.0.1: {} + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + parse-ms@2.1.0: {} path-browserify@1.0.1: {} + path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -1937,6 +3118,11 @@ snapshots: http-errors: 1.4.0 path-to-regexp: 1.9.0 + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.2 + path-to-regexp@1.9.0: dependencies: isarray: 0.0.1 @@ -1945,12 +3131,22 @@ snapshots: path-to-regexp@6.2.1: {} + path-to-regexp@6.3.0: {} + pend@1.2.0: {} picocolors@1.0.0: {} picomatch@2.3.1: {} + picomatch@4.0.3: {} + + pip-requirements-js@1.0.2: + dependencies: + ohm-js: 17.5.0 + + prelude-ls@1.2.1: {} + prettier@3.8.0: {} pretty-ms@7.0.1: @@ -1989,6 +3185,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + reusify@1.1.0: {} rimraf@3.0.2: @@ -2025,6 +3223,8 @@ snapshots: signal-exit@4.0.2: {} + smol-toml@1.5.2: {} + stat-mode@0.3.0: {} statuses@1.5.0: {} @@ -2074,10 +3274,23 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + time-span@4.0.0: dependencies: convert-hrtime: 3.0.0 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2088,6 +3301,10 @@ snapshots: tree-kill@1.2.2: {} + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-morph@12.0.0: dependencies: '@ts-morph/common': 0.11.1 @@ -2111,25 +3328,18 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): + ts-toolbelt@6.15.5: {} + + tsx@4.21.0: dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.11 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 + esbuild: 0.27.0 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 - ts-toolbelt@6.15.5: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 typescript@4.9.5: {} @@ -2137,7 +3347,9 @@ snapshots: uid-promise@1.0.0: {} - undici-types@6.21.0: {} + undici-types@5.26.5: {} + + undici-types@7.16.0: {} undici@5.26.5: dependencies: @@ -2200,6 +3412,8 @@ snapshots: dependencies: string-width: 4.2.3 + word-wrap@1.2.5: {} + wrappy@1.0.2: {} xdg-app-paths@5.1.0: @@ -2214,6 +3428,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yauzl-clone@1.0.4: dependencies: events-intercept: 2.0.0 @@ -2229,3 +3445,7 @@ snapshots: fd-slicer: 1.1.0 yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zod@3.22.4: {} From c858ae55756233ed31201fd3335127c2cc0446f2 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 11:33:33 +0200 Subject: [PATCH 11/13] feat: add gh quality checks --- .github/workflows/code-quality.yml | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/code-quality.yml diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml new file mode 100644 index 0000000..25ab60e --- /dev/null +++ b/.github/workflows/code-quality.yml @@ -0,0 +1,37 @@ +name: Code Quality + +on: + pull_request: + branches: [ main ] + push: + branches: [ main ] + +jobs: + lint-and-format: + name: Lint & Format + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # actions/checkout@v6 + + - name: Install pnpm + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # pnpm/action-setup@v4 + with: + version: 10 + + - name: Setup Node.js + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # actions/setup-node@v6 + with: + node-version: 24 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + # Takes less than eslint, so we run it first + - name: Run Prettier check + run: pnpm format:check + + - name: Run ESLint + run: pnpm lint:check From 846ba9b0d005877526683ee998f0660a52bd0be4 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 11:35:44 +0200 Subject: [PATCH 12/13] feat: add pr template --- .github/pull_request_template.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..7d000a1 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ +## Description + +[//]: # "Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context." + +## Type of Change + +[//]: # "Please select one" + +- [ ] Feature +- [ ] Bugfix +- [ ] Refactor +- [ ] Documentation +- [ ] Other + +## Checklist + +[//]: # "Please check all that apply" + +- [ ] Manually tested by running `pnpm dev` and viewing all pages +- [ ] It can build a prod build with `pnpm build` +- [ ] Documentation and comments added +- [ ] No console warnings or errors +- [ ] No ESLint warnings or errors +- [ ] No prettier warnings or errors + +## Supplementary Information + +[//]: # "Any other information that is important to this PR, such as screenshots of a UI change" From ff53a5399d473a0f69e9738a398ccb7cf1f6c917 Mon Sep 17 00:00:00 2001 From: alemoraru Date: Sun, 15 Feb 2026 11:46:26 +0200 Subject: [PATCH 13/13] feat: small mods --- README.md | 13 +- package.json | 3 +- pnpm-lock.yaml | 1583 ++++++++++++++---------------------------------- 3 files changed, 458 insertions(+), 1141 deletions(-) diff --git a/README.md b/README.md index 51d7a23..eae036d 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,12 @@ good as your code...right?! ## 🚀 Quick Start +Use the following Markdown snippets to add your GitHub stats, languages, or specific repo info to your profile README: + ```markdown -![Stats](https://your-app.vercel.app/api/stats?username=YOUR_USERNAME&theme=dark) -![Languages](https://your-app.vercel.app/api/languages?username=YOUR_USERNAME) -![Repo](https://your-app.vercel.app/api/repo?username=OWNER&repo=REPO_NAME) +![Stats](https://github-flex.vercel.app/api/stats?username=YOUR_USERNAME&theme=dark) +![Languages](https://github-flex.vercel.app/api/languages?username=YOUR_USERNAME) +![Repo](https://github-flex.vercel.app/api/repo?username=OWNER&repo=REPO_NAME) ``` ## 🔌 Available Endpoints @@ -52,8 +54,7 @@ pnpm build # or: npm run build # Run with Vercel CLI -pnpm dev -# or: npm run dev +vercel dev # Test without Vercel CLI node sandbox/test-stats.js torvalds @@ -62,8 +63,6 @@ node sandbox/test-svg.js torvalds dark node sandbox/test-languages-svg.js torvalds dark 8 ``` -Visit `http://localhost:3000/api/stats?username=torvalds` - ## ☁️ Deploy to Vercel 1. Fork this repo diff --git a/package.json b/package.json index f7b36c5..2bc87e4 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "description": "Flex your GitHub stats with customizable SVG badges for your profile. Because your GitHub profile deserves to look as good as your code...right?!", "main": "index.js", "scripts": { - "dev": "vercel dev", "build": "tsc", "type-check": "tsc --noEmit", "format:check": "prettier --check .", @@ -48,7 +47,7 @@ "globals": "^17.3.0", "prettier": "3.8.0", "typescript": "^5.9.3", - "vercel": "^33.0.0" + "vercel": "^50.17.1" }, "engines": { "node": ">=23" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38c035f..a39a168 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,18 +37,14 @@ importers: specifier: ^5.9.3 version: 5.9.3 vercel: - specifier: ^33.0.0 - version: 33.7.1 + specifier: ^50.17.1 + version: 50.17.1(@vercel/node@5.6.3) packages: '@bytecodealliance/preview2-shim@0.17.6': resolution: {integrity: sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==} - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - '@edge-runtime/format@2.2.1': resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} engines: {node: '>=16'} @@ -300,20 +296,6 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - '@mapbox/node-pre-gyp@2.0.3': resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} engines: {node: '>=18'} @@ -335,10 +317,6 @@ packages: resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} - '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -348,28 +326,16 @@ packages: rollup: optional: true - '@sinclair/typebox@0.25.24': - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} - '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@ts-morph/common@0.11.1': resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -379,9 +345,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@14.18.33': - resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} - '@types/node@20.11.0': resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} @@ -447,83 +410,38 @@ packages: resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vercel/blob@1.0.2': + resolution: {integrity: sha512-Im/KeFH4oPx7UsM+QiteimnE07bIUD7JK6CBafI9Z0jRFogaialTBMiZj8EKk/30ctUYsrpIIyP9iIY1YxWnUQ==} + engines: {node: '>=16.14'} + '@vercel/build-utils@13.4.0': resolution: {integrity: sha512-hGBYt+olxUtDZu0W8DKl4NjY8tQC1eJUxDpkJdOhcugap4NnHeHZQ33vEKs0Z72bYlqotgu0AoEOv+ri5rlh4w==} - '@vercel/build-utils@7.11.0': - resolution: {integrity: sha512-UFrx1hNIjNJJkd0NZrYfaOrmcWhQmrVsbKe9o3L9jX9J1iufG685wIZ9tFCKKC0Fa2HWbNDNzNxrE5SCAS2lyA==} - - '@vercel/error-utils@2.0.2': - resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} + '@vercel/detect-agent@1.1.0': + resolution: {integrity: sha512-Zfq6FbIcYl9gaAmVu6ROsqUiCNwpEj3Ljz/tMX5fl12Z95OFOxzf7vlO03WE5JBU/ri1tBDFHnW41dihMINOPQ==} + engines: {node: '>=14'} '@vercel/error-utils@2.0.3': resolution: {integrity: sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==} - '@vercel/fun@1.1.0': - resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} - engines: {node: '>= 10'} - - '@vercel/gatsby-plugin-vercel-analytics@1.0.11': - resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} - - '@vercel/gatsby-plugin-vercel-builder@2.0.24': - resolution: {integrity: sha512-b02ifu8WCmz4ARjkC9AyuOxpXa0Tmh0uIbDDYvyvDRpvohQY53eC3sXKVOejnmQbi9KojkaJsQRvMTBRh9BUHA==} - - '@vercel/go@3.1.1': - resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} - - '@vercel/hydrogen@1.0.2': - resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} - - '@vercel/next@4.2.0': - resolution: {integrity: sha512-2KSXdPHpfPWaf0tKTBxOWvdc8e9TPNARjmqtgYUsrl1TVaBNFsZ0GV0kWaVLEw4o7CWfREt8ZY064sNVb1BcAQ==} - - '@vercel/nft@0.26.4': - resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} - engines: {node: '>=16'} - hasBin: true + '@vercel/fun@1.3.0': + resolution: {integrity: sha512-8erw9uPe0dFg45THkNxmjtvMX143SkZebmjgSVbcM3XCkXu3RIiBaJMcMNG8aaS+rnTuw8+d4De9HVT0M/r3wg==} + engines: {node: '>= 18'} '@vercel/nft@1.1.1': resolution: {integrity: sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==} engines: {node: '>=20'} hasBin: true - '@vercel/node@3.0.26': - resolution: {integrity: sha512-PoyacnoylwpE3+7RFUVHJlbPqtneTCEJVXXx4n8g9ARgUDSRSCwFpJOhiFQon2sS2YtfCzsJa29Z9dAZQedDcQ==} - '@vercel/node@5.6.3': resolution: {integrity: sha512-sordxYoSnYquTxQ2sSIubukhZtAThSAjT+A+ACFac9nkOWyPfW83eQINPWBD/xotdNm3w+1v/afkt427GbXfNg==} '@vercel/python-analysis@0.4.1': resolution: {integrity: sha512-Ae6zayRNAO//z9ULOV+T8sjJFJLfA0OU540/BDkaVWHWhlqElIA7uyi71WuD7Ls06CDVpKYNRysv3keJaVbwow==} - '@vercel/python@4.1.1': - resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} - - '@vercel/redwood@2.0.8': - resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} - - '@vercel/remix-builder@2.1.5': - resolution: {integrity: sha512-VaDhsNg/1lZ7h6GJnaykActeZTRtFQz45qDNwKrHM+Nw5/ocwTun9sCJZY/ziECUNuQEJv95z3wUDhNweG+/9w==} - - '@vercel/routing-utils@3.1.0': - resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} - - '@vercel/ruby@2.0.5': - resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} - - '@vercel/static-build@2.4.6': - resolution: {integrity: sha512-LCmEBXRse7Bt46fo4OUzkq6RL1Q26oMWvmbFsW5uKi6bkT8asU1U5/zw9PQTeFQjGRL2vkUi22fGXF6XHuuqsA==} - - '@vercel/static-config@3.0.0': - resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} - '@vercel/static-config@3.1.2': resolution: {integrity: sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -538,19 +456,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -561,34 +471,19 @@ packages: ajv@8.6.3: resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - aproba@2.1.0: - resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - arg@4.1.0: resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + async-listen@1.2.0: resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} @@ -600,9 +495,15 @@ packages: resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} engines: {node: '>= 14'} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -610,9 +511,9 @@ packages: resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} engines: {node: 20 || >=22} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + engines: {node: '>=10.0.0'} bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -638,16 +539,13 @@ packages: resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} engines: {node: '>= 0.8'} - chokidar@3.3.1: - resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} - engines: {node: '>= 8.10.0'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chokidar@4.0.0: + resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + engines: {node: '>= 14.16.0'} chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} @@ -659,9 +557,9 @@ packages: code-block-writer@10.1.1: resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -670,9 +568,6 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - content-type@1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} @@ -681,16 +576,17 @@ packages: resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} engines: {node: '>=8'} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -709,8 +605,13 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} @@ -720,151 +621,36 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diff@4.0.4: - resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} - engines: {node: '>=0.3.1'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} edge-runtime@2.5.9: resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} engines: {node: '>=16'} hasBin: true - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.1.0: resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - esbuild-android-64@0.14.47: - resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - esbuild-android-arm64@0.14.47: - resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - esbuild-darwin-64@0.14.47: - resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - esbuild-darwin-arm64@0.14.47: - resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - esbuild-freebsd-64@0.14.47: - resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - esbuild-freebsd-arm64@0.14.47: - resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - esbuild-linux-32@0.14.47: - resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - esbuild-linux-64@0.14.47: - resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - esbuild-linux-arm64@0.14.47: - resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - esbuild-linux-arm@0.14.47: - resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - esbuild-linux-mips64le@0.14.47: - resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - esbuild-linux-ppc64le@0.14.47: - resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - esbuild-linux-riscv64@0.14.47: - resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - esbuild-linux-s390x@0.14.47: - resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - esbuild-netbsd-64@0.14.47: - resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - esbuild-openbsd-64@0.14.47: - resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - esbuild-sunos-64@0.14.47: - resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - esbuild-windows-32@0.14.47: - resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - esbuild-windows-64@0.14.47: - resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - esbuild-windows-arm64@0.14.47: - resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} - esbuild@0.14.47: - resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} - engines: {node: '>=12'} - hasBin: true + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} esbuild@0.27.0: resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} @@ -875,6 +661,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-scope@9.1.0: resolution: {integrity: sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -905,6 +696,11 @@ packages: resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -931,10 +727,6 @@ packages: events-intercept@2.0.0: resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} - execa@3.2.0: - resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} - engines: {node: ^8.12.0 || >=9.7.0} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -985,54 +777,41 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-minipass@1.2.7: - resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.1.3: - resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} generic-pool@3.4.2: resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} engines: {node: '>= 4'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-tsconfig@4.13.6: resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1045,40 +824,41 @@ packages: resolution: {integrity: sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==} engines: {node: 20 || >=22} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - globals@17.3.0: resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} engines: {node: '>=18'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} - http-errors@1.4.0: - resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} - engines: {node: '>= 0.6'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} http-errors@1.7.3: resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} engines: {node: '>= 0.6'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1095,43 +875,32 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.1: - resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1139,6 +908,9 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -1158,9 +930,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} @@ -1183,15 +952,13 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1214,10 +981,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - minimatch@10.1.1: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} @@ -1233,39 +996,14 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@2.9.0: - resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@1.3.3: - resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - minizlib@3.1.0: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -1278,12 +1016,19 @@ packages: ms@2.1.1: resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -1306,32 +1051,11 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - nopt@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - ohm-js@17.5.0: resolution: {integrity: sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==} engines: {node: '>=0.12.1'} @@ -1339,13 +1063,6 @@ packages: once@1.3.3: resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1354,10 +1071,6 @@ packages: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} - p-finally@2.0.1: - resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} - engines: {node: '>=8'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1366,6 +1079,14 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -1377,34 +1098,24 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-match@1.2.4: - resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} - deprecated: This package is archived and no longer maintained. For support, visit https://github.com/expressjs/express/discussions - path-scurry@2.0.1: resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} - path-to-regexp@1.9.0: - resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} - path-to-regexp@6.1.0: resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} - path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -1438,8 +1149,12 @@ packages: promisepipe@3.0.0: resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -1452,13 +1167,9 @@ packages: resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} engines: {node: '>= 0.8'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.3.0: - resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} - engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -1471,30 +1182,22 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true @@ -1503,9 +1206,6 @@ packages: engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - setprototypeof@1.1.1: resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} @@ -1517,17 +1217,30 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.0.2: resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} engines: {node: '>=14'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.5.2: resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} engines: {node: '>= 18'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + stat-mode@0.3.0: resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} @@ -1541,39 +1254,21 @@ packages: stream-to-promise@2.2.0: resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - tar@4.4.18: - resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} - engines: {node: '>=4.5'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - tar@7.5.7: resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + time-span@4.0.0: resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} engines: {node: '>=10'} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -1602,23 +1297,12 @@ packages: ts-morph@12.0.0: resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - ts-toolbelt@6.15.5: resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} @@ -1628,11 +1312,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1647,18 +1326,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@5.26.5: - resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} - engines: {node: '>=14.0'} - undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -1670,24 +1341,66 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@3.3.2: - resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - vercel@33.7.1: - resolution: {integrity: sha512-6VFasn9euV13r6T4q0o5twCopkvm1hYzOJIvS2PAJuNEYcf1tk6gT2Ym0RrXd5sXaWtW1PNHdNVvberkDdsnMA==} - engines: {node: '>= 16'} + vercel@50.17.1: + resolution: {integrity: sha512-ffbavqxjpiLco2Yh7sAnU5npKli663wVyD/bMeJPRZCBGexzZUZo/GGn1hHQzoIh3hKNV0rIXsXUan7PD4HYKg==} + engines: {node: '>= 18'} hasBin: true - - web-vitals@0.2.4: - resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + peerDependencies: + '@vercel/backends': 0.0.33 + '@vercel/elysia': 0.1.36 + '@vercel/express': 0.1.45 + '@vercel/fastify': 0.1.39 + '@vercel/go': 3.4.0 + '@vercel/h3': 0.1.45 + '@vercel/hono': 0.2.39 + '@vercel/hydrogen': 1.3.5 + '@vercel/koa': 0.1.19 + '@vercel/nestjs': 0.2.40 + '@vercel/next': 4.15.28 + '@vercel/node': 5.6.3 + '@vercel/python': 6.12.0 + '@vercel/redwood': 2.4.9 + '@vercel/remix-builder': 5.5.10 + '@vercel/ruby': 2.3.0 + '@vercel/rust': 1.0.5 + '@vercel/static-build': 2.8.37 + peerDependenciesMeta: + '@vercel/backends': + optional: true + '@vercel/elysia': + optional: true + '@vercel/express': + optional: true + '@vercel/fastify': + optional: true + '@vercel/go': + optional: true + '@vercel/h3': + optional: true + '@vercel/hono': + optional: true + '@vercel/hydrogen': + optional: true + '@vercel/koa': + optional: true + '@vercel/nestjs': + optional: true + '@vercel/next': + optional: true + '@vercel/node': + optional: true + '@vercel/python': + optional: true + '@vercel/redwood': + optional: true + '@vercel/remix-builder': + optional: true + '@vercel/ruby': + optional: true + '@vercel/rust': + optional: true + '@vercel/static-build': + optional: true webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -1700,9 +1413,6 @@ packages: engines: {node: '>= 8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -1718,9 +1428,6 @@ packages: resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} engines: {node: '>= 6.0'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -1739,10 +1446,6 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -1754,10 +1457,6 @@ snapshots: '@bytecodealliance/preview2-shim@0.17.6': {} - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - '@edge-runtime/format@2.2.1': {} '@edge-runtime/node-utils@2.3.0': {} @@ -1907,30 +1606,6 @@ snapshots: dependencies: minipass: 7.1.2 - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@mapbox/node-pre-gyp@1.0.11': - dependencies: - detect-libc: 2.1.2 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.6.9 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.7.4 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - '@mapbox/node-pre-gyp@2.0.3': dependencies: consola: 3.4.2 @@ -1958,21 +1633,16 @@ snapshots: '@renovatebot/pep440@4.2.1': {} - '@rollup/pluginutils@4.2.1': - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - '@rollup/pluginutils@5.3.0': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 - '@sinclair/typebox@0.25.24': {} - '@tootallnate/once@2.0.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@ts-morph/common@0.11.1': dependencies: fast-glob: 3.3.3 @@ -1980,22 +1650,12 @@ snapshots: mkdirp: 1.0.4 path-browserify: 1.0.1 - '@tsconfig/node10@1.0.12': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} - '@types/node@14.18.33': {} - '@types/node@20.11.0': dependencies: undici-types: 5.26.5 @@ -2095,87 +1755,46 @@ snapshots: '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 + '@vercel/blob@1.0.2': + dependencies: + async-retry: 1.3.3 + is-buffer: 2.0.5 + is-node-process: 1.2.0 + throttleit: 2.1.0 + undici: 5.28.4 + '@vercel/build-utils@13.4.0': dependencies: '@vercel/python-analysis': 0.4.1 - '@vercel/build-utils@7.11.0': {} - - '@vercel/error-utils@2.0.2': {} + '@vercel/detect-agent@1.1.0': {} '@vercel/error-utils@2.0.3': {} - '@vercel/fun@1.1.0': + '@vercel/fun@1.3.0': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 - debug: 4.1.1 - execa: 3.2.0 - fs-extra: 8.1.0 + debug: 4.3.4 generic-pool: 3.4.2 micro: 9.3.5-canary.3 ms: 2.1.1 node-fetch: 2.6.7 - path-match: 1.2.4 + path-to-regexp: 8.2.0 promisepipe: 3.0.0 - semver: 7.3.5 + semver: 7.5.4 stat-mode: 0.3.0 stream-to-promise: 2.2.0 - tar: 4.4.18 + tar: 7.5.7 + tinyexec: 0.3.2 tree-kill: 1.2.2 uid-promise: 1.0.0 - uuid: 3.3.2 xdg-app-paths: 5.1.0 yauzl-promise: 2.1.3 transitivePeerDependencies: - encoding - supports-color - '@vercel/gatsby-plugin-vercel-analytics@1.0.11': - dependencies: - web-vitals: 0.2.4 - - '@vercel/gatsby-plugin-vercel-builder@2.0.24': - dependencies: - '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 7.11.0 - '@vercel/routing-utils': 3.1.0 - esbuild: 0.14.47 - etag: 1.8.1 - fs-extra: 11.1.0 - - '@vercel/go@3.1.1': {} - - '@vercel/hydrogen@1.0.2': - dependencies: - '@vercel/static-config': 3.0.0 - ts-morph: 12.0.0 - - '@vercel/next@4.2.0': - dependencies: - '@vercel/nft': 0.26.4 - transitivePeerDependencies: - - encoding - - supports-color - - '@vercel/nft@0.26.4': - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - '@rollup/pluginutils': 4.2.1 - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - async-sema: 3.1.1 - bindings: 1.5.0 - estree-walker: 2.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - node-gyp-build: 4.8.4 - resolve-from: 5.0.0 - transitivePeerDependencies: - - encoding - - supports-color - '@vercel/nft@1.1.1': dependencies: '@mapbox/node-pre-gyp': 2.0.3 @@ -2195,34 +1814,6 @@ snapshots: - rollup - supports-color - '@vercel/node@3.0.26': - dependencies: - '@edge-runtime/node-utils': 2.3.0 - '@edge-runtime/primitives': 4.1.0 - '@edge-runtime/vm': 3.2.0 - '@types/node': 14.18.33 - '@vercel/build-utils': 7.11.0 - '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.26.4 - '@vercel/static-config': 3.0.0 - async-listen: 3.0.0 - cjs-module-lexer: 1.2.3 - edge-runtime: 2.5.9 - es-module-lexer: 1.4.1 - esbuild: 0.14.47 - etag: 1.8.1 - node-fetch: 2.6.9 - path-to-regexp: 6.2.1 - ts-morph: 12.0.0 - ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) - typescript: 4.9.5 - undici: 5.26.5 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding - - supports-color - '@vercel/node@5.6.3': dependencies: '@edge-runtime/node-utils': 2.3.0 @@ -2263,56 +1854,12 @@ snapshots: smol-toml: 1.5.2 zod: 3.22.4 - '@vercel/python@4.1.1': {} - - '@vercel/redwood@2.0.8': - dependencies: - '@vercel/nft': 0.26.4 - '@vercel/routing-utils': 3.1.0 - semver: 6.3.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@vercel/remix-builder@2.1.5': - dependencies: - '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.26.4 - '@vercel/static-config': 3.0.0 - ts-morph: 12.0.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@vercel/routing-utils@3.1.0': - dependencies: - path-to-regexp: 6.1.0 - optionalDependencies: - ajv: 6.12.6 - - '@vercel/ruby@2.0.5': {} - - '@vercel/static-build@2.4.6': - dependencies: - '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 - '@vercel/gatsby-plugin-vercel-builder': 2.0.24 - '@vercel/static-config': 3.0.0 - ts-morph: 12.0.0 - - '@vercel/static-config@3.0.0': - dependencies: - ajv: 8.6.3 - json-schema-to-ts: 1.6.4 - ts-morph: 12.0.0 - '@vercel/static-config@3.1.2': dependencies: ajv: 8.6.3 json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 - abbrev@1.1.1: {} - abbrev@3.0.1: {} acorn-import-attributes@1.9.5(acorn@8.15.0): @@ -2323,18 +1870,8 @@ snapshots: dependencies: acorn: 8.15.0 - acorn-walk@8.3.4: - dependencies: - acorn: 8.15.0 - acorn@8.15.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - agent-base@7.1.4: {} ajv@6.12.6: @@ -2351,43 +1888,37 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ansi-regex@5.0.1: {} - any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - aproba@2.1.0: {} - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - arg@4.1.0: {} - arg@4.1.3: {} - argparse@2.0.1: {} + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + async-listen@1.2.0: {} async-listen@3.0.0: {} async-listen@3.0.1: {} + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + async-sema@3.1.1: {} + asynckit@0.4.0: {} + balanced-match@1.0.2: {} balanced-match@4.0.2: dependencies: jackspeak: 4.2.3 - binary-extensions@2.3.0: {} + basic-ftp@5.1.0: {} bindings@1.5.0: dependencies: @@ -2414,21 +1945,14 @@ snapshots: bytes@3.1.0: {} - chokidar@3.3.1: + call-bind-apply-helpers@1.0.2: dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.3.0 - optionalDependencies: - fsevents: 2.1.3 + es-errors: 1.3.0 + function-bind: 1.1.2 - chownr@1.1.4: {} - - chownr@2.0.0: {} + chokidar@4.0.0: + dependencies: + readdirp: 4.1.2 chownr@3.0.0: {} @@ -2436,29 +1960,29 @@ snapshots: code-block-writer@10.1.1: {} - color-support@1.1.3: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 concat-map@0.0.1: {} consola@3.4.2: {} - console-control-strings@1.1.0: {} - content-type@1.0.4: {} convert-hrtime@3.0.0: {} - create-require@1.1.1: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - debug@4.1.1: + data-uri-to-buffer@6.0.2: {} + + debug@4.3.4: dependencies: - ms: 2.1.1 + ms: 2.1.2 debug@4.4.3: dependencies: @@ -2466,13 +1990,23 @@ snapshots: deep-is@0.1.4: {} - delegates@1.0.0: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} depd@1.1.2: {} detect-libc@2.1.2: {} - diff@4.0.4: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 edge-runtime@2.5.9: dependencies: @@ -2486,100 +2020,26 @@ snapshots: signal-exit: 4.0.2 time-span: 4.0.0 - emoji-regex@8.0.0: {} - end-of-stream@1.1.0: dependencies: once: 1.3.3 - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - es-module-lexer@1.4.1: {} - - esbuild-android-64@0.14.47: - optional: true - - esbuild-android-arm64@0.14.47: - optional: true - - esbuild-darwin-64@0.14.47: - optional: true + es-define-property@1.0.1: {} - esbuild-darwin-arm64@0.14.47: - optional: true - - esbuild-freebsd-64@0.14.47: - optional: true + es-errors@1.3.0: {} - esbuild-freebsd-arm64@0.14.47: - optional: true - - esbuild-linux-32@0.14.47: - optional: true - - esbuild-linux-64@0.14.47: - optional: true - - esbuild-linux-arm64@0.14.47: - optional: true - - esbuild-linux-arm@0.14.47: - optional: true - - esbuild-linux-mips64le@0.14.47: - optional: true - - esbuild-linux-ppc64le@0.14.47: - optional: true - - esbuild-linux-riscv64@0.14.47: - optional: true - - esbuild-linux-s390x@0.14.47: - optional: true - - esbuild-netbsd-64@0.14.47: - optional: true - - esbuild-openbsd-64@0.14.47: - optional: true - - esbuild-sunos-64@0.14.47: - optional: true - - esbuild-windows-32@0.14.47: - optional: true - - esbuild-windows-64@0.14.47: - optional: true + es-module-lexer@1.4.1: {} - esbuild-windows-arm64@0.14.47: - optional: true + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 - esbuild@0.14.47: - optionalDependencies: - esbuild-android-64: 0.14.47 - esbuild-android-arm64: 0.14.47 - esbuild-darwin-64: 0.14.47 - esbuild-darwin-arm64: 0.14.47 - esbuild-freebsd-64: 0.14.47 - esbuild-freebsd-arm64: 0.14.47 - esbuild-linux-32: 0.14.47 - esbuild-linux-64: 0.14.47 - esbuild-linux-arm: 0.14.47 - esbuild-linux-arm64: 0.14.47 - esbuild-linux-mips64le: 0.14.47 - esbuild-linux-ppc64le: 0.14.47 - esbuild-linux-riscv64: 0.14.47 - esbuild-linux-s390x: 0.14.47 - esbuild-netbsd-64: 0.14.47 - esbuild-openbsd-64: 0.14.47 - esbuild-sunos-64: 0.14.47 - esbuild-windows-32: 0.14.47 - esbuild-windows-64: 0.14.47 - esbuild-windows-arm64: 0.14.47 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 esbuild@0.27.0: optionalDependencies: @@ -2612,6 +2072,14 @@ snapshots: escape-string-regexp@4.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-scope@9.1.0: dependencies: '@types/esrecurse': 4.3.1 @@ -2666,6 +2134,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 5.0.0 + esprima@4.0.1: {} + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -2684,19 +2154,6 @@ snapshots: events-intercept@2.0.0: {} - execa@3.2.0: - dependencies: - cross-spawn: 7.0.6 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - p-finally: 2.0.1 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -2745,11 +2202,13 @@ snapshots: flatted@3.3.3: {} - fs-extra@11.1.0: + form-data@4.0.5: dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 fs-extra@11.1.1: dependencies: @@ -2757,50 +2216,43 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-minipass@1.2.7: - dependencies: - minipass: 2.9.0 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs.realpath@1.0.0: {} - - fsevents@2.1.3: - optional: true - fsevents@2.3.3: optional: true - gauge@3.0.2: - dependencies: - aproba: 2.1.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 + function-bind@1.1.2: {} generic-pool@3.4.2: {} - get-stream@5.2.0: + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: dependencies: - pump: 3.0.3 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 get-tsconfig@4.13.6: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.1.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2815,25 +2267,21 @@ snapshots: minipass: 7.1.2 path-scurry: 2.0.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globals@17.3.0: {} + gopd@1.2.0: {} + graceful-fs@4.2.11: {} - has-unicode@2.0.1: {} + has-symbols@1.1.0: {} - http-errors@1.4.0: + has-tostringtag@1.0.2: dependencies: - inherits: 2.0.1 - statuses: 1.5.0 + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 http-errors@1.7.3: dependencies: @@ -2843,9 +2291,9 @@ snapshots: statuses: 1.5.0 toidentifier: 1.0.0 - https-proxy-agent@5.0.1: + http-proxy-agent@7.0.2: dependencies: - agent-base: 6.0.2 + agent-base: 7.1.4 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -2857,8 +2305,6 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@1.1.1: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -2869,32 +2315,21 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.1: {} - inherits@2.0.4: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 + ip-address@10.1.0: {} - is-extglob@2.1.1: {} + is-buffer@2.0.5: {} - is-fullwidth-code-point@3.0.0: {} + is-extglob@2.1.1: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-number@7.0.0: {} - - is-stream@2.0.1: {} + is-node-process@1.2.0: {} - isarray@0.0.1: {} + is-number@7.0.0: {} isexe@2.0.0: {} @@ -2902,6 +2337,8 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 + jose@5.9.6: {} + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -2919,10 +2356,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -2948,13 +2381,9 @@ snapshots: dependencies: yallist: 4.0.0 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - make-error@1.3.6: {} + lru-cache@7.18.3: {} - merge-stream@2.0.0: {} + math-intrinsics@1.1.0: {} merge2@1.4.1: {} @@ -2975,8 +2404,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mimic-fn@2.1.0: {} - minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.1 @@ -2993,48 +2420,26 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimist@1.2.8: {} - - minipass@2.9.0: - dependencies: - safe-buffer: 5.2.1 - yallist: 3.1.1 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} - minizlib@1.3.3: - dependencies: - minipass: 2.9.0 - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - minizlib@3.1.0: dependencies: minipass: 7.1.2 - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mkdirp@1.0.4: {} mri@1.2.0: {} ms@2.1.1: {} + ms@2.1.2: {} + ms@2.1.3: {} natural-compare@1.4.0: {} + netmask@2.0.2: {} + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 @@ -3045,43 +2450,16 @@ snapshots: node-gyp-build@4.8.4: {} - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - nopt@8.1.0: dependencies: abbrev: 3.0.1 - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - - object-assign@4.1.1: {} - ohm-js@17.5.0: {} once@1.3.3: dependencies: wrappy: 1.0.2 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -3093,8 +2471,6 @@ snapshots: os-paths@4.4.0: {} - p-finally@2.0.1: {} - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -3103,36 +2479,43 @@ snapshots: dependencies: p-limit: 3.1.0 + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + parse-ms@2.1.0: {} path-browserify@1.0.1: {} path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-match@1.2.4: - dependencies: - http-errors: 1.4.0 - path-to-regexp: 1.9.0 - path-scurry@2.0.1: dependencies: lru-cache: 11.2.6 minipass: 7.1.2 - path-to-regexp@1.9.0: - dependencies: - isarray: 0.0.1 - path-to-regexp@6.1.0: {} - path-to-regexp@6.2.1: {} - path-to-regexp@6.3.0: {} + path-to-regexp@8.2.0: {} + pend@1.2.0: {} picocolors@1.0.0: {} @@ -3155,10 +2538,20 @@ snapshots: promisepipe@3.0.0: {} - pump@3.0.3: + proxy-agent@6.4.0: dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} punycode@2.3.1: {} @@ -3171,15 +2564,7 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.3.0: - dependencies: - picomatch: 2.3.1 + readdirp@4.1.2: {} require-from-string@2.0.2: {} @@ -3187,30 +2572,22 @@ snapshots: resolve-pkg-maps@1.0.0: {} - reusify@1.1.0: {} + retry@0.13.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} - semver@6.3.1: {} - - semver@7.3.5: + semver@7.5.4: dependencies: lru-cache: 6.0.0 semver@7.7.4: {} - set-blocking@2.0.0: {} - setprototypeof@1.1.1: {} shebang-command@2.0.0: @@ -3219,12 +2596,28 @@ snapshots: shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.0.2: {} + smart-buffer@4.2.0: {} + smol-toml@1.5.2: {} + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + + source-map@0.6.1: + optional: true + stat-mode@0.3.0: {} statuses@1.5.0: {} @@ -3239,41 +2632,6 @@ snapshots: end-of-stream: 1.1.0 stream-to-array: 2.3.0 - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-final-newline@2.0.0: {} - - tar@4.4.18: - dependencies: - chownr: 1.1.4 - fs-minipass: 1.2.7 - minipass: 2.9.0 - minizlib: 1.3.3 - mkdirp: 0.5.6 - safe-buffer: 5.2.1 - yallist: 3.1.1 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - tar@7.5.7: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -3282,10 +2640,14 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 + throttleit@2.1.0: {} + time-span@4.0.0: dependencies: convert-hrtime: 3.0.0 + tinyexec@0.3.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -3310,26 +2672,10 @@ snapshots: '@ts-morph/common': 0.11.1 code-block-writer: 10.1.1 - ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.18.33 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - ts-toolbelt@6.15.5: {} + tslib@2.8.1: {} + tsx@4.21.0: dependencies: esbuild: 0.27.0 @@ -3341,8 +2687,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript@4.9.5: {} - typescript@5.9.3: {} uid-promise@1.0.0: {} @@ -3351,16 +2695,10 @@ snapshots: undici-types@7.16.0: {} - undici@5.26.5: - dependencies: - '@fastify/busboy': 2.1.1 - undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - universalify@0.1.2: {} - universalify@2.0.1: {} unpipe@1.0.0: {} @@ -3369,34 +2707,23 @@ snapshots: dependencies: punycode: 2.3.1 - util-deprecate@1.0.2: {} - - uuid@3.3.2: {} - - v8-compile-cache-lib@3.0.1: {} - - vercel@33.7.1: + vercel@50.17.1(@vercel/node@5.6.3): dependencies: - '@vercel/build-utils': 7.11.0 - '@vercel/fun': 1.1.0 - '@vercel/go': 3.1.1 - '@vercel/hydrogen': 1.0.2 - '@vercel/next': 4.2.0 - '@vercel/node': 3.0.26 - '@vercel/python': 4.1.1 - '@vercel/redwood': 2.0.8 - '@vercel/remix-builder': 2.1.5 - '@vercel/ruby': 2.0.5 - '@vercel/static-build': 2.4.6 - chokidar: 3.3.1 + '@vercel/blob': 1.0.2 + '@vercel/build-utils': 13.4.0 + '@vercel/detect-agent': 1.1.0 + '@vercel/fun': 1.3.0 + chokidar: 4.0.0 + esbuild: 0.27.0 + form-data: 4.0.5 + jose: 5.9.6 + proxy-agent: 6.4.0 + optionalDependencies: + '@vercel/node': 5.6.3 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - supports-color - web-vitals@0.2.4: {} - webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -3408,10 +2735,6 @@ snapshots: dependencies: isexe: 2.0.0 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - word-wrap@1.2.5: {} wrappy@1.0.2: {} @@ -3424,8 +2747,6 @@ snapshots: dependencies: os-paths: 4.4.0 - yallist@3.1.1: {} - yallist@4.0.0: {} yallist@5.0.0: {} @@ -3444,8 +2765,6 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yn@3.1.1: {} - yocto-queue@0.1.0: {} zod@3.22.4: {}