@vitalik2060/demo-lint
Version:
198 lines (193 loc) • 6.29 kB
JavaScript
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.json',
sourceType: 'module',
},
env: {
node: true,
},
plugins: ['@typescript-eslint', 'import', 'simple-import-sort', 'dirnames', 'unicorn'],
settings: {
'import/resolver': {
node: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
},
},
},
rules: {
quotes: ['warn', 'single', { avoidEscape: true, allowTemplateLiterals: false }],
'padding-line-between-statements': [
'warn',
{ blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' },
{ blankLine: 'always', prev: '*', next: 'return' },
{
blankLine: 'any',
prev: ['const', 'let', 'var'],
next: ['const', 'let', 'var'],
},
],
'no-shadow': 'off',
// Override default airbnb rules
'no-plusplus': ['error', { allowForLoopAfterthoughts: true }],
'no-negated-condition': 'warn',
'default-case': 'off',
'no-use-before-define': 'off',
'prefer-regex-literals': 'off',
// code smell detection
complexity: ['warn', 20],
'max-params': ['warn', 5],
'max-nested-callbacks': 'warn',
'no-restricted-properties': [
'error',
{
object: 'it',
property: 'only',
message: "Did you forget to remove 'only' from this test?",
},
{
object: 'describe',
property: 'only',
message: "Did you forget to remove 'only' from this test?",
},
{
object: 'context',
property: 'only',
message: "Did you forget to remove 'only' from this test?",
},
{
object: 'test',
property: 'only',
message: "Did you forget to remove 'only' from this test?",
},
],
// typescript
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/array-type': [
'error',
{ default: 'array-simple', readonly: 'array-simple' },
],
'@typescript-eslint/consistent-type-assertions': 'error',
'@typescript-eslint/no-array-constructor': 'error',
'@typescript-eslint/no-empty-interface': 'error',
'@typescript-eslint/no-shadow': 'warn',
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/no-unused-vars': 'warn',
'@typescript-eslint/no-use-before-define': [
'error',
{ functions: false, classes: true, variables: true },
],
'@typescript-eslint/default-param-last': 'warn',
'@typescript-eslint/consistent-type-imports': [
'error',
{
prefer: 'type-imports',
fixStyle: 'inline-type-imports',
},
],
'@typescript-eslint/consistent-type-exports': [
'error',
{
fixMixedExportsWithInlineTypeSpecifier: true,
},
],
'@typescript-eslint/no-unnecessary-type-assertion': 'error',
'@typescript-eslint/prefer-optional-chain': 'error',
// Imports, file extensions
'import/no-extraneous-dependencies': [
'error',
{ devDependencies: ['**/*.{stories,test,tests,spec}.{js,jsx,ts,tsx}'] },
],
'import/no-cycle': [
'error',
{
ignoreExternal: true,
},
],
'import/prefer-default-export': 'off',
'import/no-unresolved': 'off',
'import/extensions': 'off',
'import/no-useless-path-segments': [
'error',
{
noUselessIndex: true,
},
],
'dirnames/match-kebab-case': 'error',
'unicorn/filename-case': [
'error',
{
case: 'kebabCase',
},
],
'simple-import-sort/imports': [
'warn',
{
groups: [
['dotenv/config'],
// Node.js builtins. You could also generate this regex if you use a `.js` config.
// For example: `^(${require("module").builtinModules.join("|")})(/|$)`
[
'^(assert|buffer|child_process|cluster|console|constants|crypto|dgram|dns|domain|events|fs|http|https|module|net|os|path|punycode|querystring|readline|repl|stream|string_decoder|sys|timers|tls|tty|url|util|vm|zlib|freelist|v8|process|async_hooks|http2|perf_hooks)(/.*|$)',
],
// Packages. `react` related packages come first.
['^react', '^redux', '^@?\\w'],
// Root path for project
['^#'],
// Parent imports. Put `..` last.
['^\\.\\.(?!/?$)', '^\\.\\./?$'],
// Other relative imports. Put same-folder imports and `.` last.
['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'],
// Style imports.
['^.+\\.s?css$'],
],
},
],
'import/no-import-module-exports': 'off',
'no-restricted-imports': [
'error',
{
paths: [
{
name: 'lodash',
message:
'Import specific parts of "lodash" explicitly, for example: `import isEqual from "lodash/isEqual"`. This will help ensure greater consistency in builds and make it easier to align versions across projects',
},
],
patterns: [
{
group: ['lodash.*'],
message:
'Import specific parts of "lodash" explicitly, for example: `import isEqual from "lodash/isEqual"`. This will help ensure greater consistency in builds and make it easier to align versions across projects',
},
],
},
],
'no-restricted-syntax': [
'error',
{
selector: 'TSTypeReference[typeName.name="PropsWithChildren"]',
message:
'Do not use "PropsWithChildren". Use explicit children typing instead, for example: "children?: ReactNode";',
},
{
selector: 'Literal[value=/(?:[a-z][а-яё]|[а-яё][a-z])/i]',
message:
'Detected mixed language layout within a single word. For example, "case" (first character in ru-encoding)',
},
],
'import/consistent-type-specifier-style': ['error', 'prefer-inline'],
'import/no-duplicates': ['error', { 'prefer-inline': true, considerQueryString: true }],
},
overrides: [
{
files: ['*.{test,tests,spec}.{js,jsx,ts,tsx}'],
env: {
node: true,
jest: true,
browser: true,
},
},
],
};