From 71eff2d979250b156645ae85def9212bd340fd6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beyhan=20O=C4=9Fur?= Date: Sun, 26 Apr 2026 22:09:32 +0300 Subject: [PATCH] first commit --- .dockerignore | 22 + .env | 14 + .env.example | 17 + .env.local | 14 + .gitignore | 39 + ADMIN_PANEL.md | 313 ++ API_README.md | 351 ++ API_TEST.md | 84 + DOCKER.md | 60 + DOKPLOY_TROUBLESHOOTING.md | 107 + Dockerfile | 56 + README.md | 220 ++ SECURITY.md | 61 + SETUP.md | 76 + app/admin/page.tsx | 401 ++ app/api-docs/page.tsx | 279 ++ app/api/admin/users/[id]/role/route.ts | 70 + app/api/admin/users/[id]/route.ts | 75 + .../admin/users/[id]/verification/route.ts | 72 + app/api/admin/users/route.ts | 57 + app/api/auth/[...all]/route.ts | 4 + app/api/config/route.ts | 7 + app/api/images/[id]/route.ts | 80 + app/api/images/route.ts | 77 + app/api/images/upload/route.ts | 196 + app/api/v1/admin/users/[id]/role/route.ts | 67 + app/api/v1/admin/users/[id]/route.ts | 72 + .../v1/admin/users/[id]/verification/route.ts | 69 + app/api/v1/admin/users/route.ts | 54 + app/api/v1/auth/login/route.ts | 73 + app/api/v1/auth/register/route.ts | 80 + app/api/v1/images/[id]/route.ts | 80 + app/api/v1/images/route.ts | 88 + app/api/v1/images/upload/route.ts | 182 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 26 + app/layout.tsx | 34 + app/lib/api-auth.ts | 170 + app/lib/auth.ts | 37 + app/lib/jwt.ts | 48 + ...xt js beter auth yuklu ve drizze orm y.txt | 15 + app/lib/permissions.ts | 93 + app/login/page.tsx | 142 + app/page.tsx | 293 ++ app/profile/page.tsx | 177 + app/register/page.tsx | 211 ++ app/upload/page.tsx | 415 +++ app/uploads/[...path]/route.ts | 43 + db.ts | 27 + db/schema.ts | 90 + docker-compose.yml | 46 + docker-entrypoint.sh | 9 + drizzle.config.ts | 13 + drizzle/0000_perpetual_alice.sql | 81 + drizzle/0001_harsh_morbius.sql | 1 + drizzle/meta/0000_snapshot.json | 527 +++ drizzle/meta/0001_snapshot.json | 534 +++ drizzle/meta/_journal.json | 20 + eslint.config.mjs | 18 + image_api.sql | Bin 0 -> 9354 bytes make-admin.ts | 35 + nemoriebank.md | 115 + next.config.ts | 44 + package.json | 44 + postcss.config.mjs | 7 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/uploads/G2IZKMVncbgNhi9rU1bon.avif | Bin 0 -> 5739 bytes public/uploads/UTwr4wJNmDaIHgmovLogH.avif | Bin 0 -> 41941 bytes public/uploads/_u1OsfM__88agO_goDnRz.jpg | Bin 0 -> 9204 bytes public/uploads/diQ-g_qzoYCI4GuOiNny6.avif | Bin 0 -> 230110 bytes public/uploads/kGGOVikvdoUO7F7ci0MLx.avif | Bin 0 -> 44492 bytes public/vercel.svg | 1 + public/window.svg | 1 + sadece login olmus userlerin giris yapab.txt | 3 + tsconfig.json | 34 + yarn.lock | 3299 +++++++++++++++++ 78 files changed, 10173 insertions(+) create mode 100644 .dockerignore create mode 100644 .env create mode 100644 .env.example create mode 100644 .env.local create mode 100644 .gitignore create mode 100644 ADMIN_PANEL.md create mode 100644 API_README.md create mode 100644 API_TEST.md create mode 100644 DOCKER.md create mode 100644 DOKPLOY_TROUBLESHOOTING.md create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 SETUP.md create mode 100644 app/admin/page.tsx create mode 100644 app/api-docs/page.tsx create mode 100644 app/api/admin/users/[id]/role/route.ts create mode 100644 app/api/admin/users/[id]/route.ts create mode 100644 app/api/admin/users/[id]/verification/route.ts create mode 100644 app/api/admin/users/route.ts create mode 100644 app/api/auth/[...all]/route.ts create mode 100644 app/api/config/route.ts create mode 100644 app/api/images/[id]/route.ts create mode 100644 app/api/images/route.ts create mode 100644 app/api/images/upload/route.ts create mode 100644 app/api/v1/admin/users/[id]/role/route.ts create mode 100644 app/api/v1/admin/users/[id]/route.ts create mode 100644 app/api/v1/admin/users/[id]/verification/route.ts create mode 100644 app/api/v1/admin/users/route.ts create mode 100644 app/api/v1/auth/login/route.ts create mode 100644 app/api/v1/auth/register/route.ts create mode 100644 app/api/v1/images/[id]/route.ts create mode 100644 app/api/v1/images/route.ts create mode 100644 app/api/v1/images/upload/route.ts create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/lib/api-auth.ts create mode 100644 app/lib/auth.ts create mode 100644 app/lib/jwt.ts create mode 100644 app/lib/next js beter auth yuklu ve drizze orm y.txt create mode 100644 app/lib/permissions.ts create mode 100644 app/login/page.tsx create mode 100644 app/page.tsx create mode 100644 app/profile/page.tsx create mode 100644 app/register/page.tsx create mode 100644 app/upload/page.tsx create mode 100644 app/uploads/[...path]/route.ts create mode 100644 db.ts create mode 100644 db/schema.ts create mode 100644 docker-compose.yml create mode 100644 docker-entrypoint.sh create mode 100644 drizzle.config.ts create mode 100644 drizzle/0000_perpetual_alice.sql create mode 100644 drizzle/0001_harsh_morbius.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/0001_snapshot.json create mode 100644 drizzle/meta/_journal.json create mode 100644 eslint.config.mjs create mode 100644 image_api.sql create mode 100644 make-admin.ts create mode 100644 nemoriebank.md create mode 100644 next.config.ts create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/uploads/G2IZKMVncbgNhi9rU1bon.avif create mode 100644 public/uploads/UTwr4wJNmDaIHgmovLogH.avif create mode 100644 public/uploads/_u1OsfM__88agO_goDnRz.jpg create mode 100644 public/uploads/diQ-g_qzoYCI4GuOiNny6.avif create mode 100644 public/uploads/kGGOVikvdoUO7F7ci0MLx.avif create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 sadece login olmus userlerin giris yapab.txt create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..514a032 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,22 @@ +node_modules +.next +.git +.gitignore +.env.development.local +.env.test.local +.env.production.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* +.DS_Store +*.pem +README.md +SETUP.md +.vscode +.idea +coverage +.nyc_output +*.log +drizzle +.env* diff --git a/.env b/.env new file mode 100644 index 0000000..8807e13 --- /dev/null +++ b/.env @@ -0,0 +1,14 @@ +#DATABASE_URL=postgres://cloud:gg7678290@10.80.80.70/image_api +#DATABASE_URL=postgresql://cloud:gg7678290@10.80.80.70:5432/image_api?search_path=public +DATABASE_URL=postgresql://cloud:gg7678290@188.132.232.119:5455/image_apiv2?search_path=public +BETTER_AUTH_SECRET=dB89kiKf56igxrB783yb3UyQToQIPZ93cRKADyq1yQEJ8EU4JRw5GlxBmGvQMu8e +REGISTER_ENABLE=true +BETTER_AUTH_URL=http://localhost:3000 +NEXT_PUBLIC_APP_URL=http://localhost:3000 +JWT_SECRET=dB89kiKf56igxrB783yb3UyQToQIPZ93cRKADyq1yQEJ8EU4JRw5GlxBmGvQMu8e + +# https://4f3dc7a1aa54f4ba52803e952d6cf6be.r2.cloudflarestorage.com/image-api + + +# local devop +# https://pub-79ea55a4c5a943c48147a7f1460049f2.r2.dev \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7b9bc8b --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +# Database +DATABASE_URL=postgresql://user:password@localhost:5432/image_api + +# Better Auth +BETTER_AUTH_SECRET=your-secret-key-here-min-32-characters +BETTER_AUTH_URL=https://image.beyhano.com.tr + +# App Settings +REGISTER_ENABLE=true +NODE_ENV=production + +# App URLs (production) +NEXT_PUBLIC_APP_URL=https://image.beyhano.com.tr +APP_URL=https://image.beyhano.com.tr + +# JWT Secret +JWT_SECRET=your-jwt-secret-key-min-32-characters-long \ No newline at end of file diff --git a/.env.local b/.env.local new file mode 100644 index 0000000..8807e13 --- /dev/null +++ b/.env.local @@ -0,0 +1,14 @@ +#DATABASE_URL=postgres://cloud:gg7678290@10.80.80.70/image_api +#DATABASE_URL=postgresql://cloud:gg7678290@10.80.80.70:5432/image_api?search_path=public +DATABASE_URL=postgresql://cloud:gg7678290@188.132.232.119:5455/image_apiv2?search_path=public +BETTER_AUTH_SECRET=dB89kiKf56igxrB783yb3UyQToQIPZ93cRKADyq1yQEJ8EU4JRw5GlxBmGvQMu8e +REGISTER_ENABLE=true +BETTER_AUTH_URL=http://localhost:3000 +NEXT_PUBLIC_APP_URL=http://localhost:3000 +JWT_SECRET=dB89kiKf56igxrB783yb3UyQToQIPZ93cRKADyq1yQEJ8EU4JRw5GlxBmGvQMu8e + +# https://4f3dc7a1aa54f4ba52803e952d6cf6be.r2.cloudflarestorage.com/image-api + + +# local devop +# https://pub-79ea55a4c5a943c48147a7f1460049f2.r2.dev \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c260fd0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/ADMIN_PANEL.md b/ADMIN_PANEL.md new file mode 100644 index 0000000..0463706 --- /dev/null +++ b/ADMIN_PANEL.md @@ -0,0 +1,313 @@ +# Admin Panel & Role-Based Access Control (RBAC) + +## Genel Bakış + +Bu proje artık kapsamlı bir rol tabanlı erişim kontrol (RBAC) sistemine sahiptir. Kullanıcılar rollere atanabilir ve bu roller belirli izinler sağlar. + +## Roller + +### 1. **User** (Varsayılan) +- Sadece kendi resimlerini yükleyebilir +- Sadece kendi resimlerini görebilir +- Sadece kendi resimlerini silebilir + +### 2. **Moderator** +- Kendi resimlerini yükleyebilir +- **TÜM** kullanıcıların resimlerini görebilir +- **TÜM** resimleri silebilir +- Moderasyon yetkisi + +### 3. **Admin** +- **TÜM** moderator izinlerine sahiptir +- Kullanıcıları yönetebilir (listeleme, silme) +- Kullanıcı rollerini değiştirebilir +- Tam sistem kontrolü + +## İzinler + +| İzin | User | Moderator | Admin | +|------|------|-----------|-------| +| `IMAGE_UPLOAD` | ✅ | ✅ | ✅ | +| `IMAGE_VIEW_OWN` | ✅ | ✅ | ✅ | +| `IMAGE_VIEW_ANY` | ❌ | ✅ | ✅ | +| `IMAGE_DELETE_OWN` | ✅ | ✅ | ✅ | +| `IMAGE_DELETE_ANY` | ❌ | ✅ | ✅ | +| `USER_VIEW` | ❌ | ❌ | ✅ | +| `USER_DELETE` | ❌ | ❌ | ✅ | +| `USER_MANAGE_ROLES` | ❌ | ❌ | ✅ | +| `USER_MANAGE_PERMISSIONS` | ❌ | ❌ | ✅ | +| `USER_MANAGE_API_KEYS` | ❌ | ❌ | ✅ | + +## Admin Panel + +Admin paneline erişim: **http://localhost:3000/admin** + +### Özellikler + +1. **Kullanıcı Listesi** + - Tüm kullanıcıları görüntüleme + - Kullanıcı detayları (email, rol, doğrulama durumu, kayıt tarihi) + +2. **Rol Yönetimi** + - Dropdown menüden rol seçerek anında güncelleme + - Kendi rolünü değiştirememe koruması + +3. **Kullanıcı Silme** + - Kullanıcıyı ve tüm verilerini silme + - Kullanıcının resimleri ve API anahtarları da silinir + - Kendi hesabını silememe koruması + +4. **İstatistikler** + - Toplam kullanıcı sayısı + - Admin sayısı + - Moderatör sayısı + +## API Endpoint'leri + +### Admin API + +#### 1. Kullanıcıları Listele +```http +GET /api/v1/admin/users +Authorization: Bearer +``` + +**Response:** +```json +{ + "success": true, + "data": { + "users": [ + { + "id": "user-id", + "name": "John Doe", + "email": "john@example.com", + "role": "user", + "emailVerified": true, + "createdAt": "2024-01-01T00:00:00.000Z" + } + ], + "total": 1 + } +} +``` + +#### 2. Kullanıcı Rolünü Değiştir +```http +PATCH /api/v1/admin/users/:id/role +Authorization: Bearer +Content-Type: application/json + +{ + "role": "moderator" +} +``` + +**Response:** +```json +{ + "success": true, + "message": "Kullanıcı rolü başarıyla güncellendi", + "data": { + "userId": "user-id", + "newRole": "moderator" + } +} +``` + +**Koşullar:** +- Sadece admin yetkisi +- Kendi rolünü değiştiremez +- Geçerli roller: `user`, `moderator`, `admin` + +#### 3. Kullanıcı Sil +```http +DELETE /api/v1/admin/users/:id +Authorization: Bearer +``` + +**Response:** +```json +{ + "success": true, + "message": "Kullanıcı başarıyla silindi", + "data": { + "deletedUserId": "user-id", + "deletedUser": "user@example.com" + } +} +``` + +**Koşullar:** +- Sadece admin yetkisi +- Kendi hesabını silemez +- Kullanıcının tüm resimleri ve API anahtarları da silinir + +### Güncellenmiş Resim API'leri + +#### 1. Resimleri Listele +```http +GET /api/v1/images +Authorization: Bearer +``` + +**Davranış:** +- **User**: Sadece kendi resimlerini görür +- **Moderator/Admin**: TÜM resimleri görür + +#### 2. Resim Sil +```http +DELETE /api/v1/images/:id +Authorization: Bearer +``` + +**Davranış:** +- **User**: Sadece kendi resimlerini silebilir +- **Moderator/Admin**: Herhangi bir resmi silebilir + +## İlk Admin Oluşturma + +Veritabanında manuel olarak ilk admin kullanıcısını oluşturun: + +```sql +UPDATE "user" +SET role = 'admin' +WHERE email = 'your-email@example.com'; +``` + +Veya direkt database üzerinden: + +```javascript +// Drizzle Studio veya migration ile +import { db } from "./db"; +import { user } from "./db/schema"; +import { eq } from "drizzle-orm"; + +await db.update(user) + .set({ role: "admin" }) + .where(eq(user.email, "your-email@example.com")); +``` + +## Güvenlik Özellikleri + +1. **Kendi Hesap Koruması** + - Admin kendi rolünü değiştiremez + - Admin kendi hesabını silemez + +2. **Yetkilendirme Kontrolleri** + - Her endpoint permission kontrolü yapar + - 401 (Unauthorized): Giriş yapmamış + - 403 (Forbidden): Yetkisi yok + +3. **Cascade Silme** + - Kullanıcı silindiğinde tüm resimleri ve API anahtarları da silinir + +4. **Role Validasyonu** + - Sadece geçerli roller kabul edilir + - Geçersiz rol atama engellenir + +## Kullanım Örnekleri + +### JavaScript/TypeScript (Web) + +```javascript +// Admin paneline giriş (token localStorage'da saklanıyor) +const token = localStorage.getItem("token"); + +// Kullanıcıları listele +const response = await fetch("/api/v1/admin/users", { + headers: { + Authorization: `Bearer ${token}`, + }, +}); + +const { data } = await response.json(); +console.log(data.users); + +// Rol değiştir +await fetch("/api/v1/admin/users/user-id/role", { + method: "PATCH", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ role: "moderator" }), +}); + +// Kullanıcı sil +await fetch("/api/v1/admin/users/user-id", { + method: "DELETE", + headers: { + Authorization: `Bearer ${token}`, + }, +}); +``` + +### cURL + +```bash +# Kullanıcıları listele +curl -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ + http://localhost:3000/api/v1/admin/users + +# Rol değiştir +curl -X PATCH \ + -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"role":"moderator"}' \ + http://localhost:3000/api/v1/admin/users/USER_ID/role + +# Kullanıcı sil +curl -X DELETE \ + -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ + http://localhost:3000/api/v1/admin/users/USER_ID +``` + +## Migration + +Role field'ını veritabanına eklemek için: + +```bash +# Schema'dan migration oluştur +yarn db:generate + +# Migration'ı çalıştır +yarn db:push +``` + +Veya manuel olarak SQL: + +```sql +ALTER TABLE "user" +ADD COLUMN IF NOT EXISTS role TEXT DEFAULT 'user'; +``` + +## Dosya Yapısı + +``` +app/ +├── lib/ +│ ├── permissions.ts # RBAC sistem tanımları +│ └── api-auth.ts # Auth middleware (role içerir) +├── api/ +│ └── v1/ +│ └── admin/ +│ └── users/ +│ ├── route.ts # GET (list) +│ └── [id]/ +│ ├── route.ts # DELETE +│ └── role/ +│ └── route.ts # PATCH +└── admin/ + └── page.tsx # Admin panel UI +``` + +## Sonraki Adımlar + +1. ✅ Role sistemi eklendi +2. ✅ Permission kontrolleri eklendi +3. ✅ Admin panel oluşturuldu +4. ✅ Kullanıcı yönetimi API'leri eklendi +5. ⏳ Email bildirimleri (rol değişikliği, hesap silme) +6. ⏳ Audit log sistemi (kim ne yaptı?) +7. ⏳ Gelişmiş filtreleme (role göre, tarihe göre) diff --git a/API_README.md b/API_README.md new file mode 100644 index 0000000..0660f8c --- /dev/null +++ b/API_README.md @@ -0,0 +1,351 @@ +# Image API - Resim Manipülasyon API Dokümantasyonu + +Bu API, dış uygulamaların resim yükleme, manipülasyon ve yönetim işlemlerini yapmasına olanak tanır. + +## Base URL +``` +https://image.beyhano.com.tr +# veya development için +http://localhost:3000 +``` + +## Authentication + +API, JWT token tabanlı kimlik doğrulama kullanır. Her istekte `Authorization` header'ında Bearer token gönderilmelidir. + +``` +Authorization: Bearer +``` + +## Endpoints + +### 1. Kayıt Ol (Register) + +Yeni kullanıcı kaydı oluşturur ve JWT token döner. + +**Endpoint:** `POST /api/v1/auth/register` + +**Request Body:** +```json +{ + "email": "user@example.com", + "password": "minimum8karakter", + "name": "Kullanıcı Adı" +} +``` + +**Response (200):** +```json +{ + "success": true, + "message": "Kayıt başarılı", + "data": { + "user": { + "id": "user_123abc", + "email": "user@example.com", + "name": "Kullanıcı Adı" + }, + "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + } +} +``` + +**Hata Kodları:** +- `400` - Gerekli alanlar eksik veya geçersiz +- `409` - Email adresi zaten kullanımda +- `500` - Sunucu hatası + +--- + +### 2. Giriş Yap (Login) + +Mevcut kullanıcı ile giriş yapar ve JWT token döner. + +**Endpoint:** `POST /api/v1/auth/login` + +**Request Body:** +```json +{ + "email": "user@example.com", + "password": "minimum8karakter" +} +``` + +**Response (200):** +```json +{ + "success": true, + "message": "Giriş başarılı", + "data": { + "user": { + "id": "user_123abc", + "email": "user@example.com", + "name": "Kullanıcı Adı" + }, + "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + } +} +``` + +**Hata Kodları:** +- `400` - Email veya şifre eksik +- `401` - Geçersiz email veya şifre +- `500` - Sunucu hatası + +--- + +### 3. Resim Yükle ve Manipüle Et + +Resim yükler, belirtilen boyut/kalite/formatta işler ve kaydeder. + +**Endpoint:** `POST /api/v1/images/upload` + +**Headers:** +``` +Authorization: Bearer +Content-Type: multipart/form-data +``` + +**Request Body (FormData):** +- `file` (required): Resim dosyası (max 10MB) +- `width` (optional): Genişlik (px), default: 800, max: 10000 +- `height` (optional): Yükseklik (px), default: 600, max: 10000 +- `quality` (optional): Kalite (1-100), default: 90 +- `format` (optional): Format (jpeg, png, webp, avif), default: jpeg + +**cURL Örneği:** +```bash +curl -X POST https://image.beyhano.com.tr/api/v1/images/upload \ + -H "Authorization: Bearer YOUR_JWT_TOKEN" \ + -F "file=@/path/to/image.jpg" \ + -F "width=1920" \ + -F "height=1080" \ + -F "quality=85" \ + -F "format=webp" +``` + +**Response (200):** +```json +{ + "success": true, + "message": "Resim başarıyla yüklendi", + "data": { + "image": { + "id": "img_xyz789", + "url": "https://image.beyhano.com.tr/uploads/xyz789.webp", + "width": 1920, + "height": 1080, + "format": "webp", + "fileSize": 245678 + } + } +} +``` + +**Hata Kodları:** +- `400` - Dosya eksik, boyut çok büyük veya geçersiz tip +- `401` - Geçersiz veya eksik token +- `500` - Sunucu hatası + +--- + +### 4. Resimleri Listele + +Kullanıcının tüm resimlerini listeler. + +**Endpoint:** `GET /api/v1/images` + +**Headers:** +``` +Authorization: Bearer +``` + +**Response (200):** +```json +{ + "success": true, + "data": { + "images": [ + { + "id": "img_xyz789", + "originalName": "photo.jpg", + "url": "https://image.beyhano.com.tr/uploads/xyz789.webp", + "width": 1920, + "height": 1080, + "quality": 85, + "format": "webp", + "fileSize": 245678, + "createdAt": "2026-01-06T02:00:00.000Z" + } + ], + "total": 1 + } +} +``` + +**Hata Kodları:** +- `401` - Geçersiz veya eksik token +- `500` - Sunucu hatası + +--- + +### 5. Resim Sil + +Belirtilen ID'ye sahip resmi siler. + +**Endpoint:** `DELETE /api/v1/images/{id}` + +**Headers:** +``` +Authorization: Bearer +``` + +**cURL Örneği:** +```bash +curl -X DELETE https://image.beyhano.com.tr/api/v1/images/img_xyz789 \ + -H "Authorization: Bearer YOUR_JWT_TOKEN" +``` + +**Response (200):** +```json +{ + "success": true, + "message": "Resim başarıyla silindi" +} +``` + +**Hata Kodları:** +- `401` - Geçersiz veya eksik token +- `404` - Resim bulunamadı veya size ait değil +- `500` - Sunucu hatası + +--- + +## Örnek Kullanım (JavaScript/Node.js) + +```javascript +// 1. Kayıt ol +const registerResponse = await fetch('https://image.beyhano.com.tr/api/v1/auth/register', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + email: 'user@example.com', + password: 'securepassword123', + name: 'Kullanıcı' + }) +}); +const { data } = await registerResponse.json(); +const token = data.accessToken; + +// 2. Resim yükle +const formData = new FormData(); +formData.append('file', fileInput.files[0]); +formData.append('width', '1920'); +formData.append('height', '1080'); +formData.append('quality', '85'); +formData.append('format', 'webp'); + +const uploadResponse = await fetch('https://image.beyhano.com.tr/api/v1/images/upload', { + method: 'POST', + headers: { 'Authorization': `Bearer ${token}` }, + body: formData +}); +const uploadData = await uploadResponse.json(); +console.log('Yüklenen resim:', uploadData.data.image.url); + +// 3. Resimleri listele +const imagesResponse = await fetch('https://image.beyhano.com.tr/api/v1/images', { + headers: { 'Authorization': `Bearer ${token}` } +}); +const imagesData = await imagesResponse.json(); +console.log('Toplam resim:', imagesData.data.total); + +// 4. Resim sil +const deleteResponse = await fetch(`https://image.beyhano.com.tr/api/v1/images/${imageId}`, { + method: 'DELETE', + headers: { 'Authorization': `Bearer ${token}` } +}); +const deleteData = await deleteResponse.json(); +console.log(deleteData.message); +``` + +## Örnek Kullanım (Python) + +```python +import requests + +# 1. Kayıt ol +register_response = requests.post( + 'https://image.beyhano.com.tr/api/v1/auth/register', + json={ + 'email': 'user@example.com', + 'password': 'securepassword123', + 'name': 'Kullanıcı' + } +) +token = register_response.json()['data']['accessToken'] + +# 2. Resim yükle +with open('image.jpg', 'rb') as f: + upload_response = requests.post( + 'https://image.beyhano.com.tr/api/v1/images/upload', + headers={'Authorization': f'Bearer {token}'}, + files={'file': f}, + data={ + 'width': '1920', + 'height': '1080', + 'quality': '85', + 'format': 'webp' + } + ) +image_url = upload_response.json()['data']['image']['url'] +print(f'Yüklenen resim: {image_url}') + +# 3. Resimleri listele +images_response = requests.get( + 'https://image.beyhano.com.tr/api/v1/images', + headers={'Authorization': f'Bearer {token}'} +) +images = images_response.json()['data']['images'] +print(f'Toplam resim: {len(images)}') + +# 4. Resim sil +delete_response = requests.delete( + f'https://image.beyhano.com.tr/api/v1/images/{image_id}', + headers={'Authorization': f'Bearer {token}'} +) +print(delete_response.json()['message']) +``` + +## Güvenlik + +- JWT token'lar 7 gün geçerlidir +- Şifreler bcrypt ile hashlenmiş olarak saklanır +- Token'ları güvenli bir şekilde saklayın +- HTTPS kullanın (production'da) +- Rate limiting uygulanabilir + +## Limitler + +- Maximum dosya boyutu: 10MB +- Maximum resim boyutu: 10000x10000 px +- Desteklenen formatlar: JPEG, PNG, WebP, AVIF, GIF +- JWT token geçerlilik süresi: 7 gün + +## Hata Yönetimi + +Tüm hata yanıtları şu formatta döner: + +```json +{ + "error": "Hata mesajı burada" +} +``` + +HTTP status kodları: +- `200` - Başarılı +- `400` - Kötü istek (geçersiz parametreler) +- `401` - Kimlik doğrulama hatası +- `404` - Bulunamadı +- `409` - Çakışma (örn: email zaten kullanımda) +- `500` - Sunucu hatası diff --git a/API_TEST.md b/API_TEST.md new file mode 100644 index 0000000..8da2875 --- /dev/null +++ b/API_TEST.md @@ -0,0 +1,84 @@ +# Image API - Test Senaryoları + +## API Test Komutları (cURL) + +### 1. Kayıt Ol +```bash +curl -X POST http://localhost:3000/api/v1/auth/register \ + -H "Content-Type: application/json" \ + -d '{ + "email": "test@example.com", + "password": "test12345", + "name": "Test User" + }' +``` + +### 2. Login +```bash +curl -X POST http://localhost:3000/api/v1/auth/login \ + -H "Content-Type: application/json" \ + -d '{ + "email": "test@example.com", + "password": "test12345" + }' +``` + +Yanıttan `accessToken` değerini alın ve aşağıdaki komutlarda kullanın: +```bash +export TOKEN="buraya_token_yapistirin" +``` + +### 3. Resim Yükle +```bash +curl -X POST http://localhost:3000/api/v1/images/upload \ + -H "Authorization: Bearer $TOKEN" \ + -F "file=@/path/to/image.jpg" \ + -F "width=800" \ + -F "height=600" \ + -F "quality=90" \ + -F "format=webp" +``` + +### 4. Resimleri Listele +```bash +curl -X GET http://localhost:3000/api/v1/images \ + -H "Authorization: Bearer $TOKEN" +``` + +### 5. Resim Sil +```bash +export IMAGE_ID="buraya_image_id_yapistirin" +curl -X DELETE http://localhost:3000/api/v1/images/$IMAGE_ID \ + -H "Authorization: Bearer $TOKEN" +``` + +## Test Flow + +1. Önce register olun ve token alın +2. Token ile resim yükleyin +3. Yüklenen resimleri listeleyin +4. Bir resmi silin +5. Tekrar listeleyin ve silindiğini doğrulayın + +## Hata Testleri + +### Geçersiz Token +```bash +curl -X GET http://localhost:3000/api/v1/images \ + -H "Authorization: Bearer invalid_token" +``` + +### Token Olmadan +```bash +curl -X GET http://localhost:3000/api/v1/images +``` + +### Geçersiz Login +```bash +curl -X POST http://localhost:3000/api/v1/auth/login \ + -H "Content-Type: application/json" \ + -d '{ + "email": "test@example.com", + "password": "yanlis_sifre" + }' +``` diff --git a/DOCKER.md b/DOCKER.md new file mode 100644 index 0000000..0c2cfd2 --- /dev/null +++ b/DOCKER.md @@ -0,0 +1,60 @@ +# Docker Deployment Guide + +Bu proje Node.js v24.12.0 ve Yarn 1.22.22 ile Dockerize edilmiştir. + +## Gereksinimler + +- Docker +- Docker Compose + +## Hızlı Başlangıç + +1. `.env` dosyası oluşturun: + +```bash +DATABASE_URL=postgresql://user:password@host:5432/dbname +BETTER_AUTH_SECRET=your-secret-key-here-min-32-characters-long +BETTER_AUTH_URL=http://localhost:3000 +REGISTER_ENABLE=true +``` + +**Not:** `DATABASE_URL` mevcut PostgreSQL sunucunuzun bağlantı bilgilerini içermelidir. Eğer PostgreSQL Docker dışında çalışıyorsa, host IP adresini veya `host.docker.internal` (Mac/Windows) kullanabilirsiniz. + +2. Docker Compose ile başlatın: + +```bash +docker-compose up -d +``` + +3. Veritabanı migration'larını çalıştırın (ilk kurulumda): + +```bash +docker-compose exec image-api yarn db:push +``` + +4. Uygulama `http://localhost:3000` adresinde çalışacaktır. + +## Manuel Docker Build + +Sadece uygulamayı build etmek için: + +```bash +docker build -t image-api . +docker run -p 3000:3000 --env-file .env image-api +``` + +## Production Notları + +- `.env` dosyasında `BETTER_AUTH_SECRET` mutlaka güçlü bir secret olmalıdır (en az 32 karakter) +- Production'da `BETTER_AUTH_URL` gerçek domain'inizi içermelidir +- PostgreSQL veritabanı dış bir sunucuda çalışmaktadır (docker-compose'da dahil değildir) +- `DATABASE_URL` mevcut PostgreSQL sunucunuzun erişilebilir adresini içermelidir (örn: `postgresql://user:pass@10.80.80.70:5432/dbname`) +- Upload klasörü volume olarak mount edilmiştir, böylece veriler kalıcı olur +- Container, host'un network'ündeki PostgreSQL sunucusuna erişebilir + +## Güvenlik + +- Tüm güvenlik header'ları yapılandırılmıştır +- File upload validasyonları eklenmiştir +- Debug bilgileri production'dan kaldırılmıştır +- Input validasyonları eklenmiştir diff --git a/DOKPLOY_TROUBLESHOOTING.md b/DOKPLOY_TROUBLESHOOTING.md new file mode 100644 index 0000000..a65fd3c --- /dev/null +++ b/DOKPLOY_TROUBLESHOOTING.md @@ -0,0 +1,107 @@ +# Dokploy Troubleshooting Guide + +## PostgreSQL Bağlantı Sorunları + +### Hata: `ECONNREFUSED` veya `Failed query` + +Bu hata, uygulamanın PostgreSQL sunucusuna bağlanamadığını gösterir. + +### Kontrol Listesi + +1. **DATABASE_URL Environment Variable Kontrolü** + + Dokploy'da environment variables bölümünde `DATABASE_URL` değerini kontrol edin: + + ```bash + # Doğru format: + DATABASE_URL=postgresql://user:password@host:port/database?search_path=public + + # Örnek: + DATABASE_URL=postgresql://cloud:gg7678290@10.80.80.70:5432/image_api?search_path=public + ``` + +2. **Network Erişimi** + + - Dokploy container'ından PostgreSQL sunucusuna erişilebilir olmalı + - Eğer PostgreSQL farklı bir network'teyse, network yapılandırmasını kontrol edin + - Firewall kurallarını kontrol edin (port 5432 açık olmalı) + +3. **IP Adresi ve Port** + + - Hata mesajında görünen IP/port ile DATABASE_URL'deki IP/port eşleşmeli + - Eğer farklıysa, Dokploy'da environment variable'ı güncelleyin + +4. **Connection String Formatı** + + ```bash + # ✅ Doğru + postgresql://user:password@10.80.80.70:5432/dbname + + # ❌ Yanlış + postgres://user:password@10.80.80.70:5432/dbname # postgres yerine postgresql kullanın + postgresql://user:password@10.80.80.70/dbname # Port eksik + ``` + +5. **Schema Belirtme** + + Eğer `public` dışında bir schema kullanıyorsanız: + ```bash + DATABASE_URL=postgresql://user:password@host:port/dbname?search_path=your_schema + ``` + +### Dokploy'da Environment Variables Ayarlama + +1. Dokploy dashboard'a giriş yapın +2. Projenizi seçin +3. "Environment Variables" bölümüne gidin +4. `DATABASE_URL` değerini kontrol edin/güncelleyin +5. Değişikliklerden sonra container'ı yeniden başlatın + +### Test Komutları + +Container içinden bağlantıyı test etmek için: + +```bash +# Container'a bağlan +docker exec -it image-api-app sh + +# PostgreSQL bağlantısını test et +psql $DATABASE_URL -c "SELECT version();" +``` + +### Yaygın Hatalar ve Çözümleri + +**Hata:** `ECONNREFUSED 10.0.1.215:5455` +- **Sebep:** DATABASE_URL yanlış IP/port içeriyor +- **Çözüm:** Dokploy'da DATABASE_URL'i doğru IP ve port ile güncelleyin + +**Hata:** `timeout expired` +- **Sebep:** Network erişim sorunu veya firewall +- **Çözüm:** Network yapılandırmasını ve firewall kurallarını kontrol edin + +**Hata:** `password authentication failed` +- **Sebep:** Yanlış kullanıcı adı/şifre +- **Çözüm:** DATABASE_URL'deki credentials'ları kontrol edin + +### Örnek Doğru DATABASE_URL + +```bash +# Local PostgreSQL +DATABASE_URL=postgresql://postgres:password@localhost:5432/image_api?search_path=public + +# Remote PostgreSQL +DATABASE_URL=postgresql://cloud:gg7678290@10.80.80.70:5432/image_api?search_path=public + +# SSL ile +DATABASE_URL=postgresql://user:pass@host:5432/dbname?sslmode=require +``` + +### Debug Modu + +Daha detaylı hata mesajları için: + +```bash +# db.ts dosyasında pool.on('error') event handler'ı logları gösterir +# Container loglarını kontrol edin: +docker logs image-api-app +``` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fc35f4d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,56 @@ +# Node.js v24.12.0 kullan +FROM node:24.12.0-alpine AS base + +# Yarn için corepack'i etkinleştir +RUN corepack enable + +# Dependencies stage - sadece gerekli bağımlılıkları yükle +FROM base AS deps +WORKDIR /app + +# Package dosyalarını kopyala +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + +# Builder stage - uygulamayı build et +FROM base AS builder +WORKDIR /app + +# Node modules'ü kopyala +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Build için gerekli environment variables +ENV NEXT_TELEMETRY_DISABLED=1 +# Build-time için dummy değerler (runtime'da gerçek değerler kullanılacak) +ENV DATABASE_URL="postgresql://cloud:gg7678290@database-postgist-5pcspx:5432/image_api?search_path=public" +ENV BETTER_AUTH_SECRET="dB89kiKf56igxrB783yb3UyQToQIPZ93cRKADyq1yQEJ8EU4JRw5GlxBmGvQMu8e" +ENV BETTER_AUTH_URL="https://image.beyhano.com.tr" +ENV REGISTER_ENABLE=false +# Next.js build +RUN yarn build + +# Runner stage - production için minimal image +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +# Güvenlik için non-root user oluştur +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# Standalone build'den dosyaları kopyala +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=builder --chown=nextjs:nodejs /app/public ./public + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +CMD ["node", "server.js"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..2fccd2d --- /dev/null +++ b/README.md @@ -0,0 +1,220 @@ +# Image Manipulation API + +Modern, güvenli ve ölçeklenebilir resim yönetim ve manipülasyon platformu. Next.js 16, Better Auth ve Drizzle ORM ile geliştirilmiştir. + +## ✨ Özellikler + +### 🔐 Güvenlik & Kimlik Doğrulama +- **Better Auth** ile session tabanlı kimlik doğrulama +- **JWT** destekli REST API (dış uygulamalar için) +- **Role-Based Access Control (RBAC)** - 3 farklı rol (User, Moderator, Admin) +- API Key yönetimi +- Şifre hashleme (bcrypt) + +### 🎨 Resim İşleme +- **Sharp** kütüphanesi ile hızlı resim manipülasyonu +- Boyutlandırma (width/height) +- Format dönüştürme (JPEG, PNG, WebP, AVIF) +- Kalite ayarı (1-100) +- Otomatik dosya boyutu optimizasyonu + +### 👥 Kullanıcı Yönetimi +- **Admin Panel** - Kullanıcıları yönetme, rol atama, silme +- Kullanıcı profili +- Email doğrulama desteği +- Kayıt açma/kapama kontrolü + +### 📊 Rol ve İzinler + +| Rol | İzinler | +|-----|---------| +| **User** | Kendi resimlerini yükleyebilir, görüntüleyebilir ve silebilir | +| **Moderator** | Tüm resimleri görüntüleyebilir ve silebilir | +| **Admin** | Tüm moderator izinleri + Kullanıcı yönetimi | + +### 🚀 API Özellikleri +- RESTful API tasarımı +- JWT token authentication +- API Key authentication +- Rate limiting (opsiyonel) +- Swagger-style dokümantasyon + +## 📦 Teknolojiler + +- **Framework**: Next.js 16.1.1 (App Router, Turbopack) +- **Auth**: better-auth v1.4.10 +- **Database**: PostgreSQL + Drizzle ORM v0.45.1 +- **Image Processing**: Sharp v0.34.5 +- **Styling**: Tailwind CSS v4 +- **Container**: Docker & Docker Compose +- **Runtime**: Node.js v24.12.0 + +## 🛠️ Kurulum + +### 1. Proje Klonlama +\`\`\`bash +git clone +cd image-api +\`\`\` + +### 2. Ortam Değişkenleri +\`.env\` dosyası oluşturun: +\`\`\`env +DATABASE_URL=postgresql://user:password@localhost:5432/image_api +BETTER_AUTH_SECRET=your-super-secret-key-min-32-chars +BETTER_AUTH_URL=http://localhost:3000 +NEXT_PUBLIC_APP_URL=http://localhost:3000 +JWT_SECRET=another-super-secret-key-min-32-characters +REGISTER_ENABLE=true +\`\`\` + +### 3. Docker ile Çalıştırma +\`\`\`bash +# PostgreSQL başlat +docker compose up -d postgres + +# Bağımlılıkları yükle +yarn install + +# Database migration +yarn db:push + +# Development server +yarn dev +\`\`\` + +### 4. İlk Admin Kullanıcısı +\`\`\`bash +# Kayıt ol +# Sonra admin yap: +npx tsx make-admin.ts your-email@example.com +\`\`\` + +## 📚 API Kullanımı + +### Kayıt ve Login +\`\`\`bash +# Kayıt +curl -X POST http://localhost:3000/api/v1/auth/register \\ + -H "Content-Type: application/json" \\ + -d '{"email":"user@example.com","password":"password123","name":"John Doe"}' + +# Login +curl -X POST http://localhost:3000/api/v1/auth/login \\ + -H "Content-Type: application/json" \\ + -d '{"email":"user@example.com","password":"password123"}' + +# Response: {"success":true,"token":"jwt-token-here"} +\`\`\` + +### Resim Yükleme +\`\`\`bash +curl -X POST http://localhost:3000/api/v1/images/upload \\ + -H "Authorization: Bearer YOUR_JWT_TOKEN" \\ + -F "file=@photo.jpg" \\ + -F "width=800" \\ + -F "quality=90" \\ + -F "format=webp" +\`\`\` + +### Resim Listeleme +\`\`\`bash +# User: Sadece kendi resimleri +# Moderator/Admin: Tüm resimler +curl http://localhost:3000/api/v1/images \\ + -H "Authorization: Bearer YOUR_JWT_TOKEN" +\`\`\` + +### Admin - Kullanıcıları Listeleme +\`\`\`bash +curl http://localhost:3000/api/v1/admin/users \\ + -H "Authorization: Bearer ADMIN_JWT_TOKEN" +\`\`\` + +### Admin - Rol Değiştirme +\`\`\`bash +curl -X PATCH http://localhost:3000/api/v1/admin/users/USER_ID/role \\ + -H "Authorization: Bearer ADMIN_JWT_TOKEN" \\ + -H "Content-Type: application/json" \\ + -d '{"role":"moderator"}' +\`\`\` + +Detaylı API dokümantasyonu: **http://localhost:3000/api-docs** + +## 🎯 Sayfalar + +- \`/\` - Anasayfa +- \`/login\` - Giriş yap +- \`/register\` - Kayıt ol (REGISTER_ENABLE=true ise) +- \`/upload\` - Resim yükle +- \`/profile\` - Profil ve resimlerim +- \`/admin\` - Admin panel (sadece adminler) +- \`/api-docs\` - API dokümantasyonu + +## 🔒 Güvenlik Özellikleri + +1. **Password Hashing**: bcrypt ile şifreler güvenle saklanır +2. **JWT Tokens**: 7 günlük geçerlilik süresi +3. **Role-Based Access**: Endpoint bazında yetkilendirme +4. **Session Management**: Better Auth ile güvenli session yönetimi +5. **CORS**: Yapılandırılabilir CORS desteği +6. **Environment Variables**: Hassas bilgiler .env'de + +## 📊 Database Schema + +### Tables +- \`user\` - Kullanıcı bilgileri (email, password_hash, role) +- \`session\` - Aktif oturumlar +- \`account\` - OAuth provider hesapları +- \`verification\` - Email doğrulama +- \`images\` - Yüklenen resimler +- \`apiKeys\` - API anahtarları + +## 🐳 Docker Production Build + +\`\`\`bash +# Build image +docker build -t image-api . + +# Run with docker-compose +docker compose up -d + +# Check logs +docker compose logs -f image-api +\`\`\` + +## 📝 Scripts + +\`\`\`bash +yarn dev # Development server +yarn build # Production build +yarn start # Production server +yarn lint # ESLint +yarn db:generate # Generate migrations +yarn db:push # Push schema to DB +yarn db:studio # Drizzle Studio +\`\`\` + +## 🤝 Katkıda Bulunma + +1. Fork edin +2. Feature branch oluşturun (\`git checkout -b feature/amazing\`) +3. Commit edin (\`git commit -m 'Add amazing feature'\`) +4. Push edin (\`git push origin feature/amazing\`) +5. Pull Request açın + +## 📄 Lisans + +MIT + +## 👨‍💻 Geliştirici + +Beyhan Oğur - [beyhan@beyhan.dev](mailto:beyhan@beyhan.dev) + +--- + +**Daha fazla bilgi için:** +- [API Documentation](./API_README.md) +- [Admin Panel Guide](./ADMIN_PANEL.md) +- [Docker Setup](./DOCKER.md) +- [Security Guide](./SECURITY.md) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..56dcd1d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,61 @@ +# Güvenlik İyileştirmeleri + +Bu dokümanda production'a hazırlık için yapılan güvenlik iyileştirmeleri listelenmektedir. + +## Yapılan İyileştirmeler + +### 1. Debug Bilgilerinin Kaldırılması +- ✅ Production console.log ifadeleri kaldırıldı +- ✅ API response'lardan debug bilgileri çıkarıldı +- ✅ Hata mesajlarında hassas bilgi sızıntısı önlendi + +### 2. File Upload Güvenliği +- ✅ Dosya boyutu limiti eklendi (maksimum 10MB) +- ✅ MIME type validasyonu eklendi +- ✅ Sadece resim dosyaları kabul ediliyor (jpeg, jpg, png, gif, webp, avif) +- ✅ Path traversal koruması (nanoid kullanımı) + +### 3. Input Validasyonu +- ✅ Width/Height validasyonu (1-10000px arası) +- ✅ Quality validasyonu (1-100 arası) +- ✅ Format validasyonu (sadece izin verilen formatlar) +- ✅ Image ID validasyonu (uzunluk ve tip kontrolü) + +### 4. Security Headers +- ✅ Strict-Transport-Security (HSTS) +- ✅ X-Frame-Options +- ✅ X-Content-Type-Options +- ✅ X-XSS-Protection +- ✅ Referrer-Policy +- ✅ Permissions-Policy + +### 5. Authentication & Authorization +- ✅ Tüm API endpoint'lerinde authentication kontrolü +- ✅ User-based authorization (kullanıcılar sadece kendi resimlerini görebilir/silebilir) +- ✅ Better Auth kullanımı (güvenli session yönetimi) + +### 6. Database Security +- ✅ Drizzle ORM kullanımı (SQL injection koruması) +- ✅ Parameterized queries +- ✅ Foreign key constraints + +### 7. Environment Variables +- ✅ Hassas bilgiler environment variable'larda +- ✅ .env.example dosyası oluşturuldu +- ✅ .gitignore'da .env dosyaları ignore ediliyor + +## Production Checklist + +- [ ] `BETTER_AUTH_SECRET` güçlü bir secret olarak ayarlanmalı (min 32 karakter) +- [ ] `BETTER_AUTH_URL` production domain'i ile güncellenmeli +- [ ] `DATABASE_URL` production veritabanı bağlantısı ile güncellenmeli +- [ ] HTTPS kullanılmalı (production'da) +- [ ] Rate limiting eklenmeli (opsiyonel, yüksek trafik için) +- [ ] Monitoring ve logging kurulumu yapılmalı +- [ ] Regular backup stratejisi oluşturulmalı + +## Notlar + +- File upload limiti 10MB olarak ayarlanmıştır. Gerekirse artırılabilir. +- Tüm hata mesajları generic olarak döndürülmektedir (hassas bilgi sızıntısını önlemek için). +- Console.log ifadeleri production'dan kaldırılmıştır, ancak geliştirme ortamında gerekirse eklenebilir. diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..5ef5872 --- /dev/null +++ b/SETUP.md @@ -0,0 +1,76 @@ +# Kurulum Talimatları + +Bu proje Next.js, Better Auth ve Drizzle ORM ile PostgreSQL entegrasyonu içerir. + +## Gereksinimler + +- Node.js 18+ +- PostgreSQL veritabanı +- npm veya yarn + +## Kurulum Adımları + +### 1. Bağımlılıkları Yükleyin + +```bash +npm install +# veya +yarn install +``` + +### 2. Ortam Değişkenlerini Ayarlayın + +Proje kök dizininde `.env` dosyası oluşturun: + +```env +DATABASE_URL=postgresql://user:password@localhost:5432/dbname +BETTER_AUTH_SECRET=your-secret-key-here-minimum-32-characters +BETTER_AUTH_URL=http://localhost:3000 +REGISTER_ENABLE=true +``` + +**Önemli:** +- `BETTER_AUTH_SECRET` en az 32 karakter uzunluğunda güvenli bir rastgele string olmalıdır. +- `REGISTER_ENABLE` kayıt sayfasını açıp kapatmak için kullanılır. `true` veya `false` değeri alabilir. Varsayılan olarak `true`'dur. + +### 3. Veritabanı Şemasını Oluşturun + +```bash +npm run db:push +# veya +yarn db:push +``` + +Bu komut, `db/schema.ts` dosyasındaki şemaya göre veritabanı tablolarını oluşturacaktır. + +### 4. Geliştirme Sunucusunu Başlatın + +```bash +npm run dev +# veya +yarn dev +``` + +Tarayıcınızda [http://localhost:3000](http://localhost:3000) adresine gidin. + +## Kullanım + +1. **Kayıt Ol:** `/register` sayfasından yeni bir hesap oluşturun +2. **Giriş Yap:** `/login` sayfasından giriş yapın +3. **Profil:** Giriş yaptıktan sonra `/profile` sayfasında kullanıcı bilgilerinizi görüntüleyin + +## Veritabanı Komutları + +- `npm run db:generate` - Migration dosyalarını oluşturur +- `npm run db:push` - Şemayı veritabanına uygular +- `npm run db:studio` - Drizzle Studio'yu açar (veritabanı görüntüleme aracı) + +## Dosya Yapısı + +- `db.ts` - Drizzle veritabanı bağlantısı +- `db/schema.ts` - Veritabanı şema tanımları +- `app/lib/auth.ts` - Better Auth yapılandırması +- `app/api/auth/[...all]/route.ts` - Better Auth API route handler +- `app/login/page.tsx` - Giriş sayfası +- `app/register/page.tsx` - Kayıt sayfası +- `app/profile/page.tsx` - Kullanıcı profil sayfası diff --git a/app/admin/page.tsx b/app/admin/page.tsx new file mode 100644 index 0000000..de3a957 --- /dev/null +++ b/app/admin/page.tsx @@ -0,0 +1,401 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import Swal from "sweetalert2"; + +interface User { + id: string; + name: string | null; + email: string; + role: string; + emailVerified: boolean; + createdAt: string; +} + +interface Session { + user: { + id: string; + email: string; + name?: string; + role?: string; + }; +} + +export default function AdminPanel() { + const router = useRouter(); + const [users, setUsers] = useState([]); + const [loading, setLoading] = useState(true); + const [currentUserRole, setCurrentUserRole] = useState(""); + + useEffect(() => { + checkAuth(); + }, []); + + const checkAuth = async () => { + try { + const res = await fetch("/api/auth/get-session", { + credentials: "include", + }); + + if (!res.ok) { + router.push("/login"); + return; + } + + const session: Session = await res.json(); + + if (!session.user || session.user.role !== "admin") { + await Swal.fire({ + icon: "error", + title: "Erişim Engellendi", + text: "Bu sayfaya erişim yetkiniz yok. Sadece adminler görebilir.", + confirmButtonColor: "#3b82f6", + }); + router.push("/"); + return; + } + + setCurrentUserRole(session.user.role || "user"); + await fetchUsers(); + } catch (err) { + router.push("/login"); + } + }; + + const fetchUsers = async () => { + setLoading(true); + + try { + const res = await fetch("/api/admin/users", { + credentials: "include", + }); + + if (!res.ok) { + if (res.status === 401) { + router.push("/login"); + return; + } + if (res.status === 403) { + await Swal.fire({ + icon: "error", + title: "Yetki Hatası", + text: "Bu sayfaya erişim yetkiniz yok.", + confirmButtonColor: "#3b82f6", + }); + return; + } + throw new Error("Kullanıcılar yüklenemedi"); + } + + const data = await res.json(); + setUsers(data.data.users); + } catch (err: any) { + await Swal.fire({ + icon: "error", + title: "Hata", + text: err.message, + confirmButtonColor: "#3b82f6", + }); + } finally { + setLoading(false); + } + }; + + const changeRole = async (userId: string, newRole: string, currentRole: string) => { + const result = await Swal.fire({ + title: "Rol Değiştir", + text: `Bu kullanıcının rolünü "${currentRole}" → "${newRole}" olarak değiştirmek istediğinizden emin misiniz?`, + icon: "question", + showCancelButton: true, + confirmButtonColor: "#3b82f6", + cancelButtonColor: "#6b7280", + confirmButtonText: "Evet, değiştir", + cancelButtonText: "İptal", + }); + + if (!result.isConfirmed) { + await fetchUsers(); + return; + } + + try { + const res = await fetch(`/api/admin/users/${userId}/role`, { + method: "PATCH", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ role: newRole }), + }); + + if (!res.ok) { + const data = await res.json(); + throw new Error(data.error || "Rol güncellenemedi"); + } + + await Swal.fire({ + icon: "success", + title: "Başarılı!", + text: "Kullanıcı rolü güncellendi", + timer: 2000, + showConfirmButton: false, + }); + + await fetchUsers(); + } catch (err: any) { + await Swal.fire({ + icon: "error", + title: "Hata", + text: err.message, + confirmButtonColor: "#3b82f6", + }); + await fetchUsers(); + } + }; + + const toggleEmailVerification = async (userId: string, currentStatus: boolean, email: string) => { + const newStatus = !currentStatus; + const result = await Swal.fire({ + title: "Email Doğrulama", + text: `${email} için email doğrulamasını ${newStatus ? "aktif" : "pasif"} yapmak istiyor musunuz?`, + icon: "question", + showCancelButton: true, + confirmButtonColor: "#3b82f6", + cancelButtonColor: "#6b7280", + confirmButtonText: "Evet, değiştir", + cancelButtonText: "İptal", + }); + + if (!result.isConfirmed) { + return; + } + + try { + const res = await fetch(`/api/admin/users/${userId}/verification`, { + method: "PATCH", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ emailVerified: newStatus }), + }); + + if (!res.ok) { + const data = await res.json(); + throw new Error(data.error || "Doğrulama güncellenemedi"); + } + + await Swal.fire({ + icon: "success", + title: "Başarılı!", + text: `Email doğrulama ${newStatus ? "aktif edildi" : "pasif edildi"}`, + timer: 2000, + showConfirmButton: false, + }); + + await fetchUsers(); + } catch (err: any) { + await Swal.fire({ + icon: "error", + title: "Hata", + text: err.message, + confirmButtonColor: "#3b82f6", + }); + } + }; + + const deleteUser = async (userId: string, email: string) => { + const result = await Swal.fire({ + title: "Kullanıcıyı Sil", + html: `${email} kullanıcısını silmek istediğinizden emin misiniz?

+ ⚠️ Bu işlem geri alınamaz!
+ Kullanıcının tüm resimleri ve verileri silinecek.`, + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#ef4444", + cancelButtonColor: "#6b7280", + confirmButtonText: "Evet, sil!", + cancelButtonText: "İptal", + }); + + if (!result.isConfirmed) { + return; + } + + try { + const res = await fetch(`/api/admin/users/${userId}`, { + method: "DELETE", + credentials: "include", + }); + + if (!res.ok) { + const data = await res.json(); + throw new Error(data.error || "Kullanıcı silinemedi"); + } + + await Swal.fire({ + icon: "success", + title: "Silindi!", + text: "Kullanıcı başarıyla silindi", + timer: 2000, + showConfirmButton: false, + }); + + await fetchUsers(); + } catch (err: any) { + await Swal.fire({ + icon: "error", + title: "Hata", + text: err.message, + confirmButtonColor: "#3b82f6", + }); + } + }; + + const getRoleBadgeColor = (role: string) => { + switch (role) { + case "admin": + return "bg-red-100 text-red-800 border-red-200"; + case "moderator": + return "bg-blue-100 text-blue-800 border-blue-200"; + default: + return "bg-gray-100 text-gray-800 border-gray-200"; + } + }; + + if (loading) { + return ( +
+
+
+

Yükleniyor...

+
+
+ ); + } + + return ( +
+
+
+

Admin Panel

+

Kullanıcı yönetimi ve rol atama

+
+ +
+
+ + + + + + + + + + + + + {users.map((user) => ( + + + + + + + + + ))} + +
KullanıcıEmailRolDoğrulamaKayıt Tarihiİşlemler
+
+ {user.name || "İsimsiz"} +
+
{user.id.substring(0, 8)}
+
{user.email} + + + + + {new Date(user.createdAt).toLocaleDateString("tr-TR")} + + +
+
+
+ +
+
+

Toplam Kullanıcı

+

{users.length}

+
+
+

Admin Sayısı

+

+ {users.filter((u) => u.role === "admin").length} +

+
+
+

Moderatör Sayısı

+

+ {users.filter((u) => u.role === "moderator").length} +

+
+
+

Doğrulananlar

+

+ {users.filter((u) => u.emailVerified).length} +

+
+
+
+
+ ); +} diff --git a/app/api-docs/page.tsx b/app/api-docs/page.tsx new file mode 100644 index 0000000..6eac0b2 --- /dev/null +++ b/app/api-docs/page.tsx @@ -0,0 +1,279 @@ +"use client"; + +import Link from "next/link"; + +export default function ApiDocsPage() { + return ( +
+
+ {/* Header */} +
+ + + + + Ana Sayfa + +
+ + {/* Title */} +
+

+ API Dokümantasyonu +

+

+ Image Manipulation API - REST API Kullanım Kılavuzu +

+
+ + {/* Content */} +
+ {/* Base URL */} +
+

+ Base URL +

+
+ + https://v2.beyhano.com.tr + +
+
+ + {/* Authentication */} +
+

+ Authentication +

+

+ API, JWT token tabanlı kimlik doğrulama kullanır. Her istekte Authorization header'ında Bearer token gönderilmelidir: +

+
+ + Authorization: Bearer <your_jwt_token> + +
+
+ + {/* Endpoints */} +
+

+ Endpoints +

+ + {/* Register */} +
+
+ + POST + + + /api/v1/auth/register + +
+

+ Yeni kullanıcı kaydı oluşturur ve JWT token döner. +

+
+
+{`{
+  "email": "user@example.com",
+  "password": "minimum8karakter",
+  "name": "Kullanıcı Adı"
+}`}
+                
+
+
+ + {/* Login */} +
+
+ + POST + + + /api/v1/auth/login + +
+

+ Mevcut kullanıcı ile giriş yapar ve JWT token döner. +

+
+
+{`{
+  "email": "user@example.com",
+  "password": "minimum8karakter"
+}`}
+                
+
+
+ + {/* Upload Image */} +
+
+ + POST + + + /api/v1/images/upload + +
+

+ Resim yükler, belirtilen boyut/kalite/formatta işler ve kaydeder. (multipart/form-data) +

+
+
file (required): Resim dosyası (max 10MB)
+
width (optional): Genişlik (px), default: 800
+
height (optional): Yükseklik (px), default: 600
+
quality (optional): Kalite (1-100), default: 90
+
format (optional): jpeg, png, webp, avif
+
+
+ + {/* List Images */} +
+
+ + GET + + + /api/v1/images + +
+

+ Kullanıcının tüm resimlerini listeler. +

+
+ + {/* Delete Image */} +
+
+ + DELETE + + + /api/v1/images/:id + +
+

+ Belirtilen ID'ye sahip resmi siler. +

+
+
+ + {/* Example Code */} +
+

+ Örnek Kullanım (JavaScript) +

+
+
+{`// 1. Kayıt ol
+const registerResponse = await fetch(
+  'https://image.beyhano.com.tr/api/v1/auth/register',
+  {
+    method: 'POST',
+    headers: { 'Content-Type': 'application/json' },
+    body: JSON.stringify({
+      email: 'user@example.com',
+      password: 'securepassword123',
+      name: 'Kullanıcı'
+    })
+  }
+);
+const { data } = await registerResponse.json();
+const token = data.accessToken;
+
+// 2. Resim yükle
+const formData = new FormData();
+formData.append('file', fileInput.files[0]);
+formData.append('width', '1920');
+formData.append('quality', '85');
+formData.append('format', 'webp');
+
+const uploadResponse = await fetch(
+  'https://image.beyhano.com.tr/api/v1/images/upload',
+  {
+    method: 'POST',
+    headers: { 'Authorization': \`Bearer \${token}\` },
+    body: formData
+  }
+);
+const uploadData = await uploadResponse.json();
+console.log('URL:', uploadData.data.image.url);`}
+              
+
+
+ + {/* Features */} +
+

+ Özellikler ve Limitler +

+
+
+

+ ✅ Desteklenen Formatlar +

+
    +
  • • JPEG / JPG
  • +
  • • PNG
  • +
  • • WebP
  • +
  • • AVIF
  • +
  • • GIF
  • +
+
+
+

+ ⚙️ Limitler +

+
    +
  • • Max dosya: 10MB
  • +
  • • Max boyut: 10000x10000 px
  • +
  • • Token süresi: 7 gün
  • +
  • • HTTPS zorunlu (production)
  • +
+
+
+
+ + {/* Download Full Docs */} +
+

Detaylı Dokümantasyon

+

+ Tüm endpoint'ler, hata kodları ve örnekler için tam dokümantasyonu indirin. +

+ + + + + GitHub'da Görüntüle + +
+
+
+
+ ); +} diff --git a/app/api/admin/users/[id]/role/route.ts b/app/api/admin/users/[id]/role/route.ts new file mode 100644 index 0000000..4a00d29 --- /dev/null +++ b/app/api/admin/users/[id]/role/route.ts @@ -0,0 +1,70 @@ +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "@/app/lib/auth"; +import { isAdmin, UserRole, updateUserRole } from "@/app/lib/permissions"; + +/** + * PATCH /api/admin/users/[id]/role + * Kullanıcının rolünü değiştir (Sadece admin - Web Session) + */ +export async function PATCH( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const session = await auth.api.getSession({ + headers: request.headers, + }); + + if (!session?.user) { + return NextResponse.json({ error: "Giriş yapmalısınız" }, { status: 401 }); + } + + // Admin kontrolü + const userRole = (session.user as any).role || "user"; + if (!isAdmin(userRole)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler rol değiştirebilir." }, + { status: 403 } + ); + } + + try { + const { id: userId } = await params; + const body = await request.json(); + const { role } = body; + + // Role validasyonu + const validRoles: UserRole[] = ["user", "admin", "moderator"]; + if (!role || !validRoles.includes(role)) { + return NextResponse.json( + { error: "Geçersiz rol. Geçerli roller: user, admin, moderator" }, + { status: 400 } + ); + } + + // Kendi rolünü değiştirmeyi engelle + if (userId === session.user.id) { + return NextResponse.json( + { error: "Kendi rolünüzü değiştiremezsiniz" }, + { status: 400 } + ); + } + + // Rolü güncelle + await updateUserRole(userId, role); + + return NextResponse.json({ + success: true, + message: "Kullanıcı rolü başarıyla güncellendi", + data: { + userId, + newRole: role, + }, + }); + } catch (error: any) { + console.error("Rol güncelleme hatası:", error); + return NextResponse.json( + { error: "Rol güncellenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/users/[id]/route.ts b/app/api/admin/users/[id]/route.ts new file mode 100644 index 0000000..71cd3be --- /dev/null +++ b/app/api/admin/users/[id]/route.ts @@ -0,0 +1,75 @@ +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "@/app/lib/auth"; +import { hasPermission, PERMISSIONS } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { user, images, apiKeys } from "@/db/schema"; +import { eq } from "drizzle-orm"; + +/** + * DELETE /api/admin/users/[id] + * Kullanıcıyı sil (Sadece admin - Web Session) + * Kullanıcının tüm resimleri ve API anahtarları da silinir + */ +export async function DELETE( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const session = await auth.api.getSession({ + headers: request.headers, + }); + + if (!session?.user) { + return NextResponse.json({ error: "Giriş yapmalısınız" }, { status: 401 }); + } + + // Permission kontrolü + const userRole = (session.user as any).role || "user"; + if (!hasPermission(userRole, PERMISSIONS.USER_DELETE)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler kullanıcı silebilir." }, + { status: 403 } + ); + } + + try { + const { id: userId } = await params; + + // Kendi hesabını silmeyi engelle + if (userId === session.user.id) { + return NextResponse.json( + { error: "Kendi hesabınızı silemezsiniz" }, + { status: 400 } + ); + } + + // Kullanıcının var olup olmadığını kontrol et + const targetUser = await db.select().from(user).where(eq(user.id, userId)).limit(1); + if (targetUser.length === 0) { + return NextResponse.json({ error: "Kullanıcı bulunamadı" }, { status: 404 }); + } + + // Kullanıcının resimlerini sil + await db.delete(images).where(eq(images.userId, userId)); + + // Kullanıcının API anahtarlarını sil + await db.delete(apiKeys).where(eq(apiKeys.userId, userId)); + + // Kullanıcıyı sil + await db.delete(user).where(eq(user.id, userId)); + + return NextResponse.json({ + success: true, + message: "Kullanıcı başarıyla silindi", + data: { + deletedUserId: userId, + deletedUser: targetUser[0].email, + }, + }); + } catch (error: any) { + console.error("Kullanıcı silme hatası:", error); + return NextResponse.json( + { error: "Kullanıcı silinemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/users/[id]/verification/route.ts b/app/api/admin/users/[id]/verification/route.ts new file mode 100644 index 0000000..ac0f822 --- /dev/null +++ b/app/api/admin/users/[id]/verification/route.ts @@ -0,0 +1,72 @@ +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "@/app/lib/auth"; +import { isAdmin } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { user } from "@/db/schema"; +import { eq } from "drizzle-orm"; + +/** + * PATCH /api/admin/users/[id]/verification + * Kullanıcının email doğrulamasını değiştir (Sadece admin - Web Session) + */ +export async function PATCH( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const session = await auth.api.getSession({ + headers: request.headers, + }); + + if (!session?.user) { + return NextResponse.json({ error: "Giriş yapmalısınız" }, { status: 401 }); + } + + // Admin kontrolü + const userRole = (session.user as any).role || "user"; + if (!isAdmin(userRole)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler doğrulama değiştirebilir." }, + { status: 403 } + ); + } + + try { + const { id: userId } = await params; + const body = await request.json(); + const { emailVerified } = body; + + // Boolean validasyonu + if (typeof emailVerified !== "boolean") { + return NextResponse.json( + { error: "emailVerified boolean olmalıdır" }, + { status: 400 } + ); + } + + // Email doğrulama durumunu güncelle + const result = await db + .update(user) + .set({ emailVerified }) + .where(eq(user.id, userId)) + .returning(); + + if (result.length === 0) { + return NextResponse.json({ error: "Kullanıcı bulunamadı" }, { status: 404 }); + } + + return NextResponse.json({ + success: true, + message: `Email doğrulama ${emailVerified ? "aktif edildi" : "pasif edildi"}`, + data: { + userId, + emailVerified, + }, + }); + } catch (error: any) { + console.error("Email doğrulama güncelleme hatası:", error); + return NextResponse.json( + { error: "Email doğrulama güncellenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/users/route.ts b/app/api/admin/users/route.ts new file mode 100644 index 0000000..61ce9f2 --- /dev/null +++ b/app/api/admin/users/route.ts @@ -0,0 +1,57 @@ +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "@/app/lib/auth"; +import { isAdmin } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { user } from "@/db/schema"; +import { desc } from "drizzle-orm"; + +/** + * GET /api/admin/users + * Tüm kullanıcıları listele (Sadece admin - Web Session) + */ +export async function GET(request: NextRequest) { + const session = await auth.api.getSession({ + headers: request.headers, + }); + + if (!session?.user) { + return NextResponse.json({ error: "Giriş yapmalısınız" }, { status: 401 }); + } + + // Admin kontrolü + const userRole = (session.user as any).role || "user"; + if (!isAdmin(userRole)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler kullanıcıları görüntüleyebilir." }, + { status: 403 } + ); + } + + try { + const users = await db + .select({ + id: user.id, + name: user.name, + email: user.email, + role: user.role, + emailVerified: user.emailVerified, + createdAt: user.createdAt, + }) + .from(user) + .orderBy(desc(user.createdAt)); + + return NextResponse.json({ + success: true, + data: { + users, + total: users.length, + }, + }); + } catch (error: any) { + console.error("Kullanıcı listesi hatası:", error); + return NextResponse.json( + { error: "Kullanıcılar yüklenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/auth/[...all]/route.ts b/app/api/auth/[...all]/route.ts new file mode 100644 index 0000000..438bff0 --- /dev/null +++ b/app/api/auth/[...all]/route.ts @@ -0,0 +1,4 @@ +import { auth } from "@/app/lib/auth"; +import { toNextJsHandler } from "better-auth/next-js"; + +export const { GET, POST } = toNextJsHandler(auth); diff --git a/app/api/config/route.ts b/app/api/config/route.ts new file mode 100644 index 0000000..0e00c85 --- /dev/null +++ b/app/api/config/route.ts @@ -0,0 +1,7 @@ +import { NextResponse } from "next/server"; + +export async function GET() { + return NextResponse.json({ + registerEnabled: process.env.REGISTER_ENABLE === "true", + }); +} diff --git a/app/api/images/[id]/route.ts b/app/api/images/[id]/route.ts new file mode 100644 index 0000000..0472dda --- /dev/null +++ b/app/api/images/[id]/route.ts @@ -0,0 +1,80 @@ +import { NextRequest, NextResponse } from "next/server"; +import { db } from "@/db"; +import { images } from "@/db/schema"; +import { eq, and } from "drizzle-orm"; +import { auth } from "@/app/lib/auth"; +import { unlink } from "fs/promises"; +import { join } from "path"; + +async function getUserId(request: NextRequest): Promise { + try { + const session = await auth.api.getSession({ + headers: request.headers, + }); + return session?.user?.id || null; + } catch { + return null; + } +} + +export async function DELETE( + request: NextRequest, + { params }: { params: Promise<{ id: string }> | { id: string } } +) { + try { + const userId = await getUserId(request); + if (!userId) { + return NextResponse.json( + { message: "Yetkisiz erişim" }, + { status: 401 } + ); + } + + // Next.js 15'te params async olabilir + const resolvedParams = await Promise.resolve(params); + const imageId = resolvedParams.id; + + // Input validation + if (!imageId || typeof imageId !== "string" || imageId.length > 255) { + return NextResponse.json( + { message: "Geçersiz resim ID" }, + { status: 400 } + ); + } + + // Resmi veritabanından bul + const image = await db + .select() + .from(images) + .where(and(eq(images.id, imageId), eq(images.userId, userId))) + .limit(1); + + if (image.length === 0) { + return NextResponse.json( + { message: "Resim bulunamadı veya yetkiniz yok" }, + { status: 404 } + ); + } + + const imageData = image[0]; + + // Dosyayı sil + try { + await unlink(imageData.filePath); + } catch (error) { + // Dosya bulunamazsa devam et (log production'da kaldırıldı) + } + + // Veritabanından sil + await db.delete(images).where(eq(images.id, imageId)); + + return NextResponse.json({ + message: "Resim başarıyla silindi", + }); + } catch (error: any) { + return NextResponse.json( + { message: "Silme işlemi başarısız" }, + { status: 500 } + ); + } +} diff --git a/app/api/images/route.ts b/app/api/images/route.ts new file mode 100644 index 0000000..ead8872 --- /dev/null +++ b/app/api/images/route.ts @@ -0,0 +1,77 @@ +import { NextRequest, NextResponse } from "next/server"; +import { db } from "@/db"; +import { images } from "@/db/schema"; +import { eq, desc } from "drizzle-orm"; +import { auth } from "@/app/lib/auth"; + +async function getUserId(request: NextRequest): Promise { + try { + const session = await auth.api.getSession({ + headers: request.headers, + }); + return session?.user?.id || null; + } catch { + return null; + } +} + +function getBaseUrl(request: NextRequest): string { + // First, check environment variables (production should set this) + if (process.env.NEXT_PUBLIC_APP_URL) { + return process.env.NEXT_PUBLIC_APP_URL; + } + if (process.env.APP_URL) { + return process.env.APP_URL; + } + + // Check for reverse proxy headers (X-Forwarded-Host, X-Forwarded-Proto) + const forwardedHost = request.headers.get("x-forwarded-host"); + const forwardedProto = request.headers.get("x-forwarded-proto"); + + if (forwardedHost && forwardedProto) { + return `${forwardedProto}://${forwardedHost}`; + } + + // Fallback to request origin + return request.nextUrl.origin; +} + +export async function GET(request: NextRequest) { + try { + const userId = await getUserId(request); + if (!userId) { + return NextResponse.json( + { message: "Yetkisiz erişim" }, + { status: 401 } + ); + } + + const userImages = await db + .select() + .from(images) + .where(eq(images.userId, userId)) + .orderBy(desc(images.createdAt)); + + // Get base URL + const baseUrl = getBaseUrl(request); + + return NextResponse.json({ + images: userImages.map((img) => ({ + id: img.id, + originalName: img.originalName, + url: `${baseUrl}${img.url}`, + width: img.width, + height: img.height, + quality: img.quality, + format: img.format, + fileSize: img.fileSize, + createdAt: img.createdAt.toISOString(), + })), + }); + } catch (error: any) { + return NextResponse.json( + { message: "Resimler yüklenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/images/upload/route.ts b/app/api/images/upload/route.ts new file mode 100644 index 0000000..a5c581b --- /dev/null +++ b/app/api/images/upload/route.ts @@ -0,0 +1,196 @@ +import { NextRequest, NextResponse } from "next/server"; +import { writeFile, mkdir } from "fs/promises"; +import { join } from "path"; +import sharp from "sharp"; +import { db } from "@/db"; +import { images } from "@/db/schema"; +import { nanoid } from "nanoid"; +import { auth } from "@/app/lib/auth"; + +async function getUserId(request: NextRequest): Promise { + try { + const session = await auth.api.getSession({ + headers: request.headers, + }); + return session?.user?.id || null; + } catch { + return null; + } +} + +function getBaseUrl(request: NextRequest): string { + // First, check environment variables (production should set this) + if (process.env.NEXT_PUBLIC_APP_URL) { + return process.env.NEXT_PUBLIC_APP_URL; + } + if (process.env.APP_URL) { + return process.env.APP_URL; + } + + // Check for reverse proxy headers (X-Forwarded-Host, X-Forwarded-Proto) + const forwardedHost = request.headers.get("x-forwarded-host"); + const forwardedProto = request.headers.get("x-forwarded-proto"); + + if (forwardedHost && forwardedProto) { + return `${forwardedProto}://${forwardedHost}`; + } + + // Fallback to request origin + return request.nextUrl.origin; +} + +export async function POST(request: NextRequest) { + try { + const userId = await getUserId(request); + if (!userId) { + return NextResponse.json( + { message: "Yetkisiz erişim" }, + { status: 401 } + ); + } + + const formData = await request.formData(); + const file = formData.get("file") as File; + + if (!file) { + return NextResponse.json( + { message: "Dosya bulunamadı" }, + { status: 400 } + ); + } + + // File size validation (max 10MB) + const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB + if (file.size > MAX_FILE_SIZE) { + return NextResponse.json( + { message: "Dosya boyutu çok büyük. Maksimum 10MB olmalıdır." }, + { status: 400 } + ); + } + + // File type validation + const allowedMimeTypes = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/webp", "image/avif"]; + if (!allowedMimeTypes.includes(file.type)) { + return NextResponse.json( + { message: "Geçersiz dosya tipi. Sadece resim dosyaları kabul edilir." }, + { status: 400 } + ); + } + + // Input validation + const widthInput = formData.get("width") as string; + const heightInput = formData.get("height") as string; + const qualityInput = formData.get("quality") as string; + const formatInput = (formData.get("format") as string) || "jpeg"; + + const width = Math.max(1, Math.min(10000, parseInt(widthInput) || 800)); + const height = Math.max(1, Math.min(10000, parseInt(heightInput) || 600)); + const quality = Math.max(1, Math.min(100, parseInt(qualityInput) || 90)); + const allowedFormats = ["jpeg", "jpg", "png", "webp", "avif"]; + const format = allowedFormats.includes(formatInput) ? formatInput : "jpeg"; + + const bytes = await file.arrayBuffer(); + const buffer = Buffer.from(bytes); + + // Resim manipülasyonu - Tam istenen boyuta getir (crop ile, bozmadan) + // fit: "cover" kullanarak resmi tam boyuta getiriyoruz + // Aspect ratio korunur, fazla kısımlar ortadan kesilir (crop) + let processedBuffer = sharp(buffer).resize(width, height, { + fit: "cover", // Tam boyuta getir, aspect ratio koru, fazla kısımları kes + position: "center", // Ortadan crop yap + withoutEnlargement: false, // Gerekirse büyüt de tam boyuta getir + }); + + // Format ve kalite ayarları + const normalizedFormat = format === "jpg" ? "jpeg" : format; + if (normalizedFormat === "jpeg") { + processedBuffer = processedBuffer.jpeg({ quality }); + } else if (normalizedFormat === "png") { + processedBuffer = processedBuffer.png({ quality }); + } else if (normalizedFormat === "webp") { + processedBuffer = processedBuffer.webp({ quality }); + } else if (normalizedFormat === "avif") { + processedBuffer = processedBuffer.avif({ quality }); + } + + const processedImage = await processedBuffer.toBuffer(); + const metadata = await sharp(processedImage).metadata(); + + // Dosya adı oluştur + const fileId = nanoid(); + const originalName = file.name; + const fileExtension = normalizedFormat === "jpeg" ? "jpg" : normalizedFormat; + const fileName = `${fileId}.${fileExtension}`; + + // Uploads klasörünü oluştur + // Docker volume mount: /app/public/uploads + // Standalone build'de process.cwd() = /app olmalı + const uploadsDir = join(process.cwd(), "public", "uploads"); + + try { + await mkdir(uploadsDir, { recursive: true }); + } catch (mkdirError: any) { + console.error("Uploads klasörü oluşturulamadı:", mkdirError); + console.error("Klasör yolu:", uploadsDir); + console.error("Current working directory:", process.cwd()); + throw new Error(`Uploads klasörü oluşturulamadı: ${mkdirError.message}`); + } + + // Dosyayı kaydet + const filePath = join(uploadsDir, fileName); + try { + await writeFile(filePath, processedImage); + } catch (writeError: any) { + console.error("Dosya yazılamadı:", writeError); + console.error("Dosya yolu:", filePath); + console.error("Dosya boyutu:", processedImage.length); + throw new Error(`Dosya yazılamadı: ${writeError.message}`); + } + + // Veritabanına kaydet + const imageUrl = `/uploads/${fileName}`; + const imageId = nanoid(); + + await db.insert(images).values({ + id: imageId, + userId, + originalName, + fileName, + filePath: filePath, + url: imageUrl, + width: metadata.width || null, + height: metadata.height || null, + quality, + format: normalizedFormat, + fileSize: processedImage.length, + }); + + // Get base URL + const baseUrl = getBaseUrl(request); + const fullImageUrl = `${baseUrl}${imageUrl}`; + + return NextResponse.json({ + message: "Resim başarıyla yüklendi", + image: { + id: imageId, + url: fullImageUrl, + width: metadata.width, + height: metadata.height, + }, + }); + } catch (error: any) { + console.error("Upload hatası:", error); + console.error("Error stack:", error?.stack); + console.error("Error message:", error?.message); + + // Production'da detaylı hata mesajı döndür (debug için) + const errorMessage = process.env.NODE_ENV === "production" + ? `Yükleme başarısız: ${error?.message || "Bilinmeyen hata"}` + : "Yükleme başarısız"; + + return NextResponse.json( + { message: errorMessage }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/admin/users/[id]/role/route.ts b/app/api/v1/admin/users/[id]/role/route.ts new file mode 100644 index 0000000..df6d70a --- /dev/null +++ b/app/api/v1/admin/users/[id]/role/route.ts @@ -0,0 +1,67 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { isAdmin, UserRole, updateUserRole } from "@/app/lib/permissions"; + +/** + * PATCH /api/v1/admin/users/[id]/role + * Kullanıcının rolünü değiştir (Sadece admin) + */ +export async function PATCH( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + // Admin kontrolü + if (!isAdmin(auth.role!)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler rol değiştirebilir." }, + { status: 403 } + ); + } + + try { + const { id: userId } = await params; + const body = await request.json(); + const { role } = body; + + // Role validasyonu + const validRoles: UserRole[] = ["user", "admin", "moderator"]; + if (!role || !validRoles.includes(role)) { + return NextResponse.json( + { error: "Geçersiz rol. Geçerli roller: user, admin, moderator" }, + { status: 400 } + ); + } + + // Kendi rolünü değiştirmeyi engelle + if (userId === auth.userId) { + return NextResponse.json( + { error: "Kendi rolünüzü değiştiremezsiniz" }, + { status: 400 } + ); + } + + // Rolü güncelle + await updateUserRole(userId, role); + + return NextResponse.json({ + success: true, + message: "Kullanıcı rolü başarıyla güncellendi", + data: { + userId, + newRole: role, + }, + }); + } catch (error: any) { + console.error("Rol güncelleme hatası:", error); + return NextResponse.json( + { error: "Rol güncellenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/admin/users/[id]/route.ts b/app/api/v1/admin/users/[id]/route.ts new file mode 100644 index 0000000..83c3582 --- /dev/null +++ b/app/api/v1/admin/users/[id]/route.ts @@ -0,0 +1,72 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { hasPermission, PERMISSIONS } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { user, images, apiKeys } from "@/db/schema"; +import { eq } from "drizzle-orm"; + +/** + * DELETE /api/v1/admin/users/[id] + * Kullanıcıyı sil (Sadece admin) + * Kullanıcının tüm resimleri ve API anahtarları da silinir + */ +export async function DELETE( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + // Permission kontrolü + if (!hasPermission(auth.role!, PERMISSIONS.USER_DELETE)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler kullanıcı silebilir." }, + { status: 403 } + ); + } + + try { + const { id: userId } = await params; + + // Kendi hesabını silmeyi engelle + if (userId === auth.userId) { + return NextResponse.json( + { error: "Kendi hesabınızı silemezsiniz" }, + { status: 400 } + ); + } + + // Kullanıcının var olup olmadığını kontrol et + const targetUser = await db.select().from(user).where(eq(user.id, userId)).limit(1); + if (targetUser.length === 0) { + return NextResponse.json({ error: "Kullanıcı bulunamadı" }, { status: 404 }); + } + + // Kullanıcının resimlerini sil + const deletedImages = await db.delete(images).where(eq(images.userId, userId)); + + // Kullanıcının API anahtarlarını sil + await db.delete(apiKeys).where(eq(apiKeys.userId, userId)); + + // Kullanıcıyı sil + await db.delete(user).where(eq(user.id, userId)); + + return NextResponse.json({ + success: true, + message: "Kullanıcı başarıyla silindi", + data: { + deletedUserId: userId, + deletedUser: targetUser[0].email, + }, + }); + } catch (error: any) { + console.error("Kullanıcı silme hatası:", error); + return NextResponse.json( + { error: "Kullanıcı silinemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/admin/users/[id]/verification/route.ts b/app/api/v1/admin/users/[id]/verification/route.ts new file mode 100644 index 0000000..25dfba8 --- /dev/null +++ b/app/api/v1/admin/users/[id]/verification/route.ts @@ -0,0 +1,69 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { isAdmin } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { user } from "@/db/schema"; +import { eq } from "drizzle-orm"; + +/** + * PATCH /api/v1/admin/users/[id]/verification + * Kullanıcının email doğrulamasını değiştir (Sadece admin - JWT) + */ +export async function PATCH( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + // Admin kontrolü + if (!isAdmin(auth.role!)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler doğrulama değiştirebilir." }, + { status: 403 } + ); + } + + try { + const { id: userId } = await params; + const body = await request.json(); + const { emailVerified } = body; + + // Boolean validasyonu + if (typeof emailVerified !== "boolean") { + return NextResponse.json( + { error: "emailVerified boolean olmalıdır" }, + { status: 400 } + ); + } + + // Email doğrulama durumunu güncelle + const result = await db + .update(user) + .set({ emailVerified }) + .where(eq(user.id, userId)) + .returning(); + + if (result.length === 0) { + return NextResponse.json({ error: "Kullanıcı bulunamadı" }, { status: 404 }); + } + + return NextResponse.json({ + success: true, + message: `Email doğrulama ${emailVerified ? "aktif edildi" : "pasif edildi"}`, + data: { + userId, + emailVerified, + }, + }); + } catch (error: any) { + console.error("Email doğrulama güncelleme hatası:", error); + return NextResponse.json( + { error: "Email doğrulama güncellenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/admin/users/route.ts b/app/api/v1/admin/users/route.ts new file mode 100644 index 0000000..f98c1e6 --- /dev/null +++ b/app/api/v1/admin/users/route.ts @@ -0,0 +1,54 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { isAdmin } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { user } from "@/db/schema"; +import { desc } from "drizzle-orm"; + +/** + * GET /api/v1/admin/users + * Tüm kullanıcıları listele (Sadece admin) + */ +export async function GET(request: NextRequest) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + // Admin kontrolü + if (!isAdmin(auth.role!)) { + return NextResponse.json( + { error: "Bu işlem için yetkiniz yok. Sadece adminler kullanıcıları görüntüleyebilir." }, + { status: 403 } + ); + } + + try { + const users = await db + .select({ + id: user.id, + name: user.name, + email: user.email, + role: user.role, + emailVerified: user.emailVerified, + createdAt: user.createdAt, + }) + .from(user) + .orderBy(desc(user.createdAt)); + + return NextResponse.json({ + success: true, + data: { + users, + total: users.length, + }, + }); + } catch (error: any) { + console.error("Kullanıcı listesi hatası:", error); + return NextResponse.json( + { error: "Kullanıcılar yüklenemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/auth/login/route.ts b/app/api/v1/auth/login/route.ts new file mode 100644 index 0000000..2038901 --- /dev/null +++ b/app/api/v1/auth/login/route.ts @@ -0,0 +1,73 @@ +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "@/app/lib/auth"; +import { signJWT } from "@/app/lib/jwt"; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const { email, password } = body; + + // Validasyon + if (!email || !password) { + return NextResponse.json( + { error: "Email ve password gereklidir" }, + { status: 400 } + ); + } + + // Better Auth ile giriş yap + try { + const signInResponse = await auth.api.signInEmail({ + body: { + email, + password, + }, + }); + + if (!signInResponse || !signInResponse.user) { + return NextResponse.json( + { error: "Geçersiz email veya şifre" }, + { status: 401 } + ); + } + + const user = signInResponse.user; + + // JWT token oluştur + const accessToken = signJWT( + { + userId: user.id, + email: user.email, + type: "access", + }, + "7d" + ); + + return NextResponse.json({ + success: true, + message: "Giriş başarılı", + data: { + user: { + id: user.id, + email: user.email, + name: user.name, + }, + accessToken, + }, + }); + } catch (authError: any) { + // Better Auth hatası - muhtemelen geçersiz credentials + console.error("Better Auth login hatası:", authError); + return NextResponse.json( + { error: "Geçersiz email veya şifre" }, + { status: 401 } + ); + } + } catch (error: any) { + console.error("Login API hatası:", error); + return NextResponse.json( + { error: "Giriş sırasında bir hata oluştu" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/auth/register/route.ts b/app/api/v1/auth/register/route.ts new file mode 100644 index 0000000..228a545 --- /dev/null +++ b/app/api/v1/auth/register/route.ts @@ -0,0 +1,80 @@ +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "@/app/lib/auth"; +import { signJWT } from "@/app/lib/jwt"; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const { email, password, name } = body; + + // Validasyon + if (!email || !password || !name) { + return NextResponse.json( + { error: "Email, password ve name gereklidir" }, + { status: 400 } + ); + } + + if (password.length < 8) { + return NextResponse.json( + { error: "Şifre en az 8 karakter olmalıdır" }, + { status: 400 } + ); + } + + // Better Auth ile kullanıcı oluştur + try { + const signUpResponse = await auth.api.signUpEmail({ + body: { + email, + password, + name, + }, + }); + + if (!signUpResponse || !signUpResponse.user) { + throw new Error("Kullanıcı oluşturulamadı"); + } + + const user = signUpResponse.user; + + // JWT token oluştur + const accessToken = signJWT( + { + userId: user.id, + email: user.email, + type: "access", + }, + "7d" + ); + + return NextResponse.json({ + success: true, + message: "Kayıt başarılı", + data: { + user: { + id: user.id, + email: user.email, + name: user.name, + }, + accessToken, + }, + }); + } catch (authError: any) { + // Better Auth hatası - muhtemelen email zaten kullanımda + if (authError.message?.includes("exists") || authError.message?.includes("duplicate")) { + return NextResponse.json( + { error: "Bu email adresi zaten kullanımda" }, + { status: 409 } + ); + } + throw authError; + } + } catch (error: any) { + console.error("Register API hatası:", error); + return NextResponse.json( + { error: error.message || "Kayıt sırasında bir hata oluştu" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/images/[id]/route.ts b/app/api/v1/images/[id]/route.ts new file mode 100644 index 0000000..2ff5306 --- /dev/null +++ b/app/api/v1/images/[id]/route.ts @@ -0,0 +1,80 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { hasPermission, PERMISSIONS } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { images } from "@/db/schema"; +import { eq, and } from "drizzle-orm"; +import { unlink } from "fs/promises"; + +/** + * DELETE /api/v1/images/[id] + * Resim sil + * Kullanıcılar sadece kendi resimlerini silebilir + * Moderator ve adminler herhangi bir resmi silebilir + * + * Headers: + * - Authorization: Bearer + */ +export async function DELETE( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + try { + const { id } = await params; + + // Permission kontrolü - moderator ve admin herhangi bir resmi silebilir + const canDeleteAny = hasPermission(auth.role!, PERMISSIONS.IMAGE_DELETE_ANY); + + // Resmi bul + const imageRecords = await db + .select() + .from(images) + .where(eq(images.id, id)) + .limit(1); + + if (imageRecords.length === 0) { + return NextResponse.json( + { error: "Resim bulunamadı" }, + { status: 404 } + ); + } + + const image = imageRecords[0]; + + // Yetki kontrolü - kendi resmi değilse ve delete any yetkisi yoksa reddedilir + if (!canDeleteAny && image.userId !== auth.userId) { + return NextResponse.json( + { error: "Bu resmi silme yetkiniz yok" }, + { status: 403 } + ); + } + + // Dosyayı sil + try { + await unlink(image.filePath); + } catch (fileError) { + console.error("Dosya silinemedi:", fileError); + // Devam et, veritabanından sil + } + + // Veritabanından sil + await db.delete(images).where(eq(images.id, id)); + + return NextResponse.json({ + success: true, + message: "Resim başarıyla silindi", + }); + } catch (error: any) { + console.error("API - Resim silme hatası:", error); + return NextResponse.json( + { error: "Resim silinemedi" }, + { status: 500 } + ); + } +} diff --git a/app/api/v1/images/route.ts b/app/api/v1/images/route.ts new file mode 100644 index 0000000..2b65284 --- /dev/null +++ b/app/api/v1/images/route.ts @@ -0,0 +1,88 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { hasPermission, PERMISSIONS } from "@/app/lib/permissions"; +import { db } from "@/db"; +import { images } from "@/db/schema"; +import { eq, desc } from "drizzle-orm"; + +/** + * GET /api/v1/images + * Kullanıcının tüm resimlerini listele + * Moderator ve adminler tüm resimleri görebilir + * + * Headers: + * - Authorization: Bearer + */ +export async function GET(request: NextRequest) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + try { + // Permission kontrolü - admin ve moderator tüm resimleri görebilir + const canViewAll = hasPermission(auth.role!, PERMISSIONS.IMAGE_VIEW_ANY); + + let userImages; + if (canViewAll) { + // Tüm resimleri listele + userImages = await db + .select() + .from(images) + .orderBy(desc(images.createdAt)); + } else { + // Sadece kendi resimlerini listele + userImages = await db + .select() + .from(images) + .where(eq(images.userId, auth.userId!)) + .orderBy(desc(images.createdAt)); + } + + // Base URL'i al + const baseUrl = getBaseUrl(request); + + return NextResponse.json({ + success: true, + data: { + images: userImages.map((img) => ({ + id: img.id, + originalName: img.originalName, + url: `${baseUrl}${img.url}`, + width: img.width, + height: img.height, + quality: img.quality, + format: img.format, + fileSize: img.fileSize, + createdAt: img.createdAt.toISOString(), + })), + total: userImages.length, + }, + }); + } catch (error: any) { + console.error("API - Resim listesi hatası:", error); + return NextResponse.json( + { error: "Resimler yüklenemedi" }, + { status: 500 } + ); + } +} + +function getBaseUrl(request: NextRequest): string { + if (process.env.NEXT_PUBLIC_APP_URL) { + return process.env.NEXT_PUBLIC_APP_URL; + } + if (process.env.APP_URL) { + return process.env.APP_URL; + } + + const forwardedHost = request.headers.get("x-forwarded-host"); + const forwardedProto = request.headers.get("x-forwarded-proto"); + + if (forwardedHost && forwardedProto) { + return `${forwardedProto}://${forwardedHost}`; + } + + return request.nextUrl.origin; +} diff --git a/app/api/v1/images/upload/route.ts b/app/api/v1/images/upload/route.ts new file mode 100644 index 0000000..464552b --- /dev/null +++ b/app/api/v1/images/upload/route.ts @@ -0,0 +1,182 @@ +import { NextRequest, NextResponse } from "next/server"; +import { authenticateAPIRequest } from "@/app/lib/api-auth"; +import { writeFile, mkdir } from "fs/promises"; +import { join } from "path"; +import sharp from "sharp"; +import { db } from "@/db"; +import { images } from "@/db/schema"; +import { nanoid } from "nanoid"; + +/** + * POST /api/v1/images/upload + * Resim yükle ve manipüle et + * + * Headers: + * - Authorization: Bearer + * - Content-Type: multipart/form-data + * + * Body (FormData): + * - file: Resim dosyası + * - width: Genişlik (px) - opsiyonel, default: 800 + * - height: Yükseklik (px) - opsiyonel, default: 600 + * - quality: Kalite (1-100) - opsiyonel, default: 90 + * - format: Format (jpeg, png, webp, avif) - opsiyonel, default: jpeg + */ +export async function POST(request: NextRequest) { + const auth = await authenticateAPIRequest(request); + + if (!auth.authenticated) { + return NextResponse.json({ error: auth.error }, { status: 401 }); + } + + try { + const formData = await request.formData(); + const file = formData.get("file") as File; + + if (!file) { + return NextResponse.json( + { error: "Dosya bulunamadı" }, + { status: 400 } + ); + } + + // Dosya boyutu kontrolü (max 10MB) + const MAX_FILE_SIZE = 10 * 1024 * 1024; + if (file.size > MAX_FILE_SIZE) { + return NextResponse.json( + { error: "Dosya boyutu çok büyük. Maksimum 10MB olmalıdır." }, + { status: 400 } + ); + } + + // Dosya tipi kontrolü + const allowedMimeTypes = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/webp", "image/avif"]; + if (!allowedMimeTypes.includes(file.type)) { + return NextResponse.json( + { error: "Geçersiz dosya tipi. Sadece resim dosyaları kabul edilir." }, + { status: 400 } + ); + } + + // Parametreleri al + const widthInput = formData.get("width") as string; + const heightInput = formData.get("height") as string; + const qualityInput = formData.get("quality") as string; + const formatInput = (formData.get("format") as string) || "jpeg"; + + const width = Math.max(1, Math.min(10000, parseInt(widthInput) || 800)); + const height = Math.max(1, Math.min(10000, parseInt(heightInput) || 600)); + const quality = Math.max(1, Math.min(100, parseInt(qualityInput) || 90)); + const allowedFormats = ["jpeg", "jpg", "png", "webp", "avif"]; + const format = allowedFormats.includes(formatInput) ? formatInput : "jpeg"; + + const bytes = await file.arrayBuffer(); + const buffer = Buffer.from(bytes); + + // Resim manipülasyonu + let processedBuffer = sharp(buffer).resize(width, height, { + fit: "cover", + position: "center", + withoutEnlargement: false, + }); + + // Format ve kalite ayarları + const normalizedFormat = format === "jpg" ? "jpeg" : format; + if (normalizedFormat === "jpeg") { + processedBuffer = processedBuffer.jpeg({ quality }); + } else if (normalizedFormat === "png") { + processedBuffer = processedBuffer.png({ quality }); + } else if (normalizedFormat === "webp") { + processedBuffer = processedBuffer.webp({ quality }); + } else if (normalizedFormat === "avif") { + processedBuffer = processedBuffer.avif({ quality }); + } + + const processedImage = await processedBuffer.toBuffer(); + const metadata = await sharp(processedImage).metadata(); + + // Dosya kaydet + const fileId = nanoid(); + const originalName = file.name; + const fileExtension = normalizedFormat === "jpeg" ? "jpg" : normalizedFormat; + const fileName = `${fileId}.${fileExtension}`; + + const uploadsDir = join(process.cwd(), "public", "uploads"); + + try { + await mkdir(uploadsDir, { recursive: true }); + } catch (mkdirError: any) { + console.error("Uploads klasörü oluşturulamadı:", mkdirError); + throw new Error(`Uploads klasörü oluşturulamadı: ${mkdirError.message}`); + } + + const filePath = join(uploadsDir, fileName); + try { + await writeFile(filePath, processedImage); + } catch (writeError: any) { + console.error("Dosya yazılamadı:", writeError); + throw new Error(`Dosya yazılamadı: ${writeError.message}`); + } + + // Veritabanına kaydet + const imageUrl = `/uploads/${fileName}`; + const imageId = nanoid(); + + await db.insert(images).values({ + id: imageId, + userId: auth.userId!, + originalName, + fileName, + filePath: filePath, + url: imageUrl, + width: metadata.width || null, + height: metadata.height || null, + quality, + format: normalizedFormat, + fileSize: processedImage.length, + }); + + // Base URL + const baseUrl = getBaseUrl(request); + const fullImageUrl = `${baseUrl}${imageUrl}`; + + return NextResponse.json({ + success: true, + message: "Resim başarıyla yüklendi", + data: { + image: { + id: imageId, + url: fullImageUrl, + width: metadata.width, + height: metadata.height, + format: normalizedFormat, + fileSize: processedImage.length, + }, + }, + }); + } catch (error: any) { + console.error("API - Upload hatası:", error); + return NextResponse.json( + { error: error.message || "Yükleme başarısız" }, + { status: 500 } + ); + } +} + +function getBaseUrl(request: NextRequest): string { + if (process.env.NEXT_PUBLIC_APP_URL) { + return process.env.NEXT_PUBLIC_APP_URL; + } + if (process.env.APP_URL) { + return process.env.APP_URL; + } + + const forwardedHost = request.headers.get("x-forwarded-host"); + const forwardedProto = request.headers.get("x-forwarded-proto"); + + if (forwardedHost && forwardedProto) { + return `${forwardedProto}://${forwardedHost}`; + } + + return request.nextUrl.origin; +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/app/lib/api-auth.ts b/app/lib/api-auth.ts new file mode 100644 index 0000000..36bdd2d --- /dev/null +++ b/app/lib/api-auth.ts @@ -0,0 +1,170 @@ +import { NextRequest, NextResponse } from "next/server"; +import { db } from "@/db"; +import { apiKeys, user } from "@/db/schema"; +import { eq, and } from "drizzle-orm"; +import { verifyJWT, isValidAPIKeyFormat } from "./jwt"; +import { UserRole } from "./permissions"; + +export interface AuthenticatedRequest extends NextRequest { + userId?: string; + email?: string; + role?: UserRole; +} + +export interface AuthResult { + authenticated: boolean; + userId?: string; + email?: string; + role?: UserRole; + error?: string; +} + +/** + * API isteklerini doğrula (JWT token veya API key ile) + * + * Kullanım: + * const authResult = await authenticateAPIRequest(request); + * if (!authResult.authenticated) { + * return NextResponse.json({ error: authResult.error }, { status: 401 }); + * } + * const userId = authResult.userId; + */ +export async function authenticateAPIRequest(request: NextRequest): Promise { + const authHeader = request.headers.get("authorization"); + + if (!authHeader) { + return { + authenticated: false, + error: "Authorization header eksik. Bearer token veya API key gerekli.", + }; + } + + // Bearer token kontrolü + if (authHeader.startsWith("Bearer ")) { + const token = authHeader.substring(7); + + // JWT token mu yoksa API key mi? + if (isValidAPIKeyFormat(token)) { + // API Key doğrulama + return await validateAPIKey(token); + } else { + // JWT token doğrulama + return await validateJWTToken(token); + } + } + + return { + authenticated: false, + error: "Geçersiz authorization formatı. 'Bearer ' formatında olmalı.", + }; +} + +/** + * JWT token doğrula ve kullanıcı bilgilerini getir + */ +async function validateJWTToken(token: string): Promise { + const payload = verifyJWT(token); + + if (!payload) { + return { + authenticated: false, + error: "Geçersiz veya süresi dolmuş token.", + }; + } + + // Kullanıcı bilgilerini DB'den al (role için) + try { + const users = await db + .select() + .from(user) + .where(eq(user.id, payload.userId)) + .limit(1); + + if (users.length === 0) { + return { + authenticated: false, + error: "Kullanıcı bulunamadı.", + }; + } + + const userData = users[0]; + + return { + authenticated: true, + userId: payload.userId, + email: payload.email, + role: (userData.role as UserRole) || "user", + }; + } catch (error) { + console.error("User lookup error:", error); + return { + authenticated: false, + error: "Kimlik doğrulama sırasında bir hata oluştu.", + }; + } +} + +/** + * API key doğrula (veritabanından kontrol) + */ +async function validateAPIKey(key: string): Promise { + try { + const apiKey = await db + .select() + .from(apiKeys) + .where(and(eq(apiKeys.key, key), eq(apiKeys.isActive, true))) + .limit(1); + + if (apiKey.length === 0) { + return { + authenticated: false, + error: "Geçersiz API key.", + }; + } + + const keyData = apiKey[0]; + + // Süre kontrolü + if (keyData.expiresAt && keyData.expiresAt < new Date()) { + return { + authenticated: false, + error: "API key süresi dolmuş.", + }; + } + + // Kullanıcı bilgilerini al + const users = await db + .select() + .from(user) + .where(eq(user.id, keyData.userId)) + .limit(1); + + if (users.length === 0) { + return { + authenticated: false, + error: "Kullanıcı bulunamadı.", + }; + } + + const userData = users[0]; + + // Son kullanım tarihini güncelle (opsiyonel) + await db + .update(apiKeys) + .set({ lastUsedAt: new Date() }) + .where(eq(apiKeys.id, keyData.id)); + + return { + authenticated: true, + userId: keyData.userId, + email: userData.email, + role: (userData.role as UserRole) || "user", + }; + } catch (error) { + console.error("API key doğrulama hatası:", error); + return { + authenticated: false, + error: "Kimlik doğrulama sırasında bir hata oluştu.", + }; + } +} diff --git a/app/lib/auth.ts b/app/lib/auth.ts new file mode 100644 index 0000000..0b92817 --- /dev/null +++ b/app/lib/auth.ts @@ -0,0 +1,37 @@ +import { betterAuth } from "better-auth"; +import { drizzleAdapter } from "better-auth/adapters/drizzle"; +import { db } from "@/db"; +import * as schema from "@/db/schema"; + +// Validate BETTER_AUTH_SECRET at runtime (not during build) +const secret = process.env.BETTER_AUTH_SECRET; +if (!secret && process.env.NODE_ENV === "production") { + console.warn("WARNING: BETTER_AUTH_SECRET is not set. Authentication will not work properly."); +} + +export const auth = betterAuth({ + database: drizzleAdapter(db, { + provider: "pg", + schema: { + user: schema.user, + session: schema.session, + account: schema.account, + verification: schema.verification, + }, + }), + emailAndPassword: { + enabled: true, + }, + secret: secret || "build-time-secret-key-minimum-32-characters-long-temp", + baseURL: process.env.BETTER_AUTH_URL || "http://localhost:3000", + user: { + additionalFields: { + role: { + type: "string", + defaultValue: "user", + required: false, + input: false, // Don't allow setting role on signup + }, + }, + }, +}); \ No newline at end of file diff --git a/app/lib/jwt.ts b/app/lib/jwt.ts new file mode 100644 index 0000000..914cfd8 --- /dev/null +++ b/app/lib/jwt.ts @@ -0,0 +1,48 @@ +import jwt, { SignOptions } from "jsonwebtoken"; +import { nanoid } from "nanoid"; + +const JWT_SECRET = process.env.JWT_SECRET || process.env.BETTER_AUTH_SECRET || "fallback-secret-key"; +const API_KEY_PREFIX = "img_"; + +export interface JWTPayload { + userId: string; + email: string; + type: "access" | "refresh"; +} + +/** + * JWT token oluştur + * @param payload - Token içeriği + * @param expiresIn - Geçerlilik süresi (örn: "7d", "1h") + */ +export function signJWT(payload: JWTPayload, expiresIn: string | number = "7d"): string { + return jwt.sign(payload, JWT_SECRET, { expiresIn } as SignOptions); +} + +/** + * JWT token doğrula + * @param token - Doğrulanacak token + */ +export function verifyJWT(token: string): JWTPayload | null { + try { + const decoded = jwt.verify(token, JWT_SECRET) as JWTPayload; + return decoded; + } catch (error) { + return null; + } +} + +/** + * API key oluştur + * Formad: img_xxxxxxxxxxxxxxxxxxxxxxxx + */ +export function generateAPIKey(): string { + return `${API_KEY_PREFIX}${nanoid(32)}`; +} + +/** + * API key validasyonu + */ +export function isValidAPIKeyFormat(key: string): boolean { + return key.startsWith(API_KEY_PREFIX) && key.length === 36; // img_ + 32 chars +} diff --git a/app/lib/next js beter auth yuklu ve drizze orm y.txt b/app/lib/next js beter auth yuklu ve drizze orm y.txt new file mode 100644 index 0000000..329a867 --- /dev/null +++ b/app/lib/next js beter auth yuklu ve drizze orm y.txt @@ -0,0 +1,15 @@ +next js beter auth yuklu ve drizze orm yuklu posgrsql veritabanı ile entegre edilecek. +drizzle orm ile veritabanına bağlanılacak. +beter auth ile register yapılacak. +beter auth ile giriş yapılacak. +giriş yapıldıktan sonra kullanıcının bilgileri veritabanından alınacak. +kullanıcının bilgileri veritabanından alındıktan sonra kullanıcının bilgileri sayfada görüntülenecek. +birkaç yapilandirma eklendi ama duzgun olmayabilir sen kotrol et ve duzelt + + + + + +sadece login olmus userlerin giris yapabilecegi bir sayfa olacak. ve sayfada resim dosyalri yuklenecek en boy kalite format vs kullnacini verdigi bilgilere gore +resim manipule edilecek ve database ye drizzle orm ile kaydedilecek. +resim url si çıkartilarak download edilebilir ve bir buton ile resmin url si kopyalanabilir. olacak ve bu url ile resim indirilebilir. \ No newline at end of file diff --git a/app/lib/permissions.ts b/app/lib/permissions.ts new file mode 100644 index 0000000..b34a682 --- /dev/null +++ b/app/lib/permissions.ts @@ -0,0 +1,93 @@ +import { db } from "@/db"; +import { user } from "@/db/schema"; +import { eq } from "drizzle-orm"; + +export type UserRole = "user" | "admin" | "moderator"; + +// Permission tanımları +export const PERMISSIONS = { + // Image permissions + IMAGE_UPLOAD: "image:upload", + IMAGE_DELETE_OWN: "image:delete:own", + IMAGE_DELETE_ANY: "image:delete:any", + IMAGE_VIEW_OWN: "image:view:own", + IMAGE_VIEW_ANY: "image:view:any", + + // User permissions + USER_VIEW: "user:view", + USER_EDIT: "user:edit", + USER_DELETE: "user:delete", + USER_MANAGE_ROLES: "user:manage:roles", +} as const; + +// Role'lere göre izinler +export const ROLE_PERMISSIONS: Record = { + user: [ + PERMISSIONS.IMAGE_UPLOAD, + PERMISSIONS.IMAGE_DELETE_OWN, + PERMISSIONS.IMAGE_VIEW_OWN, + ], + moderator: [ + PERMISSIONS.IMAGE_UPLOAD, + PERMISSIONS.IMAGE_DELETE_OWN, + PERMISSIONS.IMAGE_VIEW_OWN, + PERMISSIONS.IMAGE_VIEW_ANY, + PERMISSIONS.USER_VIEW, + ], + admin: Object.values(PERMISSIONS), // Tüm izinler +}; + +/** + * Kullanıcının belirli bir role sahip olup olmadığını kontrol eder + */ +export function hasRole(userRole: UserRole, requiredRole: UserRole | UserRole[]): boolean { + const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]; + return roles.includes(userRole); +} + +/** + * Kullanıcının belirli bir izne sahip olup olmadığını kontrol eder + */ +export function hasPermission(userRole: UserRole, permission: string): boolean { + const rolePermissions = ROLE_PERMISSIONS[userRole] || []; + return rolePermissions.includes(permission); +} + +/** + * Kullanıcının birden fazla izne sahip olup olmadığını kontrol eder + */ +export function hasPermissions(userRole: UserRole, permissions: string[]): boolean { + return permissions.every(permission => hasPermission(userRole, permission)); +} + +/** + * Kullanıcının en az bir izne sahip olup olmadığını kontrol eder + */ +export function hasAnyPermission(userRole: UserRole, permissions: string[]): boolean { + return permissions.some(permission => hasPermission(userRole, permission)); +} + +/** + * Kullanıcının admin olup olmadığını kontrol eder + */ +export function isAdmin(userRole: UserRole): boolean { + return userRole === "admin"; +} + +/** + * Kullanıcı bilgilerini userId'den alır + */ +export async function getUserById(userId: string) { + const users = await db.select().from(user).where(eq(user.id, userId)).limit(1); + return users[0] || null; +} + +/** + * Kullanıcının rolünü günceller (sadece admin yapabilir) + */ +export async function updateUserRole(userId: string, newRole: UserRole) { + await db.update(user).set({ + role: newRole, + updatedAt: new Date() + }).where(eq(user.id, userId)); +} diff --git a/app/login/page.tsx b/app/login/page.tsx new file mode 100644 index 0000000..a40bfc8 --- /dev/null +++ b/app/login/page.tsx @@ -0,0 +1,142 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; + +export default function LoginPage() { + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + const [registerEnabled, setRegisterEnabled] = useState(true); + const router = useRouter(); + + useEffect(() => { + const checkRegisterEnabled = async () => { + try { + const response = await fetch("/api/config"); + const data = await response.json(); + setRegisterEnabled(data.registerEnabled); + } catch (error) { + console.error("Config kontrolü başarısız:", error); + } + }; + + checkRegisterEnabled(); + }, []); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(""); + setLoading(true); + + try { + const response = await fetch("/api/auth/sign-in/email", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ + email, + password, + }), + }); + + const data = await response.json(); + + if (!response.ok) { + throw new Error(data.message || "Giriş başarısız"); + } + + router.push("/profile"); + router.refresh(); + } catch (err: any) { + setError(err.message || "Bir hata oluştu"); + } finally { + setLoading(false); + } + }; + + return ( +
+
+
+

+ Giriş Yap +

+
+
+ {error && ( +
+ {error} +
+ )} +
+
+ + setEmail(e.target.value)} + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + placeholder="ornek@email.com" + /> +
+
+ + setPassword(e.target.value)} + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + placeholder="••••••••" + /> +
+
+ +
+ +
+ + {registerEnabled && ( +
+ + Hesabınız yok mu?{" "} + + + Kayıt Ol + +
+ )} +
+
+
+ ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..88fffda --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,293 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Link from "next/link"; + +export default function Home() { + const [isAuthenticated, setIsAuthenticated] = useState(false); + const [registerEnabled, setRegisterEnabled] = useState(true); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const checkAuth = async () => { + try { + const [authResponse, configResponse] = await Promise.all([ + fetch("/api/auth/get-session", { + credentials: "include", + }), + fetch("/api/config"), + ]); + + const authData = await authResponse.json(); + const configData = await configResponse.json(); + + setIsAuthenticated(!!authData.user); + setRegisterEnabled(configData.registerEnabled); + } catch (error) { + setIsAuthenticated(false); + setRegisterEnabled(true); + } finally { + setLoading(false); + } + }; + + checkAuth(); + }, []); + + if (loading) { + return ( +
+
+
+
+ Yükleniyor... +
+
+
+ ); + } + + return ( +
+ {/* Hero Section */} +
+
+ {/* Main Content */} +
+ {/* Icon/Logo */} +
+
+ + + +
+
+ + {/* Title */} +

+ Image Manipulation API +

+ + {/* Description */} +

+ Resimlerinizi yükleyin, boyutlandırın, formatını değiştirin ve + istediğiniz kalitede kaydedin. +

+

+ JWT API desteği ile dış uygulamalarınızdan da kullanabilirsiniz. +

+ + {/* Features */} +
+
+
+
+ + + +
+
+

+ Hızlı İşlem +

+

+ Saniyeler içinde resim manipülasyonu +

+
+ +
+
+
+ + + +
+
+

+ Çoklu Format +

+

+ JPEG, PNG, WebP, AVIF desteği +

+
+ +
+
+
+ + + +
+
+

+ Güvenli API +

+

+ JWT token ile korumalı erişim +

+
+
+ + {/* CTA Buttons */} +
+ {isAuthenticated ? ( + <> + + + + + Resim Yükle + + + + + + Profilim + + + + + + Admin Panel + + + ) : ( + <> + + Giriş Yap + + + + + {registerEnabled && ( + + Kayıt Ol + + )} + + )} +
+ + {/* API Link */} +
+ + + + + API Dokümantasyonu + +
+
+
+
+
+ ); +} diff --git a/app/profile/page.tsx b/app/profile/page.tsx new file mode 100644 index 0000000..0bafc8d --- /dev/null +++ b/app/profile/page.tsx @@ -0,0 +1,177 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; + +interface User { + id: string; + name: string; + email: string; + emailVerified: boolean; + image: string | null; + createdAt: string; + updatedAt: string; +} + +export default function ProfilePage() { + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + const router = useRouter(); + + useEffect(() => { + const fetchUser = async () => { + try { + const response = await fetch("/api/auth/get-session", { + credentials: "include", + }); + const data = await response.json(); + + if (!response.ok || !data.user) { + router.push("/login"); + return; + } + + setUser(data.user); + } catch (error) { + console.error("Kullanıcı bilgileri alınamadı:", error); + router.push("/login"); + } finally { + setLoading(false); + } + }; + + fetchUser(); + }, [router]); + + const handleLogout = async () => { + try { + await fetch("/api/auth/sign-out", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({}), + }); + router.push("/login"); + router.refresh(); + } catch (error) { + console.error("Çıkış yapılamadı:", error); + } + }; + + if (loading) { + return ( +
+
+ Yükleniyor... +
+
+ ); + } + + if (!user) { + return null; + } + + return ( +
+
+
+
+

+ Kullanıcı Bilgileri +

+
+ + Resim Yükle + + + Ana Sayfa + + +
+
+ +
+
+

+ Profil Bilgileri +

+
+
+
+ Ad Soyad +
+
+ {user.name} +
+
+
+
+ E-posta +
+
+ {user.email} +
+
+
+
+ E-posta Doğrulandı mı? +
+
+ {user.emailVerified ? ( + + Evet + + ) : ( + + Hayır + + )} +
+
+
+
+ Kullanıcı ID +
+
+ {user.id} +
+
+
+
+ Kayıt Tarihi +
+
+ {new Date(user.createdAt).toLocaleString("tr-TR")} +
+
+
+
+ Son Güncelleme +
+
+ {new Date(user.updatedAt).toLocaleString("tr-TR")} +
+
+
+
+
+
+
+
+ ); +} diff --git a/app/register/page.tsx b/app/register/page.tsx new file mode 100644 index 0000000..ce4a842 --- /dev/null +++ b/app/register/page.tsx @@ -0,0 +1,211 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; + +export default function RegisterPage() { + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + const [registerEnabled, setRegisterEnabled] = useState(true); + const [checking, setChecking] = useState(true); + const router = useRouter(); + + useEffect(() => { + const checkRegisterEnabled = async () => { + try { + const response = await fetch("/api/config"); + const data = await response.json(); + setRegisterEnabled(data.registerEnabled); + if (!data.registerEnabled) { + router.push("/login"); + } + } catch (error) { + console.error("Config kontrolü başarısız:", error); + } finally { + setChecking(false); + } + }; + + checkRegisterEnabled(); + }, [router]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(""); + + // Şifre kontrolü + if (password !== confirmPassword) { + setError("Şifreler eşleşmiyor"); + return; + } + + if (password.length < 6) { + setError("Şifre en az 6 karakter olmalıdır"); + return; + } + + setLoading(true); + + try { + const response = await fetch("/api/auth/sign-up/email", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ + name, + email, + password, + }), + }); + + const data = await response.json(); + + if (!response.ok) { + throw new Error(data.message || "Kayıt başarısız"); + } + + router.push("/profile"); + router.refresh(); + } catch (err: any) { + setError(err.message || "Bir hata oluştu"); + } finally { + setLoading(false); + } + }; + + if (checking) { + return ( +
+
+ Yükleniyor... +
+
+ ); + } + + if (!registerEnabled) { + return null; + } + + return ( +
+
+
+

+ Kayıt Ol +

+
+
+ {error && ( +
+ {error} +
+ )} +
+
+ + setName(e.target.value)} + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + placeholder="Adınız Soyadınız" + /> +
+
+ + setEmail(e.target.value)} + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + placeholder="ornek@email.com" + /> +
+
+ + setPassword(e.target.value)} + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + placeholder="••••••••" + /> +
+
+ + setConfirmPassword(e.target.value)} + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + placeholder="••••••••" + /> +
+
+ +
+ +
+ +
+ + Zaten hesabınız var mı?{" "} + + + Giriş Yap + +
+
+
+
+ ); +} diff --git a/app/upload/page.tsx b/app/upload/page.tsx new file mode 100644 index 0000000..5e02fb7 --- /dev/null +++ b/app/upload/page.tsx @@ -0,0 +1,415 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; +import Swal from "sweetalert2"; + +interface Image { + id: string; + originalName: string; + url: string; + width: number | null; + height: number | null; + quality: number | null; + format: string; + fileSize: number; + createdAt: string; +} + +export default function UploadPage() { + const [file, setFile] = useState(null); + const [width, setWidth] = useState(800); + const [height, setHeight] = useState(600); + + const handleFileChange = (e: React.ChangeEvent) => { + const selectedFile = e.target.files?.[0]; + if (selectedFile) { + setFile(selectedFile); + + // Resmin boyutlarını al + const img = new Image(); + const objectUrl = URL.createObjectURL(selectedFile); + + img.onload = () => { + setWidth(img.naturalWidth); + setHeight(img.naturalHeight); + URL.revokeObjectURL(objectUrl); + }; + + img.src = objectUrl; + } + }; + const [quality, setQuality] = useState(90); + const [format, setFormat] = useState("avif"); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(""); + const [success, setSuccess] = useState(""); + const [images, setImages] = useState([]); + const [isAuthenticated, setIsAuthenticated] = useState(false); + const [checkingAuth, setCheckingAuth] = useState(true); + const router = useRouter(); + + useEffect(() => { + const checkAuth = async () => { + try { + const response = await fetch("/api/auth/get-session", { + credentials: "include", + }); + const data = await response.json(); + + if (!response.ok || !data.user) { + router.push("/login"); + return; + } + + setIsAuthenticated(true); + loadImages(); + } catch (error) { + console.error("Auth kontrolü başarısız:", error); + router.push("/login"); + } finally { + setCheckingAuth(false); + } + }; + + checkAuth(); + }, [router]); + + const loadImages = async () => { + try { + const response = await fetch("/api/images", { + credentials: "include", + cache: 'no-store', // Cache'i devre dışı bırak + }); + if (response.ok) { + const data = await response.json(); + console.log("Yüklenen resimler:", data.images?.length || 0); + setImages(data.images || []); + } else { + console.error("Resimler yüklenemedi, status:", response.status); + } + } catch (error) { + console.error("Resimler yüklenemedi:", error); + } + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(""); + setSuccess(""); + + if (!file) { + setError("Lütfen bir dosya seçin"); + return; + } + + setLoading(true); + + try { + const formData = new FormData(); + formData.append("file", file); + formData.append("width", width.toString()); + formData.append("height", height.toString()); + formData.append("quality", quality.toString()); + formData.append("format", format); + + const response = await fetch("/api/images/upload", { + method: "POST", + credentials: "include", + body: formData, + }); + + const data = await response.json(); + + if (!response.ok) { + throw new Error(data.message || "Yükleme başarısız"); + } + + // Formu tamamen resetle + setSuccess("Resim başarıyla yüklendi!"); + setFile(null); + const fileInput = document.querySelector('input[type="file"]') as HTMLInputElement; + if (fileInput) { + fileInput.value = ''; + } + + // Resimleri yeniden yükle + await loadImages(); + + // Success mesajını kısa süre sonra temizle + setTimeout(() => setSuccess(""), 3000); + } catch (err: any) { + setError(err.message || "Bir hata oluştu"); + } finally { + setLoading(false); + } + }; + + const copyToClipboard = (url: string) => { + navigator.clipboard.writeText(url); + setSuccess("URL kopyalandı!"); + setTimeout(() => setSuccess(""), 2000); + }; + + const downloadImage = (url: string, originalName: string) => { + const link = document.createElement("a"); + link.href = url; + link.download = originalName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + + const handleDelete = async (imageId: string, originalName: string) => { + const result = await Swal.fire({ + title: "Emin misiniz?", + text: `${originalName} adlı resmi silmek istediğinize emin misiniz?`, + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Evet, Sil!", + cancelButtonText: "İptal", + }); + + if (result.isConfirmed) { + try { + console.log("Silme isteği gönderiliyor, imageId:", imageId); + console.log("Image objesi:", images.find(img => img.id === imageId)); + const response = await fetch(`/api/images/${encodeURIComponent(imageId)}`, { + method: "DELETE", + credentials: "include", + }); + + const data = await response.json(); + + if (!response.ok) { + console.error("Silme hatası:", data); + throw new Error(data.message || "Silme işlemi başarısız"); + } + + Swal.fire("Silindi!", "Resim başarıyla silindi.", "success"); + loadImages(); + } catch (error: any) { + console.error("Silme hatası:", error); + Swal.fire("Hata!", error.message || "Resim silinirken bir hata oluştu.", "error"); + } + } + }; + + if (checkingAuth) { + return ( +
+
+ Yükleniyor... +
+
+ ); + } + + if (!isAuthenticated) { + return null; + } + + return ( +
+
+
+

+ Resim Yükle ve Manipüle Et +

+
+ + Profil + + + Ana Sayfa + +
+
+ +
+ {/* Upload Form */} +
+

+ Resim Yükle +

+
+ {error && ( +
+ {error} +
+ )} + {success && ( +
+ {success} +
+ )} + +
+ + +
+ +
+
+ + setWidth(parseInt(e.target.value) || 800)} + min="1" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + /> +
+
+ + setHeight(parseInt(e.target.value) || 600)} + min="1" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + /> +
+
+ +
+ + setQuality(parseInt(e.target.value) || 90)} + min="1" + max="100" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-blue-500 dark:border-gray-600 dark:bg-zinc-800 dark:text-white" + /> +
+ +
+ + +
+ + +
+
+ + {/* Images List */} +
+

+ Yüklenen Resimler ({images.length}) +

+ {images.length === 0 ? ( +
+

+ Henüz resim yüklenmedi +

+
+ ) : ( +
+ {images.map((image) => ( +
+
+ {image.originalName} +
+
+
+

+ {image.originalName} +

+
+

+ Boyut: {image.width} × {image.height} px +

+

+ Format: {image.format.toUpperCase()} +

+

+ Dosya: {Math.round(image.fileSize / 1024)} KB +

+ {image.quality && ( +

+ Kalite: {image.quality}% +

+ )} +
+
+ + +
+ +
+
+ ))} +
+ )} +
+
+
+
+ ); +} diff --git a/app/uploads/[...path]/route.ts b/app/uploads/[...path]/route.ts new file mode 100644 index 0000000..4367383 --- /dev/null +++ b/app/uploads/[...path]/route.ts @@ -0,0 +1,43 @@ +import { NextRequest, NextResponse } from "next/server"; +import { readFile } from "fs/promises"; +import { join } from "path"; + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ path: string[] }> } +) { + try { + const { path } = await params; + const filePath = join(process.cwd(), "public", "uploads", ...path); + const fileBuffer = await readFile(filePath); + + // Dosya uzantısına göre content-type belirle + const fileName = path[path.length - 1]; + const ext = fileName.split('.').pop()?.toLowerCase(); + + const contentTypeMap: Record = { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'png': 'image/png', + 'gif': 'image/gif', + 'webp': 'image/webp', + 'avif': 'image/avif', + 'svg': 'image/svg+xml', + }; + + const contentType = contentTypeMap[ext || ''] || 'application/octet-stream'; + + return new NextResponse(fileBuffer, { + headers: { + 'Content-Type': contentType, + 'Cache-Control': 'public, max-age=31536000, immutable', + }, + }); + } catch (error) { + console.error('Dosya okuma hatası:', error); + return NextResponse.json( + { message: "Dosya bulunamadı" }, + { status: 404 } + ); + } +} diff --git a/db.ts b/db.ts new file mode 100644 index 0000000..775de32 --- /dev/null +++ b/db.ts @@ -0,0 +1,27 @@ +import { drizzle } from "drizzle-orm/node-postgres"; +import { Pool } from "pg"; +import * as dotenv from "dotenv"; + +dotenv.config(); + +// Create pool - DATABASE_URL check will happen at runtime when pool is actually used +// During build time, this won't fail even if DATABASE_URL is not set +const pool = new Pool({ + connectionString: process.env.DATABASE_URL || "postgresql://localhost:5432/temp", + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 10000, + ssl: process.env.DATABASE_SSL === "true" ? { rejectUnauthorized: false } : false, +}); + +// Test connection on startup +pool.on("error", (err) => { + console.error("Unexpected error on idle client", err); +}); + +// Validate DATABASE_URL at runtime (not during build) +if (process.env.NODE_ENV === "production" && !process.env.DATABASE_URL) { + console.warn("WARNING: DATABASE_URL is not set. Database operations will fail."); +} + +export const db = drizzle(pool); diff --git a/db/schema.ts b/db/schema.ts new file mode 100644 index 0000000..e9090fb --- /dev/null +++ b/db/schema.ts @@ -0,0 +1,90 @@ +import { pgTable, text, timestamp, boolean, integer } from "drizzle-orm/pg-core"; + +// Roles enum +export const roleEnum = ["user", "admin", "moderator"] as const; +export type UserRole = typeof roleEnum[number]; + +// Better-auth requires these tables +export const user = pgTable("user", { + id: text("id").primaryKey(), + name: text("name").notNull(), + email: text("email").notNull().unique(), + emailVerified: boolean("emailVerified").notNull().default(false), + image: text("image"), + role: text("role").notNull().default("user"), // user, admin, moderator + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), +}); + +export const session = pgTable("session", { + id: text("id").primaryKey(), + expiresAt: timestamp("expiresAt").notNull(), + token: text("token").notNull().unique(), + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), + ipAddress: text("ipAddress"), + userAgent: text("userAgent"), + userId: text("userId") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), +}); + +export const account = pgTable("account", { + id: text("id").primaryKey(), + accountId: text("accountId").notNull(), + providerId: text("providerId").notNull(), + userId: text("userId") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + accessToken: text("accessToken"), + refreshToken: text("refreshToken"), + idToken: text("idToken"), + accessTokenExpiresAt: timestamp("accessTokenExpiresAt"), + refreshTokenExpiresAt: timestamp("refreshTokenExpiresAt"), + scope: text("scope"), + password: text("password"), + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), +}); + +export const verification = pgTable("verification", { + id: text("id").primaryKey(), + identifier: text("identifier").notNull(), + value: text("value").notNull(), + expiresAt: timestamp("expiresAt").notNull(), + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), +}); + +export const images = pgTable("images", { + id: text("id").primaryKey(), + userId: text("userId") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + originalName: text("originalName").notNull(), + fileName: text("fileName").notNull(), + filePath: text("filePath").notNull(), + url: text("url").notNull(), + width: integer("width"), + height: integer("height"), + quality: integer("quality"), + format: text("format").notNull(), + fileSize: integer("fileSize").notNull(), + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), +}); + +// API Keys for external applications +export const apiKeys = pgTable("apiKeys", { + id: text("id").primaryKey(), + userId: text("userId") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + name: text("name").notNull(), // API key ismi (örn: "Mobile App", "Dashboard") + key: text("key").notNull().unique(), // API key + lastUsedAt: timestamp("lastUsedAt"), + expiresAt: timestamp("expiresAt"), // null = süresiz + isActive: boolean("isActive").notNull().default(true), + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), +}); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..dc27cb1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,46 @@ +services: + image-apiv2: + build: + context: . + dockerfile: Dockerfile + container_name: image-apiv2 + user: "1001:1001" # nextjs user (uid:gid) + ports: + - "3151:3000" + networks: + - dokploy-network + environment: + - DATABASE_URL=${DATABASE_URL} + - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} + - BETTER_AUTH_URL=${BETTER_AUTH_URL:-http://localhost:3000} + - REGISTER_ENABLE=${REGISTER_ENABLE:-true} + - NODE_ENV=production + volumes: + # Uploads klasörünü persist et + - uploads_data:/app/public/uploads + restart: unless-stopped +volumes: + uploads_data: +networks: + dokploy-network: + external: true + # Opsiyonel: PostgreSQL ile birlikte kullanmak için + # depends_on: + # - postgres + + # Opsiyonel: PostgreSQL veritabanı + # postgres: + # image: postgres:16-alpine + # container_name: image-api-db + # environment: + # - POSTGRES_USER=${POSTGRES_USER:-postgres} + # - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres} + # - POSTGRES_DB=${POSTGRES_DB:-image_api} + # volumes: + # - postgres_data:/var/lib/postgresql/data + # ports: + # - "5432:5432" + # restart: unless-stopped + +# volumes: +# postgres_data: diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..5179f7a --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +# Uploads klasörünü oluştur ve izinleri ayarla (volume mount için) +mkdir -p /app/public/uploads +chmod -R 775 /app/public/uploads + +# Uygulamayı başlat +exec node server.js diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..c746e51 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "drizzle-kit"; +import * as dotenv from "dotenv"; + +dotenv.config(); + +export default defineConfig({ + schema: "./db/schema.ts", + out: "./drizzle", + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL!, + }, +}); diff --git a/drizzle/0000_perpetual_alice.sql b/drizzle/0000_perpetual_alice.sql new file mode 100644 index 0000000..fdaad5e --- /dev/null +++ b/drizzle/0000_perpetual_alice.sql @@ -0,0 +1,81 @@ +CREATE TABLE "account" ( + "id" text PRIMARY KEY NOT NULL, + "accountId" text NOT NULL, + "providerId" text NOT NULL, + "userId" text NOT NULL, + "accessToken" text, + "refreshToken" text, + "idToken" text, + "accessTokenExpiresAt" timestamp, + "refreshTokenExpiresAt" timestamp, + "scope" text, + "password" text, + "createdAt" timestamp DEFAULT now() NOT NULL, + "updatedAt" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "apiKeys" ( + "id" text PRIMARY KEY NOT NULL, + "userId" text NOT NULL, + "name" text NOT NULL, + "key" text NOT NULL, + "lastUsedAt" timestamp, + "expiresAt" timestamp, + "isActive" boolean DEFAULT true NOT NULL, + "createdAt" timestamp DEFAULT now() NOT NULL, + "updatedAt" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "apiKeys_key_unique" UNIQUE("key") +); +--> statement-breakpoint +CREATE TABLE "images" ( + "id" text PRIMARY KEY NOT NULL, + "userId" text NOT NULL, + "originalName" text NOT NULL, + "fileName" text NOT NULL, + "filePath" text NOT NULL, + "url" text NOT NULL, + "width" integer, + "height" integer, + "quality" integer, + "format" text NOT NULL, + "fileSize" integer NOT NULL, + "createdAt" timestamp DEFAULT now() NOT NULL, + "updatedAt" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "session" ( + "id" text PRIMARY KEY NOT NULL, + "expiresAt" timestamp NOT NULL, + "token" text NOT NULL, + "createdAt" timestamp DEFAULT now() NOT NULL, + "updatedAt" timestamp DEFAULT now() NOT NULL, + "ipAddress" text, + "userAgent" text, + "userId" text NOT NULL, + CONSTRAINT "session_token_unique" UNIQUE("token") +); +--> statement-breakpoint +CREATE TABLE "user" ( + "id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "email" text NOT NULL, + "emailVerified" boolean DEFAULT false NOT NULL, + "image" text, + "createdAt" timestamp DEFAULT now() NOT NULL, + "updatedAt" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "user_email_unique" UNIQUE("email") +); +--> statement-breakpoint +CREATE TABLE "verification" ( + "id" text PRIMARY KEY NOT NULL, + "identifier" text NOT NULL, + "value" text NOT NULL, + "expiresAt" timestamp NOT NULL, + "createdAt" timestamp DEFAULT now() NOT NULL, + "updatedAt" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +ALTER TABLE "account" ADD CONSTRAINT "account_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "apiKeys" ADD CONSTRAINT "apiKeys_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "images" ADD CONSTRAINT "images_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "session" ADD CONSTRAINT "session_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/drizzle/0001_harsh_morbius.sql b/drizzle/0001_harsh_morbius.sql new file mode 100644 index 0000000..68b3048 --- /dev/null +++ b/drizzle/0001_harsh_morbius.sql @@ -0,0 +1 @@ +ALTER TABLE "user" ADD COLUMN "role" text DEFAULT 'user' NOT NULL; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..673fd93 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,527 @@ +{ + "id": "e57a66f4-9087-4f42-843d-86044c7d703b", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "accountId": { + "name": "accountId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessToken": { + "name": "accessToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idToken": { + "name": "idToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessTokenExpiresAt": { + "name": "accessTokenExpiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refreshTokenExpiresAt": { + "name": "refreshTokenExpiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.apiKeys": { + "name": "apiKeys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "isActive": { + "name": "isActive", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "apiKeys_userId_user_id_fk": { + "name": "apiKeys_userId_user_id_fk", + "tableFrom": "apiKeys", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "apiKeys_key_unique": { + "name": "apiKeys_key_unique", + "nullsNotDistinct": false, + "columns": [ + "key" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.images": { + "name": "images", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "originalName": { + "name": "originalName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fileName": { + "name": "fileName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "quality": { + "name": "quality", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fileSize": { + "name": "fileSize", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "images_userId_user_id_fk": { + "name": "images_userId_user_id_fk", + "tableFrom": "images", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userAgent": { + "name": "userAgent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "emailVerified": { + "name": "emailVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 0000000..0085c69 --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,534 @@ +{ + "id": "fc4f3c3d-f7b9-4e17-b7dc-88e2944f9303", + "prevId": "e57a66f4-9087-4f42-843d-86044c7d703b", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "accountId": { + "name": "accountId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessToken": { + "name": "accessToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idToken": { + "name": "idToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessTokenExpiresAt": { + "name": "accessTokenExpiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refreshTokenExpiresAt": { + "name": "refreshTokenExpiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.apiKeys": { + "name": "apiKeys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "isActive": { + "name": "isActive", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "apiKeys_userId_user_id_fk": { + "name": "apiKeys_userId_user_id_fk", + "tableFrom": "apiKeys", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "apiKeys_key_unique": { + "name": "apiKeys_key_unique", + "nullsNotDistinct": false, + "columns": [ + "key" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.images": { + "name": "images", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "originalName": { + "name": "originalName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fileName": { + "name": "fileName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "quality": { + "name": "quality", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fileSize": { + "name": "fileSize", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "images_userId_user_id_fk": { + "name": "images_userId_user_id_fk", + "tableFrom": "images", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userAgent": { + "name": "userAgent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "emailVerified": { + "name": "emailVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'user'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..b0e907f --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,20 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1767680035227, + "tag": "0000_perpetual_alice", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1767682768043, + "tag": "0001_harsh_morbius", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/image_api.sql b/image_api.sql new file mode 100644 index 0000000000000000000000000000000000000000..7ac28621c6cca48399fad672caec31a839de584b GIT binary patch literal 9354 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 PC[productContext.md] + PB --> SP[systemPatterns.md] + PB --> TC[techContext.md] + + PC --> AC[activeContext.md] + SP --> AC + TC --> AC + + AC --> P[progress.md] + +### Core Files (Required) +1. `projectbrief.md` + - Foundation document that shapes all other files + - Created at project start if it doesn't exist + - Defines core requirements and goals + - Source of truth for project scope + +2. `productContext.md` + - Why this project exists + - Problems it solves + - How it should work + - User experience goals + +3. `activeContext.md` + - Current work focus + - Recent changes + - Next steps + - Active decisions and considerations + - Important patterns and preferences + - Learnings and project insights + +4. `systemPatterns.md` + - System architecture + - Key technical decisions + - Design patterns in use + - Component relationships + - Critical implementation paths + +5. `techContext.md` + - Technologies used + - Development setup + - Technical constraints + - Dependencies + - Tool usage patterns + +6. `progress.md` + - What works + - What's left to build + - Current status + - Known issues + - Evolution of project decisions + +### Additional Context +Create additional files/folders within memory-bank/ when they help organize: +- Complex feature documentation +- Integration specifications +- API documentation +- Testing strategies +- Deployment procedures + +## Core Workflows + +### Plan Mode +flowchart TD + Start[Start] --> ReadFiles[Read Memory Bank] + ReadFiles --> CheckFiles{Files Complete?} + + CheckFiles -->|No| Plan[Create Plan] + Plan --> Document[Document in Chat] + + CheckFiles -->|Yes| Verify[Verify Context] + Verify --> Strategy[Develop Strategy] + Strategy --> Present[Present Approach] + +### Act Mode +flowchart TD + Start[Start] --> Context[Check Memory Bank] + Context --> Update[Update Documentation] + Update --> Execute[Execute Task] + Execute --> Document[Document Changes] + +## Documentation Updates + +Memory Bank updates occur when: +1. Discovering new project patterns +2. After implementing significant changes +3. When user requests with **update memory bank** (MUST review ALL files) +4. When context needs clarification + +flowchart TD + Start[Update Process] + + subgraph Process + P1[Review ALL Files] + P2[Document Current State] + P3[Clarify Next Steps] + P4[Document Insights & Patterns] + + P1 --> P2 --> P3 --> P4 + end + + Start --> Process + +Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on activeContext.md and progress.md as they track current state. + +REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy. \ No newline at end of file diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..a5df453 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,44 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: "standalone", + async headers() { + return [ + { + source: "/:path*", + headers: [ + { + key: "X-DNS-Prefetch-Control", + value: "on", + }, + { + key: "Strict-Transport-Security", + value: "max-age=63072000; includeSubDomains; preload", + }, + { + key: "X-Frame-Options", + value: "SAMEORIGIN", + }, + { + key: "X-Content-Type-Options", + value: "nosniff", + }, + { + key: "X-XSS-Protection", + value: "1; mode=block", + }, + { + key: "Referrer-Policy", + value: "strict-origin-when-cross-origin", + }, + { + key: "Permissions-Policy", + value: "camera=(), microphone=(), geolocation=()", + }, + ], + }, + ]; + }, +}; + +export default nextConfig; diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c898fc --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "image-api", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint", + "db:generate": "drizzle-kit generate", + "db:push": "drizzle-kit push", + "db:studio": "drizzle-kit studio" + }, + "dependencies": { + "bcrypt": "^6.0.0", + "better-auth": "^1.4.10", + "dotenv": "^17.2.3", + "drizzle-orm": "^0.45.1", + "esbuild": "^0.25.12", + "jsonwebtoken": "^9.0.3", + "nanoid": "^5.1.6", + "next": "16.1.1", + "pg": "^8.16.3", + "postgres": "^3.4.7", + "react": "19.2.3", + "react-dom": "19.2.3", + "sharp": "^0.34.5", + "sweetalert2": "^11.26.17" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/bcrypt": "^6.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^20", + "@types/pg": "^8.16.0", + "@types/react": "^19", + "@types/react-dom": "^19", + "drizzle-kit": "^0.31.8", + "eslint": "^9", + "eslint-config-next": "16.1.1", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/uploads/G2IZKMVncbgNhi9rU1bon.avif b/public/uploads/G2IZKMVncbgNhi9rU1bon.avif new file mode 100644 index 0000000000000000000000000000000000000000..805751bde1b5f615221ac77811f28a98e4d6a0fc GIT binary patch literal 5739 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�F~Cn>KL>WXWK_5AiP-HME&Ddoig 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 literal 0 HcmV?d00001 diff --git a/public/uploads/_u1OsfM__88agO_goDnRz.jpg b/public/uploads/_u1OsfM__88agO_goDnRz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea757cfcf5aae4b3b251c95afbbbe49a2d294f9e GIT binary patch literal 9204 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 E4>;Hk=l}o! literal 0 HcmV?d00001 diff --git a/public/uploads/diQ-g_qzoYCI4GuOiNny6.avif b/public/uploads/diQ-g_qzoYCI4GuOiNny6.avif new file mode 100644 index 0000000000000000000000000000000000000000..29b4c970b97edc3a0b9176f99717163d7dfc03a6 GIT binary patch literal 230110 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 LzFoFlZ!y-qO4Rqw literal 0 HcmV?d00001 diff --git a/public/uploads/kGGOVikvdoUO7F7ci0MLx.avif b/public/uploads/kGGOVikvdoUO7F7ci0MLx.avif new file mode 100644 index 0000000000000000000000000000000000000000..c39ed43ddaafc1436dc8f518ee02e2102505f772 GIT binary patch literal 44492 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 literal 0 HcmV?d00001 diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sadece login olmus userlerin giris yapab.txt b/sadece login olmus userlerin giris yapab.txt new file mode 100644 index 0000000..183464c --- /dev/null +++ b/sadece login olmus userlerin giris yapab.txt @@ -0,0 +1,3 @@ +sadece login olmus userlerin giris yapabilecegi bir sayfa olacak. ve sayfada resim dosyalri yuklenecek en boy kalite format vs kullnacini verdigi bilgilere gore +resim manipule edilecek ve database ye drizzle orm ile kaydedilecek. +resim url si çıkartilarak download edilebilir ve bir buton ile resmin url si kopyalanabilir. olacak ve bu url ile resim indirilebilir. \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..a88fd7f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3299 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz" + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== + +"@babel/core@^7.0.0", "@babel/core@^7.24.4": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== + dependencies: + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.4" + +"@babel/parser@^7.24.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== + dependencies: + "@babel/types" "^7.28.5" + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.5" + debug "^4.3.1" + +"@babel/types@^7.27.1", "@babel/types@^7.28.4", "@babel/types@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@better-auth/core@1.4.10": + version "1.4.10" + resolved "https://registry.npmjs.org/@better-auth/core/-/core-1.4.10.tgz" + integrity sha512-AThrfb6CpG80wqkanfrbN2/fGOYzhGladHFf3JhaWt/3/Vtf4h084T6PJLrDE7M/vCCGYvDI1DkvP3P1OB2HAg== + dependencies: + "@standard-schema/spec" "^1.0.0" + zod "^4.1.12" + +"@better-auth/telemetry@1.4.10": + version "1.4.10" + resolved "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.4.10.tgz" + integrity sha512-Dq4XJX6EKsUu0h3jpRagX739p/VMOTcnJYWRrLtDYkqtZFg+sFiFsSWVcfapZoWpRSUGYX9iKwl6nDHn6Ju2oQ== + dependencies: + "@better-auth/utils" "0.3.0" + "@better-fetch/fetch" "1.1.21" + +"@better-auth/utils@^0.3.0", "@better-auth/utils@0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@better-auth/utils/-/utils-0.3.0.tgz" + integrity sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw== + +"@better-fetch/fetch@^1.1.4", "@better-fetch/fetch@1.1.21": + version "1.1.21" + resolved "https://registry.npmjs.org/@better-fetch/fetch/-/fetch-1.1.21.tgz" + integrity sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A== + +"@drizzle-team/brocli@^0.10.2": + version "0.10.2" + resolved "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz" + integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== + +"@emnapi/core@^1.4.3": + version "1.8.1" + resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz" + integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg== + dependencies: + "@emnapi/wasi-threads" "1.1.0" + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.3": + version "1.8.1" + resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz" + integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz" + integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== + dependencies: + tslib "^2.4.0" + +"@esbuild-kit/core-utils@^3.3.2": + version "3.3.2" + resolved "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz" + integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== + dependencies: + esbuild "~0.18.20" + source-map-support "^0.5.21" + +"@esbuild-kit/esm-loader@^2.5.5": + version "2.6.5" + resolved "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz" + integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== + dependencies: + "@esbuild-kit/core-utils" "^3.3.2" + get-tsconfig "^4.7.0" + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/linux-x64@0.25.12": + version "0.25.12" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz" + integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== + +"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/config-array@^0.21.1": + version "0.21.1" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz" + integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz" + integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.1" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.39.2": + version "9.39.2" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz" + integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== + dependencies: + "@eslint/core" "^0.17.0" + levn "^0.4.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@img/colour@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz" + integrity sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw== + +"@img/sharp-libvips-linux-x64@1.2.4": + version "1.2.4" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz" + integrity sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw== + +"@img/sharp-linux-x64@0.34.5": + version "0.34.5" + resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz" + integrity sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.2.4" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.4", "@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@next/env@16.1.1": + version "16.1.1" + resolved "https://registry.npmjs.org/@next/env/-/env-16.1.1.tgz" + integrity sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA== + +"@next/eslint-plugin-next@16.1.1": + version "16.1.1" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.1.tgz" + integrity sha512-Ovb/6TuLKbE1UiPcg0p39Ke3puyTCIKN9hGbNItmpQsp+WX3qrjO3WaMVSi6JHr9X1NrmthqIguVHodMJbh/dw== + dependencies: + fast-glob "3.3.1" + +"@next/swc-linux-x64-gnu@16.1.1": + version "16.1.1" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.1.tgz" + integrity sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ== + +"@noble/ciphers@^2.0.0": + version "2.1.1" + resolved "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz" + integrity sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw== + +"@noble/hashes@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz" + integrity sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@standard-schema/spec@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + +"@swc/helpers@0.5.15": + version "0.5.15" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" + +"@tailwindcss/node@4.1.18": + version "4.1.18" + resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz" + integrity sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ== + dependencies: + "@jridgewell/remapping" "^2.3.4" + enhanced-resolve "^5.18.3" + jiti "^2.6.1" + lightningcss "1.30.2" + magic-string "^0.30.21" + source-map-js "^1.2.1" + tailwindcss "4.1.18" + +"@tailwindcss/oxide-linux-x64-gnu@4.1.18": + version "4.1.18" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz" + integrity sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g== + +"@tailwindcss/oxide@4.1.18": + version "4.1.18" + resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz" + integrity sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A== + optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.1.18" + "@tailwindcss/oxide-darwin-arm64" "4.1.18" + "@tailwindcss/oxide-darwin-x64" "4.1.18" + "@tailwindcss/oxide-freebsd-x64" "4.1.18" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.18" + "@tailwindcss/oxide-linux-arm64-gnu" "4.1.18" + "@tailwindcss/oxide-linux-arm64-musl" "4.1.18" + "@tailwindcss/oxide-linux-x64-gnu" "4.1.18" + "@tailwindcss/oxide-linux-x64-musl" "4.1.18" + "@tailwindcss/oxide-wasm32-wasi" "4.1.18" + "@tailwindcss/oxide-win32-arm64-msvc" "4.1.18" + "@tailwindcss/oxide-win32-x64-msvc" "4.1.18" + +"@tailwindcss/postcss@^4": + version "4.1.18" + resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz" + integrity sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g== + dependencies: + "@alloc/quick-lru" "^5.2.0" + "@tailwindcss/node" "4.1.18" + "@tailwindcss/oxide" "4.1.18" + postcss "^8.4.41" + tailwindcss "4.1.18" + +"@tybys/wasm-util@^0.10.0": + version "0.10.1" + resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz" + integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== + dependencies: + tslib "^2.4.0" + +"@types/bcrypt@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz" + integrity sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ== + dependencies: + "@types/node" "*" + +"@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/jsonwebtoken@^9.0.10": + version "9.0.10" + resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz" + integrity sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA== + dependencies: + "@types/ms" "*" + "@types/node" "*" + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/node@*", "@types/node@^20": + version "20.19.27" + resolved "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz" + integrity sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug== + dependencies: + undici-types "~6.21.0" + +"@types/pg@*", "@types/pg@^8.16.0": + version "8.16.0" + resolved "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz" + integrity sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + +"@types/react-dom@^19": + version "19.2.3" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" + integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== + +"@types/react@^19", "@types/react@^19.2.0": + version "19.2.7" + resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz" + integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg== + dependencies: + csstype "^3.2.2" + +"@typescript-eslint/eslint-plugin@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz" + integrity sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.52.0" + "@typescript-eslint/type-utils" "8.52.0" + "@typescript-eslint/utils" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.4.0" + +"@typescript-eslint/parser@^8.52.0", "@typescript-eslint/parser@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz" + integrity sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg== + dependencies: + "@typescript-eslint/scope-manager" "8.52.0" + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz" + integrity sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.52.0" + "@typescript-eslint/types" "^8.52.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz" + integrity sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA== + dependencies: + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + +"@typescript-eslint/tsconfig-utils@^8.52.0", "@typescript-eslint/tsconfig-utils@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz" + integrity sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg== + +"@typescript-eslint/type-utils@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz" + integrity sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ== + dependencies: + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + "@typescript-eslint/utils" "8.52.0" + debug "^4.4.3" + ts-api-utils "^2.4.0" + +"@typescript-eslint/types@^8.52.0", "@typescript-eslint/types@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz" + integrity sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg== + +"@typescript-eslint/typescript-estree@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz" + integrity sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ== + dependencies: + "@typescript-eslint/project-service" "8.52.0" + "@typescript-eslint/tsconfig-utils" "8.52.0" + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + debug "^4.4.3" + minimatch "^9.0.5" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.4.0" + +"@typescript-eslint/utils@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz" + integrity sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.52.0" + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + +"@typescript-eslint/visitor-keys@8.52.0": + version "8.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz" + integrity sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ== + dependencies: + "@typescript-eslint/types" "8.52.0" + eslint-visitor-keys "^4.2.1" + +"@unrs/resolver-binding-linux-x64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz" + integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: + version "3.1.9" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-shim-unscopables "^1.1.0" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@^4.10.0: + version "4.11.0" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz" + integrity sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ== + +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +baseline-browser-mapping@^2.8.3, baseline-browser-mapping@^2.9.0: + version "2.9.11" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz" + integrity sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ== + +bcrypt@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz" + integrity sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg== + dependencies: + node-addon-api "^8.3.0" + node-gyp-build "^4.8.4" + +better-auth@^1.4.10: + version "1.4.10" + resolved "https://registry.npmjs.org/better-auth/-/better-auth-1.4.10.tgz" + integrity sha512-0kqwEBJLe8eyFzbUspRG/htOriCf9uMLlnpe34dlIJGdmDfPuQISd4shShvUrvIVhPxsY1dSTXdXPLpqISYOYg== + dependencies: + "@better-auth/core" "1.4.10" + "@better-auth/telemetry" "1.4.10" + "@better-auth/utils" "0.3.0" + "@better-fetch/fetch" "1.1.21" + "@noble/ciphers" "^2.0.0" + "@noble/hashes" "^2.0.0" + better-call "1.1.7" + defu "^6.1.4" + jose "^6.1.0" + kysely "^0.28.5" + nanostores "^1.0.1" + zod "^4.1.12" + +better-call@1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/better-call/-/better-call-1.1.7.tgz" + integrity sha512-6gaJe1bBIEgVebQu/7q9saahVzvBsGaByEnE8aDVncZEDiJO7sdNB28ot9I6iXSbR25egGmmZ6aIURXyQHRraQ== + dependencies: + "@better-auth/utils" "^0.3.0" + "@better-fetch/fetch" "^1.1.4" + rou3 "^0.7.10" + set-cookie-parser "^2.7.1" + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0, "browserslist@>= 4.21.0": + version "4.28.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== + dependencies: + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" + +buffer-equal-constant-time@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001759: + version "1.0.30001762" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz" + integrity sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defu@^6.1.4: + version "6.1.4" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== + +detect-libc@^2.0.3, detect-libc@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dotenv@^17.2.3: + version "17.2.3" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz" + integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== + +drizzle-kit@^0.31.8, drizzle-kit@>=0.31.4: + version "0.31.8" + resolved "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.8.tgz" + integrity sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg== + dependencies: + "@drizzle-team/brocli" "^0.10.2" + "@esbuild-kit/esm-loader" "^2.5.5" + esbuild "^0.25.4" + esbuild-register "^3.5.0" + +drizzle-orm@^0.45.1, drizzle-orm@>=0.41.0: + version "0.45.1" + resolved "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz" + integrity sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +electron-to-chromium@^1.5.263: + version "1.5.267" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz" + integrity sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.18.3: + version "5.18.4" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz" + integrity sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.1: + version "1.24.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz" + integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz" + integrity sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.1" + es-errors "^1.3.0" + es-set-tostringtag "^2.1.0" + function-bind "^1.1.2" + get-intrinsic "^1.3.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.5" + safe-array-concat "^1.1.3" + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +esbuild-register@^3.5.0: + version "3.6.0" + resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" + +esbuild@^0.25.12, esbuild@^0.25.4, "esbuild@>=0.12 <1": + version "0.25.12" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz" + integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.12" + "@esbuild/android-arm" "0.25.12" + "@esbuild/android-arm64" "0.25.12" + "@esbuild/android-x64" "0.25.12" + "@esbuild/darwin-arm64" "0.25.12" + "@esbuild/darwin-x64" "0.25.12" + "@esbuild/freebsd-arm64" "0.25.12" + "@esbuild/freebsd-x64" "0.25.12" + "@esbuild/linux-arm" "0.25.12" + "@esbuild/linux-arm64" "0.25.12" + "@esbuild/linux-ia32" "0.25.12" + "@esbuild/linux-loong64" "0.25.12" + "@esbuild/linux-mips64el" "0.25.12" + "@esbuild/linux-ppc64" "0.25.12" + "@esbuild/linux-riscv64" "0.25.12" + "@esbuild/linux-s390x" "0.25.12" + "@esbuild/linux-x64" "0.25.12" + "@esbuild/netbsd-arm64" "0.25.12" + "@esbuild/netbsd-x64" "0.25.12" + "@esbuild/openbsd-arm64" "0.25.12" + "@esbuild/openbsd-x64" "0.25.12" + "@esbuild/openharmony-arm64" "0.25.12" + "@esbuild/sunos-x64" "0.25.12" + "@esbuild/win32-arm64" "0.25.12" + "@esbuild/win32-ia32" "0.25.12" + "@esbuild/win32-x64" "0.25.12" + +esbuild@~0.18.20: + version "0.18.20" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@16.1.1: + version "16.1.1" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.1.tgz" + integrity sha512-55nTpVWm3qeuxoQKLOjQVciKZJUphKrNM0fCcQHAIOGl6VFXgaqeMfv0aKJhs7QtcnlAPhNVqsqRfRjeKBPIUA== + dependencies: + "@next/eslint-plugin-next" "16.1.1" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.32.0" + eslint-plugin-jsx-a11y "^6.10.0" + eslint-plugin-react "^7.37.0" + eslint-plugin-react-hooks "^7.0.0" + globals "16.4.0" + typescript-eslint "^8.46.0" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.10.1" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz" + integrity sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.4.0" + get-tsconfig "^4.10.0" + is-bun-module "^2.0.0" + stable-hash "^0.0.5" + tinyglobby "^0.2.13" + unrs-resolver "^1.6.2" + +eslint-module-utils@^2.12.1: + version "2.12.1" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz" + integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@*, eslint-plugin-import@^2.32.0: + version "2.32.0" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" + integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.9" + array.prototype.findlastindex "^1.2.6" + array.prototype.flat "^1.3.3" + array.prototype.flatmap "^1.3.3" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.1" + hasown "^2.0.2" + is-core-module "^2.16.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.1" + semver "^6.3.1" + string.prototype.trimend "^1.0.9" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.10.0: + version "6.10.2" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== + dependencies: + aria-query "^5.3.2" + array-includes "^3.1.8" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "^4.10.0" + axobject-query "^4.1.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + hasown "^2.0.2" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.1" + +eslint-plugin-react-hooks@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz" + integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== + dependencies: + "@babel/core" "^7.24.4" + "@babel/parser" "^7.24.4" + hermes-parser "^0.25.1" + zod "^3.25.0 || ^4.0.0" + zod-validation-error "^3.5.0 || ^4.0.0" + +eslint-plugin-react@^7.37.0: + version "7.37.5" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9, eslint@>=9.0.0: + version "9.39.2" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz" + integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.1" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.39.2" + "@eslint/plugin-kit" "^0.4.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + +esquery@^1.5.0: + version "1.7.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-tsconfig@^4.10.0, get-tsconfig@^4.7.0: + version "4.13.0" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz" + integrity sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@16.4.0: + version "16.4.0" + resolved "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz" + integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hermes-estree@0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz" + integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== + +hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz" + integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== + dependencies: + hermes-estree "0.25.1" + +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^7.0.5: + version "7.0.5" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== + dependencies: + semver "^7.7.1" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-generator-function@^1.0.10: + version "1.1.2" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + dependencies: + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + +jiti@*, jiti@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz" + integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== + +jose@^6.1.0: + version "6.1.3" + resolved "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz" + integrity sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonwebtoken@^9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz" + integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== + dependencies: + jws "^4.0.1" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +jwa@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz" + integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== + dependencies: + buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz" + integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== + dependencies: + jwa "^2.0.1" + safe-buffer "^5.0.1" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kysely@*, kysely@^0.28.5: + version "0.28.9" + resolved "https://registry.npmjs.org/kysely/-/kysely-0.28.9.tgz" + integrity sha512-3BeXMoiOhpOwu62CiVpO6lxfq4eS6KMYfQdMsN/2kUCRNuF2YiEr7u0HLHaQU+O4Xu8YXE3bHVkwaQ85i72EuA== + +language-subtag-registry@^0.3.20: + version "0.3.23" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lightningcss-linux-x64-gnu@1.30.2: + version "1.30.2" + resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz" + integrity sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w== + +lightningcss@1.30.2: + version "1.30.2" + resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz" + integrity sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.30.2" + lightningcss-darwin-arm64 "1.30.2" + lightningcss-darwin-x64 "1.30.2" + lightningcss-freebsd-x64 "1.30.2" + lightningcss-linux-arm-gnueabihf "1.30.2" + lightningcss-linux-arm64-gnu "1.30.2" + lightningcss-linux-arm64-musl "1.30.2" + lightningcss-linux-x64-gnu "1.30.2" + lightningcss-linux-x64-musl "1.30.2" + lightningcss-win32-arm64-msvc "1.30.2" + lightningcss-win32-x64-msvc "1.30.2" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@^0.30.21: + version "0.30.21" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +nanoid@^3.3.6: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +nanoid@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz" + integrity sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg== + +nanostores@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/nanostores/-/nanostores-1.1.0.tgz" + integrity sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA== + +napi-postinstall@^0.3.0: + version "0.3.4" + resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +"next@^14.0.0 || ^15.0.0 || ^16.0.0", next@16.1.1: + version "16.1.1" + resolved "https://registry.npmjs.org/next/-/next-16.1.1.tgz" + integrity sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w== + dependencies: + "@next/env" "16.1.1" + "@swc/helpers" "0.5.15" + baseline-browser-mapping "^2.8.3" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "16.1.1" + "@next/swc-darwin-x64" "16.1.1" + "@next/swc-linux-arm64-gnu" "16.1.1" + "@next/swc-linux-arm64-musl" "16.1.1" + "@next/swc-linux-x64-gnu" "16.1.1" + "@next/swc-linux-x64-musl" "16.1.1" + "@next/swc-win32-arm64-msvc" "16.1.1" + "@next/swc-win32-x64-msvc" "16.1.1" + sharp "^0.34.4" + +node-addon-api@^8.3.0: + version "8.5.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz" + integrity sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A== + +node-gyp-build@^4.8.4: + version "4.8.4" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pg-cloudflare@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz" + integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg== + +pg-connection-string@^2.9.1: + version "2.9.1" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz" + integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.10.1: + version "3.10.1" + resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz" + integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg== + +pg-protocol@*, pg-protocol@^1.10.3: + version "1.10.3" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz" + integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ== + +pg-types@^2.2.0, pg-types@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.0.0, pg@^8.16.3, pg@>=8, pg@>=8.0: + version "8.16.3" + resolved "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz" + integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw== + 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" + +pgpass@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +"picomatch@^3 || ^4", picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss@^8.4.41: + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz" + integrity sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +postgres@^3.4.7, postgres@>=3: + version "3.4.7" + resolved "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz" + integrity sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +"react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@19.2.3: + version "19.2.3" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz" + integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg== + dependencies: + scheduler "^0.27.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react@^18.0.0 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react@^19.2.3, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", react@19.2.3: + version "19.2.3" + resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz" + integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.22.4: + version "1.22.11" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== + dependencies: + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rou3@^0.7.10: + version "0.7.12" + resolved "https://registry.npmjs.org/rou3/-/rou3-0.7.12.tgz" + integrity sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +semver@^7.7.1: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +semver@^7.7.3: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +set-cookie-parser@^2.7.1: + version "2.7.2" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz" + integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +sharp@^0.34.4, sharp@^0.34.5: + version "0.34.5" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz" + integrity sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg== + dependencies: + "@img/colour" "^1.0.0" + detect-libc "^2.1.2" + semver "^7.7.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.34.5" + "@img/sharp-darwin-x64" "0.34.5" + "@img/sharp-libvips-darwin-arm64" "1.2.4" + "@img/sharp-libvips-darwin-x64" "1.2.4" + "@img/sharp-libvips-linux-arm" "1.2.4" + "@img/sharp-libvips-linux-arm64" "1.2.4" + "@img/sharp-libvips-linux-ppc64" "1.2.4" + "@img/sharp-libvips-linux-riscv64" "1.2.4" + "@img/sharp-libvips-linux-s390x" "1.2.4" + "@img/sharp-libvips-linux-x64" "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.2.4" + "@img/sharp-libvips-linuxmusl-x64" "1.2.4" + "@img/sharp-linux-arm" "0.34.5" + "@img/sharp-linux-arm64" "0.34.5" + "@img/sharp-linux-ppc64" "0.34.5" + "@img/sharp-linux-riscv64" "0.34.5" + "@img/sharp-linux-s390x" "0.34.5" + "@img/sharp-linux-x64" "0.34.5" + "@img/sharp-linuxmusl-arm64" "0.34.5" + "@img/sharp-linuxmusl-x64" "0.34.5" + "@img/sharp-wasm32" "0.34.5" + "@img/sharp-win32-arm64" "0.34.5" + "@img/sharp-win32-ia32" "0.34.5" + "@img/sharp-win32-x64" "0.34.5" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +stable-hash@^0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz" + integrity sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== + dependencies: + client-only "0.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +sweetalert2@^11.26.17: + version "11.26.17" + resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.26.17.tgz" + integrity sha512-kkaySn1IRfwNlf9AkZVqDmBINDWw9NRR6Ij0O5dBRBOD1+mbtZJWxxR9/pA90nce9E5tIIkJ7SWij4rMWXtA1g== + +tailwindcss@^4, tailwindcss@4.1.18: + version "4.1.18" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz" + integrity sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw== + +tapable@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== + +tinyglobby@^0.2.13, tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz" + integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.4.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typescript-eslint@^8.46.0: + version "8.52.0" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz" + integrity sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.52.0" + "@typescript-eslint/parser" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + "@typescript-eslint/utils" "8.52.0" + +typescript@^5, typescript@>=3.3.1, typescript@>=4.8.4, "typescript@>=4.8.4 <6.0.0": + version "5.9.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +unrs-resolver@^1.6.2: + version "1.11.1" + resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz" + integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== + dependencies: + napi-postinstall "^0.3.0" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" + "@unrs/resolver-binding-wasm32-wasi" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" + +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +"zod-validation-error@^3.5.0 || ^4.0.0": + version "4.0.2" + resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz" + integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== + +"zod@^3.25.0 || ^4.0.0", zod@^4.0.0, zod@^4.1.12: + version "4.3.5" + resolved "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz" + integrity sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==