@basis-theory/eslint-config
Version:
Basis Theory ESLint config
111 lines (104 loc) • 3.38 kB
JavaScript
// 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,
},
},
},
};