// @ts-check import eslintComments from '@eslint-community/eslint-plugin-eslint-comments/configs'; import js from '@eslint/js'; import prettier from 'eslint-config-prettier'; import jsxA11y from 'eslint-plugin-jsx-a11y'; import reactHooks from 'eslint-plugin-react-hooks'; import globals from 'globals'; import tseslint from 'typescript-eslint'; /** * One flat config for the whole monorepo. Packages run `eslint .` from their own folder and * ESLint finds this file by walking up, so a new package never needs a root edit. */ export default tseslint.config( { ignores: [ '**/node_modules/**', '**/dist/**', '**/build/**', '**/coverage/**', '**/playwright-report/**', '**/test-results/**', '**/blob-report/**', '**/.vite/**', '**/src-tauri/target/**', '**/src-tauri/gen/**', 'docs/.vitepress/cache/**', 'docs/.vitepress/dist/**', 'packages/importers/fixtures/**', 'examples/demo-workspace/**', ], }, js.configs.recommended, ...tseslint.configs.recommended, eslintComments.recommended, { files: ['**/*.{ts,tsx,js,jsx,mjs,cjs}'], languageOptions: { ecmaVersion: 2024, sourceType: 'module', globals: { ...globals.browser, ...globals.node, ...globals.es2024 }, }, rules: { '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/consistent-type-imports': [ 'error', { prefer: 'type-imports', fixStyle: 'inline-type-imports' }, ], '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', ignoreRestSiblings: true, }, ], '@typescript-eslint/ban-ts-comment': [ 'error', { 'ts-expect-error': 'allow-with-description', 'ts-ignore': true, 'ts-nocheck': true, minimumDescriptionLength: 10, }, ], '@typescript-eslint/no-non-null-assertion': 'error', '@eslint-community/eslint-comments/require-description': [ 'error', { ignore: ['eslint-enable'] }, ], '@eslint-community/eslint-comments/no-unused-disable': 'error', 'no-eval': 'error', 'no-implied-eval': 'error', 'no-new-func': 'error', 'no-console': ['error', { allow: ['warn', 'error', 'info'] }], eqeqeq: ['error', 'always', { null: 'ignore' }], 'prefer-const': 'error', 'no-var': 'error', 'object-shorthand': 'error', }, }, { files: ['**/*.{tsx,jsx}'], ...jsxA11y.flatConfigs.recommended, }, { files: ['**/*.{ts,tsx,js,jsx}'], plugins: { 'react-hooks': reactHooks }, rules: { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'error', }, }, { // Node-side code (server, CLIs, scripts, configs, tests) may log freely. files: [ 'apps/server/**', 'scripts/**', '**/*.config.{ts,js,mjs}', 'packages/create-tessera-plugin/**', 'packages/testkit/**', 'e2e/**', '**/*.bench.ts', ], rules: { 'no-console': 'off' }, }, prettier, );