eslint.config.mjs (149 lines of code) (raw):
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import functional from 'eslint-plugin-functional';
import guardian from '@guardian/eslint-config';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
// this is a workaround for variables that are used in a way that eslint doesn't recognize
const noUnusedVarsPattern = '^_|React|req|res|next|error|idxPaths|Schema$';
const config = tseslint.config(
{
// ignore files we don't want to lint
ignores: [
'**/cdk/',
'**/storybook-static/',
'build/',
'scripts/okta/okta-login.js',
],
},
{
extends: [
...guardian.configs.javascript,
eslint.configs.recommended,
...guardian.configs.react,
...tseslint.configs.recommendedTypeChecked,
...guardian.configs.jest,
...guardian.configs.storybook,
functional.configs.noMutations,
eslintPluginPrettierRecommended,
...guardian.configs.comments,
],
plugins: {
functional,
},
languageOptions: {
ecmaVersion: 2022,
sourceType: 'commonjs',
parserOptions: {
projectService: {
// lint additional files that are not part of the tsconfig
allowDefaultProject: ['eslint.config.mjs', 'cypress.config.ts'],
},
ecmaFeatures: {
jsx: true,
},
// list of all tsconfig files that should be used for type checking
project: [
'./tsconfig.json',
'./cypress/tsconfig.json',
'./scripts/okta/tsconfig.json',
],
},
},
settings: {
react: {
version: 'detect',
},
},
rules: {
// fix no-unused-vars errors based on `noUnusedVarsPattern`
'@typescript-eslint/no-unused-vars': [
'error',
{
args: 'all',
argsIgnorePattern: noUnusedVarsPattern,
caughtErrors: 'none',
caughtErrorsIgnorePattern: noUnusedVarsPattern,
destructuredArrayIgnorePattern: noUnusedVarsPattern,
varsIgnorePattern: noUnusedVarsPattern,
ignoreRestSiblings: true,
},
],
// override functional rules
'functional/immutable-data': [
'error',
{
ignoreImmediateMutation: true,
},
],
'functional/prefer-immutable-types': 'off',
'functional/type-declaration-immutability': 'off',
// eslint rules
'no-var': 'error',
'no-param-reassign': 'error',
'no-sequences': 'error',
'no-console': 'error',
'prefer-const': 'error',
// disabled @guardian/eslint-config rules, we should enable some of them later
'import/order': 'off',
'@typescript-eslint/consistent-type-imports': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'eslint-comments/require-description': 'off',
'import/no-default-export': 'off',
'@typescript-eslint/no-unnecessary-condition': 'off',
'sort-imports': 'off',
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/prefer-nullish-coalescing': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'import/no-named-as-default': 'off',
'@typescript-eslint/no-unsafe-enum-comparison': 'off',
'import/no-named-as-default-member': 'off',
'import/no-cycle': 'off',
'@typescript-eslint/only-throw-error': 'off',
},
},
{
// rules specific to storybook files
files: ['**/*.stories.tsx'],
rules: {
'functional/immutable-data': 'off',
},
},
{
// rules specific to test files
files: ['**/*.test.tsx', '**/*.test.ts'],
rules: {
'@typescript-eslint/no-unused-vars': 'off',
'@eslint-community/eslint-comments/require-description': 'off',
},
},
{
// rules specific to cypress test files
files: ['**/*.cy.ts'],
rules: {
'@typescript-eslint/no-unused-expressions': 'off',
},
},
{
// rules specific to files that are not part of the main codebase
files: [
'__mocks__/**/*',
'.storybook/**/*',
'cypress/**/*',
'scripts/**/*',
'util/**/*',
'.swcrc.config.js',
'babel.config.js',
'cypress.config.ts',
'jest.config.js',
'webpack.config.js',
'webpack.development.js',
],
rules: {
'@eslint-community/eslint-comments/require-description': 'off',
},
},
);
export default config;