UNPKG

@basis-theory/eslint-config

Version:
111 lines (104 loc) 3.38 kB
// This is a workaround for: https://github.com/eslint/eslint/issues/3458 require('@rushstack/eslint-patch/modern-module-resolution'); const gomlReactRules = require('eslint-config-get-off-my-lawn/src/react'); const readPkgUp = require('read-pkg-up'); const config = require('.'); const dotProp = require('dot-prop'); const pkg = readPkgUp.sync() || {}; const hasDependency = (dependency) => dotProp.get(pkg, `packageJson.dependencies.${dependency}`) || dotProp.get(pkg, `packageJson.devDependencies.${dependency}`); const reactRules = hasDependency('react') ? { 'react/jsx-filename-extension': [ 'error', { extensions: ['.jsx', '.tsx'] }, ], 'react/forbid-elements': [ 'error', { forbid: gomlReactRules['react/forbid-elements'][1].forbid.filter( (f) => f !== 'br' // we use <br> in translation components ), }, ], } : {}; module.exports = { parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint', 'eslint-plugin-prettier'], extends: [ 'get-off-my-lawn', 'eslint:recommended', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', 'prettier', ], parserOptions: { ecmaFeatures: { jsx: true, }, }, rules: { ...config.rules, ...reactRules, 'import/extensions': [ 'error', { json: 'ignorePackages', }, ], '@typescript-eslint/no-unused-vars': [ 'error', { ignoreRestSiblings: true }, ], '@typescript-eslint/member-ordering': 'warn', '@typescript-eslint/explicit-function-return-type': [ 'error', { allowExpressions: true, }, ], '@typescript-eslint/explicit-module-boundary-types': 'error', '@typescript-eslint/explicit-member-accessibility': 'warn', 'jest/valid-expect': 'off', // on typescript we don't need this // typescript overrides to avoid false positives 'no-use-before-define': 'off', '@typescript-eslint/no-use-before-define': ['error'], 'no-duplicate-imports': 'off', '@typescript-eslint/no-duplicate-imports': ['error'], 'no-shadow': 'off', '@typescript-eslint/no-shadow': ['error'], 'no-useless-constructor': 'off', '@typescript-eslint/no-useless-constructor': ['error'], }, overrides: [ { files: '*.js', rules: { '@typescript-eslint/no-var-requires': 'off', // js files must be able to require('') '@typescript-eslint/explicit-member-accessibility': 'off', // js files can't declare accessibility modifiers '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', }, }, { files: '**/cypress/**/*.ts', rules: { 'jest/expect-expect': 'off', // for Cypress specs this rule has a false positive 'jest/consistent-test-it': 'off', // some Cypress configurations don't support 'test' 'node/no-unpublished-import': 'off', // need to disable to use dev dependencies }, }, ], settings: { 'import/resolver': { [require.resolve('eslint-import-resolver-node')]: { extensions: ['.js', '.jsx', '.ts', '.tsx'], }, [require.resolve('eslint-import-resolver-typescript')]: { alwaysTryTypes: true, }, }, }, };