swadhinbiswas

[email protected]
2026-01-17 17:01:27 +0600 committed NaN years ago
9eabb75
commit 9eabb75
69 files changed
+11929 -2875
▼.astro/settings.json
+1-1
1
1
{
2
2
"_variables": {
3
- "lastUpdateCheck": 1767130145089
3
+ "lastUpdateCheck": 1768601342501
4
4
}
5
5
}
6
6
▼.env.example
+6-2
24
24
# DATABASE_DRIVER=mongodb
25
25
# DATABASE_URL=mongodb://localhost:27017/opencodehub
26
26
27
-# Turso example:
27
+# Turso example (Recommended for Vercel):
28
28
# DATABASE_DRIVER=turso
29
29
# DATABASE_URL=libsql://your-database.turso.io
30
30
# DATABASE_AUTH_TOKEN=your-auth-token
31
31
32
-# Redis example:
32
+# Upstash Redis (Required for Vercel Sessions):
33
+UPSTASH_REDIS_REST_URL=https://your-redis.upstash.io
34
+UPSTASH_REDIS_REST_TOKEN=your-token
35
+
36
+# Redis example (Self-hosted):
33
37
# DATABASE_DRIVER=redis
34
38
# DATABASE_URL=redis://localhost:6379
35
39
36
40
▼.gitignore
+1-0
49
49
# Monaco Editor cache
50
50
.monaco/
51
51
.vercel
52
+scripts/
52
53
▼DEPLOYMENT.md
+11-0
93
93
STORAGE_BUCKET=opencodehub-production
94
94
STORAGE_REGION=us-east-1
95
95
S3_ACCESS_KEY=<your-access-key>
96
+S3_ACCESS_KEY=<your-access-key>
96
97
S3_SECRET_KEY=<your-secret-key>
97
98
```
98
99
100
+**Google Drive + Turso Stack:**
101
+See [docs/GDRIVE_STACK.md](docs/GDRIVE_STACK.md) for detailed setup.
102
+```bash
103
+STORAGE_TYPE=gdrive
104
+GOOGLE_CLIENT_ID=...
105
+GOOGLE_CLIENT_SECRET=...
106
+GOOGLE_REFRESH_TOKEN=...
107
+GOOGLE_FOLDER_ID=...
108
+```
109
+
99
110
**Optional but Recommended:**
100
111
```bash
101
112
# Error Monitoring
102
113
▼README.md
+26-11
1
1
# OpenCodeHub
2
2
3
3
<p align="center">
4
- <img src="public/logo.png" alt="OpenCodeHub Logo" width="200">
4
+ <img src="public/logo.svg" alt="OpenCodeHub Logo" width="200">
5
5
</p>
6
6
7
7
<p align="center">
66
66
- **Universal Database Adapter** - PostgreSQL, MySQL, SQLite, MongoDB, Turso, PlanetScale
67
67
- **Flexible Storage** - Local, S3, MinIO, Google Drive, Azure Blob, R2
68
68
- **Production-Ready** - Rate limiting, CSRF, input validation, error monitoring
69
+- **Comprehensive Docs** - Integrated documentation site with guides and API reference
69
70
70
71
---
71
72
128
129
# Access at http://localhost:3000
129
130
```
130
131
131
-# Advanced Features Documentation Insert
132
-
133
-**Insert this content into README.md after line 131 (after Docker installation section, before Configuration section)**
134
-
135
132
---
136
133
137
134
## 🎯 OCH CLI - Command Line Interface
209
205
210
206
#### How It Works
211
207
212
-```
208
+```text
213
209
main
214
210
└── PR #123: Add database schema
215
211
└── PR #124: Add authentication service
322
318
- **Fix Suggestions**: Actionable improvements
323
319
324
320
**Example:**
325
-```
321
+```text
326
322
🔴 CRITICAL: SQL Injection Vulnerability
327
323
File: src/api/users.ts:45
328
324
Issue: User input directly concatenated into SQL query
436
432
#### Viewing Metrics
437
433
438
434
**Personal Dashboard:**
439
-```
435
+```text
440
436
/metrics/me
441
437
```
442
438
443
439
**Team Dashboard (Admin):**
444
-```
440
+```text
445
441
/admin/metrics
446
442
```
447
443
454
450
455
451
#### Example Metrics View
456
452
457
-```
453
+```text
458
454
📊 Your Metrics (Last 30 Days)
459
455
460
456
PR Velocity
1045
1041
### Rate Limits
1046
1042
1047
1043
All endpoints return rate limit headers:
1048
-```
1044
+```http
1049
1045
X-RateLimit-Limit: 100
1050
1046
X-RateLimit-Remaining: 95
1051
1047
X-RateLimit-Reset: 2026-01-01T15:30:00Z
1197
1193
1198
1194
---
1199
1195
1196
+## 🗺️ Roadmap
1197
+
1198
+We are constantly improving OpenCodeHub to make it the ultimate self-hosted development platform.
1199
+
1200
+### Q2 2026: Advanced AI Agents
1201
+- [ ] **Auto-Fix Agents**: Autonomous agents that can silently fix lint errors and simple bugs.
1202
+- [ ] **Test Generation**: Automatically generate unit and integration tests for new code.
1203
+
1204
+### Q3 2026: Federation & Social
1205
+- [ ] **ActivityPub Support**: Follow users and repositories across different OpenCodeHub instances.
1206
+- [ ] **Federated Merge Requests**: Cross-instance collaboration (like Email but better).
1207
+
1208
+### Q4 2026: Ecosystem Expansion
1209
+- [ ] **Mobile App**: Native iOS and Android apps for reviewing code on the go.
1210
+- [ ] **IDE Extensions**: dedicated VS Code and JetBrains plugins.
1211
+
1212
+---
1213
+
1200
1214
## 🤝 Contributing
1201
1215
1202
1216
We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
1203
1217
▼README.md.backup
+0-715
1
-# OpenCodeHub
2
-
3
-<p align="center">
4
- <img src="public/logo.png" alt="OpenCodeHub Logo" width="200">
5
-</p>
6
-
7
-<p align="center">
8
- <strong>A powerful, self-hosted Git platform with CI/CD, code review, and enterprise-grade security</strong>
9
-</p>
10
-
11
-<p align="center">
12
- <a href="#-features">Features</a> •
13
- <a href="#-quick-start">Quick Start</a> •
14
- <a href="#%EF%B8%8F-configuration">Configuration</a> •
15
- <a href="#-security">Security</a> •
16
- <a href="#-production-deployment">Production</a> •
17
- <a href="#-api">API</a> •
18
- <a href="#-contributing">Contributing</a>
19
-</p>
20
-
21
-
22
-## 🎉 Production Ready!
23
-
24
-**All critical security vulnerabilities are now fixed. OpenCodeHub is production-ready!** 🎊
25
-
26
-✅ **Rate Limiting** - Prevents brute force attacks
27
-✅ **CSRF Protection** - Cross-site request forgery defense
28
-✅ **Input Validation** - SQL injection & XSS prevention
29
-✅ **Hook Authentication** - Secure git operations
30
-✅ **Environment Validation** - Safe configuration management
31
-
32
-📚 **See [DEPLOYMENT.md](DEPLOYMENT.md) for complete deployment guide** with SSL setup, Nginx configuration, monitoring, database backups, and production best practices.
33
-
34
-
35
-## 🚀 Features
36
-
37
-### Git Hosting & Collaboration
38
-- **Full Git Support** - SSH and HTTP/HTTPS protocols with authentication
39
-- **Repository Management** - Create, fork, archive, and transfer repositories
40
-- **Branch Protection** - Enforce PR requirements, approvals, and code review policies
41
-- **Pull Requests** - Code review with inline comments and approval workflows
42
-- **Issues & Milestones** - Bug tracking with labels, assignees, and custom fields
43
-- **Wiki** - Built-in documentation with markdown support
44
-- **Organizations** - Team management with role-based access control (RBAC)
45
-
46
-### CI/CD & Automation
47
-- **GitHub Actions Compatible** - Run workflows defined in `.github/workflows/`
48
-- **Self-hosted Runners** - Docker-based job execution with artifact support
49
-- **Merge Queue** - Automated PR merge management with conflict detection
50
-- **Webhooks** - Real-time event notifications to external services
51
-- **Secrets Management** - Encrypted storage for CI/CD credentials
52
-
53
-### Security Features ✅
54
-- **Rate Limiting** - Prevents brute force attacks (5 login attempts per 15min)
55
-- **CSRF Protection** - Double-submit cookie pattern for all state-changing operations
56
-- **Input Validation** - Zod schemas prevent injection attacks
57
-- **Hook Authentication** - Shared secrets protect internal git hooks
58
-- **Session Management** - Automatic expiration and rotation
59
-- **Audit Logging** - Complete activity tracking for compliance
60
-
61
-### Modern Tech Stack
62
-- **Astro + React** - Fast, modern frontend with island architecture
63
-- **TailwindCSS + shadcn/ui** - Beautiful, accessible UI components
64
-- **Universal Database Adapter** - PostgreSQL, MySQL, SQLite, MongoDB, Turso, PlanetScale
65
-- **Flexible Storage** - Local, S3, MinIO, Google Drive, Azure Blob, R2
66
-- **Production-Ready** - Rate limiting, CSRF, input validation, error monitoring
67
-
68
-
69
-## 📦 Quick Start
70
-
71
-### Prerequisites
72
-- **Node.js** 18+ or **Bun** 1.0+
73
-- **Database**: PostgreSQL 14+ (recommended) / MySQL 8+ / SQLite 3.35+
74
-- **Git** 2.30+
75
-- **Docker** (optional, for CI/CD runners)
76
-
77
-### Installation (5 minutes)
78
-
79
-```bash
80
-# 1. Clone the repository
81
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
82
-cd OpenCodeHub
83
-
84
-# 2. Install dependencies
85
-npm install
86
-# or
87
-bun install
88
-
89
-# 3. Set up environment
90
-cp .env.example .env
91
-
92
-# 4. Configure your .env file (see Configuration section)
93
-nano .env # Set at minimum: JWT_SECRET, SESSION_SECRET, INTERNAL_HOOK_SECRET, SITE_URL
94
-
95
-# 5. Run database migrations
96
-npm run db:push
97
-# or generate migrations for version control:
98
-npm run db:generate
99
-
100
-# 6. Seed an admin user
101
-bun run scripts/seed-admin.ts
102
-# Enter username, email, password when prompted
103
-
104
-# 7. Start development server
105
-npm run dev
106
-# Application available at http://localhost:3000
107
-```
108
-
109
-### Using Docker (Recommended for Production)
110
-
111
-```bash
112
-# 1. Clone and configure
113
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
114
-cd OpenCodeHub
115
-cp .env.example .env
116
-
117
-# 2. Edit .env with production values (see Production Deployment section)
118
-
119
-# 3. Start services
120
-docker-compose up -d
121
-
122
-# 4. Create admin user
123
-docker-compose exec app bun run scripts/seed-admin.ts
124
-
125
-# Access at http://localhost:3000
126
-```
127
-
128
-
129
-## ⚙️ Configuration
130
-
131
-### Critical Environment Variables
132
-
133
-These **MUST** be set before deploying to production:
134
-
135
-```env
136
-# Security (CRITICAL - Generate strong secrets!)
137
-JWT_SECRET=<run: openssl rand -hex 32>
138
-SESSION_SECRET=<run: openssl rand -hex 32>
139
-INTERNAL_HOOK_SECRET=<run: openssl rand -hex 32>
140
-
141
-# Application URLs (CRITICAL)
142
-SITE_URL=https://your-domain.com # Must be HTTPS in production
143
-PORT=3000
144
-HOST=0.0.0.0
145
-```
146
-
147
-### Database Configuration
148
-
149
-**PostgreSQL (Recommended for Production):**
150
-```env
151
-DATABASE_DRIVER=postgres
152
-DATABASE_URL=postgresql://user:password@localhost:5432/opencodehub
153
-```
154
-
155
-**MySQL:**
156
-```env
157
-DATABASE_DRIVER=mysql
158
-DATABASE_URL=mysql://user:password@localhost:3306/opencodehub
159
-```
160
-
161
-**SQLite (Development Only):**
162
-```env
163
-DATABASE_DRIVER=sqlite
164
-DATABASE_URL=./data/opencodehub.db
165
-```
166
-
167
-### Storage Configuration
168
-
169
-Storage can be configured via Admin Panel (`/admin/storage`) or environment variables:
170
-
171
-**Local Storage:**
172
-```env
173
-STORAGE_TYPE=local
174
-STORAGE_PATH=./data/storage
175
-```
176
-
177
-**S3/MinIO/R2:**
178
-```env
179
-STORAGE_TYPE=s3
180
-STORAGE_BUCKET=opencodehub
181
-STORAGE_REGION=us-east-1
182
-STORAGE_ENDPOINT=https://s3.amazonaws.com
183
-S3_ACCESS_KEY=your-access-key
184
-S3_SECRET_KEY=your-secret-key
185
-```
186
-
187
-**Google Drive (via Admin Panel):**
188
-- Navigate to `/admin/storage`
189
-- Select "Google Drive"
190
-- Enter Client ID, Secret, and Refresh Token
191
-- Test connection before saving
192
-
193
-### Security Configuration
194
-
195
-**Rate Limiting:**
196
-```env
197
-RATE_LIMIT_AUTH=5 # Login attempts per 15 minutes
198
-RATE_LIMIT_API=100 # API requests per minute
199
-RATE_LIMIT_GIT=200 # Git operations per minute
200
-RATE_LIMIT_SKIP_DEV=false # Never skip in production
201
-```
202
-
203
-**CSRF Protection:**
204
-```env
205
-CSRF_SKIP_DEV=false # Never skip in production
206
-```
207
-
208
-### Optional Services
209
-
210
-**Email (SMTP):**
211
-```env
212
-SMTP_HOST=smtp.example.com
213
-SMTP_PORT=587
214
215
-SMTP_PASSWORD=your-smtp-password
216
217
-```
218
-
219
-**Redis (Caching & Sessions):**
220
-```env
221
-REDIS_URL=redis://localhost:6379
222
-```
223
-
224
-**Error Monitoring (Sentry):**
225
-```env
226
-SENTRY_DSN=https://...
227
-ENABLE_TRACING=true
228
-```
229
-
230
-
231
-## 🔒 Security
232
-
233
-OpenCodeHub implements **production-grade security** out of the box:
234
-
235
-### Implemented Security Features
236
-
237
-✅ **Authentication & Authorization**
238
-- JWT-based sessions with automatic expiration
239
-- Bcrypt password hashing (10 rounds)
240
-- 2FA/TOTP support
241
-- Role-based access control (RBAC)
242
-
243
-✅ **Attack Prevention**
244
-- **Rate Limiting**: Prevents brute force (5 login attempts per 15min)
245
-- **CSRF Protection**: Double-submit cookie pattern on all state-changing operations
246
-- **Input Validation**: Zod schemas prevent SQL injection and XSS
247
-- **XSS Sanitization**: Markdown rendered with `rehype-sanitize`
248
-
249
-✅ **Operational Security**
250
-- **Audit Logging**: All admin actions logged to database
251
-- **Hook Authentication**: Git hooks protected with shared secrets
252
-- **Session Management**: Automatic cleanup and rotation
253
-- **Environment Validation**: Startup checks for missing/weak secrets
254
-
255
-### Security Best Practices
256
-
257
-1. **Always use HTTPS** in production (Let's Encrypt recommended)
258
-2. **Rotate secrets** regularly (especially after team changes)
259
-3. **Enable 2FA** for all admin accounts
260
-4. **Monitor audit logs** for suspicious activity
261
-5. **Keep dependencies updated**: Run `npm audit` weekly
262
-
263
-### Reporting Security Issues
264
-
265
-Please report security vulnerabilities to **[email protected]**. Do not create public issues.
266
-
267
-
268
-## 🚀 Production Deployment
269
-
270
-### Pre-Deployment Checklist
271
-
272
-Before going live, ensure:
273
-
274
-- [ ] **Secrets**: All secrets generated with `openssl rand -hex 32`
275
-- [ ] **HTTPS**: SSL certificate configured (Let's Encrypt recommended)
276
-- [ ] **Database**: PostgreSQL with backups enabled
277
-- [ ] **Storage**: S3/R2 configured (not local filesystem)
278
-- [ ] **Monitoring**: Error tracking (Sentry) and APM configured
279
-- [ ] **Rate Limits**: Configured for expected traffic
280
-- [ ] **Admin Account**: Created via `bun run scripts/seed-admin.ts`
281
-- [ ] **Environment Validation**: Test with `bun run src/lib/env-validation.ts`
282
-- [ ] **Database Migrations**: Generated with `npm run db:generate`
283
-
284
-### Production Environment Variables
285
-
286
-```env
287
-# Application
288
-NODE_ENV=production
289
-SITE_URL=https://git.yourcompany.com
290
-PORT=3000
291
-
292
-# Security (CRITICAL - Generate with: openssl rand -hex 32)
293
-JWT_SECRET=<64-char-random-hex>
294
-SESSION_SECRET=<64-char-random-hex>
295
-INTERNAL_HOOK_SECRET=<64-char-random-hex>
296
-
297
-# Database (Use connection pooling)
298
-DATABASE_DRIVER=postgres
299
-DATABASE_URL=postgresql://user:password@db-host:5432/opencodehub?pool_timeout=30
300
-
301
-# Storage (Use cloud storage)
302
-STORAGE_TYPE=s3
303
-STORAGE_BUCKET=opencodehub-prod
304
-STORAGE_REGION=us-east-1
305
-
306
-# Rate Limiting (Adjust based on traffic)
307
-RATE_LIMIT_AUTH=5
308
-RATE_LIMIT_API=200
309
-RATE_LIMIT_GIT=500
310
-
311
-# Monitoring
312
-SENTRY_DSN=https://your-sentry-dsn
313
-LOG_LEVEL=info
314
-
315
-# Features
316
-ENABLE_REGISTRATION=true # Set false for invite-only
317
-```
318
-
319
-### Docker Production Deployment
320
-
321
-```yaml
322
-# docker-compose.prod.yml
323
-version: '3.8'
324
-
325
-services:
326
- app:
327
- image: opencodehub:latest
328
- restart: always
329
- ports:
330
- - "3000:3000"
331
- env_file: .env.production
332
- depends_on:
333
- - postgres
334
- - redis
335
- volumes:
336
- - ./data:/app/data
337
- healthcheck:
338
- test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
339
- interval: 30s
340
- timeout: 10s
341
- retries: 3
342
-
343
- postgres:
344
- image: postgres:15-alpine
345
- restart: always
346
- environment:
347
- POSTGRES_DB: opencodehub
348
- POSTGRES_USER: opencodehub
349
- POSTGRES_PASSWORD: <strong-password>
350
- volumes:
351
- - postgres_data:/var/lib/postgresql/data
352
-
353
- redis:
354
- image: redis:7-alpine
355
- restart: always
356
-
357
-volumes:
358
- postgres_data:
359
-```
360
-
361
-```bash
362
-# Deploy
363
-docker-compose -f docker-compose.prod.yml up -d
364
-
365
-# Monitor logs
366
-docker-compose -f docker-compose.prod.yml logs -f app
367
-
368
-# Health check
369
-curl https://git.yourcompany.com/api/health
370
-```
371
-
372
-### Reverse Proxy (Nginx)
373
-
374
-```nginx
375
-server {
376
- listen 443 ssl http2;
377
- server_name git.yourcompany.com;
378
-
379
- ssl_certificate /path/to/cert.pem;
380
- ssl_certificate_key /path/to/key.pem;
381
-
382
- location / {
383
- proxy_pass http://localhost:3000;
384
- proxy_set_header Host $host;
385
- proxy_set_header X-Real-IP $remote_addr;
386
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
387
- proxy_set_header X-Forwarded-Proto $scheme;
388
- }
389
-
390
- # Git operations (larger timeouts)
391
- location ~ ^/[^/]+/[^/]+\.git/ {
392
- proxy_pass http://localhost:3000;
393
- proxy_read_timeout 300s;
394
- proxy_send_timeout 300s;
395
- proxy_buffer_size 128k;
396
- proxy_buffers 4 256k;
397
- }
398
-}
399
-```
400
-
401
-### Database Backups
402
-
403
-```bash
404
-# PostgreSQL backup script (cron daily)
405
-#!/bin/bash
406
-pg_dump -U opencodehub opencodehub | gzip > /backups/opencodehub-$(date +\%Y\%m\%d).sql.gz
407
-
408
-# Retain last 30 days
409
-find /backups -name "opencodehub-*.sql.gz" -mtime +30 -delete
410
-```
411
-
412
-
413
-## 📚 API Documentation
414
-
415
-### Authentication
416
-
417
-All authenticated endpoints require a session cookie or `Authorization: Bearer <token>` header.
418
-
419
-**Register:**
420
-```bash
421
-POST /api/auth/register
422
-Content-Type: application/json
423
-
424
-{
425
- "username": "johndoe",
426
- "email": "[email protected]",
427
- "password": "SecureP@ssw0rd",
428
- "displayName": "John Doe"
429
-}
430
-
431
-# Response: 201 Created
432
-{
433
- "user": { "id": "...", "username": "johndoe", ... },
434
- "token": "eyJ...",
435
- "expiresAt": "2026-01-08T00:00:00Z"
436
-}
437
-```
438
-
439
-**Login:**
440
-```bash
441
-POST /api/auth/login
442
-Content-Type: application/json
443
-
444
-{
445
- "login": "[email protected]", # username or email
446
- "password": "SecureP@ssw0rd"
447
-}
448
-
449
-# With 2FA:
450
-{
451
- "login": "[email protected]",
452
- "password": "SecureP@ssw0rd",
453
- "totpCode": "123456"
454
-}
455
-```
456
-
457
-### Repositories
458
-
459
-**Create Repository:**
460
-```bash
461
-POST /api/repos
462
-Authorization: Bearer <token>
463
-Content-Type: application/json
464
-
465
-{
466
- "name": "my-project",
467
- "description": "My awesome project",
468
- "visibility": "public" # public, private, internal
469
-}
470
-```
471
-
472
-**Branch Protection:**
473
-```bash
474
-POST /api/repos/{repoId}/branch-protection
475
-Authorization: Bearer <token>
476
-Content-Type: application/json
477
-
478
-{
479
- "pattern": "main",
480
- "requiresPr": true,
481
- "requiredApprovals": 2,
482
- "dismissStaleReviews": true
483
-}
484
-```
485
-
486
-### Admin Endpoints
487
-
488
-**List Users (Admin Only):**
489
-```bash
490
-GET /admin/users?q=search&page=1
491
-Cookie: och_session=...
492
-```
493
-
494
-**Update Storage Config (Admin Only):**
495
-```bash
496
-POST /api/admin/config/storage
497
-Cookie: och_session=...
498
-Content-Type: application/json
499
-
500
-{
501
- "type": "s3",
502
- "bucket": "my-bucket",
503
- "region": "us-east-1",
504
- ...
505
-}
506
-```
507
-
508
-### Rate Limits
509
-
510
-All endpoints return rate limit headers:
511
-```
512
-X-RateLimit-Limit: 100
513
-X-RateLimit-Remaining: 95
514
-X-RateLimit-Reset: 2026-01-01T15:30:00Z
515
-Retry-After: 30 (when rate limited)
516
-```
517
-
518
-**Full API documentation:** `/api/docs` (OpenAPI spec coming soon)
519
-
520
-
521
-## 🔧 Usage Guide
522
-
523
-### Creating Your First Repository
524
-
525
-1. **Log in** to your account
526
-2. Click the **+** button → **New Repository**
527
-3. Fill in details:
528
- - **Name**: alphanumeric, hyphens, underscores
529
- - **Description**: Optional
530
- - **Visibility**: public/private
531
-4. Click **Create Repository**
532
-
533
-### Cl
534
-
535
-oning Repositories
536
-
537
-**SSH (Recommended):**
538
-```bash
539
-# Add your SSH key in Settings → SSH Keys
540
-git clone [email protected]:username/repo.git
541
-```
542
-
543
-**HTTPS:**
544
-```bash
545
-git clone https://your-domain.com/username/repo.git
546
-# Username: your-username
547
-# Password: your-password or personal access token
548
-```
549
-
550
-### Setting Up Branch Protection
551
-
552
-1. Navigate to **Repository → Settings → Branches**
553
-2. Click **Add Rule**
554
-3. Configure:
555
- - **Pattern**: `main` or `release/*`
556
- - **Require PR**: ✅
557
- - **Required Approvals**: 2
558
- - **Dismiss Stale Reviews**: ✅
559
-4. **Save Rule**
560
-
561
-### CI/CD Workflows
562
-
563
-Create `.github/workflows/ci.yml`:
564
-
565
-```yaml
566
-name: CI
567
-
568
-on:
569
- push:
570
- branches: [main, develop]
571
- pull_request:
572
- branches: [main]
573
-
574
-jobs:
575
- test:
576
- runs-on: ubuntu-latest
577
- steps:
578
- - uses: actions/checkout@v4
579
-
580
- - name: Setup Node.js
581
- uses: actions/setup-node@v4
582
- with:
583
- node-version: '20'
584
-
585
- - name: Install
586
- run: npm ci
587
-
588
- - name: Test
589
- run: npm test
590
-
591
- - name: Build
592
- run: npm run build
593
-
594
- - name: Upload Artifacts
595
- uses: actions/upload-artifact@v3
596
- with:
597
- name: dist
598
- path: dist/
599
-```
600
-
601
-
602
-## 🐛 Troubleshooting
603
-
604
-### Common Issues
605
-
606
-**"Rate limit exceeded" on login:**
607
-- Default: 5 attempts per 15 minutes
608
-- Solution: Wait 15 minutes or adjust `RATE_LIMIT_AUTH` in `.env`
609
-
610
-**"CSRF token validation failed":**
611
-- Ensure cookies are enabled
612
-- Check `SITE_URL` matches your actual domain
613
-- Verify HTTPS in production
614
-
615
-**"Unauthorized" on git hooks:**
616
-- Check `INTERNAL_HOOK_SECRET` is set
617
-- Verify hooks have correct secret in curl headers
618
-- Re-run `git init` on repositories to reinstall hooks
619
-
620
-**Database connection errors:**
621
-- Verify `DATABASE_URL` format
622
-- Check database server is running
623
-- Ensure user has correct permissions
624
-
625
-**Storage upload fails:**
626
-- Test connection in `/admin/storage`
627
-- Verify S3 credentials and bucket permissions
628
-- Check firewall rules for external storage
629
-
630
-### Debug Mode
631
-
632
-```env
633
-# Enable detailed logging
634
-LOG_LEVEL=debug
635
-NODE_ENV=development
636
-
637
-# View logs
638
-tail -f data/logs/opencodehub.log
639
-```
640
-
641
-### Health Check
642
-
643
-```bash
644
-curl http://localhost:3000/api/health
645
-
646
-# Response:
647
-{
648
- "status": "ok",
649
- "checks": {
650
- "database": "ok",
651
- "storage": "ok",
652
- "redis": "ok" // if configured
653
- },
654
- "uptime": 123456,
655
- "version": "1.0.0"
656
-}
657
-```
658
-
659
-
660
-## 🤝 Contributing
661
-
662
-We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
663
-
664
-### Development Setup
665
-
666
-```bash
667
-# Fork and clone
668
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
669
-cd OpencodeHub
670
-
671
-# Install dependencies
672
-bun install
673
-
674
-# Run in development
675
-bun run dev
676
-
677
-# Run tests
678
-bun test
679
-
680
-# Lint
681
-bun run lint
682
-```
683
-
684
-### Submitting Changes
685
-
686
-1. Create a feature branch (`git checkout -b feature/amazing-feature`)
687
-2. Make your changes
688
-3. Add tests
689
-4. Run `bun test` and `bun run lint`
690
-5. Commit (`git commit -m 'Add amazing feature'`)
691
-6. Push (`git push origin feature/amazing-feature`)
692
-7. Open a Pull Request
693
-
694
-
695
-## 📄 License
696
-
697
-MIT License - see [LICENSE](LICENSE) for details.
698
-
699
-
700
-## 🙏 Acknowledgments
701
-
702
-- [Astro](https://astro.build/) - Web framework
703
-- [shadcn/ui](https://ui.shadcn.com/) - UI components
704
-- [Drizzle ORM](https://orm.drizzle.team/) - Database toolkit
705
-- [simple-git](https://github.com/steveukx/git-js) - Git operations
706
-- [Monaco Editor](https://microsoft.github.io/monaco-editor/) - Code editor
707
-- [Zod](https://zod.dev/) - Schema validation
708
-
709
-
710
-<p align="center">
711
- <strong>Made with ❤️ for the open source community</strong>
712
- <br>
713
- <a href="https://github.com/swadhinbiswas/OpencodeHub/issues">Report Bug</a> •
714
- <a href="https://github.com/swadhinbiswas/OpencodeHub/issues">Request Feature</a>
715
-</p>
716
0
▼README_NEW.md
+0-1236
1
-# OpenCodeHub
2
-
3
-<p align="center">
4
- <img src="public/logo.png" alt="OpenCodeHub Logo" width="200">
5
-</p>
6
-
7
-<p align="center">
8
- <strong>A powerful, self-hosted Git platform with CI/CD, code review, and enterprise-grade security</strong>
9
-</p>
10
-
11
-<p align="center">
12
- <a href="#-features">Features</a> •
13
- <a href="#-quick-start">Quick Start</a> •
14
- <a href="#%EF%B8%8F-configuration">Configuration</a> •
15
- <a href="#-security">Security</a> •
16
- <a href="#-production-deployment">Production</a> •
17
- <a href="#-api">API</a> •
18
- <a href="#-contributing">Contributing</a>
19
-</p>
20
-
21
-
22
-## 🎉 Production Ready!
23
-
24
-**All critical security vulnerabilities are now fixed. OpenCodeHub is production-ready!** 🎊
25
-
26
-✅ **Rate Limiting** - Prevents brute force attacks
27
-✅ **CSRF Protection** - Cross-site request forgery defense
28
-✅ **Input Validation** - SQL injection & XSS prevention
29
-✅ **Hook Authentication** - Secure git operations
30
-✅ **Environment Validation** - Safe configuration management
31
-
32
-📚 **See [DEPLOYMENT.md](DEPLOYMENT.md) for complete deployment guide** with SSL setup, Nginx configuration, monitoring, database backups, and production best practices.
33
-
34
-
35
-## 🚀 Features
36
-
37
-### Git Hosting & Collaboration
38
-- **Full Git Support** - SSH and HTTP/HTTPS protocols with authentication
39
-- **Repository Management** - Create, fork, archive, and transfer repositories
40
-- **Branch Protection** - Enforce PR requirements, approvals, and code review policies
41
-- **Pull Requests** - Code review with inline comments and approval workflows
42
-- **Issues & Milestones** - Bug tracking with labels, assignees, and custom fields
43
-- **Wiki** - Built-in documentation with markdown support
44
-- **Organizations** - Team management with role-based access control (RBAC)
45
-
46
-### CI/CD & Automation
47
-- **GitHub Actions Compatible** - Run workflows defined in `.github/workflows/`
48
-- **Self-hosted Runners** - Docker-based job execution with artifact support
49
-- **Merge Queue** - Automated PR merge management with conflict detection
50
-- **Webhooks** - Real-time event notifications to external services
51
-- **Secrets Management** - Encrypted storage for CI/CD credentials
52
-
53
-### Security Features ✅
54
-- **Rate Limiting** - Prevents brute force attacks (5 login attempts per 15min)
55
-- **CSRF Protection** - Double-submit cookie pattern for all state-changing operations
56
-- **Input Validation** - Zod schemas prevent injection attacks
57
-- **Hook Authentication** - Shared secrets protect internal git hooks
58
-- **Session Management** - Automatic expiration and rotation
59
-- **Audit Logging** - Complete activity tracking for compliance
60
-
61
-### Modern Tech Stack
62
-- **Astro + React** - Fast, modern frontend with island architecture
63
-- **TailwindCSS + shadcn/ui** - Beautiful, accessible UI components
64
-- **Universal Database Adapter** - PostgreSQL, MySQL, SQLite, MongoDB, Turso, PlanetScale
65
-- **Flexible Storage** - Local, S3, MinIO, Google Drive, Azure Blob, R2
66
-- **Production-Ready** - Rate limiting, CSRF, input validation, error monitoring
67
-
68
-
69
-## 📦 Quick Start
70
-
71
-### Prerequisites
72
-- **Node.js** 18+ or **Bun** 1.0+
73
-- **Database**: PostgreSQL 14+ (recommended) / MySQL 8+ / SQLite 3.35+
74
-- **Git** 2.30+
75
-- **Docker** (optional, for CI/CD runners)
76
-
77
-### Installation (5 minutes)
78
-
79
-```bash
80
-# 1. Clone the repository
81
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
82
-cd OpenCodeHub
83
-
84
-# 2. Install dependencies
85
-npm install
86
-# or
87
-bun install
88
-
89
-# 3. Set up environment
90
-cp .env.example .env
91
-
92
-# 4. Configure your .env file (see Configuration section)
93
-nano .env # Set at minimum: JWT_SECRET, SESSION_SECRET, INTERNAL_HOOK_SECRET, SITE_URL
94
-
95
-# 5. Run database migrations
96
-npm run db:push
97
-# or generate migrations for version control:
98
-npm run db:generate
99
-
100
-# 6. Seed an admin user
101
-bun run scripts/seed-admin.ts
102
-# Enter username, email, password when prompted
103
-
104
-# 7. Start development server
105
-npm run dev
106
-# Application available at http://localhost:3000
107
-```
108
-
109
-### Using Docker (Recommended for Production)
110
-
111
-```bash
112
-# 1. Clone and configure
113
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
114
-cd OpenCodeHub
115
-cp .env.example .env
116
-
117
-# 2. Edit .env with production values (see Production Deployment section)
118
-
119
-# 3. Start services
120
-docker-compose up -d
121
-
122
-# 4. Create admin user
123
-docker-compose exec app bun run scripts/seed-admin.ts
124
-
125
-# Access at http://localhost:3000
126
-```
127
-
128
-# Advanced Features Documentation Insert
129
-
130
-**Insert this content into README.md after line 131 (after Docker installation section, before Configuration section)**
131
-
132
-
133
-## 🎯 OCH CLI - Command Line Interface
134
-
135
-Powerful CLI for stack-first PR workflows.
136
-
137
-### Installation
138
-
139
-```bash
140
-# Install globally
141
-npm install -g opencodehub-cli
142
-
143
-# Or use with npx
144
-npx opencodehub-cli
145
-
146
-# Verify installation
147
-och --version
148
-```
149
-
150
-### Quick Setup
151
-
152
-```bash
153
-# 1. Login to your OpenCode Hub instance
154
-och auth login --url https://git.yourcompany.com
155
-
156
-# 2. Navigate to your repository
157
-cd your-repo
158
-
159
-# 3. Initialize
160
-och init --url https://git.yourcompany.com
161
-```
162
-
163
-### CLI Commands Reference
164
-
165
-**Authentication:**
166
-```bash
167
-och auth login # Interactive login
168
-och auth login --token TOKEN # Login with token
169
-och auth logout # Logout
170
-och auth whoami # Show current user
171
-```
172
-
173
-**Stack Management:**
174
-```bash
175
-och stack create \u003cname\u003e # Create new stacked branch
176
-och stack view # View current stack (alias: ls)
177
-och stack submit # Push and create PRs
178
-och stack submit --draft # Create as draft PRs
179
-och stack sync # Rebase stack on latest
180
-och stack reorder # Reorder branches in stack
181
-```
182
-
183
-**Repository:**
184
-```bash
185
-och init # Initialize repo for OpenCodeHub
186
-och sync # Bidirectional sync with remote
187
-och status # Show stack status (alias: st)
188
-```
189
-
190
-
191
-## 🚀 Advanced Features
192
-
193
-### 📚 Stacked Pull Requests
194
-
195
-**Ship faster by breaking large features into reviewable chunks.**
196
-
197
-#### Why Stacked PRs?
198
-
199
-- **Faster Reviews**: Smaller, focused PRs get reviewed quicker
200
-- **Parallel Development**: Build on unmerged PRs while waiting for review
201
-- **Clean History**: Each PR represents one logical change
202
-- **Risk Reduction**: Deploy incrementally, rollback easily
203
-
204
-#### How It Works
205
-
206
-```
207
-main
208
- └── PR #123: Add database schema
209
- └── PR #124: Add authentication service
210
- └── PR #125: Add login UI
211
-```
212
-
213
-Each PR builds on the previous one. When #123 merges, #124 automatically rebases.
214
-
215
-#### Creating a Stack
216
-
217
-**Using CLI:**
218
-```bash
219
-# 1. Create base branch
220
-git checkout -b feature/auth
221
-git commit -m "Add user table schema"
222
-och stack create auth-schema
223
-
224
-# 2. Create stacked branch
225
-och stack create auth-service
226
-git commit -m "Add authentication service"
227
-
228
-# 3. Create final layer
229
-och stack create auth-ui
230
-git commit -m "Add login UI"
231
-
232
-# 4. Submit entire stack
233
-och stack submit
234
-```
235
-
236
-**Using Web UI:**
237
-1. Create first PR normally
238
-2. When creating second PR, select "Stack on PR #123"
239
-3. System tracks dependencies automatically
240
-
241
-#### Stack Features
242
-
243
-✅ **Auto-Rebasing**: When base PR merges, dependent PRs rebase automatically
244
-✅ **Dependency Visualization**: See entire stack in PR view
245
-✅ **Smart Merge Queue**: Merges in correct order
246
-✅ **Conflict Detection**: Alerts on rebase conflicts
247
-
248
-
249
-### 🤖 AI Code Review
250
-
251
-**Get instant feedback from AI reviewers powered by GPT-4 or Claude.**
252
-
253
-#### Setup
254
-
255
-**1. Configure AI Provider:**
256
-```env
257
-# In .env
258
-AI_PROVIDER=openai # or anthropic
259
-OPENAI_API_KEY=sk-...
260
-# or
261
-ANTHROPIC_API_KEY=sk-ant-...
262
-```
263
-
264
-**2. Enable for Repository:**
265
-Navigate to **Repository → Settings → AI Review**
266
-- ✅ Enable AI Review
267
-- Set review triggers (on PR open, on push, manual)
268
-- Configure review rules
269
-
270
-#### What AI Reviews Catch
271
-
272
-🔍 **Security Vulnerabilities**
273
-- SQL injection risks
274
-- XSS vulnerabilities
275
-- Authentication bypasses
276
-- Secrets in code
277
-
278
-⚡ **Performance Issues**
279
-- N+1 queries
280
-- Inefficient algorithms
281
-- Memory leaks
282
-- Blocking operations
283
-
284
-📝 **Code Quality**
285
-- Best practice violations
286
-- Code smells
287
-- Incomplete error handling
288
-- Missing documentation
289
-
290
-🐛 **Potential Bugs**
291
-- Null pointer exceptions
292
-- Race conditions
293
-- Off-by-one errors
294
-- Logic flaws
295
-
296
-#### Using AI Review
297
-
298
-**Automatic (Recommended):**
299
-AI review runs automatically on every PR based on configured triggers.
300
-
301
-**Manual:**
302
-```bash
303
-# Via CLI
304
-och review ai \u003cPR_NUMBER\u003e
305
-
306
-# Via web UI: Click "Request AI Review" button on PR
307
-```
308
-
309
-#### Review Output
310
-
311
-AI provides:
312
-- **Severity Score**: Critical / High / Medium / Low / Info
313
-- **Specific Line Comments**: Inline code suggestions
314
-- **Summary Report**: Overall code quality assessment
315
-- **Fix Suggestions**: Actionable improvements
316
-
317
-**Example:**
318
-```
319
-🔴 CRITICAL: SQL Injection Vulnerability
320
-File: src/api/users.ts:45
321
-Issue: User input directly concatenated into SQL query
322
-Fix: Use parameterized queries or ORM
323
-
324
-🟡 MEDIUM: Performance Concern
325
-File: src/lib/data.ts:128
326
-Issue: N+1 query in loop (1000+ iterations)
327
-Fix: Use batch loading or eager loading
328
-```
329
-
330
-
331
-### 🔀 Smart Merge Queue
332
-
333
-**Stack-aware merge queue with automatic conflict resolution and CI optimization.**
334
-
335
-#### Features
336
-
337
-**Stack-Aware Merging:**
338
-- Detects PR dependencies
339
-- Merges in correct order automatically
340
-- Handles entire stacks atomically
341
-
342
-**CI Optimization:**
343
-- Batches compatible PRs
344
-- Runs CI once for multiple PRs
345
-- Reduces CI cost by ~60%
346
-
347
-**Automatic Rebasing:**
348
-- Detects conflicts early
349
-- Auto-rebases on base changes
350
-- Alerts author on conflicts
351
-
352
-**Smart Ordering:**
353
-- Priority-based queue
354
-- Dependency resolution
355
-- Hotfix fast-tracking
356
-
357
-#### Using Merge Queue
358
-
359
-**Add to Queue:**
360
-```bash
361
-# Via CLI
362
-och queue add \u003cPR_NUMBER\u003e
363
-
364
-# Via Web UI
365
-Click "Add to Merge Queue" button on approved PR
366
-```
367
-
368
-**Queue Status:**
369
-```bash
370
-# View queue
371
-och queue list
372
-
373
-# Output:
374
-Position PR Title Status
375
-1 #125 Add login UI ⏳ Running CI
376
-2 #124 Auth service ⏸️ Waiting (depends on #123)
377
-3 #123 Database schema ✅ Ready to merge
378
-```
379
-
380
-**How It Works:**
381
-
382
-1. **PR Added**: Queue analyzes dependencies
383
-2. **Position Assigned**: Ordered by priority and dependencies
384
-3. **CI Running**: Runs tests in parallel where possible
385
-4. **Auto-Merge**: Merges when ready, rebases dependents
386
-5. **Notification**: Author notified on completion
387
-
388
-#### Queue Configuration
389
-
390
-**Repository → Settings → Merge Queue:**
391
-- **Require CI**: Only merge if all checks pass
392
-- **Batch Window**: Wait time to batch PRs (default: 5min)
393
-- **Max Batch Size**: Max PRs to merge together (default: 3)
394
-- **Auto-Rebase**: Rebase on conflicts vs. remove from queue
395
-
396
-
397
-### 📊 Developer Metrics
398
-
399
-**Track team velocity, review efficiency, and identify bottlenecks.**
400
-
401
-#### Available Metrics
402
-
403
-**PR Velocity:**
404
-- PRs merged per week
405
-- Average time to merge
406
-- Stack success rate
407
-- Review cycle time
408
-
409
-**Review Efficiency:**
410
-- Average review time
411
-- Reviews per day
412
-- Review quality score
413
-- Reviewer responsiveness
414
-
415
-**Team Performance:**
416
-- Lines changed per PR
417
-- PR size distribution
418
-- Revert rate
419
-- CI success rate
420
-
421
-**Stack Metrics:**
422
-- % PRs that use stacks
423
-- Average stack depth
424
-- Stack merge success rate
425
-- Time saved vs. monolithic PRs
426
-
427
-#### Viewing Metrics
428
-
429
-**Personal Dashboard:**
430
-```
431
-/metrics/me
432
-```
433
-
434
-**Team Dashboard (Admin):**
435
-```
436
-/admin/metrics
437
-```
438
-
439
-**Via CLI:**
440
-```bash
441
-och metrics show
442
-och metrics show --user @username
443
-och metrics show --repo owner/repo
444
-```
445
-
446
-#### Example Metrics View
447
-
448
-```
449
-📊 Your Metrics (Last 30 Days)
450
-
451
-PR Velocity
452
-├─ PRs Merged ━━━━━━━━━━━━━━ 24 (+12%)
453
-├─ Avg Time to Merge ━━━━━━━━━━━━━━ 8.2 hours (-3h)
454
-└─ Stack Usage ━━━━━━━━━━━━━━ 65% (+15%)
455
-
456
-Review Efficiency
457
-├─ Reviews Given ━━━━━━━━━━━━━━ 18
458
-├─ Avg Review Time ━━━━━━━━━━━━━━ 22 min
459
-└─ Approval Rate ━━━━━━━━━━━━━━ 94%
460
-```
461
-
462
-
463
-### 💬 Slack Notifications
464
-
465
-**Get actionable PR notifications directly in Slack.**
466
-
467
-#### Setup
468
-
469
-**1. Create Slack App:**
470
-1. Go to https://api.slack.com/apps
471
-2. Create New App → From Scratch
472
-3. Add OAuth Scopes:
473
- - `chat:write`
474
- - `chat:write.public`
475
- - `users:read`
476
-4. Install to workspace
477
-
478
-**2. Connect to OpenCodeHub:**
479
-Navigate to **Admin → Integrations → Slack**
480
-```
481
-Workspace Name: Your Team
482
-Bot Token: xoxb-...
483
-Signing Secret: ...
484
-```
485
-
486
-**3. Map Channels:**
487
-**Repository → Settings → Slack**
488
-```
489
-#engineering → All PR events
490
-#deployments → Merges only
491
-#security → Security findings
492
-```
493
-
494
-**4. Map Users (Optional):**
495
-Users can link their Slack account:
496
-**Settings → Integrations → Connect Slack**
497
-
498
-#### Notification Types
499
-
500
-**PR Events:**
501
-- 🎉 PR opened
502
-- ✅ PR approved
503
-- 🔀 PR merged
504
-- ❌ PR closed
505
-- 💬 Review requested
506
-- 🔴 Changes requested
507
-
508
-**CI/CD Events:**
509
-- ✅ Build passed
510
-- ❌ Build failed
511
-- 🚀 Deployment started
512
-- ✅ Deployment successful
513
-
514
-**Code Review:**
515
-- 🤖 AI review completed
516
-- 🔍 Security issue found
517
-- ⚠️ Performance concern
518
-
519
-**Merge Queue:**
520
-- ⏭️ Added to queue
521
-- ✅ Merged from queue
522
-- ⚠️ Removed (conflict)
523
-
524
-#### Interactive Actions
525
-
526
-Notifications include action buttons:
527
-```
528
-[swadhin] opened PR#125: Add login UI
529
-Stack: #123 → #124 → #125 • files →32 • LoC +420/-18
530
-
531
-[Approve] [Request Changes] [View PR] [Add to Queue]
532
-```
533
-
534
-Click buttons to:
535
-- Approve/reject directly from Slack
536
-- Request changes with comment
537
-- Add to merge queue
538
-- View full PR
539
-
540
-
541
-## 💡 Workflow Examples
542
-
543
-### Example 1: Complete Stacked PR Flow
544
-
545
-```bash
546
-# 1. Start new feature
547
-git checkout main
548
-git pull
549
-git checkout -b feature/user-profiles
550
-
551
-# 2. First PR: Database layer
552
-git add migrations/
553
-git commit -m "Add user profile tables"
554
-och stack create profile-db
555
-och stack submit
556
-
557
-# → Creates PR #301
558
-
559
-# 3. Second PR: Backend API
560
-git add src/api/profiles/
561
-git commit -m "Add profile API"
562
-och stack create profile-api
563
-och stack submit
564
-
565
-# → Creates PR #302 (stacked on #301)
566
-
567
-# 4. Third PR: Frontend
568
-git add src/pages/profile/
569
-git commit -m "Add profile UI"
570
-och stack create profile-ui
571
-och stack submit
572
-
573
-# → Creates PR #303 (stacked on #302)
574
-
575
-# 5. View stack
576
-och stack view
577
-```
578
-
579
-**Output:**
580
-```
581
-📚 Current Stack
582
-
583
-main (base)
584
- └─ #301: profile-db ✅ Approved
585
- └─ #302: profile-api 🔍 In Review
586
- └─ #303: profile-ui ⏳ AI Review Running
587
-```
588
-
589
-### Example 2: Using AI Review + Merge Queue
590
-
591
-```bash
592
-# 1. Create PR
593
-git push origin feature-branch
594
-
595
-# 2. Request AI review
596
-och review ai 304
597
-
598
-# 3. Fix AI suggestions
599
-# ... make changes based on review ...
600
-git commit -m "Fix security issues from AI review"
601
-git push
602
-
603
-# 4. Get human review
604
-# Team reviews via web UI
605
-
606
-# 5. Add to merge queue when approved
607
-och queue add 304
608
-
609
-# Queue handles:
610
-# - Waiting for CI
611
-# - Merging when ready
612
-# - Notifying on Slack
613
-```
614
-
615
-### Example 3: Team Collaboration
616
-
617
-```bash
618
-# Developer A: Creates base
619
-git checkout -b api/payments
620
-# ... implements payment models ...
621
-git commit -m "Add payment models"
622
-git push
623
-
624
-# Developer B: Builds on A's work (before merge!)
625
-git checkout api/payments
626
-git checkout -b api/payment-processing
627
-# ... implements payment processing ...
628
-git commit -m "Add payment processing"
629
-git push
630
-# Create PR stacked on A's PR
631
-
632
-# Developer C: Builds on B's work
633
-git checkout api/payment-processing
634
-git checkout -b ui/payment-form
635
-# ... implements payment UI ...
636
-```
637
-
638
-**Result**: 3 parallel PRs, all reviewed separately, merged in order.
639
-
640
-
641
-## 📖 Additional Resources
642
-
643
-- **Full CLI Reference**: `cli/README.md`
644
-- **API Documentation**: `/api/docs`
645
-- **Stacked PR Guide**: `/docs#stacked-prs`
646
-- **Slack Integration Guide**: `/docs#slack`
647
-
648
-
649
-
650
-## ⚙️ Configuration
651
-
652
-### Critical Environment Variables
653
-
654
-These **MUST** be set before deploying to production:
655
-
656
-```env
657
-# Security (CRITICAL - Generate strong secrets!)
658
-JWT_SECRET=<run: openssl rand -hex 32>
659
-SESSION_SECRET=<run: openssl rand -hex 32>
660
-INTERNAL_HOOK_SECRET=<run: openssl rand -hex 32>
661
-
662
-# Application URLs (CRITICAL)
663
-SITE_URL=https://your-domain.com # Must be HTTPS in production
664
-PORT=3000
665
-HOST=0.0.0.0
666
-```
667
-
668
-### Database Configuration
669
-
670
-**PostgreSQL (Recommended for Production):**
671
-```env
672
-DATABASE_DRIVER=postgres
673
-DATABASE_URL=postgresql://user:password@localhost:5432/opencodehub
674
-```
675
-
676
-**MySQL:**
677
-```env
678
-DATABASE_DRIVER=mysql
679
-DATABASE_URL=mysql://user:password@localhost:3306/opencodehub
680
-```
681
-
682
-**SQLite (Development Only):**
683
-```env
684
-DATABASE_DRIVER=sqlite
685
-DATABASE_URL=./data/opencodehub.db
686
-```
687
-
688
-### Storage Configuration
689
-
690
-Storage can be configured via Admin Panel (`/admin/storage`) or environment variables:
691
-
692
-**Local Storage:**
693
-```env
694
-STORAGE_TYPE=local
695
-STORAGE_PATH=./data/storage
696
-```
697
-
698
-**S3/MinIO/R2:**
699
-```env
700
-STORAGE_TYPE=s3
701
-STORAGE_BUCKET=opencodehub
702
-STORAGE_REGION=us-east-1
703
-STORAGE_ENDPOINT=https://s3.amazonaws.com
704
-S3_ACCESS_KEY=your-access-key
705
-S3_SECRET_KEY=your-secret-key
706
-```
707
-
708
-**Google Drive (via Admin Panel):**
709
-- Navigate to `/admin/storage`
710
-- Select "Google Drive"
711
-- Enter Client ID, Secret, and Refresh Token
712
-- Test connection before saving
713
-
714
-### Security Configuration
715
-
716
-**Rate Limiting:**
717
-```env
718
-RATE_LIMIT_AUTH=5 # Login attempts per 15 minutes
719
-RATE_LIMIT_API=100 # API requests per minute
720
-RATE_LIMIT_GIT=200 # Git operations per minute
721
-RATE_LIMIT_SKIP_DEV=false # Never skip in production
722
-```
723
-
724
-**CSRF Protection:**
725
-```env
726
-CSRF_SKIP_DEV=false # Never skip in production
727
-```
728
-
729
-### Optional Services
730
-
731
-**Email (SMTP):**
732
-```env
733
-SMTP_HOST=smtp.example.com
734
-SMTP_PORT=587
735
736
-SMTP_PASSWORD=your-smtp-password
737
738
-```
739
-
740
-**Redis (Caching & Sessions):**
741
-```env
742
-REDIS_URL=redis://localhost:6379
743
-```
744
-
745
-**Error Monitoring (Sentry):**
746
-```env
747
-SENTRY_DSN=https://...
748
-ENABLE_TRACING=true
749
-```
750
-
751
-
752
-## 🔒 Security
753
-
754
-OpenCodeHub implements **production-grade security** out of the box:
755
-
756
-### Implemented Security Features
757
-
758
-✅ **Authentication & Authorization**
759
-- JWT-based sessions with automatic expiration
760
-- Bcrypt password hashing (10 rounds)
761
-- 2FA/TOTP support
762
-- Role-based access control (RBAC)
763
-
764
-✅ **Attack Prevention**
765
-- **Rate Limiting**: Prevents brute force (5 login attempts per 15min)
766
-- **CSRF Protection**: Double-submit cookie pattern on all state-changing operations
767
-- **Input Validation**: Zod schemas prevent SQL injection and XSS
768
-- **XSS Sanitization**: Markdown rendered with `rehype-sanitize`
769
-
770
-✅ **Operational Security**
771
-- **Audit Logging**: All admin actions logged to database
772
-- **Hook Authentication**: Git hooks protected with shared secrets
773
-- **Session Management**: Automatic cleanup and rotation
774
-- **Environment Validation**: Startup checks for missing/weak secrets
775
-
776
-### Security Best Practices
777
-
778
-1. **Always use HTTPS** in production (Let's Encrypt recommended)
779
-2. **Rotate secrets** regularly (especially after team changes)
780
-3. **Enable 2FA** for all admin accounts
781
-4. **Monitor audit logs** for suspicious activity
782
-5. **Keep dependencies updated**: Run `npm audit` weekly
783
-
784
-### Reporting Security Issues
785
-
786
-Please report security vulnerabilities to **[email protected]**. Do not create public issues.
787
-
788
-
789
-## 🚀 Production Deployment
790
-
791
-### Pre-Deployment Checklist
792
-
793
-Before going live, ensure:
794
-
795
-- [ ] **Secrets**: All secrets generated with `openssl rand -hex 32`
796
-- [ ] **HTTPS**: SSL certificate configured (Let's Encrypt recommended)
797
-- [ ] **Database**: PostgreSQL with backups enabled
798
-- [ ] **Storage**: S3/R2 configured (not local filesystem)
799
-- [ ] **Monitoring**: Error tracking (Sentry) and APM configured
800
-- [ ] **Rate Limits**: Configured for expected traffic
801
-- [ ] **Admin Account**: Created via `bun run scripts/seed-admin.ts`
802
-- [ ] **Environment Validation**: Test with `bun run src/lib/env-validation.ts`
803
-- [ ] **Database Migrations**: Generated with `npm run db:generate`
804
-
805
-### Production Environment Variables
806
-
807
-```env
808
-# Application
809
-NODE_ENV=production
810
-SITE_URL=https://git.yourcompany.com
811
-PORT=3000
812
-
813
-# Security (CRITICAL - Generate with: openssl rand -hex 32)
814
-JWT_SECRET=<64-char-random-hex>
815
-SESSION_SECRET=<64-char-random-hex>
816
-INTERNAL_HOOK_SECRET=<64-char-random-hex>
817
-
818
-# Database (Use connection pooling)
819
-DATABASE_DRIVER=postgres
820
-DATABASE_URL=postgresql://user:password@db-host:5432/opencodehub?pool_timeout=30
821
-
822
-# Storage (Use cloud storage)
823
-STORAGE_TYPE=s3
824
-STORAGE_BUCKET=opencodehub-prod
825
-STORAGE_REGION=us-east-1
826
-
827
-# Rate Limiting (Adjust based on traffic)
828
-RATE_LIMIT_AUTH=5
829
-RATE_LIMIT_API=200
830
-RATE_LIMIT_GIT=500
831
-
832
-# Monitoring
833
-SENTRY_DSN=https://your-sentry-dsn
834
-LOG_LEVEL=info
835
-
836
-# Features
837
-ENABLE_REGISTRATION=true # Set false for invite-only
838
-```
839
-
840
-### Docker Production Deployment
841
-
842
-```yaml
843
-# docker-compose.prod.yml
844
-version: '3.8'
845
-
846
-services:
847
- app:
848
- image: opencodehub:latest
849
- restart: always
850
- ports:
851
- - "3000:3000"
852
- env_file: .env.production
853
- depends_on:
854
- - postgres
855
- - redis
856
- volumes:
857
- - ./data:/app/data
858
- healthcheck:
859
- test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
860
- interval: 30s
861
- timeout: 10s
862
- retries: 3
863
-
864
- postgres:
865
- image: postgres:15-alpine
866
- restart: always
867
- environment:
868
- POSTGRES_DB: opencodehub
869
- POSTGRES_USER: opencodehub
870
- POSTGRES_PASSWORD: <strong-password>
871
- volumes:
872
- - postgres_data:/var/lib/postgresql/data
873
-
874
- redis:
875
- image: redis:7-alpine
876
- restart: always
877
-
878
-volumes:
879
- postgres_data:
880
-```
881
-
882
-```bash
883
-# Deploy
884
-docker-compose -f docker-compose.prod.yml up -d
885
-
886
-# Monitor logs
887
-docker-compose -f docker-compose.prod.yml logs -f app
888
-
889
-# Health check
890
-curl https://git.yourcompany.com/api/health
891
-```
892
-
893
-### Reverse Proxy (Nginx)
894
-
895
-```nginx
896
-server {
897
- listen 443 ssl http2;
898
- server_name git.yourcompany.com;
899
-
900
- ssl_certificate /path/to/cert.pem;
901
- ssl_certificate_key /path/to/key.pem;
902
-
903
- location / {
904
- proxy_pass http://localhost:3000;
905
- proxy_set_header Host $host;
906
- proxy_set_header X-Real-IP $remote_addr;
907
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
908
- proxy_set_header X-Forwarded-Proto $scheme;
909
- }
910
-
911
- # Git operations (larger timeouts)
912
- location ~ ^/[^/]+/[^/]+\.git/ {
913
- proxy_pass http://localhost:3000;
914
- proxy_read_timeout 300s;
915
- proxy_send_timeout 300s;
916
- proxy_buffer_size 128k;
917
- proxy_buffers 4 256k;
918
- }
919
-}
920
-```
921
-
922
-### Database Backups
923
-
924
-```bash
925
-# PostgreSQL backup script (cron daily)
926
-#!/bin/bash
927
-pg_dump -U opencodehub opencodehub | gzip > /backups/opencodehub-$(date +\%Y\%m\%d).sql.gz
928
-
929
-# Retain last 30 days
930
-find /backups -name "opencodehub-*.sql.gz" -mtime +30 -delete
931
-```
932
-
933
-
934
-## 📚 API Documentation
935
-
936
-### Authentication
937
-
938
-All authenticated endpoints require a session cookie or `Authorization: Bearer <token>` header.
939
-
940
-**Register:**
941
-```bash
942
-POST /api/auth/register
943
-Content-Type: application/json
944
-
945
-{
946
- "username": "johndoe",
947
- "email": "[email protected]",
948
- "password": "SecureP@ssw0rd",
949
- "displayName": "John Doe"
950
-}
951
-
952
-# Response: 201 Created
953
-{
954
- "user": { "id": "...", "username": "johndoe", ... },
955
- "token": "eyJ...",
956
- "expiresAt": "2026-01-08T00:00:00Z"
957
-}
958
-```
959
-
960
-**Login:**
961
-```bash
962
-POST /api/auth/login
963
-Content-Type: application/json
964
-
965
-{
966
- "login": "[email protected]", # username or email
967
- "password": "SecureP@ssw0rd"
968
-}
969
-
970
-# With 2FA:
971
-{
972
- "login": "[email protected]",
973
- "password": "SecureP@ssw0rd",
974
- "totpCode": "123456"
975
-}
976
-```
977
-
978
-### Repositories
979
-
980
-**Create Repository:**
981
-```bash
982
-POST /api/repos
983
-Authorization: Bearer <token>
984
-Content-Type: application/json
985
-
986
-{
987
- "name": "my-project",
988
- "description": "My awesome project",
989
- "visibility": "public" # public, private, internal
990
-}
991
-```
992
-
993
-**Branch Protection:**
994
-```bash
995
-POST /api/repos/{repoId}/branch-protection
996
-Authorization: Bearer <token>
997
-Content-Type: application/json
998
-
999
-{
1000
- "pattern": "main",
1001
- "requiresPr": true,
1002
- "requiredApprovals": 2,
1003
- "dismissStaleReviews": true
1004
-}
1005
-```
1006
-
1007
-### Admin Endpoints
1008
-
1009
-**List Users (Admin Only):**
1010
-```bash
1011
-GET /admin/users?q=search&page=1
1012
-Cookie: och_session=...
1013
-```
1014
-
1015
-**Update Storage Config (Admin Only):**
1016
-```bash
1017
-POST /api/admin/config/storage
1018
-Cookie: och_session=...
1019
-Content-Type: application/json
1020
-
1021
-{
1022
- "type": "s3",
1023
- "bucket": "my-bucket",
1024
- "region": "us-east-1",
1025
- ...
1026
-}
1027
-```
1028
-
1029
-### Rate Limits
1030
-
1031
-All endpoints return rate limit headers:
1032
-```
1033
-X-RateLimit-Limit: 100
1034
-X-RateLimit-Remaining: 95
1035
-X-RateLimit-Reset: 2026-01-01T15:30:00Z
1036
-Retry-After: 30 (when rate limited)
1037
-```
1038
-
1039
-**Full API documentation:** `/api/docs` (OpenAPI spec coming soon)
1040
-
1041
-
1042
-## 🔧 Usage Guide
1043
-
1044
-### Creating Your First Repository
1045
-
1046
-1. **Log in** to your account
1047
-2. Click the **+** button → **New Repository**
1048
-3. Fill in details:
1049
- - **Name**: alphanumeric, hyphens, underscores
1050
- - **Description**: Optional
1051
- - **Visibility**: public/private
1052
-4. Click **Create Repository**
1053
-
1054
-### Cl
1055
-
1056
-oning Repositories
1057
-
1058
-**SSH (Recommended):**
1059
-```bash
1060
-# Add your SSH key in Settings → SSH Keys
1061
-git clone [email protected]:username/repo.git
1062
-```
1063
-
1064
-**HTTPS:**
1065
-```bash
1066
-git clone https://your-domain.com/username/repo.git
1067
-# Username: your-username
1068
-# Password: your-password or personal access token
1069
-```
1070
-
1071
-### Setting Up Branch Protection
1072
-
1073
-1. Navigate to **Repository → Settings → Branches**
1074
-2. Click **Add Rule**
1075
-3. Configure:
1076
- - **Pattern**: `main` or `release/*`
1077
- - **Require PR**: ✅
1078
- - **Required Approvals**: 2
1079
- - **Dismiss Stale Reviews**: ✅
1080
-4. **Save Rule**
1081
-
1082
-### CI/CD Workflows
1083
-
1084
-Create `.github/workflows/ci.yml`:
1085
-
1086
-```yaml
1087
-name: CI
1088
-
1089
-on:
1090
- push:
1091
- branches: [main, develop]
1092
- pull_request:
1093
- branches: [main]
1094
-
1095
-jobs:
1096
- test:
1097
- runs-on: ubuntu-latest
1098
- steps:
1099
- - uses: actions/checkout@v4
1100
-
1101
- - name: Setup Node.js
1102
- uses: actions/setup-node@v4
1103
- with:
1104
- node-version: '20'
1105
-
1106
- - name: Install
1107
- run: npm ci
1108
-
1109
- - name: Test
1110
- run: npm test
1111
-
1112
- - name: Build
1113
- run: npm run build
1114
-
1115
- - name: Upload Artifacts
1116
- uses: actions/upload-artifact@v3
1117
- with:
1118
- name: dist
1119
- path: dist/
1120
-```
1121
-
1122
-
1123
-## 🐛 Troubleshooting
1124
-
1125
-### Common Issues
1126
-
1127
-**"Rate limit exceeded" on login:**
1128
-- Default: 5 attempts per 15 minutes
1129
-- Solution: Wait 15 minutes or adjust `RATE_LIMIT_AUTH` in `.env`
1130
-
1131
-**"CSRF token validation failed":**
1132
-- Ensure cookies are enabled
1133
-- Check `SITE_URL` matches your actual domain
1134
-- Verify HTTPS in production
1135
-
1136
-**"Unauthorized" on git hooks:**
1137
-- Check `INTERNAL_HOOK_SECRET` is set
1138
-- Verify hooks have correct secret in curl headers
1139
-- Re-run `git init` on repositories to reinstall hooks
1140
-
1141
-**Database connection errors:**
1142
-- Verify `DATABASE_URL` format
1143
-- Check database server is running
1144
-- Ensure user has correct permissions
1145
-
1146
-**Storage upload fails:**
1147
-- Test connection in `/admin/storage`
1148
-- Verify S3 credentials and bucket permissions
1149
-- Check firewall rules for external storage
1150
-
1151
-### Debug Mode
1152
-
1153
-```env
1154
-# Enable detailed logging
1155
-LOG_LEVEL=debug
1156
-NODE_ENV=development
1157
-
1158
-# View logs
1159
-tail -f data/logs/opencodehub.log
1160
-```
1161
-
1162
-### Health Check
1163
-
1164
-```bash
1165
-curl http://localhost:3000/api/health
1166
-
1167
-# Response:
1168
-{
1169
- "status": "ok",
1170
- "checks": {
1171
- "database": "ok",
1172
- "storage": "ok",
1173
- "redis": "ok" // if configured
1174
- },
1175
- "uptime": 123456,
1176
- "version": "1.0.0"
1177
-}
1178
-```
1179
-
1180
-
1181
-## 🤝 Contributing
1182
-
1183
-We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
1184
-
1185
-### Development Setup
1186
-
1187
-```bash
1188
-# Fork and clone
1189
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
1190
-cd OpencodeHub
1191
-
1192
-# Install dependencies
1193
-bun install
1194
-
1195
-# Run in development
1196
-bun run dev
1197
-
1198
-# Run tests
1199
-bun test
1200
-
1201
-# Lint
1202
-bun run lint
1203
-```
1204
-
1205
-### Submitting Changes
1206
-
1207
-1. Create a feature branch (`git checkout -b feature/amazing-feature`)
1208
-2. Make your changes
1209
-3. Add tests
1210
-4. Run `bun test` and `bun run lint`
1211
-5. Commit (`git commit -m 'Add amazing feature'`)
1212
-6. Push (`git push origin feature/amazing-feature`)
1213
-7. Open a Pull Request
1214
-
1215
-
1216
-## 📄 License
1217
-
1218
-MIT License - see [LICENSE](LICENSE) for details.
1219
-
1220
-
1221
-## 🙏 Acknowledgments
1222
-
1223
-- [Astro](https://astro.build/) - Web framework
1224
-- [shadcn/ui](https://ui.shadcn.com/) - UI components
1225
-- [Drizzle ORM](https://orm.drizzle.team/) - Database toolkit
1226
-- [simple-git](https://github.com/steveukx/git-js) - Git operations
1227
-- [Monaco Editor](https://microsoft.github.io/monaco-editor/) - Code editor
1228
-- [Zod](https://zod.dev/) - Schema validation
1229
-
1230
-
1231
-<p align="center">
1232
- <strong>Made with ❤️ for the open source community</strong>
1233
- <br>
1234
- <a href="https://github.com/swadhinbiswas/OpencodeHub/issues">Report Bug</a> •
1235
- <a href="https://github.com/swadhinbiswas/OpencodeHub/issues">Request Feature</a>
1236
-</p>
1237
0
▼Vercel Deploy.md
+1-1
372
372
### 5.1. Install Vercel CLI (Optional)
373
373
374
374
```bash
375
-npm install -g vercel
375
+bun install -g vercel
376
376
vercel login
377
377
```
378
378
379
379
▼astro.config.mjs
+5-3
1
-import node from "@astrojs/node";
1
+import vercel from "@astrojs/vercel/serverless";
2
2
import react from "@astrojs/react";
3
3
import tailwind from "@astrojs/tailwind";
4
4
import { defineConfig } from "astro/config";
11
11
}),
12
12
],
13
13
output: "server",
14
- adapter: node({
15
- mode: "standalone",
14
+ adapter: vercel({
15
+ webAnalytics: {
16
+ enabled: true,
17
+ },
16
18
}),
17
19
server: {
18
20
port: 3000,
19
21
▼bun.lock
+43-1
8
8
"@astrojs/node": "^8.3.0",
9
9
"@astrojs/react": "^3.6.0",
10
10
"@astrojs/tailwind": "^5.1.0",
11
+ "@astrojs/vercel": "^9.0.2",
11
12
"@aws-sdk/client-s3": "^3.948.0",
12
13
"@aws-sdk/s3-request-presigner": "^3.948.0",
13
14
"@libsql/client": "^0.15.15",
70
71
"otplib": "^12.0.1",
71
72
"pg": "^8.16.3",
72
73
"pino": "^10.1.0",
74
+ "pino-loki": "^3.0.0",
73
75
"postgres": "^3.4.7",
74
76
"prom-client": "^15.1.3",
75
77
"react": "^18.3.1",
118
120
119
121
"@astrojs/compiler": ["@astrojs/[email protected]", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="],
120
122
121
- "@astrojs/internal-helpers": ["@astrojs/[email protected]", "", {}, "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g=="],
123
+ "@astrojs/internal-helpers": ["@astrojs/[email protected]", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="],
122
124
123
125
"@astrojs/markdown-remark": ["@astrojs/[email protected]", "", { "dependencies": { "@astrojs/prism": "3.1.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", "shiki": "^1.22.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "vfile": "^6.0.3" } }, "sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg=="],
124
126
132
134
133
135
"@astrojs/telemetry": ["@astrojs/[email protected]", "", { "dependencies": { "ci-info": "^4.0.0", "debug": "^4.3.4", "dlv": "^1.1.3", "dset": "^3.1.3", "is-docker": "^3.0.0", "is-wsl": "^3.0.0", "which-pm-runs": "^1.1.0" } }, "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA=="],
134
136
137
+ "@astrojs/vercel": ["@astrojs/[email protected]", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@vercel/analytics": "^1.5.0", "@vercel/functions": "^2.2.13", "@vercel/nft": "0.30.4", "@vercel/routing-utils": "^5.3.0", "esbuild": "^0.25.0", "tinyglobby": "^0.2.15" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-L/pQal/5fity/rLmQ5KsqYaVphhNI+Eui+WnLbuqZ7Vf9ocmwX6v0pSDqSejgTQMoMQJq4FPWR8XAtsxMB4Yfw=="],
138
+
135
139
"@aws-crypto/crc32": ["@aws-crypto/[email protected]", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="],
136
140
137
141
"@aws-crypto/crc32c": ["@aws-crypto/[email protected]", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="],
1026
1030
1027
1031
"@upstash/redis": ["@upstash/[email protected]", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-9zN2UV9QJGPnXfWU3yZBLVQaqqENDh7g+Y4J2vJuSxBCi9FQ0aUOtaXlzuFhnsiZvCqM+eS27ic+tgmkWUsfOg=="],
1028
1032
1033
+ "@vercel/analytics": ["@vercel/[email protected]", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "react", "svelte", "vue", "vue-router"] }, "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg=="],
1034
+
1035
+ "@vercel/functions": ["@vercel/[email protected]", "", { "dependencies": { "@vercel/oidc": "2.0.2" }, "peerDependencies": { "@aws-sdk/credential-provider-web-identity": "*" }, "optionalPeers": ["@aws-sdk/credential-provider-web-identity"] }, "sha512-14ArBSIIcOBx9nrEgaJb4Bw+en1gl6eSoJWh8qjifLl5G3E4dRXCFOT8HP+w66vb9Wqyd1lAQBrmRhRwOj9X9A=="],
1036
+
1037
+ "@vercel/nft": ["@vercel/[email protected]", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.5.0", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA=="],
1038
+
1039
+ "@vercel/oidc": ["@vercel/[email protected]", "", { "dependencies": { "@types/ms": "2.1.0", "ms": "2.1.3" } }, "sha512-59PBFx3T+k5hLTEWa3ggiMpGRz1OVvl9eN8SUai+A43IsqiOuAe7qPBf+cray/Fj6mkgnxm/D7IAtjc8zSHi7g=="],
1040
+
1041
+ "@vercel/routing-utils": ["@vercel/[email protected]", "", { "dependencies": { "path-to-regexp": "6.1.0", "path-to-regexp-updated": "npm:[email protected]" }, "optionalDependencies": { "ajv": "^6.12.3" } }, "sha512-HlqFRdB6Dm20xgEWtEatchf9X28NifweXPdDoEGyj5ItngaiqpywtkgkuiAk3xK9eAu2oXM36wEJbDDTxMblUg=="],
1042
+
1029
1043
"@vitejs/plugin-react": ["@vitejs/[email protected]", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
1030
1044
1031
1045
"@vitest/expect": ["@vitest/[email protected]", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.15", "@vitest/utils": "4.0.15", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w=="],
1056
1070
1057
1071
"agent-base": ["[email protected]", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
1058
1072
1073
+ "ajv": ["[email protected]", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
1074
+
1059
1075
"ansi-align": ["[email protected]", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
1060
1076
1061
1077
"ansi-regex": ["[email protected]", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
1084
1100
1085
1101
"async-lock": ["[email protected]", "", {}, "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ=="],
1086
1102
1103
+ "async-sema": ["[email protected]", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="],
1104
+
1087
1105
"atomic-sleep": ["[email protected]", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="],
1088
1106
1089
1107
"autoprefixer": ["[email protected]", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-lite": "^1.0.30001754", "fraction.js": "^5.3.4", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg=="],
1402
1420
1403
1421
"fast-copy": ["[email protected]", "", {}, "sha512-+uUOQlhsaswsizHFmEFAQhB3lSiQ+lisxl50N6ZP0wywlZeWsIESxSi9ftPEps8UGfiBzyYP7x27zA674WUvXw=="],
1404
1422
1423
+ "fast-deep-equal": ["[email protected]", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
1424
+
1405
1425
"fast-fifo": ["[email protected]", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
1406
1426
1407
1427
"fast-glob": ["[email protected]", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
1408
1428
1429
+ "fast-json-stable-stringify": ["[email protected]", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
1430
+
1409
1431
"fast-safe-stringify": ["[email protected]", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="],
1410
1432
1411
1433
"fast-xml-parser": ["[email protected]", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="],
1646
1668
1647
1669
"json-bigint": ["[email protected]", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
1648
1670
1671
+ "json-schema-traverse": ["[email protected]", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
1672
+
1649
1673
"json5": ["[email protected]", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
1650
1674
1651
1675
"jsonfile": ["[email protected]", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],
1872
1896
1873
1897
"node-gyp": ["[email protected]", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^14.0.3", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "tar": "^7.4.3", "tinyglobby": "^0.2.12", "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ=="],
1874
1898
1899
+ "node-gyp-build": ["[email protected]", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="],
1900
+
1875
1901
"node-gyp-build-optional-packages": ["[email protected]", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
1876
1902
1877
1903
"node-releases": ["[email protected]", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
1942
1968
1943
1969
"path-scurry": ["[email protected]", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
1944
1970
1971
+ "path-to-regexp": ["[email protected]", "", {}, "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw=="],
1972
+
1973
+ "path-to-regexp-updated": ["[email protected]", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
1974
+
1945
1975
"pathe": ["[email protected]", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
1946
1976
1947
1977
"pg": ["[email protected]", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.3", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw=="],
1972
2002
1973
2003
"pino-abstract-transport": ["[email protected]", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="],
1974
2004
2005
+ "pino-loki": ["[email protected]", "", { "dependencies": { "pino-abstract-transport": "^3.0.0", "pump": "^3.0.3" }, "bin": { "pino-loki": "dist/cli.mjs" } }, "sha512-9TyUW5syTjp2nT70QcijJtIWUzdYUj+olQ7+fWNfm1/HrDGEWt86Q4ACzClH6DM6GBwtQimRDgneNczP+p4ypA=="],
2006
+
1975
2007
"pino-pretty": ["[email protected]", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^4.0.0", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg=="],
1976
2008
1977
2009
"pino-std-serializers": ["[email protected]", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="],
2044
2076
2045
2077
"pump": ["[email protected]", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="],
2046
2078
2079
+ "punycode": ["[email protected]", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
2080
+
2047
2081
"qs": ["[email protected]", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ=="],
2048
2082
2049
2083
"queue-microtask": ["[email protected]", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
2120
2154
2121
2155
"resolve-alpn": ["[email protected]", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="],
2122
2156
2157
+ "resolve-from": ["[email protected]", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
2158
+
2123
2159
"resolve-pkg-maps": ["[email protected]", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
2124
2160
2125
2161
"responselike": ["[email protected]", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA=="],
2378
2414
2379
2415
"update-browserslist-db": ["[email protected]", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA=="],
2380
2416
2417
+ "uri-js": ["[email protected]", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
2418
+
2381
2419
"url-template": ["[email protected]", "", {}, "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw=="],
2382
2420
2383
2421
"use-callback-ref": ["[email protected]", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
2584
2622
2585
2623
"@types/ssh2/@types/node": ["@types/[email protected]", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="],
2586
2624
2625
+ "@vercel/nft/estree-walker": ["[email protected]", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
2626
+
2587
2627
"ansi-align/string-width": ["[email protected]", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
2588
2628
2589
2629
"anymatch/picomatch": ["[email protected]", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
2590
2630
2631
+ "astro/@astrojs/internal-helpers": ["@astrojs/[email protected]", "", {}, "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g=="],
2632
+
2591
2633
"astro/esbuild": ["[email protected]", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
2592
2634
2593
2635
"astro/tinyexec": ["[email protected]", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
2594
2636
▼cli/.npmignore
+15-0
1
+# Ignore source files (dist is included)
2
+src/
3
+tsconfig.json
4
+
5
+# Dev files
6
+*.test.ts
7
+*.spec.ts
8
+.vscode/
9
+.idea/
10
+
11
+# Other
12
+node_modules/
13
+coverage/
14
+.env
15
+.env.*
0
16
▼cli/CHANGELOG.md
+27-0
1
+# Changelog
2
+
3
+All notable changes to this project will be documented in this file.
4
+
5
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+## [1.0.0] - 2026-01-17
9
+
10
+### Added
11
+- Initial release of OpenCodeHub CLI
12
+- `och auth` - Authentication commands (login, logout, whoami)
13
+- `och stack` - Stack management (create, view, submit, sync, reorder)
14
+- `och init` - Repository initialization
15
+- `och status` - Stack status display
16
+- `och config` - Configuration management
17
+- Support for stacked pull requests
18
+- Interactive prompts with Inquirer.js
19
+- Progress spinners with Ora
20
+- Colorful output with Chalk
21
+
22
+### Features
23
+- Stack-first PR workflow
24
+- Automatic PR dependency linking
25
+- Smart stack rebasing
26
+- Token-based authentication for CI/CD
27
+- Cross-platform support (Windows, macOS, Linux)
0
28
▼cli/LICENSE
+21-0
1
+MIT License
2
+
3
+Copyright (c) 2024-2026 Swadhin Biswas
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy
6
+of this software and associated documentation files (the "Software"), to deal
7
+in the Software without restriction, including without limitation the rights
8
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+copies of the Software, and to permit persons to whom the Software is
10
+furnished to do so, subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+SOFTWARE.
0
22
▼cli/README.md
+124-278
1
-# OCH CLI - OpenCodeHub Command Line Interface
1
+<p align="center">
2
+ <img src="https://raw.githubusercontent.com/swadhinbiswas/OpenCodeHub/main/public/logo.svg" alt="OpenCodeHub CLI" width="120" />
3
+</p>
2
4
3
-**Stack-first PR workflows from your terminal.**
5
+<h1 align="center">OpenCodeHub CLI</h1>
4
6
5
-## Installation
7
+<p align="center">
8
+ <strong>Stack-first PR workflows from your terminal</strong>
9
+</p>
10
+
11
+<p align="center">
12
+ <a href="https://www.npmjs.com/package/opencodehub-cli"><img src="https://img.shields.io/npm/v/opencodehub-cli.svg?style=flat-square" alt="npm version" /></a>
13
+ <a href="https://www.npmjs.com/package/opencodehub-cli"><img src="https://img.shields.io/npm/dm/opencodehub-cli.svg?style=flat-square" alt="npm downloads" /></a>
14
+ <a href="https://github.com/swadhinbiswas/OpencodeHub/blob/main/cli/LICENSE"><img src="https://img.shields.io/npm/l/opencodehub-cli.svg?style=flat-square" alt="license" /></a>
15
+ <a href="https://github.com/swadhinbiswas/OpencodeHub"><img src="https://img.shields.io/github/stars/swadhinbiswas/OpenCodeHub?style=flat-square" alt="GitHub stars" /></a>
16
+</p>
17
+
18
+<p align="center">
19
+ <a href="#-installation">Installation</a> •
20
+ <a href="#-quick-start">Quick Start</a> •
21
+ <a href="#-commands">Commands</a> •
22
+ <a href="#-workflow-examples">Examples</a> •
23
+ <a href="#-contributing">Contributing</a>
24
+</p>
25
+
26
+---
27
+
28
+## ✨ Features
29
+
30
+- 📚 **Stacked PRs** - Create dependent pull requests that automatically update when parent changes
31
+- 🔄 **Smart Sync** - Rebase entire stacks with a single command
32
+- 🚀 **Fast Workflow** - Submit, update, and manage PRs without leaving your terminal
33
+- 🔗 **GitHub/GitLab Alternative** - Works with self-hosted OpenCodeHub instances
34
+- 🎯 **Zero Config** - Works out of the box with sensible defaults
35
+
36
+## 📦 Installation
6
37
7
38
```bash
8
-# Install globally
39
+# Install globally with npm
9
40
npm install -g opencodehub-cli
10
41
11
-# Or use with npx (no installation needed)
12
-npx opencodehub-cli
42
+# Or with yarn
43
+yarn global add opencodehub-cli
44
+
45
+# Or with pnpm
46
+pnpm add -g opencodehub-cli
13
47
14
48
# Verify installation
15
49
och --version
16
50
```
17
51
18
-## Quick Start
52
+## 🚀 Quick Start
19
53
20
54
```bash
21
55
# 1. Login to your OpenCodeHub instance
22
56
och auth login
23
57
24
-# Enter your email and password when prompted
25
-# Or use a personal access token:
26
-och auth login --token YOUR_TOKEN
27
-
28
58
# 2. Navigate to your repository
29
59
cd your-repo
30
60
31
61
# 3. Initialize (one-time setup)
32
62
och init --url https://git.yourcompany.com
33
63
34
-# 4. You're ready! Try:
35
-och status
64
+# 4. Create your first stack
65
+och stack create my-feature
66
+
67
+# 5. Make changes, commit, and submit
68
+git add . && git commit -m "Add feature"
69
+och stack submit
36
70
```
37
71
38
-## Commands
72
+## 📖 Commands
39
73
40
74
### Authentication
41
75
42
-```bash
43
-# Interactive login
44
-och auth login
45
-
46
-# Login with server URL
47
-och auth login --url https://git.yourcompany.com
48
-
49
-# Login with token (CI/CD)
50
-och auth login --token YOUR_ACCESS_TOKEN
51
-
52
-# Check who you're logged in as
53
-och auth whoami
54
-
55
-# Logout
56
-och auth logout
57
-```
76
+| Command | Description |
77
+|---------|-------------|
78
+| `och auth login` | Interactive login |
79
+| `och auth login --token TOKEN` | Login with access token (for CI/CD) |
80
+| `och auth whoami` | Show current user |
81
+| `och auth logout` | Clear stored credentials |
58
82
59
83
### Stack Management
60
84
61
-**Create Stacked Branches:**
62
-```bash
63
-# Create a new branch in current stack
64
-och stack create \u003cbranch-name\u003e
65
-
66
-# Example:
67
-git checkout main
68
-och stack create database-schema
69
-# Make changes, commit
70
-och stack create auth-service
71
-# Make changes, commit
72
-```
73
-
74
-**View Stack:**
75
-```bash
76
-# See all branches in current stack
77
-och stack view
78
-
79
-# Short alias:
80
-och stack ls
81
-
82
-# Example output:
83
-# 📚 Current Stack
84
-# ┌─ main (base)
85
-# ├─ stack/database-schema ✓ Pushed
86
-# └─ stack/auth-service * Current
87
-```
88
-
89
-**Submit Stack:**
90
-```bash
91
-# Push current branch and create/update PR
92
-och stack submit
93
-
94
-# Create as draft PR
95
-och stack submit --draft
96
-
97
-# This will:
98
-# - Push your branch to origin
99
-# - Create PR or update existing one
100
-# - Link it to parent PR if in a stack
101
-```
102
-
103
-**Sync Stack:**
104
-```bash
105
-# Rebase entire stack on latest main
106
-och stack sync
107
-
108
-# This handles:
109
-# - Fetching latest from origin
110
-# - Rebasing each branch in order
111
-# - Detecting and reporting conflicts
112
-```
113
-
114
-**Reorder Stack:**
115
-```bash
116
-# Interactively reorder branches
117
-och stack reorder
118
-
119
-# Choose new order from list
120
-# Stack dependencies will be updated
121
-```
85
+| Command | Description |
86
+|---------|-------------|
87
+| `och stack create <name>` | Create a new branch in current stack |
88
+| `och stack view` / `och stack ls` | View all branches in current stack |
89
+| `och stack submit` | Push and create/update PR |
90
+| `och stack submit --draft` | Submit as draft PR |
91
+| `och stack sync` | Rebase entire stack on latest main |
92
+| `och stack reorder` | Interactively reorder branches |
122
93
123
94
### Repository Operations
124
95
125
-```bash
126
-# Initialize repo for OpenCodeHub
127
-och init [--url \u003cserver-url\u003e]
128
-
129
-# Show current stack status
130
-och status
131
-# Alias: och st
96
+| Command | Description |
97
+|---------|-------------|
98
+| `och init` | Initialize repo for OpenCodeHub |
99
+| `och status` / `och st` | Show current stack status |
100
+| `och sync` | Sync with remote |
132
101
133
-# Sync with remote (bi-directional)
134
-och sync
135
-```
102
+## 🔄 Workflow Examples
136
103
137
-## Workflow Examples
138
-
139
-### Example 1: Create a Feature Stack
104
+### Creating a Feature Stack
140
105
141
106
```bash
142
107
# Start from main
143
-git checkout main
144
-git pull
108
+git checkout main && git pull
145
109
146
110
# Create base layer
147
-och stack create user-models
148
-# ... edit files ...
149
-git add .
111
+och stack create database-schema
112
+# ... make changes ...
150
113
git commit -m "Add user database models"
151
114
152
-# Create middleware layer (builds on user-models)
153
-och stack create auth-middleware
154
-# ... edit files ...
155
-git add .
156
-git commit -m "Add authentication middleware"
157
-
158
-# Create UI layer (builds on auth-middleware)
159
-och stack create login-page
160
-# ... edit files ...
161
-git add .
162
-git commit -m "Add login page UI"
115
+# Create next layer (builds on database-schema)
116
+och stack create auth-service
117
+# ... make changes ...
118
+git commit -m "Add authentication service"
163
119
164
120
# Submit entire stack
165
121
och stack submit
166
122
167
123
# Result:
168
-# PR #301: Add user database models (main ← user-models)
169
-# PR #302: Add auth middleware (user-models ← auth-middleware)
170
-# PR #303: Add login page (auth-middleware ← login-page)
124
+# PR #1: Add user database models (main ← database-schema)
125
+# PR #2: Add auth service (database-schema ← auth-service)
171
126
```
172
127
173
-### Example 2: Update Stack After Review
128
+### Updating After Review
174
129
175
130
```bash
176
-# You're on stack/login-page
177
-# Reviewer requested changes
178
-
179
-# Make changes
180
-git add .
181
-git commit -m "Address review feedback"
131
+# Make requested changes
132
+git add . && git commit -m "Address review feedback"
182
133
183
134
# Resubmit (updates PR automatically)
184
135
och stack submit
185
136
186
-# If base changed, sync the whole stack
137
+# If main changed, sync the whole stack
187
138
och stack sync
188
139
```
189
140
190
-### Example 3: collaboration on Stacks
141
+## ⚙️ Configuration
191
142
192
-```bash
193
-# Teammate created a stack, you want to build on it
194
-git fetch
195
-git checkout their-branch
143
+OCH CLI stores configuration in `~/.ochrc`.
196
144
197
-# Create your branch on top
198
-och stack create my-feature
199
-# ... make changes ...
200
-git commit -m "My changes"
201
-
202
-# Submit (will link your PR to theirs)
203
-och stack submit
204
-```
205
-
206
-## Configuration
207
-
208
-OCH CLI stores configuration in `~/.ochrc` (JSON format).
209
-
210
-**View config:**
211
145
```bash
146
+# View config
212
147
och config list
213
-```
214
148
215
-**Set config:**
216
-```bash
149
+# Set config
217
150
och config set host https://git.yourcompany.com
218
-och config set token YOUR_TOKEN
219
-```
220
-
221
-**Config file structure:**
222
-```json
223
-{
224
- "host": "https://git.yourcompany.com",
225
- "token": "your-access-token",
226
- "defaultBranch": "main"
227
-}
228
-```
229
-
230
-## Troubleshooting
231
-
232
-### "Not logged in" Error
233
-
234
-```bash
235
-# Check auth status
236
-och auth whoami
237
-
238
-# If not logged in:
239
-och auth login
240
-```
241
-
242
-### "No stack found" Error
243
-
244
-```bash
245
-# Ensure you're in a git repository
246
-git status
247
-
248
-# Initialize if needed
249
-och init
250
-
251
-# Check current branch
252
-git branch
151
+och config set defaultBranch main
253
152
```
254
153
255
-### Permission Denied
256
-
257
-```bash
258
-# Verify your token has correct permissions
259
-och auth whoami
260
-
261
-# Login again with fresh token
262
-och auth logout
263
-och auth login --token NEW_TOKEN
264
-```
265
-
266
-### Stack Sync Conflicts
267
-
268
-```bash
269
-# If sync encounters conflicts:
270
-# 1. Resolve conflicts in each branch
271
-# 2. Continue sync:
272
-git rebase --continue
273
-
274
-# 3. Or abort and do manual rebase:
275
-git rebase --abort
276
-git checkout main
277
-git pull
278
-git checkout your-branch
279
-git rebase main
280
-```
281
-
282
-## CI/CD Usage
154
+## 🔧 CI/CD Usage
283
155
284
156
```yaml
285
-# .github/workflows/deploy.yml
286
-name: Deploy Stack
287
-on:
288
- push:
289
- branches: ['stack/**']
157
+# .github/workflows/pr.yml
158
+name: Submit PR
159
+on: push
290
160
291
161
jobs:
292
- deploy:
162
+ submit:
293
163
runs-on: ubuntu-latest
294
164
steps:
295
- - uses: actions/checkout@v3
296
-
165
+ - uses: actions/checkout@v4
166
+
297
167
- name: Setup Node
298
- uses: actions/setup-node@v3
299
-
300
- - name: Install OCH CLI
168
+ uses: actions/setup-node@v4
169
+ with:
170
+ node-version: '20'
171
+
172
+ - name: Install CLI
301
173
run: npm install -g opencodehub-cli
302
-
303
- - name: Login
304
- run: och auth login --token ${{ secrets.OCH_TOKEN }}
305
-
306
- - name: Submit PR
307
- run: och stack submit
174
+
175
+ - name: Login & Submit
176
+ run: |
177
+ och auth login --token ${{ secrets.OCH_TOKEN }}
178
+ och stack submit
308
179
```
309
180
310
-## Advanced Features
311
-
312
-### Custom PR Templates
313
-
314
-Create `.github/pull_request_template.md` in your repo:
315
-
316
-```markdown
317
-## Description
318
-<!-- What does this PR do? -->
319
-
320
-## Stack Position
321
-<!-- Part of stack: #XXX → This PR → #YYY -->
322
-
323
-## Checklist
324
-- [ ] Tests pass
325
-- [ ] Docs updated
326
-```
181
+## 🤝 Contributing
327
182
328
-### Hooks
329
-
330
-OCH CLI supports git hooks for validation:
183
+We welcome contributions! Please see our [Contributing Guide](https://github.com/swadhinbiswas/OpencodeHub/blob/main/CONTRIBUTING.md).
331
184
332
185
```bash
333
-# .git/hooks/pre-push
334
-#!/bin/bash
335
-# Validate stack before push
336
-och stack verify || exit 1
337
-```
338
-
339
-## API Integration
186
+# Clone the repo
187
+git clone https://github.com/swadhinbiswas/OpencodeHub.git
188
+cd OpenCodeHub/cli
340
189
341
-OCH CLI uses OpenCodeHub REST API. Token permissions needed:
342
-- `repo` - Repository read/write
343
-- `pr` - Pull request create/update
344
-- `user` - Read user profile
190
+# Install dependencies
191
+npm install
345
192
346
-Generate token: `https://your-server/settings/tokens`
347
-
348
-## Contributing
349
-
350
-OCH CLI is open source! Contribute at:
351
-https://github.com/swadhinbiswas/OpencodeHub/tree/main/cli
193
+# Run in development mode
194
+npm run dev
195
+```
352
196
353
-## Support
197
+## 📝 License
354
198
355
-- **Documentation**: https://git.yourcompany.com/docs
356
-- **Issues**: https://github.com/swadhinbiswas/OpencodeHub/issues
357
-- **Discussions**: https://github.com/swadhinbiswas/OpencodeHub/discussions
199
+MIT License - see [LICENSE](./LICENSE) for details.
358
200
359
-## changelog
201
+## 🔗 Links
360
202
361
-See [CHANGELOG.md](./CHANGELOG.md) for version history.
203
+- [OpenCodeHub](https://github.com/swadhinbiswas/OpencodeHub) - The main project
204
+- [Documentation](https://github.com/swadhinbiswas/OpencodeHub#readme)
205
+- [Report Issues](https://github.com/swadhinbiswas/OpencodeHub/issues)
362
206
363
-## License
207
+---
364
208
365
-MIT License - see [LICENSE](../LICENSE)
209
+<p align="center">
210
+ Made with ❤️ by <a href="https://github.com/swadhinbiswas">Swadhin Biswas</a>
211
+</p>
366
212
▼cli/bin/och.ts
+1-1
59
59
// TODO: Show current stack
60
60
});
61
61
62
-program.parse();
62
+program.parse(process.argv);
63
63
▼cli/package-lock.json
+2679-0
1
+{
2
+ "name": "opencodehub-cli",
3
+ "version": "1.0.1",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "opencodehub-cli",
9
+ "version": "1.0.1",
10
+ "license": "MIT",
11
+ "dependencies": {
12
+ "chalk": "^5.3.0",
13
+ "commander": "^12.0.0",
14
+ "conf": "^12.0.0",
15
+ "inquirer": "^9.2.0",
16
+ "ora": "^8.0.0",
17
+ "simple-git": "^3.25.0"
18
+ },
19
+ "bin": {
20
+ "och": "dist/bin/och.js"
21
+ },
22
+ "devDependencies": {
23
+ "@types/inquirer": "^9.0.9",
24
+ "@types/node": "^20.14.9",
25
+ "tsx": "^4.15.0",
26
+ "typescript": "^5.5.2",
27
+ "vitest": "^4.0.15"
28
+ },
29
+ "engines": {
30
+ "node": ">=18.0.0"
31
+ }
32
+ },
33
+ "node_modules/@esbuild/aix-ppc64": {
34
+ "version": "0.27.2",
35
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
36
+ "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
37
+ "cpu": [
38
+ "ppc64"
39
+ ],
40
+ "dev": true,
41
+ "license": "MIT",
42
+ "optional": true,
43
+ "os": [
44
+ "aix"
45
+ ],
46
+ "engines": {
47
+ "node": ">=18"
48
+ }
49
+ },
50
+ "node_modules/@esbuild/android-arm": {
51
+ "version": "0.27.2",
52
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
53
+ "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
54
+ "cpu": [
55
+ "arm"
56
+ ],
57
+ "dev": true,
58
+ "license": "MIT",
59
+ "optional": true,
60
+ "os": [
61
+ "android"
62
+ ],
63
+ "engines": {
64
+ "node": ">=18"
65
+ }
66
+ },
67
+ "node_modules/@esbuild/android-arm64": {
68
+ "version": "0.27.2",
69
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
70
+ "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
71
+ "cpu": [
72
+ "arm64"
73
+ ],
74
+ "dev": true,
75
+ "license": "MIT",
76
+ "optional": true,
77
+ "os": [
78
+ "android"
79
+ ],
80
+ "engines": {
81
+ "node": ">=18"
82
+ }
83
+ },
84
+ "node_modules/@esbuild/android-x64": {
85
+ "version": "0.27.2",
86
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
87
+ "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
88
+ "cpu": [
89
+ "x64"
90
+ ],
91
+ "dev": true,
92
+ "license": "MIT",
93
+ "optional": true,
94
+ "os": [
95
+ "android"
96
+ ],
97
+ "engines": {
98
+ "node": ">=18"
99
+ }
100
+ },
101
+ "node_modules/@esbuild/darwin-arm64": {
102
+ "version": "0.27.2",
103
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
104
+ "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
105
+ "cpu": [
106
+ "arm64"
107
+ ],
108
+ "dev": true,
109
+ "license": "MIT",
110
+ "optional": true,
111
+ "os": [
112
+ "darwin"
113
+ ],
114
+ "engines": {
115
+ "node": ">=18"
116
+ }
117
+ },
118
+ "node_modules/@esbuild/darwin-x64": {
119
+ "version": "0.27.2",
120
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
121
+ "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
122
+ "cpu": [
123
+ "x64"
124
+ ],
125
+ "dev": true,
126
+ "license": "MIT",
127
+ "optional": true,
128
+ "os": [
129
+ "darwin"
130
+ ],
131
+ "engines": {
132
+ "node": ">=18"
133
+ }
134
+ },
135
+ "node_modules/@esbuild/freebsd-arm64": {
136
+ "version": "0.27.2",
137
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
138
+ "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
139
+ "cpu": [
140
+ "arm64"
141
+ ],
142
+ "dev": true,
143
+ "license": "MIT",
144
+ "optional": true,
145
+ "os": [
146
+ "freebsd"
147
+ ],
148
+ "engines": {
149
+ "node": ">=18"
150
+ }
151
+ },
152
+ "node_modules/@esbuild/freebsd-x64": {
153
+ "version": "0.27.2",
154
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
155
+ "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
156
+ "cpu": [
157
+ "x64"
158
+ ],
159
+ "dev": true,
160
+ "license": "MIT",
161
+ "optional": true,
162
+ "os": [
163
+ "freebsd"
164
+ ],
165
+ "engines": {
166
+ "node": ">=18"
167
+ }
168
+ },
169
+ "node_modules/@esbuild/linux-arm": {
170
+ "version": "0.27.2",
171
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
172
+ "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
173
+ "cpu": [
174
+ "arm"
175
+ ],
176
+ "dev": true,
177
+ "license": "MIT",
178
+ "optional": true,
179
+ "os": [
180
+ "linux"
181
+ ],
182
+ "engines": {
183
+ "node": ">=18"
184
+ }
185
+ },
186
+ "node_modules/@esbuild/linux-arm64": {
187
+ "version": "0.27.2",
188
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
189
+ "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
190
+ "cpu": [
191
+ "arm64"
192
+ ],
193
+ "dev": true,
194
+ "license": "MIT",
195
+ "optional": true,
196
+ "os": [
197
+ "linux"
198
+ ],
199
+ "engines": {
200
+ "node": ">=18"
201
+ }
202
+ },
203
+ "node_modules/@esbuild/linux-ia32": {
204
+ "version": "0.27.2",
205
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
206
+ "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
207
+ "cpu": [
208
+ "ia32"
209
+ ],
210
+ "dev": true,
211
+ "license": "MIT",
212
+ "optional": true,
213
+ "os": [
214
+ "linux"
215
+ ],
216
+ "engines": {
217
+ "node": ">=18"
218
+ }
219
+ },
220
+ "node_modules/@esbuild/linux-loong64": {
221
+ "version": "0.27.2",
222
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
223
+ "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
224
+ "cpu": [
225
+ "loong64"
226
+ ],
227
+ "dev": true,
228
+ "license": "MIT",
229
+ "optional": true,
230
+ "os": [
231
+ "linux"
232
+ ],
233
+ "engines": {
234
+ "node": ">=18"
235
+ }
236
+ },
237
+ "node_modules/@esbuild/linux-mips64el": {
238
+ "version": "0.27.2",
239
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
240
+ "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
241
+ "cpu": [
242
+ "mips64el"
243
+ ],
244
+ "dev": true,
245
+ "license": "MIT",
246
+ "optional": true,
247
+ "os": [
248
+ "linux"
249
+ ],
250
+ "engines": {
251
+ "node": ">=18"
252
+ }
253
+ },
254
+ "node_modules/@esbuild/linux-ppc64": {
255
+ "version": "0.27.2",
256
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
257
+ "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
258
+ "cpu": [
259
+ "ppc64"
260
+ ],
261
+ "dev": true,
262
+ "license": "MIT",
263
+ "optional": true,
264
+ "os": [
265
+ "linux"
266
+ ],
267
+ "engines": {
268
+ "node": ">=18"
269
+ }
270
+ },
271
+ "node_modules/@esbuild/linux-riscv64": {
272
+ "version": "0.27.2",
273
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
274
+ "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
275
+ "cpu": [
276
+ "riscv64"
277
+ ],
278
+ "dev": true,
279
+ "license": "MIT",
280
+ "optional": true,
281
+ "os": [
282
+ "linux"
283
+ ],
284
+ "engines": {
285
+ "node": ">=18"
286
+ }
287
+ },
288
+ "node_modules/@esbuild/linux-s390x": {
289
+ "version": "0.27.2",
290
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
291
+ "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
292
+ "cpu": [
293
+ "s390x"
294
+ ],
295
+ "dev": true,
296
+ "license": "MIT",
297
+ "optional": true,
298
+ "os": [
299
+ "linux"
300
+ ],
301
+ "engines": {
302
+ "node": ">=18"
303
+ }
304
+ },
305
+ "node_modules/@esbuild/linux-x64": {
306
+ "version": "0.27.2",
307
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
308
+ "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
309
+ "cpu": [
310
+ "x64"
311
+ ],
312
+ "dev": true,
313
+ "license": "MIT",
314
+ "optional": true,
315
+ "os": [
316
+ "linux"
317
+ ],
318
+ "engines": {
319
+ "node": ">=18"
320
+ }
321
+ },
322
+ "node_modules/@esbuild/netbsd-arm64": {
323
+ "version": "0.27.2",
324
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
325
+ "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
326
+ "cpu": [
327
+ "arm64"
328
+ ],
329
+ "dev": true,
330
+ "license": "MIT",
331
+ "optional": true,
332
+ "os": [
333
+ "netbsd"
334
+ ],
335
+ "engines": {
336
+ "node": ">=18"
337
+ }
338
+ },
339
+ "node_modules/@esbuild/netbsd-x64": {
340
+ "version": "0.27.2",
341
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
342
+ "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
343
+ "cpu": [
344
+ "x64"
345
+ ],
346
+ "dev": true,
347
+ "license": "MIT",
348
+ "optional": true,
349
+ "os": [
350
+ "netbsd"
351
+ ],
352
+ "engines": {
353
+ "node": ">=18"
354
+ }
355
+ },
356
+ "node_modules/@esbuild/openbsd-arm64": {
357
+ "version": "0.27.2",
358
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
359
+ "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
360
+ "cpu": [
361
+ "arm64"
362
+ ],
363
+ "dev": true,
364
+ "license": "MIT",
365
+ "optional": true,
366
+ "os": [
367
+ "openbsd"
368
+ ],
369
+ "engines": {
370
+ "node": ">=18"
371
+ }
372
+ },
373
+ "node_modules/@esbuild/openbsd-x64": {
374
+ "version": "0.27.2",
375
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
376
+ "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
377
+ "cpu": [
378
+ "x64"
379
+ ],
380
+ "dev": true,
381
+ "license": "MIT",
382
+ "optional": true,
383
+ "os": [
384
+ "openbsd"
385
+ ],
386
+ "engines": {
387
+ "node": ">=18"
388
+ }
389
+ },
390
+ "node_modules/@esbuild/openharmony-arm64": {
391
+ "version": "0.27.2",
392
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
393
+ "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
394
+ "cpu": [
395
+ "arm64"
396
+ ],
397
+ "dev": true,
398
+ "license": "MIT",
399
+ "optional": true,
400
+ "os": [
401
+ "openharmony"
402
+ ],
403
+ "engines": {
404
+ "node": ">=18"
405
+ }
406
+ },
407
+ "node_modules/@esbuild/sunos-x64": {
408
+ "version": "0.27.2",
409
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
410
+ "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
411
+ "cpu": [
412
+ "x64"
413
+ ],
414
+ "dev": true,
415
+ "license": "MIT",
416
+ "optional": true,
417
+ "os": [
418
+ "sunos"
419
+ ],
420
+ "engines": {
421
+ "node": ">=18"
422
+ }
423
+ },
424
+ "node_modules/@esbuild/win32-arm64": {
425
+ "version": "0.27.2",
426
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
427
+ "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
428
+ "cpu": [
429
+ "arm64"
430
+ ],
431
+ "dev": true,
432
+ "license": "MIT",
433
+ "optional": true,
434
+ "os": [
435
+ "win32"
436
+ ],
437
+ "engines": {
438
+ "node": ">=18"
439
+ }
440
+ },
441
+ "node_modules/@esbuild/win32-ia32": {
442
+ "version": "0.27.2",
443
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
444
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
445
+ "cpu": [
446
+ "ia32"
447
+ ],
448
+ "dev": true,
449
+ "license": "MIT",
450
+ "optional": true,
451
+ "os": [
452
+ "win32"
453
+ ],
454
+ "engines": {
455
+ "node": ">=18"
456
+ }
457
+ },
458
+ "node_modules/@esbuild/win32-x64": {
459
+ "version": "0.27.2",
460
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
461
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
462
+ "cpu": [
463
+ "x64"
464
+ ],
465
+ "dev": true,
466
+ "license": "MIT",
467
+ "optional": true,
468
+ "os": [
469
+ "win32"
470
+ ],
471
+ "engines": {
472
+ "node": ">=18"
473
+ }
474
+ },
475
+ "node_modules/@inquirer/external-editor": {
476
+ "version": "1.0.3",
477
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
478
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
479
+ "license": "MIT",
480
+ "dependencies": {
481
+ "chardet": "^2.1.1",
482
+ "iconv-lite": "^0.7.0"
483
+ },
484
+ "engines": {
485
+ "node": ">=18"
486
+ },
487
+ "peerDependencies": {
488
+ "@types/node": ">=18"
489
+ },
490
+ "peerDependenciesMeta": {
491
+ "@types/node": {
492
+ "optional": true
493
+ }
494
+ }
495
+ },
496
+ "node_modules/@inquirer/figures": {
497
+ "version": "1.0.15",
498
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
499
+ "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
500
+ "license": "MIT",
501
+ "engines": {
502
+ "node": ">=18"
503
+ }
504
+ },
505
+ "node_modules/@jridgewell/sourcemap-codec": {
506
+ "version": "1.5.5",
507
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
508
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
509
+ "dev": true,
510
+ "license": "MIT"
511
+ },
512
+ "node_modules/@kwsites/file-exists": {
513
+ "version": "1.1.1",
514
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
515
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
516
+ "license": "MIT",
517
+ "dependencies": {
518
+ "debug": "^4.1.1"
519
+ }
520
+ },
521
+ "node_modules/@kwsites/promise-deferred": {
522
+ "version": "1.1.1",
523
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
524
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
525
+ "license": "MIT"
526
+ },
527
+ "node_modules/@rollup/rollup-android-arm-eabi": {
528
+ "version": "4.55.1",
529
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz",
530
+ "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==",
531
+ "cpu": [
532
+ "arm"
533
+ ],
534
+ "dev": true,
535
+ "license": "MIT",
536
+ "optional": true,
537
+ "os": [
538
+ "android"
539
+ ]
540
+ },
541
+ "node_modules/@rollup/rollup-android-arm64": {
542
+ "version": "4.55.1",
543
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz",
544
+ "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==",
545
+ "cpu": [
546
+ "arm64"
547
+ ],
548
+ "dev": true,
549
+ "license": "MIT",
550
+ "optional": true,
551
+ "os": [
552
+ "android"
553
+ ]
554
+ },
555
+ "node_modules/@rollup/rollup-darwin-arm64": {
556
+ "version": "4.55.1",
557
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz",
558
+ "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==",
559
+ "cpu": [
560
+ "arm64"
561
+ ],
562
+ "dev": true,
563
+ "license": "MIT",
564
+ "optional": true,
565
+ "os": [
566
+ "darwin"
567
+ ]
568
+ },
569
+ "node_modules/@rollup/rollup-darwin-x64": {
570
+ "version": "4.55.1",
571
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz",
572
+ "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==",
573
+ "cpu": [
574
+ "x64"
575
+ ],
576
+ "dev": true,
577
+ "license": "MIT",
578
+ "optional": true,
579
+ "os": [
580
+ "darwin"
581
+ ]
582
+ },
583
+ "node_modules/@rollup/rollup-freebsd-arm64": {
584
+ "version": "4.55.1",
585
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz",
586
+ "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==",
587
+ "cpu": [
588
+ "arm64"
589
+ ],
590
+ "dev": true,
591
+ "license": "MIT",
592
+ "optional": true,
593
+ "os": [
594
+ "freebsd"
595
+ ]
596
+ },
597
+ "node_modules/@rollup/rollup-freebsd-x64": {
598
+ "version": "4.55.1",
599
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz",
600
+ "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==",
601
+ "cpu": [
602
+ "x64"
603
+ ],
604
+ "dev": true,
605
+ "license": "MIT",
606
+ "optional": true,
607
+ "os": [
608
+ "freebsd"
609
+ ]
610
+ },
611
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
612
+ "version": "4.55.1",
613
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz",
614
+ "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==",
615
+ "cpu": [
616
+ "arm"
617
+ ],
618
+ "dev": true,
619
+ "license": "MIT",
620
+ "optional": true,
621
+ "os": [
622
+ "linux"
623
+ ]
624
+ },
625
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
626
+ "version": "4.55.1",
627
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz",
628
+ "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==",
629
+ "cpu": [
630
+ "arm"
631
+ ],
632
+ "dev": true,
633
+ "license": "MIT",
634
+ "optional": true,
635
+ "os": [
636
+ "linux"
637
+ ]
638
+ },
639
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
640
+ "version": "4.55.1",
641
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz",
642
+ "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==",
643
+ "cpu": [
644
+ "arm64"
645
+ ],
646
+ "dev": true,
647
+ "license": "MIT",
648
+ "optional": true,
649
+ "os": [
650
+ "linux"
651
+ ]
652
+ },
653
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
654
+ "version": "4.55.1",
655
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz",
656
+ "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==",
657
+ "cpu": [
658
+ "arm64"
659
+ ],
660
+ "dev": true,
661
+ "license": "MIT",
662
+ "optional": true,
663
+ "os": [
664
+ "linux"
665
+ ]
666
+ },
667
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
668
+ "version": "4.55.1",
669
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz",
670
+ "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==",
671
+ "cpu": [
672
+ "loong64"
673
+ ],
674
+ "dev": true,
675
+ "license": "MIT",
676
+ "optional": true,
677
+ "os": [
678
+ "linux"
679
+ ]
680
+ },
681
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
682
+ "version": "4.55.1",
683
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz",
684
+ "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==",
685
+ "cpu": [
686
+ "loong64"
687
+ ],
688
+ "dev": true,
689
+ "license": "MIT",
690
+ "optional": true,
691
+ "os": [
692
+ "linux"
693
+ ]
694
+ },
695
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
696
+ "version": "4.55.1",
697
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz",
698
+ "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==",
699
+ "cpu": [
700
+ "ppc64"
701
+ ],
702
+ "dev": true,
703
+ "license": "MIT",
704
+ "optional": true,
705
+ "os": [
706
+ "linux"
707
+ ]
708
+ },
709
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
710
+ "version": "4.55.1",
711
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz",
712
+ "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==",
713
+ "cpu": [
714
+ "ppc64"
715
+ ],
716
+ "dev": true,
717
+ "license": "MIT",
718
+ "optional": true,
719
+ "os": [
720
+ "linux"
721
+ ]
722
+ },
723
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
724
+ "version": "4.55.1",
725
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz",
726
+ "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==",
727
+ "cpu": [
728
+ "riscv64"
729
+ ],
730
+ "dev": true,
731
+ "license": "MIT",
732
+ "optional": true,
733
+ "os": [
734
+ "linux"
735
+ ]
736
+ },
737
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
738
+ "version": "4.55.1",
739
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz",
740
+ "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==",
741
+ "cpu": [
742
+ "riscv64"
743
+ ],
744
+ "dev": true,
745
+ "license": "MIT",
746
+ "optional": true,
747
+ "os": [
748
+ "linux"
749
+ ]
750
+ },
751
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
752
+ "version": "4.55.1",
753
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz",
754
+ "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==",
755
+ "cpu": [
756
+ "s390x"
757
+ ],
758
+ "dev": true,
759
+ "license": "MIT",
760
+ "optional": true,
761
+ "os": [
762
+ "linux"
763
+ ]
764
+ },
765
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
766
+ "version": "4.55.1",
767
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz",
768
+ "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==",
769
+ "cpu": [
770
+ "x64"
771
+ ],
772
+ "dev": true,
773
+ "license": "MIT",
774
+ "optional": true,
775
+ "os": [
776
+ "linux"
777
+ ]
778
+ },
779
+ "node_modules/@rollup/rollup-linux-x64-musl": {
780
+ "version": "4.55.1",
781
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz",
782
+ "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==",
783
+ "cpu": [
784
+ "x64"
785
+ ],
786
+ "dev": true,
787
+ "license": "MIT",
788
+ "optional": true,
789
+ "os": [
790
+ "linux"
791
+ ]
792
+ },
793
+ "node_modules/@rollup/rollup-openbsd-x64": {
794
+ "version": "4.55.1",
795
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz",
796
+ "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==",
797
+ "cpu": [
798
+ "x64"
799
+ ],
800
+ "dev": true,
801
+ "license": "MIT",
802
+ "optional": true,
803
+ "os": [
804
+ "openbsd"
805
+ ]
806
+ },
807
+ "node_modules/@rollup/rollup-openharmony-arm64": {
808
+ "version": "4.55.1",
809
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz",
810
+ "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==",
811
+ "cpu": [
812
+ "arm64"
813
+ ],
814
+ "dev": true,
815
+ "license": "MIT",
816
+ "optional": true,
817
+ "os": [
818
+ "openharmony"
819
+ ]
820
+ },
821
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
822
+ "version": "4.55.1",
823
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz",
824
+ "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==",
825
+ "cpu": [
826
+ "arm64"
827
+ ],
828
+ "dev": true,
829
+ "license": "MIT",
830
+ "optional": true,
831
+ "os": [
832
+ "win32"
833
+ ]
834
+ },
835
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
836
+ "version": "4.55.1",
837
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz",
838
+ "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==",
839
+ "cpu": [
840
+ "ia32"
841
+ ],
842
+ "dev": true,
843
+ "license": "MIT",
844
+ "optional": true,
845
+ "os": [
846
+ "win32"
847
+ ]
848
+ },
849
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
850
+ "version": "4.55.1",
851
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz",
852
+ "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==",
853
+ "cpu": [
854
+ "x64"
855
+ ],
856
+ "dev": true,
857
+ "license": "MIT",
858
+ "optional": true,
859
+ "os": [
860
+ "win32"
861
+ ]
862
+ },
863
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
864
+ "version": "4.55.1",
865
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz",
866
+ "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==",
867
+ "cpu": [
868
+ "x64"
869
+ ],
870
+ "dev": true,
871
+ "license": "MIT",
872
+ "optional": true,
873
+ "os": [
874
+ "win32"
875
+ ]
876
+ },
877
+ "node_modules/@standard-schema/spec": {
878
+ "version": "1.1.0",
879
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
880
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
881
+ "dev": true,
882
+ "license": "MIT"
883
+ },
884
+ "node_modules/@types/chai": {
885
+ "version": "5.2.3",
886
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
887
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
888
+ "dev": true,
889
+ "license": "MIT",
890
+ "dependencies": {
891
+ "@types/deep-eql": "*",
892
+ "assertion-error": "^2.0.1"
893
+ }
894
+ },
895
+ "node_modules/@types/deep-eql": {
896
+ "version": "4.0.2",
897
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
898
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
899
+ "dev": true,
900
+ "license": "MIT"
901
+ },
902
+ "node_modules/@types/estree": {
903
+ "version": "1.0.8",
904
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
905
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
906
+ "dev": true,
907
+ "license": "MIT"
908
+ },
909
+ "node_modules/@types/inquirer": {
910
+ "version": "9.0.9",
911
+ "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz",
912
+ "integrity": "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==",
913
+ "dev": true,
914
+ "license": "MIT",
915
+ "dependencies": {
916
+ "@types/through": "*",
917
+ "rxjs": "^7.2.0"
918
+ }
919
+ },
920
+ "node_modules/@types/node": {
921
+ "version": "20.19.30",
922
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz",
923
+ "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==",
924
+ "devOptional": true,
925
+ "license": "MIT",
926
+ "peer": true,
927
+ "dependencies": {
928
+ "undici-types": "~6.21.0"
929
+ }
930
+ },
931
+ "node_modules/@types/through": {
932
+ "version": "0.0.33",
933
+ "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz",
934
+ "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==",
935
+ "dev": true,
936
+ "license": "MIT",
937
+ "dependencies": {
938
+ "@types/node": "*"
939
+ }
940
+ },
941
+ "node_modules/@vitest/expect": {
942
+ "version": "4.0.17",
943
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz",
944
+ "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==",
945
+ "dev": true,
946
+ "license": "MIT",
947
+ "dependencies": {
948
+ "@standard-schema/spec": "^1.0.0",
949
+ "@types/chai": "^5.2.2",
950
+ "@vitest/spy": "4.0.17",
951
+ "@vitest/utils": "4.0.17",
952
+ "chai": "^6.2.1",
953
+ "tinyrainbow": "^3.0.3"
954
+ },
955
+ "funding": {
956
+ "url": "https://opencollective.com/vitest"
957
+ }
958
+ },
959
+ "node_modules/@vitest/mocker": {
960
+ "version": "4.0.17",
961
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz",
962
+ "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==",
963
+ "dev": true,
964
+ "license": "MIT",
965
+ "dependencies": {
966
+ "@vitest/spy": "4.0.17",
967
+ "estree-walker": "^3.0.3",
968
+ "magic-string": "^0.30.21"
969
+ },
970
+ "funding": {
971
+ "url": "https://opencollective.com/vitest"
972
+ },
973
+ "peerDependencies": {
974
+ "msw": "^2.4.9",
975
+ "vite": "^6.0.0 || ^7.0.0-0"
976
+ },
977
+ "peerDependenciesMeta": {
978
+ "msw": {
979
+ "optional": true
980
+ },
981
+ "vite": {
982
+ "optional": true
983
+ }
984
+ }
985
+ },
986
+ "node_modules/@vitest/pretty-format": {
987
+ "version": "4.0.17",
988
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz",
989
+ "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==",
990
+ "dev": true,
991
+ "license": "MIT",
992
+ "dependencies": {
993
+ "tinyrainbow": "^3.0.3"
994
+ },
995
+ "funding": {
996
+ "url": "https://opencollective.com/vitest"
997
+ }
998
+ },
999
+ "node_modules/@vitest/runner": {
1000
+ "version": "4.0.17",
1001
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz",
1002
+ "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==",
1003
+ "dev": true,
1004
+ "license": "MIT",
1005
+ "dependencies": {
1006
+ "@vitest/utils": "4.0.17",
1007
+ "pathe": "^2.0.3"
1008
+ },
1009
+ "funding": {
1010
+ "url": "https://opencollective.com/vitest"
1011
+ }
1012
+ },
1013
+ "node_modules/@vitest/snapshot": {
1014
+ "version": "4.0.17",
1015
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz",
1016
+ "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==",
1017
+ "dev": true,
1018
+ "license": "MIT",
1019
+ "dependencies": {
1020
+ "@vitest/pretty-format": "4.0.17",
1021
+ "magic-string": "^0.30.21",
1022
+ "pathe": "^2.0.3"
1023
+ },
1024
+ "funding": {
1025
+ "url": "https://opencollective.com/vitest"
1026
+ }
1027
+ },
1028
+ "node_modules/@vitest/spy": {
1029
+ "version": "4.0.17",
1030
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz",
1031
+ "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==",
1032
+ "dev": true,
1033
+ "license": "MIT",
1034
+ "funding": {
1035
+ "url": "https://opencollective.com/vitest"
1036
+ }
1037
+ },
1038
+ "node_modules/@vitest/utils": {
1039
+ "version": "4.0.17",
1040
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz",
1041
+ "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==",
1042
+ "dev": true,
1043
+ "license": "MIT",
1044
+ "dependencies": {
1045
+ "@vitest/pretty-format": "4.0.17",
1046
+ "tinyrainbow": "^3.0.3"
1047
+ },
1048
+ "funding": {
1049
+ "url": "https://opencollective.com/vitest"
1050
+ }
1051
+ },
1052
+ "node_modules/ajv": {
1053
+ "version": "8.17.1",
1054
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
1055
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
1056
+ "license": "MIT",
1057
+ "dependencies": {
1058
+ "fast-deep-equal": "^3.1.3",
1059
+ "fast-uri": "^3.0.1",
1060
+ "json-schema-traverse": "^1.0.0",
1061
+ "require-from-string": "^2.0.2"
1062
+ },
1063
+ "funding": {
1064
+ "type": "github",
1065
+ "url": "https://github.com/sponsors/epoberezkin"
1066
+ }
1067
+ },
1068
+ "node_modules/ajv-formats": {
1069
+ "version": "2.1.1",
1070
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
1071
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
1072
+ "license": "MIT",
1073
+ "dependencies": {
1074
+ "ajv": "^8.0.0"
1075
+ },
1076
+ "peerDependencies": {
1077
+ "ajv": "^8.0.0"
1078
+ },
1079
+ "peerDependenciesMeta": {
1080
+ "ajv": {
1081
+ "optional": true
1082
+ }
1083
+ }
1084
+ },
1085
+ "node_modules/ansi-escapes": {
1086
+ "version": "4.3.2",
1087
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
1088
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
1089
+ "license": "MIT",
1090
+ "dependencies": {
1091
+ "type-fest": "^0.21.3"
1092
+ },
1093
+ "engines": {
1094
+ "node": ">=8"
1095
+ },
1096
+ "funding": {
1097
+ "url": "https://github.com/sponsors/sindresorhus"
1098
+ }
1099
+ },
1100
+ "node_modules/ansi-escapes/node_modules/type-fest": {
1101
+ "version": "0.21.3",
1102
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
1103
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
1104
+ "license": "(MIT OR CC0-1.0)",
1105
+ "engines": {
1106
+ "node": ">=10"
1107
+ },
1108
+ "funding": {
1109
+ "url": "https://github.com/sponsors/sindresorhus"
1110
+ }
1111
+ },
1112
+ "node_modules/ansi-regex": {
1113
+ "version": "5.0.1",
1114
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1115
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1116
+ "license": "MIT",
1117
+ "engines": {
1118
+ "node": ">=8"
1119
+ }
1120
+ },
1121
+ "node_modules/ansi-styles": {
1122
+ "version": "4.3.0",
1123
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1124
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1125
+ "license": "MIT",
1126
+ "dependencies": {
1127
+ "color-convert": "^2.0.1"
1128
+ },
1129
+ "engines": {
1130
+ "node": ">=8"
1131
+ },
1132
+ "funding": {
1133
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1134
+ }
1135
+ },
1136
+ "node_modules/assertion-error": {
1137
+ "version": "2.0.1",
1138
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
1139
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
1140
+ "dev": true,
1141
+ "license": "MIT",
1142
+ "engines": {
1143
+ "node": ">=12"
1144
+ }
1145
+ },
1146
+ "node_modules/atomically": {
1147
+ "version": "2.1.0",
1148
+ "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.1.0.tgz",
1149
+ "integrity": "sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==",
1150
+ "license": "MIT",
1151
+ "dependencies": {
1152
+ "stubborn-fs": "^2.0.0",
1153
+ "when-exit": "^2.1.4"
1154
+ }
1155
+ },
1156
+ "node_modules/base64-js": {
1157
+ "version": "1.5.1",
1158
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
1159
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
1160
+ "funding": [
1161
+ {
1162
+ "type": "github",
1163
+ "url": "https://github.com/sponsors/feross"
1164
+ },
1165
+ {
1166
+ "type": "patreon",
1167
+ "url": "https://www.patreon.com/feross"
1168
+ },
1169
+ {
1170
+ "type": "consulting",
1171
+ "url": "https://feross.org/support"
1172
+ }
1173
+ ],
1174
+ "license": "MIT"
1175
+ },
1176
+ "node_modules/bl": {
1177
+ "version": "4.1.0",
1178
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
1179
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
1180
+ "license": "MIT",
1181
+ "dependencies": {
1182
+ "buffer": "^5.5.0",
1183
+ "inherits": "^2.0.4",
1184
+ "readable-stream": "^3.4.0"
1185
+ }
1186
+ },
1187
+ "node_modules/buffer": {
1188
+ "version": "5.7.1",
1189
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
1190
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
1191
+ "funding": [
1192
+ {
1193
+ "type": "github",
1194
+ "url": "https://github.com/sponsors/feross"
1195
+ },
1196
+ {
1197
+ "type": "patreon",
1198
+ "url": "https://www.patreon.com/feross"
1199
+ },
1200
+ {
1201
+ "type": "consulting",
1202
+ "url": "https://feross.org/support"
1203
+ }
1204
+ ],
1205
+ "license": "MIT",
1206
+ "dependencies": {
1207
+ "base64-js": "^1.3.1",
1208
+ "ieee754": "^1.1.13"
1209
+ }
1210
+ },
1211
+ "node_modules/chai": {
1212
+ "version": "6.2.2",
1213
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
1214
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
1215
+ "dev": true,
1216
+ "license": "MIT",
1217
+ "engines": {
1218
+ "node": ">=18"
1219
+ }
1220
+ },
1221
+ "node_modules/chalk": {
1222
+ "version": "5.6.2",
1223
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
1224
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
1225
+ "license": "MIT",
1226
+ "engines": {
1227
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
1228
+ },
1229
+ "funding": {
1230
+ "url": "https://github.com/chalk/chalk?sponsor=1"
1231
+ }
1232
+ },
1233
+ "node_modules/chardet": {
1234
+ "version": "2.1.1",
1235
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
1236
+ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
1237
+ "license": "MIT"
1238
+ },
1239
+ "node_modules/cli-cursor": {
1240
+ "version": "5.0.0",
1241
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
1242
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
1243
+ "license": "MIT",
1244
+ "dependencies": {
1245
+ "restore-cursor": "^5.0.0"
1246
+ },
1247
+ "engines": {
1248
+ "node": ">=18"
1249
+ },
1250
+ "funding": {
1251
+ "url": "https://github.com/sponsors/sindresorhus"
1252
+ }
1253
+ },
1254
+ "node_modules/cli-spinners": {
1255
+ "version": "2.9.2",
1256
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
1257
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
1258
+ "license": "MIT",
1259
+ "engines": {
1260
+ "node": ">=6"
1261
+ },
1262
+ "funding": {
1263
+ "url": "https://github.com/sponsors/sindresorhus"
1264
+ }
1265
+ },
1266
+ "node_modules/cli-width": {
1267
+ "version": "4.1.0",
1268
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
1269
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
1270
+ "license": "ISC",
1271
+ "engines": {
1272
+ "node": ">= 12"
1273
+ }
1274
+ },
1275
+ "node_modules/clone": {
1276
+ "version": "1.0.4",
1277
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
1278
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
1279
+ "license": "MIT",
1280
+ "engines": {
1281
+ "node": ">=0.8"
1282
+ }
1283
+ },
1284
+ "node_modules/color-convert": {
1285
+ "version": "2.0.1",
1286
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1287
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1288
+ "license": "MIT",
1289
+ "dependencies": {
1290
+ "color-name": "~1.1.4"
1291
+ },
1292
+ "engines": {
1293
+ "node": ">=7.0.0"
1294
+ }
1295
+ },
1296
+ "node_modules/color-name": {
1297
+ "version": "1.1.4",
1298
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1299
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1300
+ "license": "MIT"
1301
+ },
1302
+ "node_modules/commander": {
1303
+ "version": "12.1.0",
1304
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
1305
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
1306
+ "license": "MIT",
1307
+ "engines": {
1308
+ "node": ">=18"
1309
+ }
1310
+ },
1311
+ "node_modules/conf": {
1312
+ "version": "12.0.0",
1313
+ "resolved": "https://registry.npmjs.org/conf/-/conf-12.0.0.tgz",
1314
+ "integrity": "sha512-fIWyWUXrJ45cHCIQX+Ck1hrZDIf/9DR0P0Zewn3uNht28hbt5OfGUq8rRWsxi96pZWPyBEd0eY9ama01JTaknA==",
1315
+ "license": "MIT",
1316
+ "dependencies": {
1317
+ "ajv": "^8.12.0",
1318
+ "ajv-formats": "^2.1.1",
1319
+ "atomically": "^2.0.2",
1320
+ "debounce-fn": "^5.1.2",
1321
+ "dot-prop": "^8.0.2",
1322
+ "env-paths": "^3.0.0",
1323
+ "json-schema-typed": "^8.0.1",
1324
+ "semver": "^7.5.4",
1325
+ "uint8array-extras": "^0.3.0"
1326
+ },
1327
+ "engines": {
1328
+ "node": ">=18"
1329
+ },
1330
+ "funding": {
1331
+ "url": "https://github.com/sponsors/sindresorhus"
1332
+ }
1333
+ },
1334
+ "node_modules/debounce-fn": {
1335
+ "version": "5.1.2",
1336
+ "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-5.1.2.tgz",
1337
+ "integrity": "sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==",
1338
+ "license": "MIT",
1339
+ "dependencies": {
1340
+ "mimic-fn": "^4.0.0"
1341
+ },
1342
+ "engines": {
1343
+ "node": ">=12"
1344
+ },
1345
+ "funding": {
1346
+ "url": "https://github.com/sponsors/sindresorhus"
1347
+ }
1348
+ },
1349
+ "node_modules/debug": {
1350
+ "version": "4.4.3",
1351
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1352
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1353
+ "license": "MIT",
1354
+ "dependencies": {
1355
+ "ms": "^2.1.3"
1356
+ },
1357
+ "engines": {
1358
+ "node": ">=6.0"
1359
+ },
1360
+ "peerDependenciesMeta": {
1361
+ "supports-color": {
1362
+ "optional": true
1363
+ }
1364
+ }
1365
+ },
1366
+ "node_modules/defaults": {
1367
+ "version": "1.0.4",
1368
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
1369
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
1370
+ "license": "MIT",
1371
+ "dependencies": {
1372
+ "clone": "^1.0.2"
1373
+ },
1374
+ "funding": {
1375
+ "url": "https://github.com/sponsors/sindresorhus"
1376
+ }
1377
+ },
1378
+ "node_modules/dot-prop": {
1379
+ "version": "8.0.2",
1380
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-8.0.2.tgz",
1381
+ "integrity": "sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==",
1382
+ "license": "MIT",
1383
+ "dependencies": {
1384
+ "type-fest": "^3.8.0"
1385
+ },
1386
+ "engines": {
1387
+ "node": ">=16"
1388
+ },
1389
+ "funding": {
1390
+ "url": "https://github.com/sponsors/sindresorhus"
1391
+ }
1392
+ },
1393
+ "node_modules/emoji-regex": {
1394
+ "version": "8.0.0",
1395
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1396
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1397
+ "license": "MIT"
1398
+ },
1399
+ "node_modules/env-paths": {
1400
+ "version": "3.0.0",
1401
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
1402
+ "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
1403
+ "license": "MIT",
1404
+ "engines": {
1405
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1406
+ },
1407
+ "funding": {
1408
+ "url": "https://github.com/sponsors/sindresorhus"
1409
+ }
1410
+ },
1411
+ "node_modules/es-module-lexer": {
1412
+ "version": "1.7.0",
1413
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
1414
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
1415
+ "dev": true,
1416
+ "license": "MIT"
1417
+ },
1418
+ "node_modules/esbuild": {
1419
+ "version": "0.27.2",
1420
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
1421
+ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
1422
+ "dev": true,
1423
+ "hasInstallScript": true,
1424
+ "license": "MIT",
1425
+ "bin": {
1426
+ "esbuild": "bin/esbuild"
1427
+ },
1428
+ "engines": {
1429
+ "node": ">=18"
1430
+ },
1431
+ "optionalDependencies": {
1432
+ "@esbuild/aix-ppc64": "0.27.2",
1433
+ "@esbuild/android-arm": "0.27.2",
1434
+ "@esbuild/android-arm64": "0.27.2",
1435
+ "@esbuild/android-x64": "0.27.2",
1436
+ "@esbuild/darwin-arm64": "0.27.2",
1437
+ "@esbuild/darwin-x64": "0.27.2",
1438
+ "@esbuild/freebsd-arm64": "0.27.2",
1439
+ "@esbuild/freebsd-x64": "0.27.2",
1440
+ "@esbuild/linux-arm": "0.27.2",
1441
+ "@esbuild/linux-arm64": "0.27.2",
1442
+ "@esbuild/linux-ia32": "0.27.2",
1443
+ "@esbuild/linux-loong64": "0.27.2",
1444
+ "@esbuild/linux-mips64el": "0.27.2",
1445
+ "@esbuild/linux-ppc64": "0.27.2",
1446
+ "@esbuild/linux-riscv64": "0.27.2",
1447
+ "@esbuild/linux-s390x": "0.27.2",
1448
+ "@esbuild/linux-x64": "0.27.2",
1449
+ "@esbuild/netbsd-arm64": "0.27.2",
1450
+ "@esbuild/netbsd-x64": "0.27.2",
1451
+ "@esbuild/openbsd-arm64": "0.27.2",
1452
+ "@esbuild/openbsd-x64": "0.27.2",
1453
+ "@esbuild/openharmony-arm64": "0.27.2",
1454
+ "@esbuild/sunos-x64": "0.27.2",
1455
+ "@esbuild/win32-arm64": "0.27.2",
1456
+ "@esbuild/win32-ia32": "0.27.2",
1457
+ "@esbuild/win32-x64": "0.27.2"
1458
+ }
1459
+ },
1460
+ "node_modules/estree-walker": {
1461
+ "version": "3.0.3",
1462
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
1463
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
1464
+ "dev": true,
1465
+ "license": "MIT",
1466
+ "dependencies": {
1467
+ "@types/estree": "^1.0.0"
1468
+ }
1469
+ },
1470
+ "node_modules/expect-type": {
1471
+ "version": "1.3.0",
1472
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
1473
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
1474
+ "dev": true,
1475
+ "license": "Apache-2.0",
1476
+ "engines": {
1477
+ "node": ">=12.0.0"
1478
+ }
1479
+ },
1480
+ "node_modules/fast-deep-equal": {
1481
+ "version": "3.1.3",
1482
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1483
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1484
+ "license": "MIT"
1485
+ },
1486
+ "node_modules/fast-uri": {
1487
+ "version": "3.1.0",
1488
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
1489
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
1490
+ "funding": [
1491
+ {
1492
+ "type": "github",
1493
+ "url": "https://github.com/sponsors/fastify"
1494
+ },
1495
+ {
1496
+ "type": "opencollective",
1497
+ "url": "https://opencollective.com/fastify"
1498
+ }
1499
+ ],
1500
+ "license": "BSD-3-Clause"
1501
+ },
1502
+ "node_modules/fdir": {
1503
+ "version": "6.5.0",
1504
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1505
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1506
+ "dev": true,
1507
+ "license": "MIT",
1508
+ "engines": {
1509
+ "node": ">=12.0.0"
1510
+ },
1511
+ "peerDependencies": {
1512
+ "picomatch": "^3 || ^4"
1513
+ },
1514
+ "peerDependenciesMeta": {
1515
+ "picomatch": {
1516
+ "optional": true
1517
+ }
1518
+ }
1519
+ },
1520
+ "node_modules/fsevents": {
1521
+ "version": "2.3.3",
1522
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1523
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1524
+ "dev": true,
1525
+ "hasInstallScript": true,
1526
+ "license": "MIT",
1527
+ "optional": true,
1528
+ "os": [
1529
+ "darwin"
1530
+ ],
1531
+ "engines": {
1532
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1533
+ }
1534
+ },
1535
+ "node_modules/get-east-asian-width": {
1536
+ "version": "1.4.0",
1537
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
1538
+ "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==",
1539
+ "license": "MIT",
1540
+ "engines": {
1541
+ "node": ">=18"
1542
+ },
1543
+ "funding": {
1544
+ "url": "https://github.com/sponsors/sindresorhus"
1545
+ }
1546
+ },
1547
+ "node_modules/get-tsconfig": {
1548
+ "version": "4.13.0",
1549
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
1550
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
1551
+ "dev": true,
1552
+ "license": "MIT",
1553
+ "dependencies": {
1554
+ "resolve-pkg-maps": "^1.0.0"
1555
+ },
1556
+ "funding": {
1557
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
1558
+ }
1559
+ },
1560
+ "node_modules/has-flag": {
1561
+ "version": "4.0.0",
1562
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1563
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1564
+ "license": "MIT",
1565
+ "engines": {
1566
+ "node": ">=8"
1567
+ }
1568
+ },
1569
+ "node_modules/iconv-lite": {
1570
+ "version": "0.7.2",
1571
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
1572
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
1573
+ "license": "MIT",
1574
+ "dependencies": {
1575
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
1576
+ },
1577
+ "engines": {
1578
+ "node": ">=0.10.0"
1579
+ },
1580
+ "funding": {
1581
+ "type": "opencollective",
1582
+ "url": "https://opencollective.com/express"
1583
+ }
1584
+ },
1585
+ "node_modules/ieee754": {
1586
+ "version": "1.2.1",
1587
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1588
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
1589
+ "funding": [
1590
+ {
1591
+ "type": "github",
1592
+ "url": "https://github.com/sponsors/feross"
1593
+ },
1594
+ {
1595
+ "type": "patreon",
1596
+ "url": "https://www.patreon.com/feross"
1597
+ },
1598
+ {
1599
+ "type": "consulting",
1600
+ "url": "https://feross.org/support"
1601
+ }
1602
+ ],
1603
+ "license": "BSD-3-Clause"
1604
+ },
1605
+ "node_modules/inherits": {
1606
+ "version": "2.0.4",
1607
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1608
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1609
+ "license": "ISC"
1610
+ },
1611
+ "node_modules/inquirer": {
1612
+ "version": "9.3.8",
1613
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz",
1614
+ "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==",
1615
+ "license": "MIT",
1616
+ "dependencies": {
1617
+ "@inquirer/external-editor": "^1.0.2",
1618
+ "@inquirer/figures": "^1.0.3",
1619
+ "ansi-escapes": "^4.3.2",
1620
+ "cli-width": "^4.1.0",
1621
+ "mute-stream": "1.0.0",
1622
+ "ora": "^5.4.1",
1623
+ "run-async": "^3.0.0",
1624
+ "rxjs": "^7.8.1",
1625
+ "string-width": "^4.2.3",
1626
+ "strip-ansi": "^6.0.1",
1627
+ "wrap-ansi": "^6.2.0",
1628
+ "yoctocolors-cjs": "^2.1.2"
1629
+ },
1630
+ "engines": {
1631
+ "node": ">=18"
1632
+ }
1633
+ },
1634
+ "node_modules/inquirer/node_modules/chalk": {
1635
+ "version": "4.1.2",
1636
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1637
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1638
+ "license": "MIT",
1639
+ "dependencies": {
1640
+ "ansi-styles": "^4.1.0",
1641
+ "supports-color": "^7.1.0"
1642
+ },
1643
+ "engines": {
1644
+ "node": ">=10"
1645
+ },
1646
+ "funding": {
1647
+ "url": "https://github.com/chalk/chalk?sponsor=1"
1648
+ }
1649
+ },
1650
+ "node_modules/inquirer/node_modules/cli-cursor": {
1651
+ "version": "3.1.0",
1652
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
1653
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
1654
+ "license": "MIT",
1655
+ "dependencies": {
1656
+ "restore-cursor": "^3.1.0"
1657
+ },
1658
+ "engines": {
1659
+ "node": ">=8"
1660
+ }
1661
+ },
1662
+ "node_modules/inquirer/node_modules/is-interactive": {
1663
+ "version": "1.0.0",
1664
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
1665
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
1666
+ "license": "MIT",
1667
+ "engines": {
1668
+ "node": ">=8"
1669
+ }
1670
+ },
1671
+ "node_modules/inquirer/node_modules/is-unicode-supported": {
1672
+ "version": "0.1.0",
1673
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
1674
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
1675
+ "license": "MIT",
1676
+ "engines": {
1677
+ "node": ">=10"
1678
+ },
1679
+ "funding": {
1680
+ "url": "https://github.com/sponsors/sindresorhus"
1681
+ }
1682
+ },
1683
+ "node_modules/inquirer/node_modules/log-symbols": {
1684
+ "version": "4.1.0",
1685
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
1686
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
1687
+ "license": "MIT",
1688
+ "dependencies": {
1689
+ "chalk": "^4.1.0",
1690
+ "is-unicode-supported": "^0.1.0"
1691
+ },
1692
+ "engines": {
1693
+ "node": ">=10"
1694
+ },
1695
+ "funding": {
1696
+ "url": "https://github.com/sponsors/sindresorhus"
1697
+ }
1698
+ },
1699
+ "node_modules/inquirer/node_modules/mimic-fn": {
1700
+ "version": "2.1.0",
1701
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1702
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1703
+ "license": "MIT",
1704
+ "engines": {
1705
+ "node": ">=6"
1706
+ }
1707
+ },
1708
+ "node_modules/inquirer/node_modules/onetime": {
1709
+ "version": "5.1.2",
1710
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1711
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1712
+ "license": "MIT",
1713
+ "dependencies": {
1714
+ "mimic-fn": "^2.1.0"
1715
+ },
1716
+ "engines": {
1717
+ "node": ">=6"
1718
+ },
1719
+ "funding": {
1720
+ "url": "https://github.com/sponsors/sindresorhus"
1721
+ }
1722
+ },
1723
+ "node_modules/inquirer/node_modules/ora": {
1724
+ "version": "5.4.1",
1725
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
1726
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
1727
+ "license": "MIT",
1728
+ "dependencies": {
1729
+ "bl": "^4.1.0",
1730
+ "chalk": "^4.1.0",
1731
+ "cli-cursor": "^3.1.0",
1732
+ "cli-spinners": "^2.5.0",
1733
+ "is-interactive": "^1.0.0",
1734
+ "is-unicode-supported": "^0.1.0",
1735
+ "log-symbols": "^4.1.0",
1736
+ "strip-ansi": "^6.0.0",
1737
+ "wcwidth": "^1.0.1"
1738
+ },
1739
+ "engines": {
1740
+ "node": ">=10"
1741
+ },
1742
+ "funding": {
1743
+ "url": "https://github.com/sponsors/sindresorhus"
1744
+ }
1745
+ },
1746
+ "node_modules/inquirer/node_modules/restore-cursor": {
1747
+ "version": "3.1.0",
1748
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
1749
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
1750
+ "license": "MIT",
1751
+ "dependencies": {
1752
+ "onetime": "^5.1.0",
1753
+ "signal-exit": "^3.0.2"
1754
+ },
1755
+ "engines": {
1756
+ "node": ">=8"
1757
+ }
1758
+ },
1759
+ "node_modules/inquirer/node_modules/signal-exit": {
1760
+ "version": "3.0.7",
1761
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1762
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
1763
+ "license": "ISC"
1764
+ },
1765
+ "node_modules/is-fullwidth-code-point": {
1766
+ "version": "3.0.0",
1767
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1768
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1769
+ "license": "MIT",
1770
+ "engines": {
1771
+ "node": ">=8"
1772
+ }
1773
+ },
1774
+ "node_modules/is-interactive": {
1775
+ "version": "2.0.0",
1776
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
1777
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
1778
+ "license": "MIT",
1779
+ "engines": {
1780
+ "node": ">=12"
1781
+ },
1782
+ "funding": {
1783
+ "url": "https://github.com/sponsors/sindresorhus"
1784
+ }
1785
+ },
1786
+ "node_modules/is-unicode-supported": {
1787
+ "version": "2.1.0",
1788
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
1789
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
1790
+ "license": "MIT",
1791
+ "engines": {
1792
+ "node": ">=18"
1793
+ },
1794
+ "funding": {
1795
+ "url": "https://github.com/sponsors/sindresorhus"
1796
+ }
1797
+ },
1798
+ "node_modules/json-schema-traverse": {
1799
+ "version": "1.0.0",
1800
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1801
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
1802
+ "license": "MIT"
1803
+ },
1804
+ "node_modules/json-schema-typed": {
1805
+ "version": "8.0.2",
1806
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
1807
+ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
1808
+ "license": "BSD-2-Clause"
1809
+ },
1810
+ "node_modules/log-symbols": {
1811
+ "version": "6.0.0",
1812
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
1813
+ "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
1814
+ "license": "MIT",
1815
+ "dependencies": {
1816
+ "chalk": "^5.3.0",
1817
+ "is-unicode-supported": "^1.3.0"
1818
+ },
1819
+ "engines": {
1820
+ "node": ">=18"
1821
+ },
1822
+ "funding": {
1823
+ "url": "https://github.com/sponsors/sindresorhus"
1824
+ }
1825
+ },
1826
+ "node_modules/log-symbols/node_modules/is-unicode-supported": {
1827
+ "version": "1.3.0",
1828
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
1829
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
1830
+ "license": "MIT",
1831
+ "engines": {
1832
+ "node": ">=12"
1833
+ },
1834
+ "funding": {
1835
+ "url": "https://github.com/sponsors/sindresorhus"
1836
+ }
1837
+ },
1838
+ "node_modules/magic-string": {
1839
+ "version": "0.30.21",
1840
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
1841
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
1842
+ "dev": true,
1843
+ "license": "MIT",
1844
+ "dependencies": {
1845
+ "@jridgewell/sourcemap-codec": "^1.5.5"
1846
+ }
1847
+ },
1848
+ "node_modules/mimic-fn": {
1849
+ "version": "4.0.0",
1850
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
1851
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
1852
+ "license": "MIT",
1853
+ "engines": {
1854
+ "node": ">=12"
1855
+ },
1856
+ "funding": {
1857
+ "url": "https://github.com/sponsors/sindresorhus"
1858
+ }
1859
+ },
1860
+ "node_modules/mimic-function": {
1861
+ "version": "5.0.1",
1862
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
1863
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
1864
+ "license": "MIT",
1865
+ "engines": {
1866
+ "node": ">=18"
1867
+ },
1868
+ "funding": {
1869
+ "url": "https://github.com/sponsors/sindresorhus"
1870
+ }
1871
+ },
1872
+ "node_modules/ms": {
1873
+ "version": "2.1.3",
1874
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1875
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1876
+ "license": "MIT"
1877
+ },
1878
+ "node_modules/mute-stream": {
1879
+ "version": "1.0.0",
1880
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
1881
+ "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
1882
+ "license": "ISC",
1883
+ "engines": {
1884
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
1885
+ }
1886
+ },
1887
+ "node_modules/nanoid": {
1888
+ "version": "3.3.11",
1889
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1890
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1891
+ "dev": true,
1892
+ "funding": [
1893
+ {
1894
+ "type": "github",
1895
+ "url": "https://github.com/sponsors/ai"
1896
+ }
1897
+ ],
1898
+ "license": "MIT",
1899
+ "bin": {
1900
+ "nanoid": "bin/nanoid.cjs"
1901
+ },
1902
+ "engines": {
1903
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1904
+ }
1905
+ },
1906
+ "node_modules/obug": {
1907
+ "version": "2.1.1",
1908
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
1909
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
1910
+ "dev": true,
1911
+ "funding": [
1912
+ "https://github.com/sponsors/sxzz",
1913
+ "https://opencollective.com/debug"
1914
+ ],
1915
+ "license": "MIT"
1916
+ },
1917
+ "node_modules/onetime": {
1918
+ "version": "7.0.0",
1919
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
1920
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
1921
+ "license": "MIT",
1922
+ "dependencies": {
1923
+ "mimic-function": "^5.0.0"
1924
+ },
1925
+ "engines": {
1926
+ "node": ">=18"
1927
+ },
1928
+ "funding": {
1929
+ "url": "https://github.com/sponsors/sindresorhus"
1930
+ }
1931
+ },
1932
+ "node_modules/ora": {
1933
+ "version": "8.2.0",
1934
+ "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz",
1935
+ "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
1936
+ "license": "MIT",
1937
+ "dependencies": {
1938
+ "chalk": "^5.3.0",
1939
+ "cli-cursor": "^5.0.0",
1940
+ "cli-spinners": "^2.9.2",
1941
+ "is-interactive": "^2.0.0",
1942
+ "is-unicode-supported": "^2.0.0",
1943
+ "log-symbols": "^6.0.0",
1944
+ "stdin-discarder": "^0.2.2",
1945
+ "string-width": "^7.2.0",
1946
+ "strip-ansi": "^7.1.0"
1947
+ },
1948
+ "engines": {
1949
+ "node": ">=18"
1950
+ },
1951
+ "funding": {
1952
+ "url": "https://github.com/sponsors/sindresorhus"
1953
+ }
1954
+ },
1955
+ "node_modules/ora/node_modules/ansi-regex": {
1956
+ "version": "6.2.2",
1957
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
1958
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
1959
+ "license": "MIT",
1960
+ "engines": {
1961
+ "node": ">=12"
1962
+ },
1963
+ "funding": {
1964
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1965
+ }
1966
+ },
1967
+ "node_modules/ora/node_modules/emoji-regex": {
1968
+ "version": "10.6.0",
1969
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
1970
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
1971
+ "license": "MIT"
1972
+ },
1973
+ "node_modules/ora/node_modules/string-width": {
1974
+ "version": "7.2.0",
1975
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
1976
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
1977
+ "license": "MIT",
1978
+ "dependencies": {
1979
+ "emoji-regex": "^10.3.0",
1980
+ "get-east-asian-width": "^1.0.0",
1981
+ "strip-ansi": "^7.1.0"
1982
+ },
1983
+ "engines": {
1984
+ "node": ">=18"
1985
+ },
1986
+ "funding": {
1987
+ "url": "https://github.com/sponsors/sindresorhus"
1988
+ }
1989
+ },
1990
+ "node_modules/ora/node_modules/strip-ansi": {
1991
+ "version": "7.1.2",
1992
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
1993
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
1994
+ "license": "MIT",
1995
+ "dependencies": {
1996
+ "ansi-regex": "^6.0.1"
1997
+ },
1998
+ "engines": {
1999
+ "node": ">=12"
2000
+ },
2001
+ "funding": {
2002
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2003
+ }
2004
+ },
2005
+ "node_modules/pathe": {
2006
+ "version": "2.0.3",
2007
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
2008
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
2009
+ "dev": true,
2010
+ "license": "MIT"
2011
+ },
2012
+ "node_modules/picocolors": {
2013
+ "version": "1.1.1",
2014
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2015
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2016
+ "dev": true,
2017
+ "license": "ISC"
2018
+ },
2019
+ "node_modules/picomatch": {
2020
+ "version": "4.0.3",
2021
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2022
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2023
+ "dev": true,
2024
+ "license": "MIT",
2025
+ "peer": true,
2026
+ "engines": {
2027
+ "node": ">=12"
2028
+ },
2029
+ "funding": {
2030
+ "url": "https://github.com/sponsors/jonschlinkert"
2031
+ }
2032
+ },
2033
+ "node_modules/postcss": {
2034
+ "version": "8.5.6",
2035
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
2036
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
2037
+ "dev": true,
2038
+ "funding": [
2039
+ {
2040
+ "type": "opencollective",
2041
+ "url": "https://opencollective.com/postcss/"
2042
+ },
2043
+ {
2044
+ "type": "tidelift",
2045
+ "url": "https://tidelift.com/funding/github/npm/postcss"
2046
+ },
2047
+ {
2048
+ "type": "github",
2049
+ "url": "https://github.com/sponsors/ai"
2050
+ }
2051
+ ],
2052
+ "license": "MIT",
2053
+ "dependencies": {
2054
+ "nanoid": "^3.3.11",
2055
+ "picocolors": "^1.1.1",
2056
+ "source-map-js": "^1.2.1"
2057
+ },
2058
+ "engines": {
2059
+ "node": "^10 || ^12 || >=14"
2060
+ }
2061
+ },
2062
+ "node_modules/readable-stream": {
2063
+ "version": "3.6.2",
2064
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
2065
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
2066
+ "license": "MIT",
2067
+ "dependencies": {
2068
+ "inherits": "^2.0.3",
2069
+ "string_decoder": "^1.1.1",
2070
+ "util-deprecate": "^1.0.1"
2071
+ },
2072
+ "engines": {
2073
+ "node": ">= 6"
2074
+ }
2075
+ },
2076
+ "node_modules/require-from-string": {
2077
+ "version": "2.0.2",
2078
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
2079
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
2080
+ "license": "MIT",
2081
+ "engines": {
2082
+ "node": ">=0.10.0"
2083
+ }
2084
+ },
2085
+ "node_modules/resolve-pkg-maps": {
2086
+ "version": "1.0.0",
2087
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
2088
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
2089
+ "dev": true,
2090
+ "license": "MIT",
2091
+ "funding": {
2092
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
2093
+ }
2094
+ },
2095
+ "node_modules/restore-cursor": {
2096
+ "version": "5.1.0",
2097
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
2098
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
2099
+ "license": "MIT",
2100
+ "dependencies": {
2101
+ "onetime": "^7.0.0",
2102
+ "signal-exit": "^4.1.0"
2103
+ },
2104
+ "engines": {
2105
+ "node": ">=18"
2106
+ },
2107
+ "funding": {
2108
+ "url": "https://github.com/sponsors/sindresorhus"
2109
+ }
2110
+ },
2111
+ "node_modules/rollup": {
2112
+ "version": "4.55.1",
2113
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
2114
+ "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==",
2115
+ "dev": true,
2116
+ "license": "MIT",
2117
+ "dependencies": {
2118
+ "@types/estree": "1.0.8"
2119
+ },
2120
+ "bin": {
2121
+ "rollup": "dist/bin/rollup"
2122
+ },
2123
+ "engines": {
2124
+ "node": ">=18.0.0",
2125
+ "npm": ">=8.0.0"
2126
+ },
2127
+ "optionalDependencies": {
2128
+ "@rollup/rollup-android-arm-eabi": "4.55.1",
2129
+ "@rollup/rollup-android-arm64": "4.55.1",
2130
+ "@rollup/rollup-darwin-arm64": "4.55.1",
2131
+ "@rollup/rollup-darwin-x64": "4.55.1",
2132
+ "@rollup/rollup-freebsd-arm64": "4.55.1",
2133
+ "@rollup/rollup-freebsd-x64": "4.55.1",
2134
+ "@rollup/rollup-linux-arm-gnueabihf": "4.55.1",
2135
+ "@rollup/rollup-linux-arm-musleabihf": "4.55.1",
2136
+ "@rollup/rollup-linux-arm64-gnu": "4.55.1",
2137
+ "@rollup/rollup-linux-arm64-musl": "4.55.1",
2138
+ "@rollup/rollup-linux-loong64-gnu": "4.55.1",
2139
+ "@rollup/rollup-linux-loong64-musl": "4.55.1",
2140
+ "@rollup/rollup-linux-ppc64-gnu": "4.55.1",
2141
+ "@rollup/rollup-linux-ppc64-musl": "4.55.1",
2142
+ "@rollup/rollup-linux-riscv64-gnu": "4.55.1",
2143
+ "@rollup/rollup-linux-riscv64-musl": "4.55.1",
2144
+ "@rollup/rollup-linux-s390x-gnu": "4.55.1",
2145
+ "@rollup/rollup-linux-x64-gnu": "4.55.1",
2146
+ "@rollup/rollup-linux-x64-musl": "4.55.1",
2147
+ "@rollup/rollup-openbsd-x64": "4.55.1",
2148
+ "@rollup/rollup-openharmony-arm64": "4.55.1",
2149
+ "@rollup/rollup-win32-arm64-msvc": "4.55.1",
2150
+ "@rollup/rollup-win32-ia32-msvc": "4.55.1",
2151
+ "@rollup/rollup-win32-x64-gnu": "4.55.1",
2152
+ "@rollup/rollup-win32-x64-msvc": "4.55.1",
2153
+ "fsevents": "~2.3.2"
2154
+ }
2155
+ },
2156
+ "node_modules/run-async": {
2157
+ "version": "3.0.0",
2158
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
2159
+ "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
2160
+ "license": "MIT",
2161
+ "engines": {
2162
+ "node": ">=0.12.0"
2163
+ }
2164
+ },
2165
+ "node_modules/rxjs": {
2166
+ "version": "7.8.2",
2167
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
2168
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
2169
+ "license": "Apache-2.0",
2170
+ "dependencies": {
2171
+ "tslib": "^2.1.0"
2172
+ }
2173
+ },
2174
+ "node_modules/safe-buffer": {
2175
+ "version": "5.2.1",
2176
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2177
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
2178
+ "funding": [
2179
+ {
2180
+ "type": "github",
2181
+ "url": "https://github.com/sponsors/feross"
2182
+ },
2183
+ {
2184
+ "type": "patreon",
2185
+ "url": "https://www.patreon.com/feross"
2186
+ },
2187
+ {
2188
+ "type": "consulting",
2189
+ "url": "https://feross.org/support"
2190
+ }
2191
+ ],
2192
+ "license": "MIT"
2193
+ },
2194
+ "node_modules/safer-buffer": {
2195
+ "version": "2.1.2",
2196
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2197
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2198
+ "license": "MIT"
2199
+ },
2200
+ "node_modules/semver": {
2201
+ "version": "7.7.3",
2202
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
2203
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
2204
+ "license": "ISC",
2205
+ "bin": {
2206
+ "semver": "bin/semver.js"
2207
+ },
2208
+ "engines": {
2209
+ "node": ">=10"
2210
+ }
2211
+ },
2212
+ "node_modules/siginfo": {
2213
+ "version": "2.0.0",
2214
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
2215
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
2216
+ "dev": true,
2217
+ "license": "ISC"
2218
+ },
2219
+ "node_modules/signal-exit": {
2220
+ "version": "4.1.0",
2221
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2222
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2223
+ "license": "ISC",
2224
+ "engines": {
2225
+ "node": ">=14"
2226
+ },
2227
+ "funding": {
2228
+ "url": "https://github.com/sponsors/isaacs"
2229
+ }
2230
+ },
2231
+ "node_modules/simple-git": {
2232
+ "version": "3.30.0",
2233
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz",
2234
+ "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==",
2235
+ "license": "MIT",
2236
+ "dependencies": {
2237
+ "@kwsites/file-exists": "^1.1.1",
2238
+ "@kwsites/promise-deferred": "^1.1.1",
2239
+ "debug": "^4.4.0"
2240
+ },
2241
+ "funding": {
2242
+ "type": "github",
2243
+ "url": "https://github.com/steveukx/git-js?sponsor=1"
2244
+ }
2245
+ },
2246
+ "node_modules/source-map-js": {
2247
+ "version": "1.2.1",
2248
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2249
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2250
+ "dev": true,
2251
+ "license": "BSD-3-Clause",
2252
+ "engines": {
2253
+ "node": ">=0.10.0"
2254
+ }
2255
+ },
2256
+ "node_modules/stackback": {
2257
+ "version": "0.0.2",
2258
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
2259
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
2260
+ "dev": true,
2261
+ "license": "MIT"
2262
+ },
2263
+ "node_modules/std-env": {
2264
+ "version": "3.10.0",
2265
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
2266
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
2267
+ "dev": true,
2268
+ "license": "MIT"
2269
+ },
2270
+ "node_modules/stdin-discarder": {
2271
+ "version": "0.2.2",
2272
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
2273
+ "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
2274
+ "license": "MIT",
2275
+ "engines": {
2276
+ "node": ">=18"
2277
+ },
2278
+ "funding": {
2279
+ "url": "https://github.com/sponsors/sindresorhus"
2280
+ }
2281
+ },
2282
+ "node_modules/string_decoder": {
2283
+ "version": "1.3.0",
2284
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2285
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2286
+ "license": "MIT",
2287
+ "dependencies": {
2288
+ "safe-buffer": "~5.2.0"
2289
+ }
2290
+ },
2291
+ "node_modules/string-width": {
2292
+ "version": "4.2.3",
2293
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2294
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2295
+ "license": "MIT",
2296
+ "dependencies": {
2297
+ "emoji-regex": "^8.0.0",
2298
+ "is-fullwidth-code-point": "^3.0.0",
2299
+ "strip-ansi": "^6.0.1"
2300
+ },
2301
+ "engines": {
2302
+ "node": ">=8"
2303
+ }
2304
+ },
2305
+ "node_modules/strip-ansi": {
2306
+ "version": "6.0.1",
2307
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2308
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2309
+ "license": "MIT",
2310
+ "dependencies": {
2311
+ "ansi-regex": "^5.0.1"
2312
+ },
2313
+ "engines": {
2314
+ "node": ">=8"
2315
+ }
2316
+ },
2317
+ "node_modules/stubborn-fs": {
2318
+ "version": "2.0.0",
2319
+ "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-2.0.0.tgz",
2320
+ "integrity": "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==",
2321
+ "license": "MIT",
2322
+ "dependencies": {
2323
+ "stubborn-utils": "^1.0.1"
2324
+ }
2325
+ },
2326
+ "node_modules/stubborn-utils": {
2327
+ "version": "1.0.2",
2328
+ "resolved": "https://registry.npmjs.org/stubborn-utils/-/stubborn-utils-1.0.2.tgz",
2329
+ "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==",
2330
+ "license": "MIT"
2331
+ },
2332
+ "node_modules/supports-color": {
2333
+ "version": "7.2.0",
2334
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2335
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2336
+ "license": "MIT",
2337
+ "dependencies": {
2338
+ "has-flag": "^4.0.0"
2339
+ },
2340
+ "engines": {
2341
+ "node": ">=8"
2342
+ }
2343
+ },
2344
+ "node_modules/tinybench": {
2345
+ "version": "2.9.0",
2346
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
2347
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
2348
+ "dev": true,
2349
+ "license": "MIT"
2350
+ },
2351
+ "node_modules/tinyexec": {
2352
+ "version": "1.0.2",
2353
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
2354
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
2355
+ "dev": true,
2356
+ "license": "MIT",
2357
+ "engines": {
2358
+ "node": ">=18"
2359
+ }
2360
+ },
2361
+ "node_modules/tinyglobby": {
2362
+ "version": "0.2.15",
2363
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
2364
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
2365
+ "dev": true,
2366
+ "license": "MIT",
2367
+ "dependencies": {
2368
+ "fdir": "^6.5.0",
2369
+ "picomatch": "^4.0.3"
2370
+ },
2371
+ "engines": {
2372
+ "node": ">=12.0.0"
2373
+ },
2374
+ "funding": {
2375
+ "url": "https://github.com/sponsors/SuperchupuDev"
2376
+ }
2377
+ },
2378
+ "node_modules/tinyrainbow": {
2379
+ "version": "3.0.3",
2380
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz",
2381
+ "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==",
2382
+ "dev": true,
2383
+ "license": "MIT",
2384
+ "engines": {
2385
+ "node": ">=14.0.0"
2386
+ }
2387
+ },
2388
+ "node_modules/tslib": {
2389
+ "version": "2.8.1",
2390
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2391
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2392
+ "license": "0BSD"
2393
+ },
2394
+ "node_modules/tsx": {
2395
+ "version": "4.21.0",
2396
+ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
2397
+ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
2398
+ "dev": true,
2399
+ "license": "MIT",
2400
+ "peer": true,
2401
+ "dependencies": {
2402
+ "esbuild": "~0.27.0",
2403
+ "get-tsconfig": "^4.7.5"
2404
+ },
2405
+ "bin": {
2406
+ "tsx": "dist/cli.mjs"
2407
+ },
2408
+ "engines": {
2409
+ "node": ">=18.0.0"
2410
+ },
2411
+ "optionalDependencies": {
2412
+ "fsevents": "~2.3.3"
2413
+ }
2414
+ },
2415
+ "node_modules/type-fest": {
2416
+ "version": "3.13.1",
2417
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
2418
+ "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
2419
+ "license": "(MIT OR CC0-1.0)",
2420
+ "engines": {
2421
+ "node": ">=14.16"
2422
+ },
2423
+ "funding": {
2424
+ "url": "https://github.com/sponsors/sindresorhus"
2425
+ }
2426
+ },
2427
+ "node_modules/typescript": {
2428
+ "version": "5.9.3",
2429
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
2430
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
2431
+ "dev": true,
2432
+ "license": "Apache-2.0",
2433
+ "bin": {
2434
+ "tsc": "bin/tsc",
2435
+ "tsserver": "bin/tsserver"
2436
+ },
2437
+ "engines": {
2438
+ "node": ">=14.17"
2439
+ }
2440
+ },
2441
+ "node_modules/uint8array-extras": {
2442
+ "version": "0.3.0",
2443
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-0.3.0.tgz",
2444
+ "integrity": "sha512-erJsJwQ0tKdwuqI0359U8ijkFmfiTcq25JvvzRVc1VP+2son1NJRXhxcAKJmAW3ajM8JSGAfsAXye8g4s+znxA==",
2445
+ "license": "MIT",
2446
+ "engines": {
2447
+ "node": ">=18"
2448
+ },
2449
+ "funding": {
2450
+ "url": "https://github.com/sponsors/sindresorhus"
2451
+ }
2452
+ },
2453
+ "node_modules/undici-types": {
2454
+ "version": "6.21.0",
2455
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
2456
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
2457
+ "devOptional": true,
2458
+ "license": "MIT"
2459
+ },
2460
+ "node_modules/util-deprecate": {
2461
+ "version": "1.0.2",
2462
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2463
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2464
+ "license": "MIT"
2465
+ },
2466
+ "node_modules/vite": {
2467
+ "version": "7.3.1",
2468
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
2469
+ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
2470
+ "dev": true,
2471
+ "license": "MIT",
2472
+ "peer": true,
2473
+ "dependencies": {
2474
+ "esbuild": "^0.27.0",
2475
+ "fdir": "^6.5.0",
2476
+ "picomatch": "^4.0.3",
2477
+ "postcss": "^8.5.6",
2478
+ "rollup": "^4.43.0",
2479
+ "tinyglobby": "^0.2.15"
2480
+ },
2481
+ "bin": {
2482
+ "vite": "bin/vite.js"
2483
+ },
2484
+ "engines": {
2485
+ "node": "^20.19.0 || >=22.12.0"
2486
+ },
2487
+ "funding": {
2488
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2489
+ },
2490
+ "optionalDependencies": {
2491
+ "fsevents": "~2.3.3"
2492
+ },
2493
+ "peerDependencies": {
2494
+ "@types/node": "^20.19.0 || >=22.12.0",
2495
+ "jiti": ">=1.21.0",
2496
+ "less": "^4.0.0",
2497
+ "lightningcss": "^1.21.0",
2498
+ "sass": "^1.70.0",
2499
+ "sass-embedded": "^1.70.0",
2500
+ "stylus": ">=0.54.8",
2501
+ "sugarss": "^5.0.0",
2502
+ "terser": "^5.16.0",
2503
+ "tsx": "^4.8.1",
2504
+ "yaml": "^2.4.2"
2505
+ },
2506
+ "peerDependenciesMeta": {
2507
+ "@types/node": {
2508
+ "optional": true
2509
+ },
2510
+ "jiti": {
2511
+ "optional": true
2512
+ },
2513
+ "less": {
2514
+ "optional": true
2515
+ },
2516
+ "lightningcss": {
2517
+ "optional": true
2518
+ },
2519
+ "sass": {
2520
+ "optional": true
2521
+ },
2522
+ "sass-embedded": {
2523
+ "optional": true
2524
+ },
2525
+ "stylus": {
2526
+ "optional": true
2527
+ },
2528
+ "sugarss": {
2529
+ "optional": true
2530
+ },
2531
+ "terser": {
2532
+ "optional": true
2533
+ },
2534
+ "tsx": {
2535
+ "optional": true
2536
+ },
2537
+ "yaml": {
2538
+ "optional": true
2539
+ }
2540
+ }
2541
+ },
2542
+ "node_modules/vitest": {
2543
+ "version": "4.0.17",
2544
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz",
2545
+ "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==",
2546
+ "dev": true,
2547
+ "license": "MIT",
2548
+ "dependencies": {
2549
+ "@vitest/expect": "4.0.17",
2550
+ "@vitest/mocker": "4.0.17",
2551
+ "@vitest/pretty-format": "4.0.17",
2552
+ "@vitest/runner": "4.0.17",
2553
+ "@vitest/snapshot": "4.0.17",
2554
+ "@vitest/spy": "4.0.17",
2555
+ "@vitest/utils": "4.0.17",
2556
+ "es-module-lexer": "^1.7.0",
2557
+ "expect-type": "^1.2.2",
2558
+ "magic-string": "^0.30.21",
2559
+ "obug": "^2.1.1",
2560
+ "pathe": "^2.0.3",
2561
+ "picomatch": "^4.0.3",
2562
+ "std-env": "^3.10.0",
2563
+ "tinybench": "^2.9.0",
2564
+ "tinyexec": "^1.0.2",
2565
+ "tinyglobby": "^0.2.15",
2566
+ "tinyrainbow": "^3.0.3",
2567
+ "vite": "^6.0.0 || ^7.0.0",
2568
+ "why-is-node-running": "^2.3.0"
2569
+ },
2570
+ "bin": {
2571
+ "vitest": "vitest.mjs"
2572
+ },
2573
+ "engines": {
2574
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
2575
+ },
2576
+ "funding": {
2577
+ "url": "https://opencollective.com/vitest"
2578
+ },
2579
+ "peerDependencies": {
2580
+ "@edge-runtime/vm": "*",
2581
+ "@opentelemetry/api": "^1.9.0",
2582
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
2583
+ "@vitest/browser-playwright": "4.0.17",
2584
+ "@vitest/browser-preview": "4.0.17",
2585
+ "@vitest/browser-webdriverio": "4.0.17",
2586
+ "@vitest/ui": "4.0.17",
2587
+ "happy-dom": "*",
2588
+ "jsdom": "*"
2589
+ },
2590
+ "peerDependenciesMeta": {
2591
+ "@edge-runtime/vm": {
2592
+ "optional": true
2593
+ },
2594
+ "@opentelemetry/api": {
2595
+ "optional": true
2596
+ },
2597
+ "@types/node": {
2598
+ "optional": true
2599
+ },
2600
+ "@vitest/browser-playwright": {
2601
+ "optional": true
2602
+ },
2603
+ "@vitest/browser-preview": {
2604
+ "optional": true
2605
+ },
2606
+ "@vitest/browser-webdriverio": {
2607
+ "optional": true
2608
+ },
2609
+ "@vitest/ui": {
2610
+ "optional": true
2611
+ },
2612
+ "happy-dom": {
2613
+ "optional": true
2614
+ },
2615
+ "jsdom": {
2616
+ "optional": true
2617
+ }
2618
+ }
2619
+ },
2620
+ "node_modules/wcwidth": {
2621
+ "version": "1.0.1",
2622
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
2623
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
2624
+ "license": "MIT",
2625
+ "dependencies": {
2626
+ "defaults": "^1.0.3"
2627
+ }
2628
+ },
2629
+ "node_modules/when-exit": {
2630
+ "version": "2.1.5",
2631
+ "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.5.tgz",
2632
+ "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==",
2633
+ "license": "MIT"
2634
+ },
2635
+ "node_modules/why-is-node-running": {
2636
+ "version": "2.3.0",
2637
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
2638
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
2639
+ "dev": true,
2640
+ "license": "MIT",
2641
+ "dependencies": {
2642
+ "siginfo": "^2.0.0",
2643
+ "stackback": "0.0.2"
2644
+ },
2645
+ "bin": {
2646
+ "why-is-node-running": "cli.js"
2647
+ },
2648
+ "engines": {
2649
+ "node": ">=8"
2650
+ }
2651
+ },
2652
+ "node_modules/wrap-ansi": {
2653
+ "version": "6.2.0",
2654
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
2655
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
2656
+ "license": "MIT",
2657
+ "dependencies": {
2658
+ "ansi-styles": "^4.0.0",
2659
+ "string-width": "^4.1.0",
2660
+ "strip-ansi": "^6.0.0"
2661
+ },
2662
+ "engines": {
2663
+ "node": ">=8"
2664
+ }
2665
+ },
2666
+ "node_modules/yoctocolors-cjs": {
2667
+ "version": "2.1.3",
2668
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
2669
+ "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
2670
+ "license": "MIT",
2671
+ "engines": {
2672
+ "node": ">=18"
2673
+ },
2674
+ "funding": {
2675
+ "url": "https://github.com/sponsors/sindresorhus"
2676
+ }
2677
+ }
2678
+ }
2679
+}
0
2680
▼cli/package.json
+35-8
1
1
{
2
2
"name": "opencodehub-cli",
3
- "version": "1.0.0",
4
- "description": "CLI for OpenCodeHub - Stack-first PR workflows",
3
+ "version": "1.0.1",
4
+ "description": "Stack-first PR workflows from your terminal - CLI for OpenCodeHub",
5
+ "author": "Swadhin Biswas <[email protected]>",
6
+ "license": "MIT",
5
7
"type": "module",
6
8
"bin": {
7
- "och": "./bin/och.js"
9
+ "och": "dist/bin/och.js"
10
+ },
11
+ "files": [
12
+ "bin",
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/swadhinbiswas/OpencodeHub.git",
20
+ "directory": "cli"
21
+ },
22
+ "homepage": "https://github.com/swadhinbiswas/OpencodeHub#readme",
23
+ "bugs": {
24
+ "url": "https://github.com/swadhinbiswas/OpencodeHub/issues"
8
25
},
9
26
"scripts": {
10
27
"build": "tsc",
11
28
"dev": "tsx bin/och.ts",
12
- "test": "vitest"
29
+ "prepublishOnly": "npm run build",
30
+ "test": "vitest run"
13
31
},
14
32
"dependencies": {
15
- "commander": "^12.0.0",
16
33
"chalk": "^5.3.0",
17
- "ora": "^8.0.0",
18
- "inquirer": "^9.2.0",
34
+ "commander": "^12.0.0",
19
35
"conf": "^12.0.0",
36
+ "inquirer": "^9.2.0",
37
+ "ora": "^8.0.0",
20
38
"simple-git": "^3.25.0"
21
39
},
22
40
"devDependencies": {
41
+ "@types/inquirer": "^9.0.9",
23
42
"@types/node": "^20.14.9",
24
43
"tsx": "^4.15.0",
25
44
"typescript": "^5.5.2",
30
49
},
31
50
"keywords": [
32
51
"git",
52
+ "github",
53
+ "gitlab",
33
54
"stacked-prs",
55
+ "stacked-diffs",
34
56
"code-review",
35
- "cli"
57
+ "cli",
58
+ "devops",
59
+ "pull-request",
60
+ "pr",
61
+ "workflow",
62
+ "opencodehub"
36
63
]
37
64
}
38
65
▼cli/src/smoke.test.ts
+15-0
1
+import { describe, it, expect } from 'vitest';
2
+import { execSync } from 'child_process';
3
+
4
+describe('CLI Smoke Test', () => {
5
+ it('should show help menu', () => {
6
+ const output = execSync('node dist/bin/och.js --help').toString();
7
+ expect(output).toContain('OpenCodeHub CLI');
8
+ expect(output).toContain('Usage: och');
9
+ });
10
+
11
+ it('should show version', () => {
12
+ const output = execSync('node dist/bin/och.js --version').toString();
13
+ expect(output).toMatch(/\d+\.\d+\.\d+/);
14
+ });
15
+});
0
16
▼cli/tsconfig.json
+1-1
2
2
"compilerOptions": {
3
3
"target": "ES2022",
4
4
"module": "ESNext",
5
- "moduleResolution": "node",
5
+ "moduleResolution": "bundler",
6
6
"outDir": "./dist",
7
7
"rootDir": ".",
8
8
"strict": true,
9
9
▼docs-site/api.html
+133-0
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+
4
+<head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>API Reference - OpenCodeHub Docs</title>
8
+ <meta name="description" content="OpenCodeHub REST API reference">
9
+ <link rel="icon" type="image/svg+xml" href="../public/logo.svg">
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
12
+ rel="stylesheet">
13
+ <link rel="stylesheet" href="styles.css">
14
+</head>
15
+
16
+<body>
17
+ <header class="header">
18
+ <a href="index.html" class="header-logo">
19
+ <img src="../public/logo.svg" alt="OpenCodeHub" height="40">
20
+ </a>
21
+ <nav class="header-nav">
22
+ <a href="getting-started.html">Getting Started</a>
23
+ <a href="deployment.html">Deployment</a>
24
+ <a href="cli.html">CLI</a>
25
+ <a href="api.html">API</a>
26
+ </nav>
27
+ </header>
28
+
29
+ <div class="layout">
30
+ <aside class="sidebar">
31
+ <div class="sidebar-section">
32
+ <div class="sidebar-title">API</div>
33
+ <nav class="sidebar-nav">
34
+ <a href="#auth" class="sidebar-link active">Authentication</a>
35
+ <a href="#repos" class="sidebar-link">Repositories</a>
36
+ <a href="#prs" class="sidebar-link">Pull Requests</a>
37
+ <a href="#webhooks" class="sidebar-link">Webhooks</a>
38
+ </nav>
39
+ </div>
40
+ </aside>
41
+
42
+ <main class="main">
43
+ <div class="content">
44
+ <h1>🔌 API Reference</h1>
45
+ <p>RESTful API for programmatic access to OpenCodeHub.</p>
46
+
47
+ <section id="auth">
48
+ <h2>🔐 Authentication</h2>
49
+ <p>All API requests require authentication via Bearer token:</p>
50
+ <pre><code>Authorization: Bearer YOUR_API_TOKEN</code></pre>
51
+ <p>Create tokens in <strong>Settings → Developer → API Tokens</strong>.</p>
52
+ </section>
53
+
54
+ <section id="repos">
55
+ <h2>📁 Repositories</h2>
56
+ <table>
57
+ <tr>
58
+ <td><code>GET /api/repos</code></td>
59
+ <td>List repositories</td>
60
+ </tr>
61
+ <tr>
62
+ <td><code>GET /api/repos/:owner/:repo</code></td>
63
+ <td>Get repository</td>
64
+ </tr>
65
+ <tr>
66
+ <td><code>POST /api/repos</code></td>
67
+ <td>Create repository</td>
68
+ </tr>
69
+ <tr>
70
+ <td><code>DELETE /api/repos/:owner/:repo</code></td>
71
+ <td>Delete repository</td>
72
+ </tr>
73
+ </table>
74
+ <h3>Example</h3>
75
+ <pre><code>curl -H "Authorization: Bearer TOKEN" \
76
+ https://git.example.com/api/repos/user/project</code></pre>
77
+ </section>
78
+
79
+ <section id="prs">
80
+ <h2>🔀 Pull Requests</h2>
81
+ <table>
82
+ <tr>
83
+ <td><code>GET /api/repos/:owner/:repo/pulls</code></td>
84
+ <td>List PRs</td>
85
+ </tr>
86
+ <tr>
87
+ <td><code>POST /api/repos/:owner/:repo/pulls</code></td>
88
+ <td>Create PR</td>
89
+ </tr>
90
+ <tr>
91
+ <td><code>PUT /api/repos/:owner/:repo/pulls/:id/merge</code></td>
92
+ <td>Merge PR</td>
93
+ </tr>
94
+ </table>
95
+ </section>
96
+
97
+ <section id="webhooks">
98
+ <h2>🔔 Webhooks</h2>
99
+ <p>Configure webhooks in <strong>Repository → Settings → Webhooks</strong>.</p>
100
+ <h3>Events</h3>
101
+ <table>
102
+ <tr>
103
+ <td><code>push</code></td>
104
+ <td>Code pushed to repository</td>
105
+ </tr>
106
+ <tr>
107
+ <td><code>pull_request</code></td>
108
+ <td>PR opened, closed, merged</td>
109
+ </tr>
110
+ <tr>
111
+ <td><code>issue</code></td>
112
+ <td>Issue created or updated</td>
113
+ </tr>
114
+ </table>
115
+ <h3>Payload Example</h3>
116
+ <pre><code>{
117
+ "event": "pull_request",
118
+ "action": "opened",
119
+ "repository": {"name": "project", "owner": "user"},
120
+ "pull_request": {"number": 42, "title": "Add feature"}
121
+}</code></pre>
122
+ </section>
123
+
124
+ <footer
125
+ style="margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--border-primary); text-align: center; color: var(--text-muted);">
126
+ <p>Made with ❤️ by <a href="https://github.com/swadhinbiswas">Swadhin Biswas</a></p>
127
+ </footer>
128
+ </div>
129
+ </main>
130
+ </div>
131
+</body>
132
+
133
+</html>
0
134
▼docs-site/cli.html
+141-0
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+
4
+<head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>CLI Reference - OpenCodeHub Docs</title>
8
+ <meta name="description" content="OpenCodeHub CLI reference - Stack-first PR workflows">
9
+ <link rel="icon" type="image/svg+xml" href="../public/logo.svg">
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
12
+ rel="stylesheet">
13
+ <link rel="stylesheet" href="styles.css">
14
+</head>
15
+
16
+<body>
17
+ <header class="header">
18
+ <a href="index.html" class="header-logo">
19
+ <img src="../public/logo.svg" alt="OpenCodeHub" height="40">
20
+ </a>
21
+ <nav class="header-nav">
22
+ <a href="getting-started.html">Getting Started</a>
23
+ <a href="deployment.html">Deployment</a>
24
+ <a href="cli.html">CLI</a>
25
+ <a href="api.html">API</a>
26
+ </nav>
27
+ </header>
28
+
29
+ <div class="layout">
30
+ <aside class="sidebar">
31
+ <div class="sidebar-section">
32
+ <div class="sidebar-title">CLI</div>
33
+ <nav class="sidebar-nav">
34
+ <a href="#installation" class="sidebar-link active">Installation</a>
35
+ <a href="#auth" class="sidebar-link">Authentication</a>
36
+ <a href="#stacked-prs" class="sidebar-link">Stacked PRs</a>
37
+ <a href="#commands" class="sidebar-link">All Commands</a>
38
+ </nav>
39
+ </div>
40
+ </aside>
41
+
42
+ <main class="main">
43
+ <div class="content">
44
+ <h1>💻 CLI Reference</h1>
45
+ <p>Stack-first PR workflows from your terminal.</p>
46
+
47
+ <section id="installation">
48
+ <h2>📦 Installation</h2>
49
+ <div class="command-line">
50
+ <span class="command-prompt">$</span>
51
+ <span class="command-text">npm install -g opencodehub-cli</span>
52
+ </div>
53
+ <div class="command-line">
54
+ <span class="command-prompt">$</span>
55
+ <span class="command-text">och --version</span>
56
+ </div>
57
+ </section>
58
+
59
+ <section id="auth">
60
+ <h2>🔐 Authentication</h2>
61
+ <table>
62
+ <tr>
63
+ <td><code>och auth login</code></td>
64
+ <td>Interactive login</td>
65
+ </tr>
66
+ <tr>
67
+ <td><code>och auth login --token TOKEN</code></td>
68
+ <td>CI/CD token login</td>
69
+ </tr>
70
+ <tr>
71
+ <td><code>och auth whoami</code></td>
72
+ <td>Show current user</td>
73
+ </tr>
74
+ <tr>
75
+ <td><code>och auth logout</code></td>
76
+ <td>Clear credentials</td>
77
+ </tr>
78
+ </table>
79
+ </section>
80
+
81
+ <section id="stacked-prs">
82
+ <h2>📚 Stacked PRs</h2>
83
+ <p>Create dependent pull requests that auto-update when parents change.</p>
84
+ <table>
85
+ <tr>
86
+ <td><code>och stack create &lt;name&gt;</code></td>
87
+ <td>Create new branch in stack</td>
88
+ </tr>
89
+ <tr>
90
+ <td><code>och stack view</code></td>
91
+ <td>View current stack</td>
92
+ </tr>
93
+ <tr>
94
+ <td><code>och stack submit</code></td>
95
+ <td>Push and create PRs</td>
96
+ </tr>
97
+ <tr>
98
+ <td><code>och stack sync</code></td>
99
+ <td>Rebase stack on main</td>
100
+ </tr>
101
+ </table>
102
+ <h3>Example</h3>
103
+ <pre><code>och stack create database-schema
104
+git commit -m "Add tables"
105
+och stack create auth-service
106
+git commit -m "Add auth"
107
+och stack submit # Creates 2 stacked PRs</code></pre>
108
+ </section>
109
+
110
+ <section id="commands">
111
+ <h2>📋 All Commands</h2>
112
+ <table>
113
+ <tr>
114
+ <td><code>och init</code></td>
115
+ <td>Initialize repo for OpenCodeHub</td>
116
+ </tr>
117
+ <tr>
118
+ <td><code>och status</code></td>
119
+ <td>Show stack status</td>
120
+ </tr>
121
+ <tr>
122
+ <td><code>och sync</code></td>
123
+ <td>Sync with remote</td>
124
+ </tr>
125
+ <tr>
126
+ <td><code>och config list</code></td>
127
+ <td>List configuration</td>
128
+ </tr>
129
+ </table>
130
+ </section>
131
+
132
+ <footer
133
+ style="margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--border-primary); text-align: center; color: var(--text-muted);">
134
+ <p>Made with ❤️ by <a href="https://github.com/swadhinbiswas">Swadhin Biswas</a></p>
135
+ </footer>
136
+ </div>
137
+ </main>
138
+ </div>
139
+</body>
140
+
141
+</html>
0
142
▼docs-site/deployment.html
+533-0
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+
4
+<head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Deployment Guide - OpenCodeHub Docs</title>
8
+ <meta name="description"
9
+ content="Complete deployment guide for OpenCodeHub - Docker, Vercel, VPS deployment tutorials">
10
+ <link rel="icon" type="image/svg+xml" href="../public/logo.svg">
11
+ <link rel="preconnect" href="https://fonts.googleapis.com">
12
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13
+ <link
14
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
15
+ rel="stylesheet">
16
+ <link rel="stylesheet" href="styles.css">
17
+</head>
18
+
19
+<body>
20
+ <!-- Header -->
21
+ <header class="header">
22
+ <a href="index.html" class="header-logo">
23
+ <img src="../public/logo.svg" alt="OpenCodeHub" height="40">
24
+ </a>
25
+ <nav class="header-nav">
26
+ <a href="getting-started.html">Getting Started</a>
27
+ <a href="deployment.html">Deployment</a>
28
+ <a href="cli.html">CLI</a>
29
+ <a href="api.html">API</a>
30
+ <a href="https://github.com/swadhinbiswas/OpencodeHub" class="btn-github" target="_blank">
31
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
32
+ <path
33
+ d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
34
+ </svg>
35
+ GitHub
36
+ </a>
37
+ </nav>
38
+ </header>
39
+
40
+ <div class="layout">
41
+ <!-- Sidebar -->
42
+ <aside class="sidebar">
43
+ <div class="sidebar-section">
44
+ <div class="sidebar-title">Getting Started</div>
45
+ <nav class="sidebar-nav">
46
+ <a href="getting-started.html" class="sidebar-link">
47
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
48
+ <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
49
+ </svg>
50
+ Quick Start
51
+ </a>
52
+ </nav>
53
+ </div>
54
+
55
+ <div class="sidebar-section">
56
+ <div class="sidebar-title">Deployment</div>
57
+ <nav class="sidebar-nav">
58
+ <a href="deployment.html" class="sidebar-link active">
59
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
60
+ <rect x="2" y="3" width="20" height="14" rx="2" ry="2" />
61
+ <path d="M8 21h8M12 17v4" />
62
+ </svg>
63
+ Overview
64
+ </a>
65
+ <a href="#docker" class="sidebar-link">
66
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
67
+ <path
68
+ d="M22 12.5c0 .5-.5 1-1 1h-2v-2h2c.5 0 1 .5 1 1zM2 12.5c0-.5.5-1 1-1h2v2H3c-.5 0-1-.5-1-1z" />
69
+ <rect x="6" y="9" width="12" height="6" rx="1" />
70
+ </svg>
71
+ Docker
72
+ </a>
73
+ <a href="#vercel" class="sidebar-link">
74
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
75
+ <polygon points="12 2 2 22 22 22" />
76
+ </svg>
77
+ Vercel
78
+ </a>
79
+ <a href="#vps" class="sidebar-link">
80
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
81
+ <rect x="2" y="2" width="20" height="8" rx="2" ry="2" />
82
+ <rect x="2" y="14" width="20" height="8" rx="2" ry="2" />
83
+ <line x1="6" y1="6" x2="6.01" y2="6" />
84
+ <line x1="6" y1="18" x2="6.01" y2="18" />
85
+ </svg>
86
+ VPS / Linux
87
+ </a>
88
+ <a href="#ssl" class="sidebar-link">
89
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
90
+ <rect x="3" y="11" width="18" height="11" rx="2" ry="2" />
91
+ <path d="M7 11V7a5 5 0 0110 0v4" />
92
+ </svg>
93
+ SSL Setup
94
+ </a>
95
+ </nav>
96
+ </div>
97
+
98
+ <div class="sidebar-section">
99
+ <div class="sidebar-title">CLI</div>
100
+ <nav class="sidebar-nav">
101
+ <a href="cli.html" class="sidebar-link">
102
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
103
+ <polyline points="4 17 10 11 4 5" />
104
+ <line x1="12" y1="19" x2="20" y2="19" />
105
+ </svg>
106
+ CLI Reference
107
+ </a>
108
+ </nav>
109
+ </div>
110
+ </aside>
111
+
112
+ <!-- Main Content -->
113
+ <main class="main">
114
+ <div class="content">
115
+ <h1>🚀 Deployment Guide</h1>
116
+ <p>
117
+ Deploy OpenCodeHub to your preferred platform. Choose Docker for simplicity,
118
+ Vercel for serverless, or VPS for full control.
119
+ </p>
120
+
121
+ <!-- Overview -->
122
+ <section>
123
+ <h2>📋 Deployment Options</h2>
124
+
125
+ <table>
126
+ <thead>
127
+ <tr>
128
+ <th>Platform</th>
129
+ <th>Difficulty</th>
130
+ <th>Best For</th>
131
+ <th>Estimated Time</th>
132
+ </tr>
133
+ </thead>
134
+ <tbody>
135
+ <tr>
136
+ <td><strong>🐳 Docker</strong></td>
137
+ <td><span class="badge badge-primary">Easy</span></td>
138
+ <td>Quick setup, self-hosted</td>
139
+ <td>5-10 minutes</td>
140
+ </tr>
141
+ <tr>
142
+ <td><strong>▲ Vercel</strong></td>
143
+ <td><span class="badge badge-primary">Easy</span></td>
144
+ <td>Serverless, auto-scaling</td>
145
+ <td>10-15 minutes</td>
146
+ </tr>
147
+ <tr>
148
+ <td><strong>🖥️ VPS</strong></td>
149
+ <td><span class="badge">Medium</span></td>
150
+ <td>Full control, bare metal</td>
151
+ <td>30-45 minutes</td>
152
+ </tr>
153
+ </tbody>
154
+ </table>
155
+ </section>
156
+
157
+ <!-- Docker -->
158
+ <section id="docker">
159
+ <h2>🐳 Docker Deployment</h2>
160
+ <p>The fastest way to get OpenCodeHub running. Includes PostgreSQL and all dependencies.</p>
161
+
162
+ <div class="alert alert-info">
163
+ <div class="alert-title">💡 Prerequisites</div>
164
+ <p>Docker 20.10+ and Docker Compose installed on your system.</p>
165
+ </div>
166
+
167
+ <div class="steps">
168
+ <div class="step">
169
+ <div class="step-title">Clone the Repository</div>
170
+ <div class="step-content">
171
+ <div class="command-line">
172
+ <span class="command-prompt">$</span>
173
+ <span class="command-text">git clone
174
+ https://github.com/swadhinbiswas/OpencodeHub.git && cd OpenCodeHub</span>
175
+ </div>
176
+ </div>
177
+ </div>
178
+
179
+ <div class="step">
180
+ <div class="step-title">Configure Environment</div>
181
+ <div class="step-content">
182
+ <p>Copy the example environment file and configure your secrets:</p>
183
+ <div class="command-line">
184
+ <span class="command-prompt">$</span>
185
+ <span class="command-text">cp .env.example .env</span>
186
+ </div>
187
+ <p>Generate secure secrets for production:</p>
188
+ <pre><code># Generate secrets (copy these to your .env file)
189
+openssl rand -hex 32 # For JWT_SECRET
190
+openssl rand -hex 32 # For SESSION_SECRET
191
+openssl rand -hex 32 # For INTERNAL_HOOK_SECRET</code></pre>
192
+ </div>
193
+ </div>
194
+
195
+ <div class="step">
196
+ <div class="step-title">Start Services</div>
197
+ <div class="step-content">
198
+ <div class="command-line">
199
+ <span class="command-prompt">$</span>
200
+ <span class="command-text">docker-compose up -d</span>
201
+ </div>
202
+ <p>This starts PostgreSQL and the OpenCodeHub application.</p>
203
+ </div>
204
+ </div>
205
+
206
+ <div class="step">
207
+ <div class="step-title">Create Admin User</div>
208
+ <div class="step-content">
209
+ <div class="command-line">
210
+ <span class="command-prompt">$</span>
211
+ <span class="command-text">docker-compose exec app bun run
212
+ scripts/seed-admin.ts</span>
213
+ </div>
214
+ <p>Follow the prompts to create your administrator account.</p>
215
+ </div>
216
+ </div>
217
+
218
+ <div class="step">
219
+ <div class="step-title">Access Your Instance</div>
220
+ <div class="step-content">
221
+ <p>Open <code>http://localhost:3000</code> in your browser and log in with your admin
222
+ credentials.</p>
223
+ </div>
224
+ </div>
225
+ </div>
226
+
227
+ <div class="card">
228
+ <h3 class="card-title">📁 Docker Compose Configuration</h3>
229
+ <pre><code>version: '3.8'
230
+services:
231
+ app:
232
+ build: .
233
+ ports:
234
+ - "3000:3000"
235
+ environment:
236
+ - DATABASE_URL=postgresql://postgres:password@db:5432/opencodehub
237
+ - NODE_ENV=production
238
+ depends_on:
239
+ - db
240
+ volumes:
241
+ - ./repos:/app/repos
242
+ - ./data:/app/data
243
+
244
+ db:
245
+ image: postgres:15-alpine
246
+ environment:
247
+ - POSTGRES_USER=postgres
248
+ - POSTGRES_PASSWORD=password
249
+ - POSTGRES_DB=opencodehub
250
+ volumes:
251
+ - postgres_data:/var/lib/postgresql/data
252
+
253
+volumes:
254
+ postgres_data:</code></pre>
255
+ </div>
256
+ </section>
257
+
258
+ <!-- Vercel -->
259
+ <section id="vercel">
260
+ <h2>▲ Vercel Deployment</h2>
261
+ <p>Deploy OpenCodeHub as a serverless application with automatic scaling.</p>
262
+
263
+ <div class="alert alert-warning">
264
+ <div class="alert-title">⚠️ Important Note</div>
265
+ <p>Git repository storage requires external storage (S3, R2, etc.) when using Vercel.</p>
266
+ </div>
267
+
268
+ <div class="steps">
269
+ <div class="step">
270
+ <div class="step-title">Fork the Repository</div>
271
+ <div class="step-content">
272
+ <p>Fork <a href="https://github.com/swadhinbiswas/OpencodeHub">OpenCodeHub on GitHub</a>
273
+ to your account.</p>
274
+ </div>
275
+ </div>
276
+
277
+ <div class="step">
278
+ <div class="step-title">Import to Vercel</div>
279
+ <div class="step-content">
280
+ <p>Go to <a href="https://vercel.com/new">vercel.com/new</a> and import your forked
281
+ repository.</p>
282
+ </div>
283
+ </div>
284
+
285
+ <div class="step">
286
+ <div class="step-title">Configure Environment Variables</div>
287
+ <div class="step-content">
288
+ <p>Add the following environment variables in Vercel project settings:</p>
289
+ <table>
290
+ <thead>
291
+ <tr>
292
+ <th>Variable</th>
293
+ <th>Description</th>
294
+ </tr>
295
+ </thead>
296
+ <tbody>
297
+ <tr>
298
+ <td><code>DATABASE_URL</code></td>
299
+ <td>PostgreSQL connection string (use Vercel Postgres or external)</td>
300
+ </tr>
301
+ <tr>
302
+ <td><code>JWT_SECRET</code></td>
303
+ <td>32+ character secret for JWT tokens</td>
304
+ </tr>
305
+ <tr>
306
+ <td><code>SESSION_SECRET</code></td>
307
+ <td>32+ character secret for sessions</td>
308
+ </tr>
309
+ <tr>
310
+ <td><code>SITE_URL</code></td>
311
+ <td>Your Vercel deployment URL</td>
312
+ </tr>
313
+ <tr>
314
+ <td><code>STORAGE_TYPE</code></td>
315
+ <td>Set to <code>s3</code> for cloud storage</td>
316
+ </tr>
317
+ </tbody>
318
+ </table>
319
+ </div>
320
+ </div>
321
+
322
+ <div class="step">
323
+ <div class="step-title">Deploy</div>
324
+ <div class="step-content">
325
+ <p>Click "Deploy" and wait for the build to complete. Your instance will be available at
326
+ your Vercel URL.</p>
327
+ </div>
328
+ </div>
329
+ </div>
330
+ </section>
331
+
332
+ <!-- VPS -->
333
+ <section id="vps">
334
+ <h2>🖥️ VPS / Linux Deployment</h2>
335
+ <p>Full control deployment on any Linux server with systemd and Nginx.</p>
336
+
337
+ <div class="alert alert-info">
338
+ <div class="alert-title">💡 Recommended Specs</div>
339
+ <p>2+ CPU cores, 4GB+ RAM, 50GB+ SSD. Ubuntu 22.04 or Debian 12 recommended.</p>
340
+ </div>
341
+
342
+ <div class="steps">
343
+ <div class="step">
344
+ <div class="step-title">Install Dependencies</div>
345
+ <div class="step-content">
346
+ <pre><code># Update system
347
+sudo apt update && sudo apt upgrade -y
348
+
349
+# Install Node.js 20
350
+curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
351
+sudo apt install -y nodejs
352
+
353
+# Install PostgreSQL
354
+sudo apt install -y postgresql postgresql-contrib
355
+
356
+# Install Git and Nginx
357
+sudo apt install -y git nginx certbot python3-certbot-nginx</code></pre>
358
+ </div>
359
+ </div>
360
+
361
+ <div class="step">
362
+ <div class="step-title">Setup PostgreSQL</div>
363
+ <div class="step-content">
364
+ <pre><code># Create database and user
365
+sudo -u postgres psql
366
+
367
+CREATE USER opencodehub WITH PASSWORD 'your-secure-password';
368
+CREATE DATABASE opencodehub OWNER opencodehub;
369
+GRANT ALL PRIVILEGES ON DATABASE opencodehub TO opencodehub;
370
+\q</code></pre>
371
+ </div>
372
+ </div>
373
+
374
+ <div class="step">
375
+ <div class="step-title">Clone and Configure</div>
376
+ <div class="step-content">
377
+ <pre><code># Clone repository
378
+cd /opt
379
+sudo git clone https://github.com/swadhinbiswas/OpencodeHub.git
380
+cd OpenCodeHub
381
+
382
+# Install dependencies
383
+sudo npm install
384
+
385
+# Configure environment
386
+sudo cp .env.example .env
387
+sudo nano .env # Edit with your production values
388
+
389
+# Run migrations
390
+sudo npm run db:push
391
+
392
+# Build for production
393
+sudo npm run build</code></pre>
394
+ </div>
395
+ </div>
396
+
397
+ <div class="step">
398
+ <div class="step-title">Create Systemd Service</div>
399
+ <div class="step-content">
400
+ <pre><code># Create service file
401
+sudo nano /etc/systemd/system/opencodehub.service</code></pre>
402
+ <pre><code>[Unit]
403
+Description=OpenCodeHub
404
+After=network.target postgresql.service
405
+
406
+[Service]
407
+Type=simple
408
+User=www-data
409
+WorkingDirectory=/opt/OpenCodeHub
410
+ExecStart=/usr/bin/node dist/server/entry.mjs
411
+Restart=on-failure
412
+Environment=NODE_ENV=production
413
+
414
+[Install]
415
+WantedBy=multi-user.target</code></pre>
416
+ <pre><code># Enable and start service
417
+sudo systemctl enable opencodehub
418
+sudo systemctl start opencodehub</code></pre>
419
+ </div>
420
+ </div>
421
+
422
+ <div class="step">
423
+ <div class="step-title">Configure Nginx</div>
424
+ <div class="step-content">
425
+ <pre><code># Create Nginx config
426
+sudo nano /etc/nginx/sites-available/opencodehub</code></pre>
427
+ <pre><code>server {
428
+ listen 80;
429
+ server_name git.yourdomain.com;
430
+
431
+ location / {
432
+ proxy_pass http://127.0.0.1:3000;
433
+ proxy_http_version 1.1;
434
+ proxy_set_header Upgrade $http_upgrade;
435
+ proxy_set_header Connection 'upgrade';
436
+ proxy_set_header Host $host;
437
+ proxy_set_header X-Real-IP $remote_addr;
438
+ proxy_cache_bypass $http_upgrade;
439
+ }
440
+}</code></pre>
441
+ <pre><code># Enable site
442
+sudo ln -s /etc/nginx/sites-available/opencodehub /etc/nginx/sites-enabled/
443
+sudo nginx -t && sudo systemctl reload nginx</code></pre>
444
+ </div>
445
+ </div>
446
+ </div>
447
+ </section>
448
+
449
+ <!-- SSL -->
450
+ <section id="ssl">
451
+ <h2>🔐 SSL Certificate Setup</h2>
452
+ <p>Secure your OpenCodeHub instance with HTTPS using Let's Encrypt.</p>
453
+
454
+ <div class="steps">
455
+ <div class="step">
456
+ <div class="step-title">Install Certbot</div>
457
+ <div class="step-content">
458
+ <div class="command-line">
459
+ <span class="command-prompt">$</span>
460
+ <span class="command-text">sudo apt install certbot python3-certbot-nginx</span>
461
+ </div>
462
+ </div>
463
+ </div>
464
+
465
+ <div class="step">
466
+ <div class="step-title">Obtain Certificate</div>
467
+ <div class="step-content">
468
+ <div class="command-line">
469
+ <span class="command-prompt">$</span>
470
+ <span class="command-text">sudo certbot --nginx -d git.yourdomain.com</span>
471
+ </div>
472
+ <p>Follow the prompts. Certbot will automatically configure Nginx for HTTPS.</p>
473
+ </div>
474
+ </div>
475
+
476
+ <div class="step">
477
+ <div class="step-title">Auto-Renewal</div>
478
+ <div class="step-content">
479
+ <p>Certbot automatically sets up certificate renewal. Test it with:</p>
480
+ <div class="command-line">
481
+ <span class="command-prompt">$</span>
482
+ <span class="command-text">sudo certbot renew --dry-run</span>
483
+ </div>
484
+ </div>
485
+ </div>
486
+ </div>
487
+ </section>
488
+
489
+ <!-- Production Checklist -->
490
+ <section>
491
+ <h2>✅ Production Checklist</h2>
492
+
493
+ <div class="card">
494
+ <h3 class="card-title">Before Going Live</h3>
495
+ <ul>
496
+ <li>✅ Set strong secrets (JWT_SECRET, SESSION_SECRET, INTERNAL_HOOK_SECRET)</li>
497
+ <li>✅ Configure HTTPS with valid SSL certificate</li>
498
+ <li>✅ Set correct SITE_URL in environment</li>
499
+ <li>✅ Enable rate limiting (RATE_LIMIT_SKIP_DEV=false)</li>
500
+ <li>✅ Enable CSRF protection (CSRF_SKIP_DEV=false)</li>
501
+ <li>✅ Configure database backups</li>
502
+ <li>✅ Set up monitoring and alerts</li>
503
+ <li>✅ Create admin account with 2FA</li>
504
+ </ul>
505
+ </div>
506
+ </section>
507
+
508
+ <!-- Footer -->
509
+ <footer
510
+ style="margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--border-primary); text-align: center; color: var(--text-muted);">
511
+ <p>
512
+ Made with ❤️ by <a href="https://github.com/swadhinbiswas">Swadhin Biswas</a> •
513
+ <a href="https://github.com/swadhinbiswas/OpencodeHub">GitHub</a>
514
+ </p>
515
+ </footer>
516
+ </div>
517
+ </main>
518
+ </div>
519
+
520
+ <script>
521
+ // Smooth scroll for anchor links
522
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
523
+ anchor.addEventListener('click', function (e) {
524
+ e.preventDefault();
525
+ document.querySelector(this.getAttribute('href')).scrollIntoView({
526
+ behavior: 'smooth'
527
+ });
528
+ });
529
+ });
530
+ </script>
531
+</body>
532
+
533
+</html>
0
534
▼docs-site/getting-started.html
+373-0
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+
4
+<head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Getting Started - OpenCodeHub Docs</title>
8
+ <meta name="description" content="Get started with OpenCodeHub - Installation, configuration, and first steps">
9
+ <link rel="icon" type="image/svg+xml" href="../public/logo.svg">
10
+ <link rel="preconnect" href="https://fonts.googleapis.com">
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
12
+ <link
13
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
14
+ rel="stylesheet">
15
+ <link rel="stylesheet" href="styles.css">
16
+</head>
17
+
18
+<body>
19
+ <!-- Header -->
20
+ <header class="header">
21
+ <a href="index.html" class="header-logo">
22
+ <img src="../public/logo.svg" alt="OpenCodeHub" height="40">
23
+ </a>
24
+ <nav class="header-nav">
25
+ <a href="getting-started.html">Getting Started</a>
26
+ <a href="deployment.html">Deployment</a>
27
+ <a href="cli.html">CLI</a>
28
+ <a href="api.html">API</a>
29
+ <a href="https://github.com/swadhinbiswas/OpencodeHub" class="btn-github" target="_blank">
30
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
31
+ <path
32
+ d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
33
+ </svg>
34
+ GitHub
35
+ </a>
36
+ </nav>
37
+ </header>
38
+
39
+ <div class="layout">
40
+ <!-- Sidebar -->
41
+ <aside class="sidebar">
42
+ <div class="sidebar-section">
43
+ <div class="sidebar-title">Getting Started</div>
44
+ <nav class="sidebar-nav">
45
+ <a href="getting-started.html" class="sidebar-link active">
46
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
47
+ <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
48
+ </svg>
49
+ Quick Start
50
+ </a>
51
+ <a href="#installation" class="sidebar-link">
52
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
53
+ <path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3" />
54
+ </svg>
55
+ Installation
56
+ </a>
57
+ <a href="#configuration" class="sidebar-link">
58
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
59
+ <circle cx="12" cy="12" r="3" />
60
+ <path
61
+ d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z" />
62
+ </svg>
63
+ Configuration
64
+ </a>
65
+ <a href="#first-repo" class="sidebar-link">
66
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
67
+ <path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z" />
68
+ </svg>
69
+ First Repository
70
+ </a>
71
+ </nav>
72
+ </div>
73
+
74
+ <div class="sidebar-section">
75
+ <div class="sidebar-title">Deployment</div>
76
+ <nav class="sidebar-nav">
77
+ <a href="deployment.html" class="sidebar-link">
78
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
79
+ <rect x="2" y="3" width="20" height="14" rx="2" ry="2" />
80
+ <path d="M8 21h8M12 17v4" />
81
+ </svg>
82
+ Overview
83
+ </a>
84
+ </nav>
85
+ </div>
86
+
87
+ <div class="sidebar-section">
88
+ <div class="sidebar-title">CLI</div>
89
+ <nav class="sidebar-nav">
90
+ <a href="cli.html" class="sidebar-link">
91
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
92
+ <polyline points="4 17 10 11 4 5" />
93
+ <line x1="12" y1="19" x2="20" y2="19" />
94
+ </svg>
95
+ CLI Reference
96
+ </a>
97
+ </nav>
98
+ </div>
99
+ </aside>
100
+
101
+ <!-- Main Content -->
102
+ <main class="main">
103
+ <div class="content">
104
+ <h1>🚀 Getting Started</h1>
105
+ <p>
106
+ Get OpenCodeHub running locally in under 5 minutes. This guide covers installation,
107
+ configuration, and creating your first repository.
108
+ </p>
109
+
110
+ <!-- Prerequisites -->
111
+ <section>
112
+ <h2>📋 Prerequisites</h2>
113
+
114
+ <div class="feature-grid">
115
+ <div class="card">
116
+ <h3 class="card-title">
117
+ <span>📦</span> Node.js 18+
118
+ </h3>
119
+ <p class="card-description">
120
+ JavaScript runtime for the application. <a href="https://nodejs.org">Download
121
+ Node.js</a>
122
+ </p>
123
+ </div>
124
+ <div class="card">
125
+ <h3 class="card-title">
126
+ <span>🗄️</span> Database
127
+ </h3>
128
+ <p class="card-description">
129
+ PostgreSQL 14+ (recommended), MySQL 8+, or SQLite 3.35+
130
+ </p>
131
+ </div>
132
+ <div class="card">
133
+ <h3 class="card-title">
134
+ <span>🔀</span> Git 2.30+
135
+ </h3>
136
+ <p class="card-description">
137
+ For repository management. Usually pre-installed on Linux/macOS.
138
+ </p>
139
+ </div>
140
+ </div>
141
+ </section>
142
+
143
+ <!-- Installation -->
144
+ <section id="installation">
145
+ <h2>📥 Installation</h2>
146
+
147
+ <div class="steps">
148
+ <div class="step">
149
+ <div class="step-title">Clone the Repository</div>
150
+ <div class="step-content">
151
+ <div class="command-line">
152
+ <span class="command-prompt">$</span>
153
+ <span class="command-text">git clone
154
+ https://github.com/swadhinbiswas/OpencodeHub.git</span>
155
+ </div>
156
+ <div class="command-line">
157
+ <span class="command-prompt">$</span>
158
+ <span class="command-text">cd OpenCodeHub</span>
159
+ </div>
160
+ </div>
161
+ </div>
162
+
163
+ <div class="step">
164
+ <div class="step-title">Install Dependencies</div>
165
+ <div class="step-content">
166
+ <div class="command-line">
167
+ <span class="command-prompt">$</span>
168
+ <span class="command-text">npm install</span>
169
+ </div>
170
+ <p>Or use Bun for faster installation:</p>
171
+ <div class="command-line">
172
+ <span class="command-prompt">$</span>
173
+ <span class="command-text">bun install</span>
174
+ </div>
175
+ </div>
176
+ </div>
177
+
178
+ <div class="step">
179
+ <div class="step-title">Configure Environment</div>
180
+ <div class="step-content">
181
+ <div class="command-line">
182
+ <span class="command-prompt">$</span>
183
+ <span class="command-text">cp .env.example .env</span>
184
+ </div>
185
+ <p>Edit <code>.env</code> with your database connection and secrets.</p>
186
+ </div>
187
+ </div>
188
+
189
+ <div class="step">
190
+ <div class="step-title">Setup Database</div>
191
+ <div class="step-content">
192
+ <div class="command-line">
193
+ <span class="command-prompt">$</span>
194
+ <span class="command-text">npm run db:push</span>
195
+ </div>
196
+ <p>This creates all required database tables.</p>
197
+ </div>
198
+ </div>
199
+
200
+ <div class="step">
201
+ <div class="step-title">Create Admin User</div>
202
+ <div class="step-content">
203
+ <div class="command-line">
204
+ <span class="command-prompt">$</span>
205
+ <span class="command-text">bun run scripts/seed-admin.ts</span>
206
+ </div>
207
+ <p>Follow the prompts to set username, email, and password.</p>
208
+ </div>
209
+ </div>
210
+
211
+ <div class="step">
212
+ <div class="step-title">Start Server</div>
213
+ <div class="step-content">
214
+ <div class="command-line">
215
+ <span class="command-prompt">$</span>
216
+ <span class="command-text">npm run dev</span>
217
+ </div>
218
+ <p>Open <code>http://localhost:3000</code> in your browser!</p>
219
+ </div>
220
+ </div>
221
+ </div>
222
+ </section>
223
+
224
+ <!-- Configuration -->
225
+ <section id="configuration">
226
+ <h2>⚙️ Configuration</h2>
227
+ <p>Key environment variables to configure:</p>
228
+
229
+ <table>
230
+ <thead>
231
+ <tr>
232
+ <th>Variable</th>
233
+ <th>Required</th>
234
+ <th>Description</th>
235
+ </tr>
236
+ </thead>
237
+ <tbody>
238
+ <tr>
239
+ <td><code>DATABASE_URL</code></td>
240
+ <td>✅</td>
241
+ <td>Database connection string</td>
242
+ </tr>
243
+ <tr>
244
+ <td><code>JWT_SECRET</code></td>
245
+ <td>✅</td>
246
+ <td>Secret for JWT tokens (32+ chars)</td>
247
+ </tr>
248
+ <tr>
249
+ <td><code>SESSION_SECRET</code></td>
250
+ <td>✅</td>
251
+ <td>Secret for sessions (32+ chars)</td>
252
+ </tr>
253
+ <tr>
254
+ <td><code>SITE_URL</code></td>
255
+ <td>✅</td>
256
+ <td>Your site URL (e.g., https://git.example.com)</td>
257
+ </tr>
258
+ <tr>
259
+ <td><code>INTERNAL_HOOK_SECRET</code></td>
260
+ <td>✅</td>
261
+ <td>Secret for Git hooks (32+ chars)</td>
262
+ </tr>
263
+ <tr>
264
+ <td><code>STORAGE_TYPE</code></td>
265
+ <td>❌</td>
266
+ <td>local, s3, gcs, or azure</td>
267
+ </tr>
268
+ </tbody>
269
+ </table>
270
+
271
+ <div class="alert alert-success">
272
+ <div class="alert-title">💡 Generating Secrets</div>
273
+ <p>Generate secure secrets with: <code>openssl rand -hex 32</code></p>
274
+ </div>
275
+ </section>
276
+
277
+ <!-- First Repository -->
278
+ <section id="first-repo">
279
+ <h2>📁 Create Your First Repository</h2>
280
+
281
+ <div class="steps">
282
+ <div class="step">
283
+ <div class="step-title">Login to OpenCodeHub</div>
284
+ <div class="step-content">
285
+ <p>Navigate to <code>http://localhost:3000/login</code> and sign in with your admin
286
+ credentials.</p>
287
+ </div>
288
+ </div>
289
+
290
+ <div class="step">
291
+ <div class="step-title">Create Repository</div>
292
+ <div class="step-content">
293
+ <p>Click the <strong>+</strong> button in the header and select <strong>New
294
+ Repository</strong>.</p>
295
+ <p>Fill in the repository name, description, and visibility settings.</p>
296
+ </div>
297
+ </div>
298
+
299
+ <div class="step">
300
+ <div class="step-title">Clone Locally</div>
301
+ <div class="step-content">
302
+ <div class="command-line">
303
+ <span class="command-prompt">$</span>
304
+ <span class="command-text">git clone
305
+ http://localhost:3000/your-username/repo-name.git</span>
306
+ </div>
307
+ </div>
308
+ </div>
309
+
310
+ <div class="step">
311
+ <div class="step-title">Push Your Code</div>
312
+ <div class="step-content">
313
+ <pre><code>cd repo-name
314
+echo "# My Project" > README.md
315
+git add .
316
+git commit -m "Initial commit"
317
+git push origin main</code></pre>
318
+ </div>
319
+ </div>
320
+ </div>
321
+ </section>
322
+
323
+ <!-- Next Steps -->
324
+ <section>
325
+ <h2>📚 Next Steps</h2>
326
+
327
+ <div class="feature-grid">
328
+ <a href="cli.html" class="card" style="text-decoration: none;">
329
+ <h3 class="card-title">💻 Install CLI</h3>
330
+ <p class="card-description">
331
+ Set up the OCH CLI for stacked PRs and terminal workflows.
332
+ </p>
333
+ </a>
334
+ <a href="deployment.html" class="card" style="text-decoration: none;">
335
+ <h3 class="card-title">🚀 Production Deploy</h3>
336
+ <p class="card-description">
337
+ Deploy to Docker, Vercel, or your own VPS with SSL.
338
+ </p>
339
+ </a>
340
+ <a href="api.html" class="card" style="text-decoration: none;">
341
+ <h3 class="card-title">🔌 API Integration</h3>
342
+ <p class="card-description">
343
+ Integrate OpenCodeHub with your existing tools.
344
+ </p>
345
+ </a>
346
+ </div>
347
+ </section>
348
+
349
+ <!-- Footer -->
350
+ <footer
351
+ style="margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--border-primary); text-align: center; color: var(--text-muted);">
352
+ <p>
353
+ Made with ❤️ by <a href="https://github.com/swadhinbiswas">Swadhin Biswas</a> •
354
+ <a href="https://github.com/swadhinbiswas/OpencodeHub">GitHub</a>
355
+ </p>
356
+ </footer>
357
+ </div>
358
+ </main>
359
+ </div>
360
+
361
+ <script>
362
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
363
+ anchor.addEventListener('click', function (e) {
364
+ e.preventDefault();
365
+ document.querySelector(this.getAttribute('href')).scrollIntoView({
366
+ behavior: 'smooth'
367
+ });
368
+ });
369
+ });
370
+ </script>
371
+</body>
372
+
373
+</html>
0
374
▼docs-site/index.html
+335-0
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+
4
+<head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>OpenCodeHub Documentation</title>
8
+ <meta name="description"
9
+ content="Complete documentation for OpenCodeHub - Self-hosted Git platform with stacked PRs, AI review, and CI/CD">
10
+ <link rel="icon" type="image/svg+xml" href="../public/logo.svg">
11
+ <link rel="preconnect" href="https://fonts.googleapis.com">
12
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13
+ <link
14
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
15
+ rel="stylesheet">
16
+ <link rel="stylesheet" href="styles.css">
17
+</head>
18
+
19
+<body>
20
+ <!-- Header -->
21
+ <header class="header">
22
+ <a href="index.html" class="header-logo">
23
+ <img src="../public/logo.svg" alt="OpenCodeHub" height="40">
24
+ </a>
25
+ <nav class="header-nav">
26
+ <a href="getting-started.html">Getting Started</a>
27
+ <a href="deployment.html">Deployment</a>
28
+ <a href="cli.html">CLI</a>
29
+ <a href="api.html">API</a>
30
+ <a href="https://github.com/swadhinbiswas/OpencodeHub" class="btn-github" target="_blank">
31
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
32
+ <path
33
+ d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
34
+ </svg>
35
+ GitHub
36
+ </a>
37
+ </nav>
38
+ </header>
39
+
40
+ <div class="layout">
41
+ <!-- Sidebar -->
42
+ <aside class="sidebar">
43
+ <div class="sidebar-section">
44
+ <div class="sidebar-title">Getting Started</div>
45
+ <nav class="sidebar-nav">
46
+ <a href="getting-started.html" class="sidebar-link active">
47
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
48
+ <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
49
+ </svg>
50
+ Quick Start
51
+ </a>
52
+ <a href="getting-started.html#installation" class="sidebar-link">
53
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
54
+ <path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3" />
55
+ </svg>
56
+ Installation
57
+ </a>
58
+ <a href="getting-started.html#configuration" class="sidebar-link">
59
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
60
+ <circle cx="12" cy="12" r="3" />
61
+ <path
62
+ d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z" />
63
+ </svg>
64
+ Configuration
65
+ </a>
66
+ </nav>
67
+ </div>
68
+
69
+ <div class="sidebar-section">
70
+ <div class="sidebar-title">Deployment</div>
71
+ <nav class="sidebar-nav">
72
+ <a href="deployment.html" class="sidebar-link">
73
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
74
+ <rect x="2" y="3" width="20" height="14" rx="2" ry="2" />
75
+ <path d="M8 21h8M12 17v4" />
76
+ </svg>
77
+ Overview
78
+ </a>
79
+ <a href="deployment.html#docker" class="sidebar-link">
80
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
81
+ <path
82
+ d="M22 12.5c0 .5-.5 1-1 1h-2v-2h2c.5 0 1 .5 1 1zM2 12.5c0-.5.5-1 1-1h2v2H3c-.5 0-1-.5-1-1z" />
83
+ <rect x="6" y="9" width="12" height="6" rx="1" />
84
+ <rect x="8" y="11" width="2" height="2" />
85
+ <rect x="11" y="11" width="2" height="2" />
86
+ <rect x="14" y="11" width="2" height="2" />
87
+ </svg>
88
+ Docker
89
+ </a>
90
+ <a href="deployment.html#vercel" class="sidebar-link">
91
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
92
+ <polygon points="12 2 2 22 22 22" />
93
+ </svg>
94
+ Vercel
95
+ </a>
96
+ <a href="deployment.html#vps" class="sidebar-link">
97
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
98
+ <rect x="2" y="2" width="20" height="8" rx="2" ry="2" />
99
+ <rect x="2" y="14" width="20" height="8" rx="2" ry="2" />
100
+ <line x1="6" y1="6" x2="6.01" y2="6" />
101
+ <line x1="6" y1="18" x2="6.01" y2="18" />
102
+ </svg>
103
+ VPS / Linux
104
+ </a>
105
+ </nav>
106
+ </div>
107
+
108
+ <div class="sidebar-section">
109
+ <div class="sidebar-title">CLI</div>
110
+ <nav class="sidebar-nav">
111
+ <a href="cli.html" class="sidebar-link">
112
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
113
+ <polyline points="4 17 10 11 4 5" />
114
+ <line x1="12" y1="19" x2="20" y2="19" />
115
+ </svg>
116
+ CLI Reference
117
+ </a>
118
+ <a href="cli.html#stacked-prs" class="sidebar-link">
119
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
120
+ <path d="M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2" />
121
+ <rect x="8" y="2" width="8" height="4" rx="1" ry="1" />
122
+ </svg>
123
+ Stacked PRs
124
+ </a>
125
+ </nav>
126
+ </div>
127
+
128
+ <div class="sidebar-section">
129
+ <div class="sidebar-title">API</div>
130
+ <nav class="sidebar-nav">
131
+ <a href="api.html" class="sidebar-link">
132
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
133
+ <path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z" />
134
+ <polyline points="14 2 14 8 20 8" />
135
+ <line x1="16" y1="13" x2="8" y2="13" />
136
+ <line x1="16" y1="17" x2="8" y2="17" />
137
+ <polyline points="10 9 9 9 8 9" />
138
+ </svg>
139
+ REST API
140
+ </a>
141
+ <a href="api.html#webhooks" class="sidebar-link">
142
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
143
+ <path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71" />
144
+ <path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71" />
145
+ </svg>
146
+ Webhooks
147
+ </a>
148
+ </nav>
149
+ </div>
150
+ </aside>
151
+
152
+ <!-- Main Content -->
153
+ <main class="main">
154
+ <div class="content">
155
+ <!-- Hero Section -->
156
+ <section class="hero animate-fade-in">
157
+ <h1>OpenCodeHub Documentation</h1>
158
+ <p class="hero-subtitle">
159
+ Everything you need to deploy, configure, and master OpenCodeHub -
160
+ the self-hosted Git platform with stacked PRs, AI review, and CI/CD.
161
+ </p>
162
+ <div class="hero-buttons">
163
+ <a href="getting-started.html" class="btn btn-primary">
164
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor"
165
+ stroke-width="2">
166
+ <polygon points="5 3 19 12 5 21 5 3" />
167
+ </svg>
168
+ Get Started
169
+ </a>
170
+ <a href="deployment.html" class="btn btn-secondary">
171
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor"
172
+ stroke-width="2">
173
+ <path
174
+ d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z" />
175
+ </svg>
176
+ Deploy Now
177
+ </a>
178
+ </div>
179
+ </section>
180
+
181
+ <!-- Quick Install -->
182
+ <section>
183
+ <h2>⚡ Quick Install</h2>
184
+ <p>Get OpenCodeHub running in minutes with Docker:</p>
185
+
186
+ <div class="command-line">
187
+ <span class="command-prompt">$</span>
188
+ <span class="command-text">git clone https://github.com/swadhinbiswas/OpencodeHub && cd
189
+ OpenCodeHub</span>
190
+ <button class="command-copy"
191
+ onclick="copyCommand(this, 'git clone https://github.com/swadhinbiswas/OpencodeHub && cd OpenCodeHub')">
192
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
193
+ stroke-width="2">
194
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
195
+ <path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" />
196
+ </svg>
197
+ </button>
198
+ </div>
199
+
200
+ <div class="command-line">
201
+ <span class="command-prompt">$</span>
202
+ <span class="command-text">docker-compose up -d</span>
203
+ <button class="command-copy" onclick="copyCommand(this, 'docker-compose up -d')">
204
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
205
+ stroke-width="2">
206
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
207
+ <path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" />
208
+ </svg>
209
+ </button>
210
+ </div>
211
+
212
+ <p>Then visit <code>http://localhost:3000</code> in your browser.</p>
213
+ </section>
214
+
215
+ <!-- Features -->
216
+ <section>
217
+ <h2>✨ Key Features</h2>
218
+ <div class="feature-grid">
219
+ <div class="card">
220
+ <h3 class="card-title">
221
+ <span>📚</span> Stacked Pull Requests
222
+ </h3>
223
+ <p class="card-description">
224
+ Break large changes into reviewable chunks. Ship faster with dependent PRs that
225
+ automatically update.
226
+ </p>
227
+ </div>
228
+ <div class="card">
229
+ <h3 class="card-title">
230
+ <span>🤖</span> AI Code Review
231
+ </h3>
232
+ <p class="card-description">
233
+ Instant feedback from GPT-4 or Claude. Catch security issues, bugs, and code smells
234
+ automatically.
235
+ </p>
236
+ </div>
237
+ <div class="card">
238
+ <h3 class="card-title">
239
+ <span>🔀</span> Smart Merge Queue
240
+ </h3>
241
+ <p class="card-description">
242
+ Stack-aware CI optimization. Batch PRs, auto-rebase, and merge in the correct order.
243
+ </p>
244
+ </div>
245
+ <div class="card">
246
+ <h3 class="card-title">
247
+ <span>⚡</span> CI/CD Pipelines
248
+ </h3>
249
+ <p class="card-description">
250
+ GitHub Actions-compatible workflows. Build, test, and deploy with self-hosted runners.
251
+ </p>
252
+ </div>
253
+ <div class="card">
254
+ <h3 class="card-title">
255
+ <span>🔒</span> Enterprise Security
256
+ </h3>
257
+ <p class="card-description">
258
+ Rate limiting, CSRF protection, audit logging, 2FA, and encrypted secrets management.
259
+ </p>
260
+ </div>
261
+ <div class="card">
262
+ <h3 class="card-title">
263
+ <span>💻</span> Powerful CLI
264
+ </h3>
265
+ <p class="card-description">
266
+ Stack-first workflows from your terminal. Manage PRs, sync stacks, and more.
267
+ </p>
268
+ </div>
269
+ </div>
270
+ </section>
271
+
272
+ <!-- Documentation Sections -->
273
+ <section>
274
+ <h2>📖 Documentation</h2>
275
+
276
+ <div class="card" style="cursor: pointer" onclick="location.href='getting-started.html'">
277
+ <h3 class="card-title">🚀 Getting Started</h3>
278
+ <p class="card-description">
279
+ Install OpenCodeHub, create your first repository, and configure your environment.
280
+ </p>
281
+ </div>
282
+
283
+ <div class="card" style="cursor: pointer" onclick="location.href='deployment.html'">
284
+ <h3 class="card-title">🌐 Deployment Guide</h3>
285
+ <p class="card-description">
286
+ Deploy to Docker, Vercel, VPS, or any cloud provider with production-ready configurations.
287
+ </p>
288
+ </div>
289
+
290
+ <div class="card" style="cursor: pointer" onclick="location.href='cli.html'">
291
+ <h3 class="card-title">💻 CLI Reference</h3>
292
+ <p class="card-description">
293
+ Complete command reference for the OpenCodeHub CLI. Stack management, authentication, and
294
+ more.
295
+ </p>
296
+ </div>
297
+
298
+ <div class="card" style="cursor: pointer" onclick="location.href='api.html'">
299
+ <h3 class="card-title">🔌 API Documentation</h3>
300
+ <p class="card-description">
301
+ REST API reference, webhook events, and authentication for programmatic access.
302
+ </p>
303
+ </div>
304
+ </section>
305
+
306
+ <!-- Footer -->
307
+ <footer
308
+ style="margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--border-primary); text-align: center; color: var(--text-muted);">
309
+ <p>
310
+ Made with ❤️ by <a href="https://github.com/swadhinbiswas">Swadhin Biswas</a> •
311
+ <a href="https://github.com/swadhinbiswas/OpencodeHub">GitHub</a> •
312
+ <a href="https://github.com/swadhinbiswas/OpencodeHub/blob/main/LICENSE">MIT License</a>
313
+ </p>
314
+ </footer>
315
+ </div>
316
+ </main>
317
+ </div>
318
+
319
+ <script>
320
+ function copyCommand(button, text) {
321
+ navigator.clipboard.writeText(text);
322
+ button.classList.add('copied');
323
+ setTimeout(() => button.classList.remove('copied'), 2000);
324
+ }
325
+
326
+ // Update active sidebar link based on current page
327
+ document.querySelectorAll('.sidebar-link').forEach(link => {
328
+ if (link.href === window.location.href) {
329
+ link.classList.add('active');
330
+ }
331
+ });
332
+ </script>
333
+</body>
334
+
335
+</html>
0
336
▼docs-site/styles.css
+689-0
1
+/* OpenCodeHub Documentation Site - Professional Design System */
2
+:root {
3
+ /* Core Colors */
4
+ --primary: #22c55e;
5
+ --primary-dark: #16a34a;
6
+ --primary-light: #4ade80;
7
+ --accent: #3b82f6;
8
+ --accent-light: #60a5fa;
9
+
10
+ /* Dark Theme */
11
+ --bg-primary: #0f172a;
12
+ --bg-secondary: #1e293b;
13
+ --bg-tertiary: #334155;
14
+ --bg-card: rgba(30, 41, 59, 0.8);
15
+ --bg-hover: rgba(51, 65, 85, 0.5);
16
+
17
+ /* Text Colors */
18
+ --text-primary: #f8fafc;
19
+ --text-secondary: #94a3b8;
20
+ --text-muted: #64748b;
21
+
22
+ /* Border Colors */
23
+ --border-primary: rgba(148, 163, 184, 0.1);
24
+ --border-hover: rgba(148, 163, 184, 0.2);
25
+
26
+ /* Glassmorphism */
27
+ --glass-bg: rgba(15, 23, 42, 0.8);
28
+ --glass-blur: blur(20px);
29
+
30
+ /* Typography Scale */
31
+ --font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
32
+ --text-xs: 0.75rem;
33
+ --text-sm: 0.875rem;
34
+ --text-base: 1rem;
35
+ --text-lg: 1.125rem;
36
+ --text-xl: 1.25rem;
37
+ --text-2xl: 1.5rem;
38
+ --text-3xl: 1.875rem;
39
+ --text-4xl: 2.25rem;
40
+
41
+ /* Spacing */
42
+ --spacing-1: 0.25rem;
43
+ --spacing-2: 0.5rem;
44
+ --spacing-3: 0.75rem;
45
+ --spacing-4: 1rem;
46
+ --spacing-6: 1.5rem;
47
+ --spacing-8: 2rem;
48
+ --spacing-12: 3rem;
49
+ --spacing-16: 4rem;
50
+
51
+ /* Border Radius */
52
+ --radius-sm: 0.375rem;
53
+ --radius-md: 0.5rem;
54
+ --radius-lg: 0.75rem;
55
+ --radius-xl: 1rem;
56
+
57
+ /* Shadows */
58
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
59
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3);
60
+ --shadow-lg: 0 10px 25px rgba(0, 0, 0, 0.4);
61
+ --shadow-glow: 0 0 40px rgba(34, 197, 94, 0.15);
62
+
63
+ /* Transitions */
64
+ --transition-fast: 150ms ease;
65
+ --transition-base: 200ms ease;
66
+ --transition-slow: 300ms ease;
67
+
68
+ /* Layout */
69
+ --sidebar-width: 280px;
70
+ --header-height: 64px;
71
+ --max-content-width: 900px;
72
+}
73
+
74
+/* Reset */
75
+*, *::before, *::after {
76
+ box-sizing: border-box;
77
+ margin: 0;
78
+ padding: 0;
79
+}
80
+
81
+html {
82
+ scroll-behavior: smooth;
83
+}
84
+
85
+body {
86
+ font-family: var(--font-family);
87
+ font-size: var(--text-base);
88
+ line-height: 1.6;
89
+ color: var(--text-primary);
90
+ background: var(--bg-primary);
91
+ min-height: 100vh;
92
+ -webkit-font-smoothing: antialiased;
93
+ -moz-osx-font-smoothing: grayscale;
94
+}
95
+
96
+/* Background Pattern */
97
+body::before {
98
+ content: '';
99
+ position: fixed;
100
+ top: 0;
101
+ left: 0;
102
+ right: 0;
103
+ bottom: 0;
104
+ background:
105
+ radial-gradient(circle at 20% 20%, rgba(34, 197, 94, 0.05) 0%, transparent 50%),
106
+ radial-gradient(circle at 80% 80%, rgba(59, 130, 246, 0.05) 0%, transparent 50%);
107
+ pointer-events: none;
108
+ z-index: -1;
109
+}
110
+
111
+a {
112
+ color: var(--primary);
113
+ text-decoration: none;
114
+ transition: color var(--transition-fast);
115
+}
116
+
117
+a:hover {
118
+ color: var(--primary-light);
119
+}
120
+
121
+/* Header */
122
+.header {
123
+ position: fixed;
124
+ top: 0;
125
+ left: 0;
126
+ right: 0;
127
+ height: var(--header-height);
128
+ background: var(--glass-bg);
129
+ backdrop-filter: var(--glass-blur);
130
+ border-bottom: 1px solid var(--border-primary);
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: space-between;
134
+ padding: 0 var(--spacing-6);
135
+ z-index: 100;
136
+}
137
+
138
+.header-logo {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: var(--spacing-3);
142
+}
143
+
144
+.header-logo img {
145
+ height: 36px;
146
+ width: auto;
147
+}
148
+
149
+.header-logo span {
150
+ font-size: var(--text-xl);
151
+ font-weight: 700;
152
+ background: linear-gradient(135deg, var(--text-primary), var(--text-secondary));
153
+ -webkit-background-clip: text;
154
+ -webkit-text-fill-color: transparent;
155
+ background-clip: text;
156
+}
157
+
158
+.header-nav {
159
+ display: flex;
160
+ align-items: center;
161
+ gap: var(--spacing-4);
162
+}
163
+
164
+.header-nav a {
165
+ color: var(--text-secondary);
166
+ font-size: var(--text-sm);
167
+ font-weight: 500;
168
+ padding: var(--spacing-2) var(--spacing-3);
169
+ border-radius: var(--radius-md);
170
+ transition: all var(--transition-fast);
171
+}
172
+
173
+.header-nav a:hover {
174
+ color: var(--text-primary);
175
+ background: var(--bg-hover);
176
+}
177
+
178
+.btn-github {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: var(--spacing-2);
182
+ background: var(--bg-tertiary);
183
+ padding: var(--spacing-2) var(--spacing-4);
184
+ border-radius: var(--radius-md);
185
+ color: var(--text-primary) !important;
186
+}
187
+
188
+.btn-github:hover {
189
+ background: var(--bg-hover);
190
+}
191
+
192
+/* Layout */
193
+.layout {
194
+ display: flex;
195
+ min-height: 100vh;
196
+ padding-top: var(--header-height);
197
+}
198
+
199
+/* Sidebar */
200
+.sidebar {
201
+ position: fixed;
202
+ top: var(--header-height);
203
+ left: 0;
204
+ bottom: 0;
205
+ width: var(--sidebar-width);
206
+ background: var(--bg-secondary);
207
+ border-right: 1px solid var(--border-primary);
208
+ overflow-y: auto;
209
+ padding: var(--spacing-6);
210
+}
211
+
212
+.sidebar-section {
213
+ margin-bottom: var(--spacing-6);
214
+}
215
+
216
+.sidebar-title {
217
+ font-size: var(--text-xs);
218
+ font-weight: 600;
219
+ text-transform: uppercase;
220
+ letter-spacing: 0.05em;
221
+ color: var(--text-muted);
222
+ margin-bottom: var(--spacing-3);
223
+}
224
+
225
+.sidebar-nav {
226
+ display: flex;
227
+ flex-direction: column;
228
+ gap: var(--spacing-1);
229
+}
230
+
231
+.sidebar-link {
232
+ display: flex;
233
+ align-items: center;
234
+ gap: var(--spacing-3);
235
+ padding: var(--spacing-2) var(--spacing-3);
236
+ border-radius: var(--radius-md);
237
+ color: var(--text-secondary);
238
+ font-size: var(--text-sm);
239
+ transition: all var(--transition-fast);
240
+}
241
+
242
+.sidebar-link:hover {
243
+ color: var(--text-primary);
244
+ background: var(--bg-hover);
245
+}
246
+
247
+.sidebar-link.active {
248
+ color: var(--primary);
249
+ background: rgba(34, 197, 94, 0.1);
250
+}
251
+
252
+.sidebar-link svg {
253
+ width: 18px;
254
+ height: 18px;
255
+ flex-shrink: 0;
256
+}
257
+
258
+/* Main Content */
259
+.main {
260
+ margin-left: var(--sidebar-width);
261
+ flex: 1;
262
+ padding: var(--spacing-8);
263
+ max-width: calc(var(--max-content-width) + var(--spacing-16));
264
+}
265
+
266
+.content {
267
+ max-width: var(--max-content-width);
268
+}
269
+
270
+/* Typography */
271
+h1, h2, h3, h4, h5, h6 {
272
+ font-weight: 600;
273
+ color: var(--text-primary);
274
+ margin-bottom: var(--spacing-4);
275
+}
276
+
277
+h1 {
278
+ font-size: var(--text-4xl);
279
+ line-height: 1.2;
280
+ margin-bottom: var(--spacing-6);
281
+}
282
+
283
+h2 {
284
+ font-size: var(--text-2xl);
285
+ margin-top: var(--spacing-12);
286
+ padding-bottom: var(--spacing-3);
287
+ border-bottom: 1px solid var(--border-primary);
288
+}
289
+
290
+h3 {
291
+ font-size: var(--text-xl);
292
+ margin-top: var(--spacing-8);
293
+}
294
+
295
+p {
296
+ margin-bottom: var(--spacing-4);
297
+ color: var(--text-secondary);
298
+}
299
+
300
+/* Lists */
301
+ul, ol {
302
+ margin-bottom: var(--spacing-4);
303
+ padding-left: var(--spacing-6);
304
+}
305
+
306
+li {
307
+ color: var(--text-secondary);
308
+ margin-bottom: var(--spacing-2);
309
+}
310
+
311
+li::marker {
312
+ color: var(--primary);
313
+}
314
+
315
+/* Code Blocks */
316
+code {
317
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
318
+ font-size: 0.9em;
319
+ background: var(--bg-tertiary);
320
+ padding: 0.2em 0.4em;
321
+ border-radius: var(--radius-sm);
322
+}
323
+
324
+pre {
325
+ background: var(--bg-secondary);
326
+ border: 1px solid var(--border-primary);
327
+ border-radius: var(--radius-lg);
328
+ padding: var(--spacing-4);
329
+ overflow-x: auto;
330
+ margin-bottom: var(--spacing-6);
331
+}
332
+
333
+pre code {
334
+ background: none;
335
+ padding: 0;
336
+ font-size: var(--text-sm);
337
+ line-height: 1.7;
338
+}
339
+
340
+/* Cards */
341
+.card {
342
+ background: var(--bg-card);
343
+ border: 1px solid var(--border-primary);
344
+ border-radius: var(--radius-lg);
345
+ padding: var(--spacing-6);
346
+ margin-bottom: var(--spacing-4);
347
+ backdrop-filter: var(--glass-blur);
348
+ transition: all var(--transition-base);
349
+}
350
+
351
+.card:hover {
352
+ border-color: var(--border-hover);
353
+ box-shadow: var(--shadow-md);
354
+}
355
+
356
+.card-title {
357
+ font-size: var(--text-lg);
358
+ font-weight: 600;
359
+ margin-bottom: var(--spacing-2);
360
+ display: flex;
361
+ align-items: center;
362
+ gap: var(--spacing-2);
363
+}
364
+
365
+.card-description {
366
+ color: var(--text-secondary);
367
+ font-size: var(--text-sm);
368
+}
369
+
370
+/* Feature Grid */
371
+.feature-grid {
372
+ display: grid;
373
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
374
+ gap: var(--spacing-4);
375
+ margin: var(--spacing-6) 0;
376
+}
377
+
378
+/* Steps */
379
+.steps {
380
+ counter-reset: step;
381
+ margin: var(--spacing-6) 0;
382
+}
383
+
384
+.step {
385
+ position: relative;
386
+ padding-left: var(--spacing-12);
387
+ margin-bottom: var(--spacing-6);
388
+}
389
+
390
+.step::before {
391
+ counter-increment: step;
392
+ content: counter(step);
393
+ position: absolute;
394
+ left: 0;
395
+ top: 0;
396
+ width: 32px;
397
+ height: 32px;
398
+ background: linear-gradient(135deg, var(--primary), var(--primary-dark));
399
+ color: white;
400
+ font-weight: 600;
401
+ font-size: var(--text-sm);
402
+ display: flex;
403
+ align-items: center;
404
+ justify-content: center;
405
+ border-radius: 50%;
406
+}
407
+
408
+.step-title {
409
+ font-size: var(--text-lg);
410
+ font-weight: 600;
411
+ margin-bottom: var(--spacing-2);
412
+}
413
+
414
+.step-content {
415
+ color: var(--text-secondary);
416
+}
417
+
418
+/* Alerts */
419
+.alert {
420
+ padding: var(--spacing-4);
421
+ border-radius: var(--radius-lg);
422
+ margin-bottom: var(--spacing-4);
423
+ border-left: 4px solid;
424
+}
425
+
426
+.alert-info {
427
+ background: rgba(59, 130, 246, 0.1);
428
+ border-color: var(--accent);
429
+}
430
+
431
+.alert-warning {
432
+ background: rgba(234, 179, 8, 0.1);
433
+ border-color: #eab308;
434
+}
435
+
436
+.alert-success {
437
+ background: rgba(34, 197, 94, 0.1);
438
+ border-color: var(--primary);
439
+}
440
+
441
+.alert-title {
442
+ font-weight: 600;
443
+ margin-bottom: var(--spacing-2);
444
+}
445
+
446
+/* Tables */
447
+table {
448
+ width: 100%;
449
+ border-collapse: collapse;
450
+ margin-bottom: var(--spacing-6);
451
+ background: var(--bg-card);
452
+ border-radius: var(--radius-lg);
453
+ overflow: hidden;
454
+}
455
+
456
+th, td {
457
+ padding: var(--spacing-3) var(--spacing-4);
458
+ text-align: left;
459
+ border-bottom: 1px solid var(--border-primary);
460
+}
461
+
462
+th {
463
+ background: var(--bg-tertiary);
464
+ font-weight: 600;
465
+ color: var(--text-primary);
466
+ font-size: var(--text-sm);
467
+}
468
+
469
+td {
470
+ color: var(--text-secondary);
471
+ font-size: var(--text-sm);
472
+}
473
+
474
+tr:last-child td {
475
+ border-bottom: none;
476
+}
477
+
478
+/* Buttons */
479
+.btn {
480
+ display: inline-flex;
481
+ align-items: center;
482
+ gap: var(--spacing-2);
483
+ padding: var(--spacing-3) var(--spacing-6);
484
+ border-radius: var(--radius-md);
485
+ font-weight: 500;
486
+ font-size: var(--text-sm);
487
+ cursor: pointer;
488
+ transition: all var(--transition-fast);
489
+ border: none;
490
+}
491
+
492
+.btn-primary {
493
+ background: linear-gradient(135deg, var(--primary), var(--primary-dark));
494
+ color: white;
495
+ box-shadow: var(--shadow-glow);
496
+}
497
+
498
+.btn-primary:hover {
499
+ transform: translateY(-2px);
500
+ box-shadow: 0 0 50px rgba(34, 197, 94, 0.25);
501
+ color: white;
502
+}
503
+
504
+.btn-secondary {
505
+ background: var(--bg-tertiary);
506
+ color: var(--text-primary);
507
+}
508
+
509
+.btn-secondary:hover {
510
+ background: var(--bg-hover);
511
+}
512
+
513
+/* Hero Section */
514
+.hero {
515
+ text-align: center;
516
+ padding: var(--spacing-16) 0;
517
+ margin-bottom: var(--spacing-12);
518
+}
519
+
520
+.hero h1 {
521
+ font-size: 3rem;
522
+ background: linear-gradient(135deg, var(--text-primary), var(--primary));
523
+ -webkit-background-clip: text;
524
+ -webkit-text-fill-color: transparent;
525
+ background-clip: text;
526
+}
527
+
528
+.hero-subtitle {
529
+ font-size: var(--text-xl);
530
+ color: var(--text-secondary);
531
+ margin-bottom: var(--spacing-8);
532
+ max-width: 600px;
533
+ margin-left: auto;
534
+ margin-right: auto;
535
+}
536
+
537
+.hero-buttons {
538
+ display: flex;
539
+ gap: var(--spacing-4);
540
+ justify-content: center;
541
+}
542
+
543
+/* Command Line */
544
+.command-line {
545
+ display: flex;
546
+ align-items: center;
547
+ background: var(--bg-secondary);
548
+ border: 1px solid var(--border-primary);
549
+ border-radius: var(--radius-lg);
550
+ padding: var(--spacing-4);
551
+ margin: var(--spacing-4) 0;
552
+ font-family: 'JetBrains Mono', monospace;
553
+}
554
+
555
+.command-prompt {
556
+ color: var(--primary);
557
+ margin-right: var(--spacing-2);
558
+}
559
+
560
+.command-text {
561
+ color: var(--text-primary);
562
+ flex: 1;
563
+}
564
+
565
+.command-copy {
566
+ background: var(--bg-tertiary);
567
+ border: none;
568
+ color: var(--text-secondary);
569
+ padding: var(--spacing-2);
570
+ border-radius: var(--radius-sm);
571
+ cursor: pointer;
572
+ transition: all var(--transition-fast);
573
+}
574
+
575
+.command-copy:hover {
576
+ color: var(--text-primary);
577
+ background: var(--bg-hover);
578
+}
579
+
580
+/* Badges */
581
+.badge {
582
+ display: inline-flex;
583
+ align-items: center;
584
+ gap: var(--spacing-1);
585
+ padding: var(--spacing-1) var(--spacing-2);
586
+ background: var(--bg-tertiary);
587
+ border-radius: var(--radius-sm);
588
+ font-size: var(--text-xs);
589
+ color: var(--text-secondary);
590
+}
591
+
592
+.badge-primary {
593
+ background: rgba(34, 197, 94, 0.2);
594
+ color: var(--primary-light);
595
+}
596
+
597
+/* Responsive */
598
+@media (max-width: 1024px) {
599
+ .sidebar {
600
+ display: none;
601
+ }
602
+
603
+ .main {
604
+ margin-left: 0;
605
+ }
606
+}
607
+
608
+@media (max-width: 768px) {
609
+ .header {
610
+ padding: 0 var(--spacing-4);
611
+ }
612
+
613
+ .header-nav {
614
+ display: none;
615
+ }
616
+
617
+ .main {
618
+ padding: var(--spacing-4);
619
+ }
620
+
621
+ h1 {
622
+ font-size: var(--text-3xl);
623
+ }
624
+
625
+ .hero {
626
+ padding: var(--spacing-8) 0;
627
+ }
628
+
629
+ .hero h1 {
630
+ font-size: var(--text-3xl);
631
+ }
632
+
633
+ .hero-buttons {
634
+ flex-direction: column;
635
+ align-items: stretch;
636
+ }
637
+
638
+ .feature-grid {
639
+ grid-template-columns: 1fr;
640
+ }
641
+}
642
+
643
+/* Scrollbar */
644
+::-webkit-scrollbar {
645
+ width: 8px;
646
+ height: 8px;
647
+}
648
+
649
+::-webkit-scrollbar-track {
650
+ background: var(--bg-secondary);
651
+}
652
+
653
+::-webkit-scrollbar-thumb {
654
+ background: var(--bg-tertiary);
655
+ border-radius: 4px;
656
+}
657
+
658
+::-webkit-scrollbar-thumb:hover {
659
+ background: var(--text-muted);
660
+}
661
+
662
+/* Animations */
663
+@keyframes fadeIn {
664
+ from { opacity: 0; transform: translateY(10px); }
665
+ to { opacity: 1; transform: translateY(0); }
666
+}
667
+
668
+.animate-fade-in {
669
+ animation: fadeIn 0.5s ease forwards;
670
+}
671
+
672
+/* Copy button tooltip */
673
+.copied {
674
+ position: relative;
675
+}
676
+
677
+.copied::after {
678
+ content: 'Copied!';
679
+ position: absolute;
680
+ top: -30px;
681
+ left: 50%;
682
+ transform: translateX(-50%);
683
+ background: var(--primary);
684
+ color: white;
685
+ padding: 4px 8px;
686
+ border-radius: var(--radius-sm);
687
+ font-size: var(--text-xs);
688
+ animation: fadeIn 0.2s ease;
689
+}
0
690
▼docs/GDRIVE_STACK.md
+91-0
1
+
2
+## ☁️ Google Drive + Turso + Gmail Stack
3
+
4
+This stack is ideal for cost-effective, serverless-style deployments where you want to minimize persistent volume usage and use managed services.
5
+
6
+### 1. Database: Turso (LibSQL)
7
+
8
+Turso is a managed SQLite-compatible database perfect for edge deployments.
9
+
10
+**Get Credentials:**
11
+1. Create a database on [Turso](https://turso.tech).
12
+2. Get your Database URL (e.g., `libsql://db-name-user.turso.io`).
13
+3. Create an Auth Token.
14
+
15
+**Configuration:**
16
+```env
17
+DATABASE_DRIVER=libsql
18
+DATABASE_URL=libsql://your-db.turso.io
19
+DATABASE_AUTH_TOKEN=your-auth-token
20
+```
21
+
22
+### 2. Storage: Google Drive
23
+
24
+Store repositories and LFS objects in a Google Drive folder.
25
+
26
+**Get Credentials:**
27
+1. Go to [Google Cloud Console](https://console.cloud.google.com).
28
+2. Create a project and enable the **Google Drive API**.
29
+3. Configure OAuth Consent Screen (Internal or External).
30
+4. Create Credentials -> **OAuth Client ID** (Web Application).
31
+ - Set Redirect URI to `https://developers.google.com/oauthplayground` (for generating token).
32
+5. Go to [OAuth 2.0 Playground](https://developers.google.com/oauthplayground).
33
+ - Step 1: Input your own scope: `https://www.googleapis.com/auth/drive.file`
34
+ - Step 2: Use your Client ID & Secret in settings.
35
+ - Step 3: Authorize and exchange for **Refresh Token**.
36
+6. Create a folder in Google Drive and copy its **Folder ID** (from URL).
37
+
38
+**Configuration:**
39
+```env
40
+STORAGE_TYPE=gdrive
41
+GOOGLE_CLIENT_ID=your-client-id
42
+GOOGLE_CLIENT_SECRET=your-client-secret
43
+GOOGLE_REFRESH_TOKEN=your-refresh-token
44
+GOOGLE_FOLDER_ID=your-folder-id
45
+```
46
+
47
+### 3. Email: Google Mail (Gmail SMTP)
48
+
49
+Use Gmail to send system emails.
50
+
51
+**Get Credentials:**
52
+1. Enable 2-Step Verification on your Google Account.
53
+2. Go to **App Passwords** (Security settings).
54
+3. Create a new App Password for "Mail".
55
+
56
+**Configuration:**
57
+```env
58
+SMTP_HOST=smtp.gmail.com
59
+SMTP_PORT=587
60
61
+SMTP_PASSWORD=your-app-password
62
+SMTP_FROM=OpenCodeHub <[email protected]>
63
+```
64
+
65
+### 4. Full `.env` Example
66
+
67
+```env
68
+# Security
69
+JWT_SECRET=<run: openssl rand -hex 32>
70
+SESSION_SECRET=<run: openssl rand -hex 32>
71
+INTERNAL_HOOK_SECRET=<run: openssl rand -hex 32>
72
+SITE_URL=https://your-app.com
73
+
74
+# Turso Database
75
+DATABASE_DRIVER=libsql
76
+DATABASE_URL=libsql://...
77
+DATABASE_AUTH_TOKEN=...
78
+
79
+# Google Drive Storage
80
+STORAGE_TYPE=gdrive
81
+GOOGLE_CLIENT_ID=...
82
+GOOGLE_CLIENT_SECRET=...
83
+GOOGLE_REFRESH_TOKEN=...
84
+GOOGLE_FOLDER_ID=...
85
+
86
+# Gmail
87
+SMTP_HOST=smtp.gmail.com
88
+SMTP_PORT=587
89
+SMTP_USER=...
90
+SMTP_PASSWORD=...
91
+```
0
92
▼docs/GRAFANA_SETUP.md
+58-0
1
+# Setting up Grafana Cloud Logging (OTLP)
2
+
3
+This guide explains how to get the credentials required to stream logs from OpenCodeHub to Grafana Cloud using the OTLP (OpenTelemetry) protocol.
4
+
5
+## Prerequisites
6
+
7
+1. A verified account on [Grafana Cloud](https://grafana.com/products/cloud/). (They have a generous free tier).
8
+
9
+## Step-by-Step Guide
10
+
11
+1. **Log in** to your Grafana Cloud Portal at [grafana.com](https://grafana.com).
12
+2. Navigate to **"My Account"** or the main dashboard.
13
+3. Find your **Stack** and locate the **"OpenTelemetry"** or **"OTLP"** section.
14
+4. Click on **"Configure"** or **"Details"**.
15
+
16
+## Finding Your Credentials
17
+
18
+You will need three values for your `.env` file:
19
+
20
+### 1. GRAFANA_OTLP_ENDPOINT
21
+* The OTLP endpoint URL for your region.
22
+* Examples:
23
+ - Asia-Pacific: `https://otlp-gateway-prod-ap-south-1.grafana.net/otlp/v1/logs`
24
+ - US: `https://otlp-gateway-prod-us-central-0.grafana.net/otlp/v1/logs`
25
+ - EU: `https://otlp-gateway-prod-eu-west-0.grafana.net/otlp/v1/logs`
26
+
27
+### 2. GRAFANA_INSTANCE_ID
28
+* Your Loki/OTLP **Instance ID** (numeric).
29
+* Found in the OTLP or Loki configuration section.
30
+
31
+### 3. GRAFANA_API_KEY
32
+* Generate an API Key (Access Policy Token) with **logs:write** scope.
33
+* Navigate to **Access Policies** → **Create Access Policy**.
34
+* Give it a name (e.g., `opencodehub-logger`).
35
+* Ensure it has scope/permission to `logs:write`.
36
+* Copy the generated token.
37
+
38
+## Final Configuration
39
+
40
+Update your `.env` file:
41
+
42
+```bash
43
+# Grafana Cloud OTLP Logging
44
+GRAFANA_OTLP_ENDPOINT=https://otlp-gateway-prod-ap-south-1.grafana.net/otlp/v1/logs
45
+GRAFANA_INSTANCE_ID=1273345
46
+GRAFANA_API_KEY=your_long_api_key_token_here
47
+```
48
+
49
+Restart your application for changes to take effect:
50
+```bash
51
+bun run dev
52
+```
53
+
54
+## Viewing Logs in Grafana
55
+
56
+1. Go to your Grafana Cloud dashboard
57
+2. Navigate to **Explore** → Select **Loki** as the data source
58
+3. Query logs with: `{service_name="opencodehub"}`
0
59
▼docs/publishing.md
+43-0
1
+# Publishing Guide
2
+
3
+## NPM Registry
4
+
5
+To publish the OpenCodeHub CLI to the official npm registry:
6
+
7
+1. **Login to npm**:
8
+ ```bash
9
+ npm login
10
+ ```
11
+
12
+2. **Run the publish script**:
13
+ ```bash
14
+ ./scripts/publish-cli.sh
15
+ ```
16
+
17
+## GitHub Packages (Other Registry)
18
+
19
+To publish to GitHub Packages:
20
+
21
+1. **Configure `.npmrc`**:
22
+ Create a `.npmrc` file in `cli/` with:
23
+ ```ini
24
+ @swadhinbiswas:registry=https://npm.pkg.github.com
25
+ ```
26
+
27
+2. **Update Package Name**:
28
+ In `cli/package.json`, change the name to allow scoped publishing:
29
+ ```json
30
+ "name": "@swadhinbiswas/opencodehub-cli"
31
+ ```
32
+
33
+3. **Authenticate**:
34
+ Generate a Value Access Token (PAT) with `write:packages` scope on GitHub.
35
+ ```bash
36
+ npm login --scope=@swadhinbiswas --registry=https://npm.pkg.github.com
37
+ ```
38
+
39
+4. **Publish**:
40
+ ```bash
41
+ cd cli
42
+ npm publish
43
+ ```
0
44
▼package.json
+2-0
29
29
"@astrojs/node": "^8.3.0",
30
30
"@astrojs/react": "^3.6.0",
31
31
"@astrojs/tailwind": "^5.1.0",
32
+ "@astrojs/vercel": "^9.0.2",
32
33
"@aws-sdk/client-s3": "^3.948.0",
33
34
"@aws-sdk/s3-request-presigner": "^3.948.0",
34
35
"@libsql/client": "^0.15.15",
91
92
"otplib": "^12.0.1",
92
93
"pg": "^8.16.3",
93
94
"pino": "^10.1.0",
95
+ "pino-loki": "^3.0.0",
94
96
"postgres": "^3.4.7",
95
97
"prom-client": "^15.1.3",
96
98
"react": "^18.3.1",
97
99
▼packages/sdk/package-lock.json
+2109-0
1
+{
2
+ "name": "@opencodehub/sdk",
3
+ "version": "0.1.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "@opencodehub/sdk",
9
+ "version": "0.1.0",
10
+ "license": "MIT",
11
+ "dependencies": {
12
+ "axios": "^1.6.0"
13
+ },
14
+ "devDependencies": {
15
+ "typescript": "^5.0.0",
16
+ "vitest": "^1.0.0"
17
+ }
18
+ },
19
+ "node_modules/@esbuild/aix-ppc64": {
20
+ "version": "0.21.5",
21
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
22
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
23
+ "cpu": [
24
+ "ppc64"
25
+ ],
26
+ "dev": true,
27
+ "license": "MIT",
28
+ "optional": true,
29
+ "os": [
30
+ "aix"
31
+ ],
32
+ "engines": {
33
+ "node": ">=12"
34
+ }
35
+ },
36
+ "node_modules/@esbuild/android-arm": {
37
+ "version": "0.21.5",
38
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
39
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
40
+ "cpu": [
41
+ "arm"
42
+ ],
43
+ "dev": true,
44
+ "license": "MIT",
45
+ "optional": true,
46
+ "os": [
47
+ "android"
48
+ ],
49
+ "engines": {
50
+ "node": ">=12"
51
+ }
52
+ },
53
+ "node_modules/@esbuild/android-arm64": {
54
+ "version": "0.21.5",
55
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
56
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
57
+ "cpu": [
58
+ "arm64"
59
+ ],
60
+ "dev": true,
61
+ "license": "MIT",
62
+ "optional": true,
63
+ "os": [
64
+ "android"
65
+ ],
66
+ "engines": {
67
+ "node": ">=12"
68
+ }
69
+ },
70
+ "node_modules/@esbuild/android-x64": {
71
+ "version": "0.21.5",
72
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
73
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
74
+ "cpu": [
75
+ "x64"
76
+ ],
77
+ "dev": true,
78
+ "license": "MIT",
79
+ "optional": true,
80
+ "os": [
81
+ "android"
82
+ ],
83
+ "engines": {
84
+ "node": ">=12"
85
+ }
86
+ },
87
+ "node_modules/@esbuild/darwin-arm64": {
88
+ "version": "0.21.5",
89
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
90
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
91
+ "cpu": [
92
+ "arm64"
93
+ ],
94
+ "dev": true,
95
+ "license": "MIT",
96
+ "optional": true,
97
+ "os": [
98
+ "darwin"
99
+ ],
100
+ "engines": {
101
+ "node": ">=12"
102
+ }
103
+ },
104
+ "node_modules/@esbuild/darwin-x64": {
105
+ "version": "0.21.5",
106
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
107
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
108
+ "cpu": [
109
+ "x64"
110
+ ],
111
+ "dev": true,
112
+ "license": "MIT",
113
+ "optional": true,
114
+ "os": [
115
+ "darwin"
116
+ ],
117
+ "engines": {
118
+ "node": ">=12"
119
+ }
120
+ },
121
+ "node_modules/@esbuild/freebsd-arm64": {
122
+ "version": "0.21.5",
123
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
124
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
125
+ "cpu": [
126
+ "arm64"
127
+ ],
128
+ "dev": true,
129
+ "license": "MIT",
130
+ "optional": true,
131
+ "os": [
132
+ "freebsd"
133
+ ],
134
+ "engines": {
135
+ "node": ">=12"
136
+ }
137
+ },
138
+ "node_modules/@esbuild/freebsd-x64": {
139
+ "version": "0.21.5",
140
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
141
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
142
+ "cpu": [
143
+ "x64"
144
+ ],
145
+ "dev": true,
146
+ "license": "MIT",
147
+ "optional": true,
148
+ "os": [
149
+ "freebsd"
150
+ ],
151
+ "engines": {
152
+ "node": ">=12"
153
+ }
154
+ },
155
+ "node_modules/@esbuild/linux-arm": {
156
+ "version": "0.21.5",
157
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
158
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
159
+ "cpu": [
160
+ "arm"
161
+ ],
162
+ "dev": true,
163
+ "license": "MIT",
164
+ "optional": true,
165
+ "os": [
166
+ "linux"
167
+ ],
168
+ "engines": {
169
+ "node": ">=12"
170
+ }
171
+ },
172
+ "node_modules/@esbuild/linux-arm64": {
173
+ "version": "0.21.5",
174
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
175
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
176
+ "cpu": [
177
+ "arm64"
178
+ ],
179
+ "dev": true,
180
+ "license": "MIT",
181
+ "optional": true,
182
+ "os": [
183
+ "linux"
184
+ ],
185
+ "engines": {
186
+ "node": ">=12"
187
+ }
188
+ },
189
+ "node_modules/@esbuild/linux-ia32": {
190
+ "version": "0.21.5",
191
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
192
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
193
+ "cpu": [
194
+ "ia32"
195
+ ],
196
+ "dev": true,
197
+ "license": "MIT",
198
+ "optional": true,
199
+ "os": [
200
+ "linux"
201
+ ],
202
+ "engines": {
203
+ "node": ">=12"
204
+ }
205
+ },
206
+ "node_modules/@esbuild/linux-loong64": {
207
+ "version": "0.21.5",
208
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
209
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
210
+ "cpu": [
211
+ "loong64"
212
+ ],
213
+ "dev": true,
214
+ "license": "MIT",
215
+ "optional": true,
216
+ "os": [
217
+ "linux"
218
+ ],
219
+ "engines": {
220
+ "node": ">=12"
221
+ }
222
+ },
223
+ "node_modules/@esbuild/linux-mips64el": {
224
+ "version": "0.21.5",
225
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
226
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
227
+ "cpu": [
228
+ "mips64el"
229
+ ],
230
+ "dev": true,
231
+ "license": "MIT",
232
+ "optional": true,
233
+ "os": [
234
+ "linux"
235
+ ],
236
+ "engines": {
237
+ "node": ">=12"
238
+ }
239
+ },
240
+ "node_modules/@esbuild/linux-ppc64": {
241
+ "version": "0.21.5",
242
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
243
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
244
+ "cpu": [
245
+ "ppc64"
246
+ ],
247
+ "dev": true,
248
+ "license": "MIT",
249
+ "optional": true,
250
+ "os": [
251
+ "linux"
252
+ ],
253
+ "engines": {
254
+ "node": ">=12"
255
+ }
256
+ },
257
+ "node_modules/@esbuild/linux-riscv64": {
258
+ "version": "0.21.5",
259
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
260
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
261
+ "cpu": [
262
+ "riscv64"
263
+ ],
264
+ "dev": true,
265
+ "license": "MIT",
266
+ "optional": true,
267
+ "os": [
268
+ "linux"
269
+ ],
270
+ "engines": {
271
+ "node": ">=12"
272
+ }
273
+ },
274
+ "node_modules/@esbuild/linux-s390x": {
275
+ "version": "0.21.5",
276
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
277
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
278
+ "cpu": [
279
+ "s390x"
280
+ ],
281
+ "dev": true,
282
+ "license": "MIT",
283
+ "optional": true,
284
+ "os": [
285
+ "linux"
286
+ ],
287
+ "engines": {
288
+ "node": ">=12"
289
+ }
290
+ },
291
+ "node_modules/@esbuild/linux-x64": {
292
+ "version": "0.21.5",
293
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
294
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
295
+ "cpu": [
296
+ "x64"
297
+ ],
298
+ "dev": true,
299
+ "license": "MIT",
300
+ "optional": true,
301
+ "os": [
302
+ "linux"
303
+ ],
304
+ "engines": {
305
+ "node": ">=12"
306
+ }
307
+ },
308
+ "node_modules/@esbuild/netbsd-x64": {
309
+ "version": "0.21.5",
310
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
311
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
312
+ "cpu": [
313
+ "x64"
314
+ ],
315
+ "dev": true,
316
+ "license": "MIT",
317
+ "optional": true,
318
+ "os": [
319
+ "netbsd"
320
+ ],
321
+ "engines": {
322
+ "node": ">=12"
323
+ }
324
+ },
325
+ "node_modules/@esbuild/openbsd-x64": {
326
+ "version": "0.21.5",
327
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
328
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
329
+ "cpu": [
330
+ "x64"
331
+ ],
332
+ "dev": true,
333
+ "license": "MIT",
334
+ "optional": true,
335
+ "os": [
336
+ "openbsd"
337
+ ],
338
+ "engines": {
339
+ "node": ">=12"
340
+ }
341
+ },
342
+ "node_modules/@esbuild/sunos-x64": {
343
+ "version": "0.21.5",
344
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
345
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
346
+ "cpu": [
347
+ "x64"
348
+ ],
349
+ "dev": true,
350
+ "license": "MIT",
351
+ "optional": true,
352
+ "os": [
353
+ "sunos"
354
+ ],
355
+ "engines": {
356
+ "node": ">=12"
357
+ }
358
+ },
359
+ "node_modules/@esbuild/win32-arm64": {
360
+ "version": "0.21.5",
361
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
362
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
363
+ "cpu": [
364
+ "arm64"
365
+ ],
366
+ "dev": true,
367
+ "license": "MIT",
368
+ "optional": true,
369
+ "os": [
370
+ "win32"
371
+ ],
372
+ "engines": {
373
+ "node": ">=12"
374
+ }
375
+ },
376
+ "node_modules/@esbuild/win32-ia32": {
377
+ "version": "0.21.5",
378
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
379
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
380
+ "cpu": [
381
+ "ia32"
382
+ ],
383
+ "dev": true,
384
+ "license": "MIT",
385
+ "optional": true,
386
+ "os": [
387
+ "win32"
388
+ ],
389
+ "engines": {
390
+ "node": ">=12"
391
+ }
392
+ },
393
+ "node_modules/@esbuild/win32-x64": {
394
+ "version": "0.21.5",
395
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
396
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
397
+ "cpu": [
398
+ "x64"
399
+ ],
400
+ "dev": true,
401
+ "license": "MIT",
402
+ "optional": true,
403
+ "os": [
404
+ "win32"
405
+ ],
406
+ "engines": {
407
+ "node": ">=12"
408
+ }
409
+ },
410
+ "node_modules/@jest/schemas": {
411
+ "version": "29.6.3",
412
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
413
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
414
+ "dev": true,
415
+ "license": "MIT",
416
+ "dependencies": {
417
+ "@sinclair/typebox": "^0.27.8"
418
+ },
419
+ "engines": {
420
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
421
+ }
422
+ },
423
+ "node_modules/@jridgewell/sourcemap-codec": {
424
+ "version": "1.5.5",
425
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
426
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
427
+ "dev": true,
428
+ "license": "MIT"
429
+ },
430
+ "node_modules/@rollup/rollup-android-arm-eabi": {
431
+ "version": "4.55.1",
432
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz",
433
+ "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==",
434
+ "cpu": [
435
+ "arm"
436
+ ],
437
+ "dev": true,
438
+ "license": "MIT",
439
+ "optional": true,
440
+ "os": [
441
+ "android"
442
+ ]
443
+ },
444
+ "node_modules/@rollup/rollup-android-arm64": {
445
+ "version": "4.55.1",
446
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz",
447
+ "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==",
448
+ "cpu": [
449
+ "arm64"
450
+ ],
451
+ "dev": true,
452
+ "license": "MIT",
453
+ "optional": true,
454
+ "os": [
455
+ "android"
456
+ ]
457
+ },
458
+ "node_modules/@rollup/rollup-darwin-arm64": {
459
+ "version": "4.55.1",
460
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz",
461
+ "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==",
462
+ "cpu": [
463
+ "arm64"
464
+ ],
465
+ "dev": true,
466
+ "license": "MIT",
467
+ "optional": true,
468
+ "os": [
469
+ "darwin"
470
+ ]
471
+ },
472
+ "node_modules/@rollup/rollup-darwin-x64": {
473
+ "version": "4.55.1",
474
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz",
475
+ "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==",
476
+ "cpu": [
477
+ "x64"
478
+ ],
479
+ "dev": true,
480
+ "license": "MIT",
481
+ "optional": true,
482
+ "os": [
483
+ "darwin"
484
+ ]
485
+ },
486
+ "node_modules/@rollup/rollup-freebsd-arm64": {
487
+ "version": "4.55.1",
488
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz",
489
+ "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==",
490
+ "cpu": [
491
+ "arm64"
492
+ ],
493
+ "dev": true,
494
+ "license": "MIT",
495
+ "optional": true,
496
+ "os": [
497
+ "freebsd"
498
+ ]
499
+ },
500
+ "node_modules/@rollup/rollup-freebsd-x64": {
501
+ "version": "4.55.1",
502
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz",
503
+ "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==",
504
+ "cpu": [
505
+ "x64"
506
+ ],
507
+ "dev": true,
508
+ "license": "MIT",
509
+ "optional": true,
510
+ "os": [
511
+ "freebsd"
512
+ ]
513
+ },
514
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
515
+ "version": "4.55.1",
516
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz",
517
+ "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==",
518
+ "cpu": [
519
+ "arm"
520
+ ],
521
+ "dev": true,
522
+ "license": "MIT",
523
+ "optional": true,
524
+ "os": [
525
+ "linux"
526
+ ]
527
+ },
528
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
529
+ "version": "4.55.1",
530
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz",
531
+ "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==",
532
+ "cpu": [
533
+ "arm"
534
+ ],
535
+ "dev": true,
536
+ "license": "MIT",
537
+ "optional": true,
538
+ "os": [
539
+ "linux"
540
+ ]
541
+ },
542
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
543
+ "version": "4.55.1",
544
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz",
545
+ "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==",
546
+ "cpu": [
547
+ "arm64"
548
+ ],
549
+ "dev": true,
550
+ "license": "MIT",
551
+ "optional": true,
552
+ "os": [
553
+ "linux"
554
+ ]
555
+ },
556
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
557
+ "version": "4.55.1",
558
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz",
559
+ "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==",
560
+ "cpu": [
561
+ "arm64"
562
+ ],
563
+ "dev": true,
564
+ "license": "MIT",
565
+ "optional": true,
566
+ "os": [
567
+ "linux"
568
+ ]
569
+ },
570
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
571
+ "version": "4.55.1",
572
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz",
573
+ "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==",
574
+ "cpu": [
575
+ "loong64"
576
+ ],
577
+ "dev": true,
578
+ "license": "MIT",
579
+ "optional": true,
580
+ "os": [
581
+ "linux"
582
+ ]
583
+ },
584
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
585
+ "version": "4.55.1",
586
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz",
587
+ "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==",
588
+ "cpu": [
589
+ "loong64"
590
+ ],
591
+ "dev": true,
592
+ "license": "MIT",
593
+ "optional": true,
594
+ "os": [
595
+ "linux"
596
+ ]
597
+ },
598
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
599
+ "version": "4.55.1",
600
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz",
601
+ "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==",
602
+ "cpu": [
603
+ "ppc64"
604
+ ],
605
+ "dev": true,
606
+ "license": "MIT",
607
+ "optional": true,
608
+ "os": [
609
+ "linux"
610
+ ]
611
+ },
612
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
613
+ "version": "4.55.1",
614
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz",
615
+ "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==",
616
+ "cpu": [
617
+ "ppc64"
618
+ ],
619
+ "dev": true,
620
+ "license": "MIT",
621
+ "optional": true,
622
+ "os": [
623
+ "linux"
624
+ ]
625
+ },
626
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
627
+ "version": "4.55.1",
628
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz",
629
+ "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==",
630
+ "cpu": [
631
+ "riscv64"
632
+ ],
633
+ "dev": true,
634
+ "license": "MIT",
635
+ "optional": true,
636
+ "os": [
637
+ "linux"
638
+ ]
639
+ },
640
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
641
+ "version": "4.55.1",
642
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz",
643
+ "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==",
644
+ "cpu": [
645
+ "riscv64"
646
+ ],
647
+ "dev": true,
648
+ "license": "MIT",
649
+ "optional": true,
650
+ "os": [
651
+ "linux"
652
+ ]
653
+ },
654
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
655
+ "version": "4.55.1",
656
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz",
657
+ "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==",
658
+ "cpu": [
659
+ "s390x"
660
+ ],
661
+ "dev": true,
662
+ "license": "MIT",
663
+ "optional": true,
664
+ "os": [
665
+ "linux"
666
+ ]
667
+ },
668
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
669
+ "version": "4.55.1",
670
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz",
671
+ "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==",
672
+ "cpu": [
673
+ "x64"
674
+ ],
675
+ "dev": true,
676
+ "license": "MIT",
677
+ "optional": true,
678
+ "os": [
679
+ "linux"
680
+ ]
681
+ },
682
+ "node_modules/@rollup/rollup-linux-x64-musl": {
683
+ "version": "4.55.1",
684
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz",
685
+ "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==",
686
+ "cpu": [
687
+ "x64"
688
+ ],
689
+ "dev": true,
690
+ "license": "MIT",
691
+ "optional": true,
692
+ "os": [
693
+ "linux"
694
+ ]
695
+ },
696
+ "node_modules/@rollup/rollup-openbsd-x64": {
697
+ "version": "4.55.1",
698
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz",
699
+ "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==",
700
+ "cpu": [
701
+ "x64"
702
+ ],
703
+ "dev": true,
704
+ "license": "MIT",
705
+ "optional": true,
706
+ "os": [
707
+ "openbsd"
708
+ ]
709
+ },
710
+ "node_modules/@rollup/rollup-openharmony-arm64": {
711
+ "version": "4.55.1",
712
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz",
713
+ "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==",
714
+ "cpu": [
715
+ "arm64"
716
+ ],
717
+ "dev": true,
718
+ "license": "MIT",
719
+ "optional": true,
720
+ "os": [
721
+ "openharmony"
722
+ ]
723
+ },
724
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
725
+ "version": "4.55.1",
726
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz",
727
+ "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==",
728
+ "cpu": [
729
+ "arm64"
730
+ ],
731
+ "dev": true,
732
+ "license": "MIT",
733
+ "optional": true,
734
+ "os": [
735
+ "win32"
736
+ ]
737
+ },
738
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
739
+ "version": "4.55.1",
740
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz",
741
+ "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==",
742
+ "cpu": [
743
+ "ia32"
744
+ ],
745
+ "dev": true,
746
+ "license": "MIT",
747
+ "optional": true,
748
+ "os": [
749
+ "win32"
750
+ ]
751
+ },
752
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
753
+ "version": "4.55.1",
754
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz",
755
+ "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==",
756
+ "cpu": [
757
+ "x64"
758
+ ],
759
+ "dev": true,
760
+ "license": "MIT",
761
+ "optional": true,
762
+ "os": [
763
+ "win32"
764
+ ]
765
+ },
766
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
767
+ "version": "4.55.1",
768
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz",
769
+ "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==",
770
+ "cpu": [
771
+ "x64"
772
+ ],
773
+ "dev": true,
774
+ "license": "MIT",
775
+ "optional": true,
776
+ "os": [
777
+ "win32"
778
+ ]
779
+ },
780
+ "node_modules/@sinclair/typebox": {
781
+ "version": "0.27.8",
782
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
783
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
784
+ "dev": true,
785
+ "license": "MIT"
786
+ },
787
+ "node_modules/@types/estree": {
788
+ "version": "1.0.8",
789
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
790
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
791
+ "dev": true,
792
+ "license": "MIT"
793
+ },
794
+ "node_modules/@vitest/expect": {
795
+ "version": "1.6.1",
796
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz",
797
+ "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==",
798
+ "dev": true,
799
+ "license": "MIT",
800
+ "dependencies": {
801
+ "@vitest/spy": "1.6.1",
802
+ "@vitest/utils": "1.6.1",
803
+ "chai": "^4.3.10"
804
+ },
805
+ "funding": {
806
+ "url": "https://opencollective.com/vitest"
807
+ }
808
+ },
809
+ "node_modules/@vitest/runner": {
810
+ "version": "1.6.1",
811
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz",
812
+ "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==",
813
+ "dev": true,
814
+ "license": "MIT",
815
+ "dependencies": {
816
+ "@vitest/utils": "1.6.1",
817
+ "p-limit": "^5.0.0",
818
+ "pathe": "^1.1.1"
819
+ },
820
+ "funding": {
821
+ "url": "https://opencollective.com/vitest"
822
+ }
823
+ },
824
+ "node_modules/@vitest/snapshot": {
825
+ "version": "1.6.1",
826
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz",
827
+ "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==",
828
+ "dev": true,
829
+ "license": "MIT",
830
+ "dependencies": {
831
+ "magic-string": "^0.30.5",
832
+ "pathe": "^1.1.1",
833
+ "pretty-format": "^29.7.0"
834
+ },
835
+ "funding": {
836
+ "url": "https://opencollective.com/vitest"
837
+ }
838
+ },
839
+ "node_modules/@vitest/spy": {
840
+ "version": "1.6.1",
841
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz",
842
+ "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==",
843
+ "dev": true,
844
+ "license": "MIT",
845
+ "dependencies": {
846
+ "tinyspy": "^2.2.0"
847
+ },
848
+ "funding": {
849
+ "url": "https://opencollective.com/vitest"
850
+ }
851
+ },
852
+ "node_modules/@vitest/utils": {
853
+ "version": "1.6.1",
854
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz",
855
+ "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==",
856
+ "dev": true,
857
+ "license": "MIT",
858
+ "dependencies": {
859
+ "diff-sequences": "^29.6.3",
860
+ "estree-walker": "^3.0.3",
861
+ "loupe": "^2.3.7",
862
+ "pretty-format": "^29.7.0"
863
+ },
864
+ "funding": {
865
+ "url": "https://opencollective.com/vitest"
866
+ }
867
+ },
868
+ "node_modules/acorn": {
869
+ "version": "8.15.0",
870
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
871
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
872
+ "dev": true,
873
+ "license": "MIT",
874
+ "bin": {
875
+ "acorn": "bin/acorn"
876
+ },
877
+ "engines": {
878
+ "node": ">=0.4.0"
879
+ }
880
+ },
881
+ "node_modules/acorn-walk": {
882
+ "version": "8.3.4",
883
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
884
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
885
+ "dev": true,
886
+ "license": "MIT",
887
+ "dependencies": {
888
+ "acorn": "^8.11.0"
889
+ },
890
+ "engines": {
891
+ "node": ">=0.4.0"
892
+ }
893
+ },
894
+ "node_modules/ansi-styles": {
895
+ "version": "5.2.0",
896
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
897
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
898
+ "dev": true,
899
+ "license": "MIT",
900
+ "engines": {
901
+ "node": ">=10"
902
+ },
903
+ "funding": {
904
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
905
+ }
906
+ },
907
+ "node_modules/assertion-error": {
908
+ "version": "1.1.0",
909
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
910
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
911
+ "dev": true,
912
+ "license": "MIT",
913
+ "engines": {
914
+ "node": "*"
915
+ }
916
+ },
917
+ "node_modules/asynckit": {
918
+ "version": "0.4.0",
919
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
920
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
921
+ "license": "MIT"
922
+ },
923
+ "node_modules/axios": {
924
+ "version": "1.13.2",
925
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
926
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
927
+ "license": "MIT",
928
+ "dependencies": {
929
+ "follow-redirects": "^1.15.6",
930
+ "form-data": "^4.0.4",
931
+ "proxy-from-env": "^1.1.0"
932
+ }
933
+ },
934
+ "node_modules/cac": {
935
+ "version": "6.7.14",
936
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
937
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
938
+ "dev": true,
939
+ "license": "MIT",
940
+ "engines": {
941
+ "node": ">=8"
942
+ }
943
+ },
944
+ "node_modules/call-bind-apply-helpers": {
945
+ "version": "1.0.2",
946
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
947
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
948
+ "license": "MIT",
949
+ "dependencies": {
950
+ "es-errors": "^1.3.0",
951
+ "function-bind": "^1.1.2"
952
+ },
953
+ "engines": {
954
+ "node": ">= 0.4"
955
+ }
956
+ },
957
+ "node_modules/chai": {
958
+ "version": "4.5.0",
959
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
960
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
961
+ "dev": true,
962
+ "license": "MIT",
963
+ "dependencies": {
964
+ "assertion-error": "^1.1.0",
965
+ "check-error": "^1.0.3",
966
+ "deep-eql": "^4.1.3",
967
+ "get-func-name": "^2.0.2",
968
+ "loupe": "^2.3.6",
969
+ "pathval": "^1.1.1",
970
+ "type-detect": "^4.1.0"
971
+ },
972
+ "engines": {
973
+ "node": ">=4"
974
+ }
975
+ },
976
+ "node_modules/check-error": {
977
+ "version": "1.0.3",
978
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
979
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
980
+ "dev": true,
981
+ "license": "MIT",
982
+ "dependencies": {
983
+ "get-func-name": "^2.0.2"
984
+ },
985
+ "engines": {
986
+ "node": "*"
987
+ }
988
+ },
989
+ "node_modules/combined-stream": {
990
+ "version": "1.0.8",
991
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
992
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
993
+ "license": "MIT",
994
+ "dependencies": {
995
+ "delayed-stream": "~1.0.0"
996
+ },
997
+ "engines": {
998
+ "node": ">= 0.8"
999
+ }
1000
+ },
1001
+ "node_modules/confbox": {
1002
+ "version": "0.1.8",
1003
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
1004
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
1005
+ "dev": true,
1006
+ "license": "MIT"
1007
+ },
1008
+ "node_modules/cross-spawn": {
1009
+ "version": "7.0.6",
1010
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1011
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1012
+ "dev": true,
1013
+ "license": "MIT",
1014
+ "dependencies": {
1015
+ "path-key": "^3.1.0",
1016
+ "shebang-command": "^2.0.0",
1017
+ "which": "^2.0.1"
1018
+ },
1019
+ "engines": {
1020
+ "node": ">= 8"
1021
+ }
1022
+ },
1023
+ "node_modules/debug": {
1024
+ "version": "4.4.3",
1025
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1026
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1027
+ "dev": true,
1028
+ "license": "MIT",
1029
+ "dependencies": {
1030
+ "ms": "^2.1.3"
1031
+ },
1032
+ "engines": {
1033
+ "node": ">=6.0"
1034
+ },
1035
+ "peerDependenciesMeta": {
1036
+ "supports-color": {
1037
+ "optional": true
1038
+ }
1039
+ }
1040
+ },
1041
+ "node_modules/deep-eql": {
1042
+ "version": "4.1.4",
1043
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
1044
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
1045
+ "dev": true,
1046
+ "license": "MIT",
1047
+ "dependencies": {
1048
+ "type-detect": "^4.0.0"
1049
+ },
1050
+ "engines": {
1051
+ "node": ">=6"
1052
+ }
1053
+ },
1054
+ "node_modules/delayed-stream": {
1055
+ "version": "1.0.0",
1056
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1057
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
1058
+ "license": "MIT",
1059
+ "engines": {
1060
+ "node": ">=0.4.0"
1061
+ }
1062
+ },
1063
+ "node_modules/diff-sequences": {
1064
+ "version": "29.6.3",
1065
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
1066
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
1067
+ "dev": true,
1068
+ "license": "MIT",
1069
+ "engines": {
1070
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
1071
+ }
1072
+ },
1073
+ "node_modules/dunder-proto": {
1074
+ "version": "1.0.1",
1075
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
1076
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
1077
+ "license": "MIT",
1078
+ "dependencies": {
1079
+ "call-bind-apply-helpers": "^1.0.1",
1080
+ "es-errors": "^1.3.0",
1081
+ "gopd": "^1.2.0"
1082
+ },
1083
+ "engines": {
1084
+ "node": ">= 0.4"
1085
+ }
1086
+ },
1087
+ "node_modules/es-define-property": {
1088
+ "version": "1.0.1",
1089
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
1090
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
1091
+ "license": "MIT",
1092
+ "engines": {
1093
+ "node": ">= 0.4"
1094
+ }
1095
+ },
1096
+ "node_modules/es-errors": {
1097
+ "version": "1.3.0",
1098
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
1099
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
1100
+ "license": "MIT",
1101
+ "engines": {
1102
+ "node": ">= 0.4"
1103
+ }
1104
+ },
1105
+ "node_modules/es-object-atoms": {
1106
+ "version": "1.1.1",
1107
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
1108
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
1109
+ "license": "MIT",
1110
+ "dependencies": {
1111
+ "es-errors": "^1.3.0"
1112
+ },
1113
+ "engines": {
1114
+ "node": ">= 0.4"
1115
+ }
1116
+ },
1117
+ "node_modules/es-set-tostringtag": {
1118
+ "version": "2.1.0",
1119
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
1120
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
1121
+ "license": "MIT",
1122
+ "dependencies": {
1123
+ "es-errors": "^1.3.0",
1124
+ "get-intrinsic": "^1.2.6",
1125
+ "has-tostringtag": "^1.0.2",
1126
+ "hasown": "^2.0.2"
1127
+ },
1128
+ "engines": {
1129
+ "node": ">= 0.4"
1130
+ }
1131
+ },
1132
+ "node_modules/esbuild": {
1133
+ "version": "0.21.5",
1134
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1135
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1136
+ "dev": true,
1137
+ "hasInstallScript": true,
1138
+ "license": "MIT",
1139
+ "bin": {
1140
+ "esbuild": "bin/esbuild"
1141
+ },
1142
+ "engines": {
1143
+ "node": ">=12"
1144
+ },
1145
+ "optionalDependencies": {
1146
+ "@esbuild/aix-ppc64": "0.21.5",
1147
+ "@esbuild/android-arm": "0.21.5",
1148
+ "@esbuild/android-arm64": "0.21.5",
1149
+ "@esbuild/android-x64": "0.21.5",
1150
+ "@esbuild/darwin-arm64": "0.21.5",
1151
+ "@esbuild/darwin-x64": "0.21.5",
1152
+ "@esbuild/freebsd-arm64": "0.21.5",
1153
+ "@esbuild/freebsd-x64": "0.21.5",
1154
+ "@esbuild/linux-arm": "0.21.5",
1155
+ "@esbuild/linux-arm64": "0.21.5",
1156
+ "@esbuild/linux-ia32": "0.21.5",
1157
+ "@esbuild/linux-loong64": "0.21.5",
1158
+ "@esbuild/linux-mips64el": "0.21.5",
1159
+ "@esbuild/linux-ppc64": "0.21.5",
1160
+ "@esbuild/linux-riscv64": "0.21.5",
1161
+ "@esbuild/linux-s390x": "0.21.5",
1162
+ "@esbuild/linux-x64": "0.21.5",
1163
+ "@esbuild/netbsd-x64": "0.21.5",
1164
+ "@esbuild/openbsd-x64": "0.21.5",
1165
+ "@esbuild/sunos-x64": "0.21.5",
1166
+ "@esbuild/win32-arm64": "0.21.5",
1167
+ "@esbuild/win32-ia32": "0.21.5",
1168
+ "@esbuild/win32-x64": "0.21.5"
1169
+ }
1170
+ },
1171
+ "node_modules/estree-walker": {
1172
+ "version": "3.0.3",
1173
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
1174
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
1175
+ "dev": true,
1176
+ "license": "MIT",
1177
+ "dependencies": {
1178
+ "@types/estree": "^1.0.0"
1179
+ }
1180
+ },
1181
+ "node_modules/execa": {
1182
+ "version": "8.0.1",
1183
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
1184
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
1185
+ "dev": true,
1186
+ "license": "MIT",
1187
+ "dependencies": {
1188
+ "cross-spawn": "^7.0.3",
1189
+ "get-stream": "^8.0.1",
1190
+ "human-signals": "^5.0.0",
1191
+ "is-stream": "^3.0.0",
1192
+ "merge-stream": "^2.0.0",
1193
+ "npm-run-path": "^5.1.0",
1194
+ "onetime": "^6.0.0",
1195
+ "signal-exit": "^4.1.0",
1196
+ "strip-final-newline": "^3.0.0"
1197
+ },
1198
+ "engines": {
1199
+ "node": ">=16.17"
1200
+ },
1201
+ "funding": {
1202
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
1203
+ }
1204
+ },
1205
+ "node_modules/follow-redirects": {
1206
+ "version": "1.15.11",
1207
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
1208
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
1209
+ "funding": [
1210
+ {
1211
+ "type": "individual",
1212
+ "url": "https://github.com/sponsors/RubenVerborgh"
1213
+ }
1214
+ ],
1215
+ "license": "MIT",
1216
+ "engines": {
1217
+ "node": ">=4.0"
1218
+ },
1219
+ "peerDependenciesMeta": {
1220
+ "debug": {
1221
+ "optional": true
1222
+ }
1223
+ }
1224
+ },
1225
+ "node_modules/form-data": {
1226
+ "version": "4.0.5",
1227
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
1228
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
1229
+ "license": "MIT",
1230
+ "dependencies": {
1231
+ "asynckit": "^0.4.0",
1232
+ "combined-stream": "^1.0.8",
1233
+ "es-set-tostringtag": "^2.1.0",
1234
+ "hasown": "^2.0.2",
1235
+ "mime-types": "^2.1.12"
1236
+ },
1237
+ "engines": {
1238
+ "node": ">= 6"
1239
+ }
1240
+ },
1241
+ "node_modules/fsevents": {
1242
+ "version": "2.3.3",
1243
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1244
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1245
+ "dev": true,
1246
+ "hasInstallScript": true,
1247
+ "license": "MIT",
1248
+ "optional": true,
1249
+ "os": [
1250
+ "darwin"
1251
+ ],
1252
+ "engines": {
1253
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1254
+ }
1255
+ },
1256
+ "node_modules/function-bind": {
1257
+ "version": "1.1.2",
1258
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1259
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1260
+ "license": "MIT",
1261
+ "funding": {
1262
+ "url": "https://github.com/sponsors/ljharb"
1263
+ }
1264
+ },
1265
+ "node_modules/get-func-name": {
1266
+ "version": "2.0.2",
1267
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
1268
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
1269
+ "dev": true,
1270
+ "license": "MIT",
1271
+ "engines": {
1272
+ "node": "*"
1273
+ }
1274
+ },
1275
+ "node_modules/get-intrinsic": {
1276
+ "version": "1.3.0",
1277
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
1278
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
1279
+ "license": "MIT",
1280
+ "dependencies": {
1281
+ "call-bind-apply-helpers": "^1.0.2",
1282
+ "es-define-property": "^1.0.1",
1283
+ "es-errors": "^1.3.0",
1284
+ "es-object-atoms": "^1.1.1",
1285
+ "function-bind": "^1.1.2",
1286
+ "get-proto": "^1.0.1",
1287
+ "gopd": "^1.2.0",
1288
+ "has-symbols": "^1.1.0",
1289
+ "hasown": "^2.0.2",
1290
+ "math-intrinsics": "^1.1.0"
1291
+ },
1292
+ "engines": {
1293
+ "node": ">= 0.4"
1294
+ },
1295
+ "funding": {
1296
+ "url": "https://github.com/sponsors/ljharb"
1297
+ }
1298
+ },
1299
+ "node_modules/get-proto": {
1300
+ "version": "1.0.1",
1301
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
1302
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
1303
+ "license": "MIT",
1304
+ "dependencies": {
1305
+ "dunder-proto": "^1.0.1",
1306
+ "es-object-atoms": "^1.0.0"
1307
+ },
1308
+ "engines": {
1309
+ "node": ">= 0.4"
1310
+ }
1311
+ },
1312
+ "node_modules/get-stream": {
1313
+ "version": "8.0.1",
1314
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
1315
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
1316
+ "dev": true,
1317
+ "license": "MIT",
1318
+ "engines": {
1319
+ "node": ">=16"
1320
+ },
1321
+ "funding": {
1322
+ "url": "https://github.com/sponsors/sindresorhus"
1323
+ }
1324
+ },
1325
+ "node_modules/gopd": {
1326
+ "version": "1.2.0",
1327
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
1328
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1329
+ "license": "MIT",
1330
+ "engines": {
1331
+ "node": ">= 0.4"
1332
+ },
1333
+ "funding": {
1334
+ "url": "https://github.com/sponsors/ljharb"
1335
+ }
1336
+ },
1337
+ "node_modules/has-symbols": {
1338
+ "version": "1.1.0",
1339
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
1340
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
1341
+ "license": "MIT",
1342
+ "engines": {
1343
+ "node": ">= 0.4"
1344
+ },
1345
+ "funding": {
1346
+ "url": "https://github.com/sponsors/ljharb"
1347
+ }
1348
+ },
1349
+ "node_modules/has-tostringtag": {
1350
+ "version": "1.0.2",
1351
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
1352
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
1353
+ "license": "MIT",
1354
+ "dependencies": {
1355
+ "has-symbols": "^1.0.3"
1356
+ },
1357
+ "engines": {
1358
+ "node": ">= 0.4"
1359
+ },
1360
+ "funding": {
1361
+ "url": "https://github.com/sponsors/ljharb"
1362
+ }
1363
+ },
1364
+ "node_modules/hasown": {
1365
+ "version": "2.0.2",
1366
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1367
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1368
+ "license": "MIT",
1369
+ "dependencies": {
1370
+ "function-bind": "^1.1.2"
1371
+ },
1372
+ "engines": {
1373
+ "node": ">= 0.4"
1374
+ }
1375
+ },
1376
+ "node_modules/human-signals": {
1377
+ "version": "5.0.0",
1378
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
1379
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
1380
+ "dev": true,
1381
+ "license": "Apache-2.0",
1382
+ "engines": {
1383
+ "node": ">=16.17.0"
1384
+ }
1385
+ },
1386
+ "node_modules/is-stream": {
1387
+ "version": "3.0.0",
1388
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
1389
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
1390
+ "dev": true,
1391
+ "license": "MIT",
1392
+ "engines": {
1393
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1394
+ },
1395
+ "funding": {
1396
+ "url": "https://github.com/sponsors/sindresorhus"
1397
+ }
1398
+ },
1399
+ "node_modules/isexe": {
1400
+ "version": "2.0.0",
1401
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1402
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1403
+ "dev": true,
1404
+ "license": "ISC"
1405
+ },
1406
+ "node_modules/js-tokens": {
1407
+ "version": "9.0.1",
1408
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
1409
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
1410
+ "dev": true,
1411
+ "license": "MIT"
1412
+ },
1413
+ "node_modules/local-pkg": {
1414
+ "version": "0.5.1",
1415
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
1416
+ "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
1417
+ "dev": true,
1418
+ "license": "MIT",
1419
+ "dependencies": {
1420
+ "mlly": "^1.7.3",
1421
+ "pkg-types": "^1.2.1"
1422
+ },
1423
+ "engines": {
1424
+ "node": ">=14"
1425
+ },
1426
+ "funding": {
1427
+ "url": "https://github.com/sponsors/antfu"
1428
+ }
1429
+ },
1430
+ "node_modules/loupe": {
1431
+ "version": "2.3.7",
1432
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
1433
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
1434
+ "dev": true,
1435
+ "license": "MIT",
1436
+ "dependencies": {
1437
+ "get-func-name": "^2.0.1"
1438
+ }
1439
+ },
1440
+ "node_modules/magic-string": {
1441
+ "version": "0.30.21",
1442
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
1443
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
1444
+ "dev": true,
1445
+ "license": "MIT",
1446
+ "dependencies": {
1447
+ "@jridgewell/sourcemap-codec": "^1.5.5"
1448
+ }
1449
+ },
1450
+ "node_modules/math-intrinsics": {
1451
+ "version": "1.1.0",
1452
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1453
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1454
+ "license": "MIT",
1455
+ "engines": {
1456
+ "node": ">= 0.4"
1457
+ }
1458
+ },
1459
+ "node_modules/merge-stream": {
1460
+ "version": "2.0.0",
1461
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1462
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1463
+ "dev": true,
1464
+ "license": "MIT"
1465
+ },
1466
+ "node_modules/mime-db": {
1467
+ "version": "1.52.0",
1468
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1469
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1470
+ "license": "MIT",
1471
+ "engines": {
1472
+ "node": ">= 0.6"
1473
+ }
1474
+ },
1475
+ "node_modules/mime-types": {
1476
+ "version": "2.1.35",
1477
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1478
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1479
+ "license": "MIT",
1480
+ "dependencies": {
1481
+ "mime-db": "1.52.0"
1482
+ },
1483
+ "engines": {
1484
+ "node": ">= 0.6"
1485
+ }
1486
+ },
1487
+ "node_modules/mimic-fn": {
1488
+ "version": "4.0.0",
1489
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
1490
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
1491
+ "dev": true,
1492
+ "license": "MIT",
1493
+ "engines": {
1494
+ "node": ">=12"
1495
+ },
1496
+ "funding": {
1497
+ "url": "https://github.com/sponsors/sindresorhus"
1498
+ }
1499
+ },
1500
+ "node_modules/mlly": {
1501
+ "version": "1.8.0",
1502
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
1503
+ "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
1504
+ "dev": true,
1505
+ "license": "MIT",
1506
+ "dependencies": {
1507
+ "acorn": "^8.15.0",
1508
+ "pathe": "^2.0.3",
1509
+ "pkg-types": "^1.3.1",
1510
+ "ufo": "^1.6.1"
1511
+ }
1512
+ },
1513
+ "node_modules/mlly/node_modules/pathe": {
1514
+ "version": "2.0.3",
1515
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1516
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1517
+ "dev": true,
1518
+ "license": "MIT"
1519
+ },
1520
+ "node_modules/ms": {
1521
+ "version": "2.1.3",
1522
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1523
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1524
+ "dev": true,
1525
+ "license": "MIT"
1526
+ },
1527
+ "node_modules/nanoid": {
1528
+ "version": "3.3.11",
1529
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1530
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1531
+ "dev": true,
1532
+ "funding": [
1533
+ {
1534
+ "type": "github",
1535
+ "url": "https://github.com/sponsors/ai"
1536
+ }
1537
+ ],
1538
+ "license": "MIT",
1539
+ "bin": {
1540
+ "nanoid": "bin/nanoid.cjs"
1541
+ },
1542
+ "engines": {
1543
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1544
+ }
1545
+ },
1546
+ "node_modules/npm-run-path": {
1547
+ "version": "5.3.0",
1548
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
1549
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
1550
+ "dev": true,
1551
+ "license": "MIT",
1552
+ "dependencies": {
1553
+ "path-key": "^4.0.0"
1554
+ },
1555
+ "engines": {
1556
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1557
+ },
1558
+ "funding": {
1559
+ "url": "https://github.com/sponsors/sindresorhus"
1560
+ }
1561
+ },
1562
+ "node_modules/npm-run-path/node_modules/path-key": {
1563
+ "version": "4.0.0",
1564
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
1565
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
1566
+ "dev": true,
1567
+ "license": "MIT",
1568
+ "engines": {
1569
+ "node": ">=12"
1570
+ },
1571
+ "funding": {
1572
+ "url": "https://github.com/sponsors/sindresorhus"
1573
+ }
1574
+ },
1575
+ "node_modules/onetime": {
1576
+ "version": "6.0.0",
1577
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
1578
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
1579
+ "dev": true,
1580
+ "license": "MIT",
1581
+ "dependencies": {
1582
+ "mimic-fn": "^4.0.0"
1583
+ },
1584
+ "engines": {
1585
+ "node": ">=12"
1586
+ },
1587
+ "funding": {
1588
+ "url": "https://github.com/sponsors/sindresorhus"
1589
+ }
1590
+ },
1591
+ "node_modules/p-limit": {
1592
+ "version": "5.0.0",
1593
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
1594
+ "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
1595
+ "dev": true,
1596
+ "license": "MIT",
1597
+ "dependencies": {
1598
+ "yocto-queue": "^1.0.0"
1599
+ },
1600
+ "engines": {
1601
+ "node": ">=18"
1602
+ },
1603
+ "funding": {
1604
+ "url": "https://github.com/sponsors/sindresorhus"
1605
+ }
1606
+ },
1607
+ "node_modules/path-key": {
1608
+ "version": "3.1.1",
1609
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1610
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1611
+ "dev": true,
1612
+ "license": "MIT",
1613
+ "engines": {
1614
+ "node": ">=8"
1615
+ }
1616
+ },
1617
+ "node_modules/pathe": {
1618
+ "version": "1.1.2",
1619
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
1620
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
1621
+ "dev": true,
1622
+ "license": "MIT"
1623
+ },
1624
+ "node_modules/pathval": {
1625
+ "version": "1.1.1",
1626
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
1627
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
1628
+ "dev": true,
1629
+ "license": "MIT",
1630
+ "engines": {
1631
+ "node": "*"
1632
+ }
1633
+ },
1634
+ "node_modules/picocolors": {
1635
+ "version": "1.1.1",
1636
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1637
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1638
+ "dev": true,
1639
+ "license": "ISC"
1640
+ },
1641
+ "node_modules/pkg-types": {
1642
+ "version": "1.3.1",
1643
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
1644
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
1645
+ "dev": true,
1646
+ "license": "MIT",
1647
+ "dependencies": {
1648
+ "confbox": "^0.1.8",
1649
+ "mlly": "^1.7.4",
1650
+ "pathe": "^2.0.1"
1651
+ }
1652
+ },
1653
+ "node_modules/pkg-types/node_modules/pathe": {
1654
+ "version": "2.0.3",
1655
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1656
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1657
+ "dev": true,
1658
+ "license": "MIT"
1659
+ },
1660
+ "node_modules/postcss": {
1661
+ "version": "8.5.6",
1662
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
1663
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
1664
+ "dev": true,
1665
+ "funding": [
1666
+ {
1667
+ "type": "opencollective",
1668
+ "url": "https://opencollective.com/postcss/"
1669
+ },
1670
+ {
1671
+ "type": "tidelift",
1672
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1673
+ },
1674
+ {
1675
+ "type": "github",
1676
+ "url": "https://github.com/sponsors/ai"
1677
+ }
1678
+ ],
1679
+ "license": "MIT",
1680
+ "dependencies": {
1681
+ "nanoid": "^3.3.11",
1682
+ "picocolors": "^1.1.1",
1683
+ "source-map-js": "^1.2.1"
1684
+ },
1685
+ "engines": {
1686
+ "node": "^10 || ^12 || >=14"
1687
+ }
1688
+ },
1689
+ "node_modules/pretty-format": {
1690
+ "version": "29.7.0",
1691
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
1692
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
1693
+ "dev": true,
1694
+ "license": "MIT",
1695
+ "dependencies": {
1696
+ "@jest/schemas": "^29.6.3",
1697
+ "ansi-styles": "^5.0.0",
1698
+ "react-is": "^18.0.0"
1699
+ },
1700
+ "engines": {
1701
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
1702
+ }
1703
+ },
1704
+ "node_modules/proxy-from-env": {
1705
+ "version": "1.1.0",
1706
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1707
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
1708
+ "license": "MIT"
1709
+ },
1710
+ "node_modules/react-is": {
1711
+ "version": "18.3.1",
1712
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
1713
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
1714
+ "dev": true,
1715
+ "license": "MIT"
1716
+ },
1717
+ "node_modules/rollup": {
1718
+ "version": "4.55.1",
1719
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
1720
+ "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==",
1721
+ "dev": true,
1722
+ "license": "MIT",
1723
+ "dependencies": {
1724
+ "@types/estree": "1.0.8"
1725
+ },
1726
+ "bin": {
1727
+ "rollup": "dist/bin/rollup"
1728
+ },
1729
+ "engines": {
1730
+ "node": ">=18.0.0",
1731
+ "npm": ">=8.0.0"
1732
+ },
1733
+ "optionalDependencies": {
1734
+ "@rollup/rollup-android-arm-eabi": "4.55.1",
1735
+ "@rollup/rollup-android-arm64": "4.55.1",
1736
+ "@rollup/rollup-darwin-arm64": "4.55.1",
1737
+ "@rollup/rollup-darwin-x64": "4.55.1",
1738
+ "@rollup/rollup-freebsd-arm64": "4.55.1",
1739
+ "@rollup/rollup-freebsd-x64": "4.55.1",
1740
+ "@rollup/rollup-linux-arm-gnueabihf": "4.55.1",
1741
+ "@rollup/rollup-linux-arm-musleabihf": "4.55.1",
1742
+ "@rollup/rollup-linux-arm64-gnu": "4.55.1",
1743
+ "@rollup/rollup-linux-arm64-musl": "4.55.1",
1744
+ "@rollup/rollup-linux-loong64-gnu": "4.55.1",
1745
+ "@rollup/rollup-linux-loong64-musl": "4.55.1",
1746
+ "@rollup/rollup-linux-ppc64-gnu": "4.55.1",
1747
+ "@rollup/rollup-linux-ppc64-musl": "4.55.1",
1748
+ "@rollup/rollup-linux-riscv64-gnu": "4.55.1",
1749
+ "@rollup/rollup-linux-riscv64-musl": "4.55.1",
1750
+ "@rollup/rollup-linux-s390x-gnu": "4.55.1",
1751
+ "@rollup/rollup-linux-x64-gnu": "4.55.1",
1752
+ "@rollup/rollup-linux-x64-musl": "4.55.1",
1753
+ "@rollup/rollup-openbsd-x64": "4.55.1",
1754
+ "@rollup/rollup-openharmony-arm64": "4.55.1",
1755
+ "@rollup/rollup-win32-arm64-msvc": "4.55.1",
1756
+ "@rollup/rollup-win32-ia32-msvc": "4.55.1",
1757
+ "@rollup/rollup-win32-x64-gnu": "4.55.1",
1758
+ "@rollup/rollup-win32-x64-msvc": "4.55.1",
1759
+ "fsevents": "~2.3.2"
1760
+ }
1761
+ },
1762
+ "node_modules/shebang-command": {
1763
+ "version": "2.0.0",
1764
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1765
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1766
+ "dev": true,
1767
+ "license": "MIT",
1768
+ "dependencies": {
1769
+ "shebang-regex": "^3.0.0"
1770
+ },
1771
+ "engines": {
1772
+ "node": ">=8"
1773
+ }
1774
+ },
1775
+ "node_modules/shebang-regex": {
1776
+ "version": "3.0.0",
1777
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1778
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1779
+ "dev": true,
1780
+ "license": "MIT",
1781
+ "engines": {
1782
+ "node": ">=8"
1783
+ }
1784
+ },
1785
+ "node_modules/siginfo": {
1786
+ "version": "2.0.0",
1787
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
1788
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
1789
+ "dev": true,
1790
+ "license": "ISC"
1791
+ },
1792
+ "node_modules/signal-exit": {
1793
+ "version": "4.1.0",
1794
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1795
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1796
+ "dev": true,
1797
+ "license": "ISC",
1798
+ "engines": {
1799
+ "node": ">=14"
1800
+ },
1801
+ "funding": {
1802
+ "url": "https://github.com/sponsors/isaacs"
1803
+ }
1804
+ },
1805
+ "node_modules/source-map-js": {
1806
+ "version": "1.2.1",
1807
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1808
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1809
+ "dev": true,
1810
+ "license": "BSD-3-Clause",
1811
+ "engines": {
1812
+ "node": ">=0.10.0"
1813
+ }
1814
+ },
1815
+ "node_modules/stackback": {
1816
+ "version": "0.0.2",
1817
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
1818
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
1819
+ "dev": true,
1820
+ "license": "MIT"
1821
+ },
1822
+ "node_modules/std-env": {
1823
+ "version": "3.10.0",
1824
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
1825
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
1826
+ "dev": true,
1827
+ "license": "MIT"
1828
+ },
1829
+ "node_modules/strip-final-newline": {
1830
+ "version": "3.0.0",
1831
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
1832
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
1833
+ "dev": true,
1834
+ "license": "MIT",
1835
+ "engines": {
1836
+ "node": ">=12"
1837
+ },
1838
+ "funding": {
1839
+ "url": "https://github.com/sponsors/sindresorhus"
1840
+ }
1841
+ },
1842
+ "node_modules/strip-literal": {
1843
+ "version": "2.1.1",
1844
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz",
1845
+ "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
1846
+ "dev": true,
1847
+ "license": "MIT",
1848
+ "dependencies": {
1849
+ "js-tokens": "^9.0.1"
1850
+ },
1851
+ "funding": {
1852
+ "url": "https://github.com/sponsors/antfu"
1853
+ }
1854
+ },
1855
+ "node_modules/tinybench": {
1856
+ "version": "2.9.0",
1857
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
1858
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
1859
+ "dev": true,
1860
+ "license": "MIT"
1861
+ },
1862
+ "node_modules/tinypool": {
1863
+ "version": "0.8.4",
1864
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz",
1865
+ "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==",
1866
+ "dev": true,
1867
+ "license": "MIT",
1868
+ "engines": {
1869
+ "node": ">=14.0.0"
1870
+ }
1871
+ },
1872
+ "node_modules/tinyspy": {
1873
+ "version": "2.2.1",
1874
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
1875
+ "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
1876
+ "dev": true,
1877
+ "license": "MIT",
1878
+ "engines": {
1879
+ "node": ">=14.0.0"
1880
+ }
1881
+ },
1882
+ "node_modules/type-detect": {
1883
+ "version": "4.1.0",
1884
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
1885
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
1886
+ "dev": true,
1887
+ "license": "MIT",
1888
+ "engines": {
1889
+ "node": ">=4"
1890
+ }
1891
+ },
1892
+ "node_modules/typescript": {
1893
+ "version": "5.9.3",
1894
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
1895
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
1896
+ "dev": true,
1897
+ "license": "Apache-2.0",
1898
+ "bin": {
1899
+ "tsc": "bin/tsc",
1900
+ "tsserver": "bin/tsserver"
1901
+ },
1902
+ "engines": {
1903
+ "node": ">=14.17"
1904
+ }
1905
+ },
1906
+ "node_modules/ufo": {
1907
+ "version": "1.6.3",
1908
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
1909
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
1910
+ "dev": true,
1911
+ "license": "MIT"
1912
+ },
1913
+ "node_modules/vite": {
1914
+ "version": "5.4.21",
1915
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
1916
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
1917
+ "dev": true,
1918
+ "license": "MIT",
1919
+ "dependencies": {
1920
+ "esbuild": "^0.21.3",
1921
+ "postcss": "^8.4.43",
1922
+ "rollup": "^4.20.0"
1923
+ },
1924
+ "bin": {
1925
+ "vite": "bin/vite.js"
1926
+ },
1927
+ "engines": {
1928
+ "node": "^18.0.0 || >=20.0.0"
1929
+ },
1930
+ "funding": {
1931
+ "url": "https://github.com/vitejs/vite?sponsor=1"
1932
+ },
1933
+ "optionalDependencies": {
1934
+ "fsevents": "~2.3.3"
1935
+ },
1936
+ "peerDependencies": {
1937
+ "@types/node": "^18.0.0 || >=20.0.0",
1938
+ "less": "*",
1939
+ "lightningcss": "^1.21.0",
1940
+ "sass": "*",
1941
+ "sass-embedded": "*",
1942
+ "stylus": "*",
1943
+ "sugarss": "*",
1944
+ "terser": "^5.4.0"
1945
+ },
1946
+ "peerDependenciesMeta": {
1947
+ "@types/node": {
1948
+ "optional": true
1949
+ },
1950
+ "less": {
1951
+ "optional": true
1952
+ },
1953
+ "lightningcss": {
1954
+ "optional": true
1955
+ },
1956
+ "sass": {
1957
+ "optional": true
1958
+ },
1959
+ "sass-embedded": {
1960
+ "optional": true
1961
+ },
1962
+ "stylus": {
1963
+ "optional": true
1964
+ },
1965
+ "sugarss": {
1966
+ "optional": true
1967
+ },
1968
+ "terser": {
1969
+ "optional": true
1970
+ }
1971
+ }
1972
+ },
1973
+ "node_modules/vite-node": {
1974
+ "version": "1.6.1",
1975
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz",
1976
+ "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==",
1977
+ "dev": true,
1978
+ "license": "MIT",
1979
+ "dependencies": {
1980
+ "cac": "^6.7.14",
1981
+ "debug": "^4.3.4",
1982
+ "pathe": "^1.1.1",
1983
+ "picocolors": "^1.0.0",
1984
+ "vite": "^5.0.0"
1985
+ },
1986
+ "bin": {
1987
+ "vite-node": "vite-node.mjs"
1988
+ },
1989
+ "engines": {
1990
+ "node": "^18.0.0 || >=20.0.0"
1991
+ },
1992
+ "funding": {
1993
+ "url": "https://opencollective.com/vitest"
1994
+ }
1995
+ },
1996
+ "node_modules/vitest": {
1997
+ "version": "1.6.1",
1998
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz",
1999
+ "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==",
2000
+ "dev": true,
2001
+ "license": "MIT",
2002
+ "dependencies": {
2003
+ "@vitest/expect": "1.6.1",
2004
+ "@vitest/runner": "1.6.1",
2005
+ "@vitest/snapshot": "1.6.1",
2006
+ "@vitest/spy": "1.6.1",
2007
+ "@vitest/utils": "1.6.1",
2008
+ "acorn-walk": "^8.3.2",
2009
+ "chai": "^4.3.10",
2010
+ "debug": "^4.3.4",
2011
+ "execa": "^8.0.1",
2012
+ "local-pkg": "^0.5.0",
2013
+ "magic-string": "^0.30.5",
2014
+ "pathe": "^1.1.1",
2015
+ "picocolors": "^1.0.0",
2016
+ "std-env": "^3.5.0",
2017
+ "strip-literal": "^2.0.0",
2018
+ "tinybench": "^2.5.1",
2019
+ "tinypool": "^0.8.3",
2020
+ "vite": "^5.0.0",
2021
+ "vite-node": "1.6.1",
2022
+ "why-is-node-running": "^2.2.2"
2023
+ },
2024
+ "bin": {
2025
+ "vitest": "vitest.mjs"
2026
+ },
2027
+ "engines": {
2028
+ "node": "^18.0.0 || >=20.0.0"
2029
+ },
2030
+ "funding": {
2031
+ "url": "https://opencollective.com/vitest"
2032
+ },
2033
+ "peerDependencies": {
2034
+ "@edge-runtime/vm": "*",
2035
+ "@types/node": "^18.0.0 || >=20.0.0",
2036
+ "@vitest/browser": "1.6.1",
2037
+ "@vitest/ui": "1.6.1",
2038
+ "happy-dom": "*",
2039
+ "jsdom": "*"
2040
+ },
2041
+ "peerDependenciesMeta": {
2042
+ "@edge-runtime/vm": {
2043
+ "optional": true
2044
+ },
2045
+ "@types/node": {
2046
+ "optional": true
2047
+ },
2048
+ "@vitest/browser": {
2049
+ "optional": true
2050
+ },
2051
+ "@vitest/ui": {
2052
+ "optional": true
2053
+ },
2054
+ "happy-dom": {
2055
+ "optional": true
2056
+ },
2057
+ "jsdom": {
2058
+ "optional": true
2059
+ }
2060
+ }
2061
+ },
2062
+ "node_modules/which": {
2063
+ "version": "2.0.2",
2064
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2065
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2066
+ "dev": true,
2067
+ "license": "ISC",
2068
+ "dependencies": {
2069
+ "isexe": "^2.0.0"
2070
+ },
2071
+ "bin": {
2072
+ "node-which": "bin/node-which"
2073
+ },
2074
+ "engines": {
2075
+ "node": ">= 8"
2076
+ }
2077
+ },
2078
+ "node_modules/why-is-node-running": {
2079
+ "version": "2.3.0",
2080
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
2081
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
2082
+ "dev": true,
2083
+ "license": "MIT",
2084
+ "dependencies": {
2085
+ "siginfo": "^2.0.0",
2086
+ "stackback": "0.0.2"
2087
+ },
2088
+ "bin": {
2089
+ "why-is-node-running": "cli.js"
2090
+ },
2091
+ "engines": {
2092
+ "node": ">=8"
2093
+ }
2094
+ },
2095
+ "node_modules/yocto-queue": {
2096
+ "version": "1.2.2",
2097
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
2098
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
2099
+ "dev": true,
2100
+ "license": "MIT",
2101
+ "engines": {
2102
+ "node": ">=12.20"
2103
+ },
2104
+ "funding": {
2105
+ "url": "https://github.com/sponsors/sindresorhus"
2106
+ }
2107
+ }
2108
+ }
2109
+}
0
2110