chore: Projektgerüst und Werkzeugkette einrichten

Next 16 mit App Router und standalone-Ausgabe, React 19, TypeScript strict,
Tailwind 4, Vitest und Playwright. Alle Versionen exakt gepinnt.

Abweichungen vom ursprünglich notierten Stand, jeweils begründet:
- Prisma 7.10.0 statt 6, weil 6 überholt ist und 8 nur als RC vorliegt.
- TypeScript 6.0.3 statt 7, weil typescript-eslint 8 nur "<6.1.0" trägt.
- ESLint 9.39.5 statt 10, weil das in eslint-config-next gebündelte
  eslint-plugin-react noch context.getFilename() benutzt.
- npm-overrides für SimpleWebAuthn und nodemailer, weil next-auth dort
  ältere optionale Peers deklariert. Die betroffenen next-auth-Provider
  werden nicht benutzt: Passkeys laufen direkt über SimpleWebAuthn 14.

"npm run pruefen" bündelt Prettier, ESLint, tsc, Vitest und ShellCheck.
ShellCheck läuft über das Docker-Abbild, wenn es lokal fehlt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-10 12:41:28 +02:00
co-authored by Claude Opus 5
parent 8220adc449
commit de1f923767
18 changed files with 13414 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
{
"name": "planer",
"version": "0.0.0",
"private": true,
"description": "Aufgaben, Ideen, Projekte und Zeitblöcke mit Anbindung an Microsoft 365 und Google Kalender",
"type": "module",
"engines": {
"node": ">=22.12.0"
},
"scripts": {
"dev": "next dev",
"build": "prisma generate && next build",
"start": "next start",
"pruefen": "node scripts/pruefen.mjs",
"format": "prettier --write .",
"format:pruefen": "prettier --check .",
"lint": "eslint . --max-warnings 0",
"typen": "tsc --noEmit",
"test": "vitest run",
"test:beobachten": "vitest",
"test:integration": "tsx scripts/integrationstest.ts",
"test:migration": "tsx scripts/migrationstest.ts",
"test:e2e": "playwright test",
"screenshots": "tsx scripts/screenshots.ts",
"db:generieren": "prisma generate",
"db:migrieren": "prisma migrate dev",
"db:einspielen": "prisma migrate deploy",
"db:seed": "tsx prisma/seed.ts",
"db:studio": "prisma studio"
},
"prisma": {
"seed": "tsx prisma/seed.ts"
},
"overrides": {
"@simplewebauthn/browser": "14.0.0",
"@simplewebauthn/server": "14.0.1",
"nodemailer": "10.0.3"
},
"dependencies": {
"@auth/prisma-adapter": "2.11.3",
"@date-fns/tz": "1.5.0",
"@prisma/adapter-pg": "7.10.0",
"@prisma/client": "7.10.0",
"@radix-ui/react-avatar": "1.2.6",
"@radix-ui/react-dialog": "1.1.23",
"@radix-ui/react-dropdown-menu": "2.1.24",
"@radix-ui/react-label": "2.1.15",
"@radix-ui/react-separator": "1.1.15",
"@radix-ui/react-slot": "1.3.3",
"@simplewebauthn/browser": "14.0.0",
"@simplewebauthn/server": "14.0.1",
"bcryptjs": "3.0.3",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"date-fns": "4.4.0",
"lucide-react": "1.44.0",
"next": "16.3.4",
"next-auth": "5.0.0-beta.32",
"next-themes": "0.4.6",
"node-cron": "4.6.0",
"nodemailer": "10.0.3",
"pg": "8.23.0",
"react": "19.3.0",
"react-dom": "19.3.0",
"server-only": "0.0.1",
"sonner": "2.0.8",
"tailwind-merge": "3.6.0",
"zod": "4.6.1"
},
"devDependencies": {
"@playwright/test": "1.63.0",
"@tailwindcss/postcss": "4.3.3",
"@testing-library/react": "16.3.3",
"@types/node": "24.13.4",
"@types/nodemailer": "8.0.1",
"@types/pg": "8.23.1",
"@types/react": "19.3.0",
"@types/react-dom": "19.3.0",
"@vitejs/plugin-react": "6.1.1",
"@vitest/coverage-v8": "5.0.0",
"dotenv": "17.4.2",
"eslint": "9.39.5",
"eslint-config-next": "16.3.4",
"jsdom": "30.0.1",
"prettier": "3.9.6",
"prettier-plugin-tailwindcss": "0.8.1",
"prisma": "7.10.0",
"tailwindcss": "4.3.3",
"tsx": "4.23.13",
"tw-animate-css": "1.4.0",
"typescript": "6.0.3",
"typescript-eslint": "8.70.0",
"vitest": "5.0.0"
},
"allowScripts": {
"prisma@7.10.0": true,
"@prisma/engines@7.10.0": true,
"esbuild@0.28.2": true,
"unrs-resolver@1.12.2": true
}
}