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([ // Ignores MUST come first so they apply to every subsequent // config item. globalIgnores() at the bottom of the array works // for *.next / out / build / next-env.d.ts because eslint-config- // next handles those internally, but .pnpmfile.cjs is not in that // default list — declaring an explicit `{ ignores: [...] }` block // at index 0 is the documented way to make eslint v9 skip files // entirely before any config rules apply. { ignores: ['**/.pnpmfile.cjs', '**/*.cjs'], }, ...nextVitals, ...nextTs, { rules: { 'react-hooks/set-state-in-effect': 'off', '@typescript-eslint/no-unused-vars': [ 'warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' }, ], }, }, // UX-drift ratchet (UX-1): shared `@bytelyst/ui` primitives must be adopted // through the local adapter `src/components/ui/Primitives.tsx`, never imported // directly into pages/components. This keeps product-specific variants, the // `--bl-*` token bridge, and a single migration seam in one place (the // exception below). Mirrors tracker-web's convention. { rules: { 'no-restricted-imports': [ 'error', { paths: [ { name: '@bytelyst/ui', message: "Import shared UI primitives via '@/components/ui/Primitives' instead of '@bytelyst/ui' directly (UX-drift ratchet — see docs/roadmaps/UX_INTEGRATION_ADMIN.md).", }, ], patterns: [ { group: ['@bytelyst/ui/*'], message: "Import shared UI primitives via '@/components/ui/Primitives' instead of '@bytelyst/ui/*' directly (UX-drift ratchet — see docs/roadmaps/UX_INTEGRATION_ADMIN.md).", }, ], }, ], }, }, // The Primitives adapter is the ONE sanctioned seam for `@bytelyst/ui`. { files: ['src/components/ui/Primitives.tsx'], rules: { 'no-restricted-imports': 'off', }, }, // Override default ignores of eslint-config-next. globalIgnores([ // Default ignores of eslint-config-next: '.next/**', 'out/**', 'build/**', 'next-env.d.ts', // .pnpmfile.cjs is a pnpm install hook (CommonJS by design). // The TypeScript no-require-imports rule would otherwise flag // every require() call in this file. eslint-config-next does NOT // ignore .cjs by default. '.pnpmfile.cjs', '**/*.cjs', ]), ]); export default eslintConfig;