Kachelliste mit Suche ueber Setnummer, Name und EAN sowie Filtern nach Hersteller, Thema, Jahr und Besitzstatus. Besitz kommt aus genau einer Stelle: src/lib/ownership.ts definiert "hat er nicht" als Katalogeintrag ohne collection_item mit Status ungleich sold, als korrelierte Subquery, damit mehrere Exemplare die Liste nicht verdoppeln. Detailseite mit Metadaten, Anleitungen (PDF-Upload plus pdf.js-Viewer ohne CDN, oder externer Link), Fotos, Sammlungseintraegen und den Aktionen "Zur Sammlung" und "Auf Wunschliste". Upload-Pipeline prueft Magic Bytes statt des gemeldeten MIME-Typs, erzeugt Dateinamen serverseitig, wandelt Bilder in WebP inklusive Thumbnail und liefert Dateien ueber /api/files aus - Set-Bilder oeffentlich, Fotos und PDFs nur mit Session. Dazu das Seed-Skript mit 3 Herstellern, 6 Themen, 10 Sets und 4 Sammlungseintraegen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
73 lines
1.9 KiB
JSON
73 lines
1.9 KiB
JSON
{
|
|
"name": "bricktrack",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"description": "Self-hosted Verwaltung fuer Spielzeug-Set-Sammlungen (Lego, Playmobil, Cobi, ...)",
|
|
"packageManager": "pnpm@10.34.5",
|
|
"engines": {
|
|
"node": ">=22"
|
|
},
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "eslint .",
|
|
"typecheck": "tsc --noEmit",
|
|
"db:generate": "drizzle-kit generate",
|
|
"db:migrate": "tsx scripts/migrate.ts",
|
|
"db:seed": "tsx scripts/seed.ts",
|
|
"db:studio": "drizzle-kit studio",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:e2e": "playwright test",
|
|
"screenshots": "playwright test --config=playwright.screenshots.config.ts"
|
|
},
|
|
"dependencies": {
|
|
"@better-auth/passkey": "^1.7.3",
|
|
"better-auth": "^1.7.3",
|
|
"better-sqlite3": "^13.0.3",
|
|
"class-variance-authority": "^0.7.1",
|
|
"cn": "^0.2.6",
|
|
"date-fns": "^4.4.0",
|
|
"drizzle-orm": "^0.45.2",
|
|
"lucide-react": "^1.41.0",
|
|
"next": "15.5.25",
|
|
"next-themes": "^0.4.6",
|
|
"pdfjs-dist": "^6.3.289",
|
|
"radix-ui": "^1.6.7",
|
|
"react": "19.1.0",
|
|
"react-dom": "19.1.0",
|
|
"server-only": "^0.0.1",
|
|
"sharp": "^0.35.4",
|
|
"sonner": "^2.0.8",
|
|
"tw-animate-css": "^1.4.0",
|
|
"zod": "^4.5.4"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/eslintrc": "^3",
|
|
"@playwright/test": "^1.63.0",
|
|
"@tailwindcss/postcss": "^4",
|
|
"@types/better-sqlite3": "^9.6.0",
|
|
"@types/node": "^20",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"dotenv": "^17.4.2",
|
|
"drizzle-kit": "^0.31.10",
|
|
"eslint": "^9",
|
|
"eslint-config-next": "15.5.25",
|
|
"shadcn": "^4.21.0",
|
|
"tailwindcss": "^4",
|
|
"tsx": "^4.23.13",
|
|
"typescript": "^5",
|
|
"vitest": "^5.0.0"
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"better-sqlite3",
|
|
"esbuild",
|
|
"sharp",
|
|
"unrs-resolver"
|
|
]
|
|
}
|
|
}
|