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", ]), // ── Der Datenbankzugriff bleibt in einer Hand ─────────────────── // // Die Zugriffsrechte hängen an einer Sitzungsvariablen, die nur innerhalb // einer Transaktion gesetzt werden darf (siehe lib/db/index.ts). Wer den // Pool direkt benutzt, umgeht das — und die Abfrage läuft dann mit dem // Kontext, den die vorherige Anfrage auf derselben gepoolten Verbindung // hinterlassen hat. // // Das muss strukturell unmöglich sein, nicht per Konvention: eine // Vereinbarung überlebt den nächsten Termindruck nicht. { files: ["**/*.ts", "**/*.tsx"], ignores: ["lib/db/**", "tests/integration/**", "supabase/**", "scripts/**"], rules: { "no-restricted-imports": [ "error", { paths: [ { name: "pg", message: "Kein direkter Pool-Zugriff. Abfragen laufen über withUser() aus lib/db — nur dort wird der Sitzungskontext transaktionslokal gesetzt.", }, { name: "kysely", importNames: ["Kysely"], message: "Keine zweite Kysely-Instanz. lib/db exportiert withUser(); die Instanz selbst bleibt privat, damit keine Abfrage ohne Kontext möglich ist.", }, ], patterns: [ { group: ["**/lib/db/pool", "**/db/pool"], message: "Der Pool ist absichtlich nicht exportiert. Über lib/db gehen — withUser() erzwingt die Transaktion.", }, ], }, ], }, }, ]); export default eslintConfig;