- Remove production DB dump (db_backup_*.sql) and update.log from git tracking - Add DB backups to .gitignore - Replace all console.log/console.error with structured logger module - Translate Dutch error messages to English (link-discord.ts) - Remove dead code blocks (register-form.tsx false && pattern) - Add ESLint flat config with TypeScript, React, Next.js, jsx-a11y, and security plugins - Add Prettier config - Add eslint-plugin-security for security-aware linting - Fix all 119+ ESLint warnings across the codebase: - Resolve security/detect-object-injection with safe access patterns - Resolve security/detect-non-literal-fs-filename with path traversal validation - Replace <img> with next/image <Image> component - Remove unused variables and imports - Replace non-null assertions with proper type guards - Replace <a> with <Link> for internal navigation - Use next/script Script component for external scripts - Fix setState-in-useEffect anti-patterns (navbar-color-picker, logo-generator, theme-switcher) - Add lint and format scripts to package.json All checks: typecheck ✓, tests 58/58 ✓, lint 0 errors 0 warnings ✓
67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
import js from "@eslint/js";
|
|
import tseslint from "typescript-eslint";
|
|
import reactHooks from "eslint-plugin-react-hooks";
|
|
import nextPlugin from "@next/eslint-plugin-next";
|
|
import security from "eslint-plugin-security";
|
|
import jsxA11y from "eslint-plugin-jsx-a11y";
|
|
import prettier from "eslint-config-prettier";
|
|
|
|
export default tseslint.config(
|
|
js.configs.recommended,
|
|
...tseslint.configs.recommended,
|
|
security.configs.recommended,
|
|
prettier,
|
|
{
|
|
plugins: {
|
|
"@next/next": nextPlugin,
|
|
"react-hooks": reactHooks,
|
|
"jsx-a11y": jsxA11y,
|
|
},
|
|
rules: {
|
|
...nextPlugin.configs.recommended.rules,
|
|
|
|
"react-hooks/rules-of-hooks": "error",
|
|
"react-hooks/exhaustive-deps": "warn",
|
|
|
|
"no-console": "off",
|
|
"no-unused-vars": "off",
|
|
"@typescript-eslint/no-unused-vars": [
|
|
"warn",
|
|
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
|
|
],
|
|
"@typescript-eslint/no-explicit-any": "warn",
|
|
"@typescript-eslint/consistent-type-imports": "error",
|
|
"@typescript-eslint/no-non-null-assertion": "warn",
|
|
"prefer-const": "error",
|
|
"no-var": "error",
|
|
eqeqeq: ["error", "always", { null: "ignore" }],
|
|
|
|
"no-empty": ["warn", { allowEmptyCatch: true }],
|
|
"no-useless-assignment": "off",
|
|
"no-undef": "off",
|
|
|
|
"security/detect-object-injection": "warn",
|
|
"security/detect-non-literal-fs-filename": "warn",
|
|
|
|
},
|
|
},
|
|
{
|
|
files: ["**/*.test.ts", "**/*.test.tsx", "scripts/**"],
|
|
rules: {
|
|
"security/detect-object-injection": "off",
|
|
"security/detect-non-literal-fs-filename": "off",
|
|
"@typescript-eslint/no-explicit-any": "off",
|
|
},
|
|
},
|
|
{
|
|
ignores: [
|
|
".next/",
|
|
"node_modules/",
|
|
"src/generated/",
|
|
"public/",
|
|
"prisma/migrations/",
|
|
"db_backup_*.sql",
|
|
],
|
|
},
|
|
);
|