@code-guideline/eslint
Version:
Code Guideline for eslint
961 lines (846 loc) • 24.7 kB
TypeScript
import tsParser from '@typescript-eslint/parser';
import stylistic from '@stylistic/eslint-plugin';
import newlineDestructuring from 'eslint-plugin-newline-destructuring';
import importNewLines from 'eslint-plugin-import-newlines';
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import unusedImports from 'eslint-plugin-unused-imports';
import typescript from '@typescript-eslint/eslint-plugin';
/**
* @type {import('eslint').Linter.Config}
*/
const config$4 = {
plugins: {
'@stylistic': stylistic, 'newline-destructuring': newlineDestructuring,
},
files: ['**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}'],
rules: {
'@stylistic/array-bracket-newline': [
'error',
{
minItems: 3,
multiline: true,
},
],
'@stylistic/array-bracket-spacing': ['error', 'never'],
'@stylistic/array-element-newline': [
'error',
{
ArrayExpression: 'consistent',
ArrayPattern: 'consistent',
},
],
'@stylistic/arrow-parens': ['error', 'as-needed'],
'@stylistic/arrow-spacing': [
'error',
{
after: true,
before: true,
},
],
'@stylistic/block-spacing': ['error', 'always'],
'@stylistic/brace-style': [
'error',
'1tbs',
{ allowSingleLine: true },
],
'@stylistic/comma-dangle': ['error', 'always-multiline'],
'@stylistic/comma-spacing': [
'error',
{
after: true,
before: false,
},
],
'@stylistic/comma-style': ['error', 'last'],
'@stylistic/computed-property-spacing': ['error', 'never'],
'@stylistic/curly-newline': ['error', 'always'],
'@stylistic/dot-location': ['error', 'property'],
'@stylistic/eol-last': ['error', 'always'],
'@stylistic/function-call-argument-newline': ['error', 'consistent'],
'@stylistic/function-call-spacing': ['error', 'never'],
'@stylistic/function-paren-newline': ['error', { minItems: 5 }],
'@stylistic/generator-star-spacing': [
'error',
{
after: true,
before: false,
},
],
'@stylistic/implicit-arrow-linebreak': ['error', 'beside'],
'@stylistic/indent': ['error', 2],
'@stylistic/indent-binary-ops': ['error', 2],
'@stylistic/key-spacing': [
'error',
{ align: {
beforeColon: false,
afterColon: true,
mode: 'strict',
on: 'value',
} },
],
'@stylistic/keyword-spacing': [
'error',
{
before: true,
after: true,
},
],
'@stylistic/line-comment-position': 'off',
'@stylistic/linebreak-style': ['off', 'unix'],
'@stylistic/lines-around-comment': [
'error',
{
beforeLineComment: true,
allowClassStart: false,
allowClassEnd: false,
allowObjectStart: false,
allowObjectEnd: false,
allowArrayStart: false,
allowArrayEnd: false,
allowBlockStart: true,
allowBlockEnd: false,
allowEnumStart: false,
allowEnumEnd: false,
allowInterfaceStart: false,
allowInterfaceEnd: false,
allowModuleStart: false,
allowModuleEnd: false,
allowTypeStart: false,
allowTypeEnd: false,
applyDefaultIgnorePatterns: false,
afterHashbangComment: true,
},
],
'@stylistic/lines-between-class-members': [
'error',
{ enforce: [
{
blankLine: 'always',
prev: 'method',
next: 'method',
},
] },
],
'@stylistic/max-len': [
'error',
{
code: Number.POSITIVE_INFINITY,
tabWidth: 2,
comments: 100,
ignoreComments: true,
ignoreTrailingComments: true,
ignoreUrls: true,
ignoreStrings: true,
ignoreTemplateLiterals: true,
ignoreRegExpLiterals: true,
},
],
'@stylistic/max-statements-per-line': ['error', { max: 2 }],
'@stylistic/member-delimiter-style': 'error',
'@stylistic/multiline-comment-style': ['error', 'starred-block'],
'@stylistic/multiline-ternary': ['error', 'always-multiline'],
'@stylistic/new-parens': ['error', 'never'],
'@stylistic/newline-per-chained-call': ['error', { ignoreChainWithDepth: 2 }],
'@stylistic/no-confusing-arrow': ['error', { onlyOneSimpleParam: true }],
'@stylistic/no-extra-parens': [
'error',
'all',
{
nestedBinaryExpressions: false,
ternaryOperandBinaryExpressions: false,
ignoreJSX: 'multi-line',
nestedConditionalExpressions: false,
enforceForArrowConditionals: false,
},
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'off',
'@stylistic/no-multiple-empty-lines': [
'error',
{
max: 1,
maxBOF: 0,
maxEOF: 1,
},
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/nonblock-statement-body-position': ['error', 'beside'],
'@stylistic/object-curly-newline': [
'error',
{
ObjectExpression: { minProperties: 2 },
ObjectPattern: { minProperties: 3 },
ImportDeclaration: { minProperties: 4 },
ExportDeclaration: 'always',
TSTypeLiteral: 'always',
TSInterfaceBody: 'always',
},
],
'@stylistic/object-curly-spacing': [
'error',
'always',
{ arraysInObjects: true },
],
'@stylistic/object-property-newline': [
'error',
{
allowAllPropertiesOnSameLine: true,
// allowMultiplePropertiesPerLine: true, // ESLint 9.x에서 지원하지 않으므로 삭제
},
],
'@stylistic/one-var-declaration-per-line': ['error', 'always'],
'@stylistic/operator-linebreak': [
'error',
'after',
{ overrides: {
'?': 'before',
':': 'before',
} },
],
'@stylistic/padded-blocks': ['error', 'never'],
'@stylistic/padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: '*',
next: '*',
},
{
blankLine: 'any',
prev: 'import',
next: 'import',
},
{
blankLine: 'never',
prev: 'singleline-export',
next: 'singleline-export',
},
{
blankLine: 'never',
prev: 'singleline-const',
next: 'singleline-const',
},
{
blankLine: 'never',
prev: 'let',
next: 'let',
},
],
'@stylistic/quote-props': ['error', 'as-needed'],
'@stylistic/quotes': [
'error',
'single',
{ avoidEscape: true },
],
'@stylistic/rest-spread-spacing': 'error',
'@stylistic/semi': 'error',
'@stylistic/semi-spacing': [
'error',
{
before: false,
after: true,
},
],
'@stylistic/semi-style': 'error',
'@stylistic/space-before-blocks': 'error',
'@stylistic/space-before-function-paren': [
'error',
{
anonymous: 'never',
named: 'never',
asyncArrow: 'always',
},
],
'@stylistic/space-in-parens': 'error',
'@stylistic/space-infix-ops': 'error',
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': ['error', 'always'],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/template-curly-spacing': 'error',
'@stylistic/template-tag-spacing': 'error',
'@stylistic/type-annotation-spacing': 'error',
'@stylistic/type-generic-spacing': 'error',
'@stylistic/type-named-tuple-spacing': 'error',
'@stylistic/wrap-iife': ['error', 'inside'],
'@stylistic/wrap-regex': 'error',
'@stylistic/yield-star-spacing': ['error', 'after'],
'newline-destructuring/newline': ['error', { itemsWithRest: 2 }],
},
};
/**
* @type {import('eslint').Linter.Config}
*/
const config$3 = {
plugins: {
'simple-import-sort': simpleImportSort,
'import-newlines': importNewLines,
'unused-imports': unusedImports,
},
settings: { 'import/resolver': {
typescript: {},
node: { extensions: [
'.js',
'.mjs',
'.cjs',
'.jsx',
'.ts',
'.mts',
'.cts',
'.tsx',
] },
} },
rules: {
'simple-import-sort/imports': [
'error',
{ groups: [
['^.+\\.css$'],
[
'^@?\\w',
'^@/',
'^\\.',
],
['^\\u0000'],
] },
],
'import-newlines/enforce': ['error', { items: 3 }],
'unused-imports/no-unused-imports': 'error',
'no-restricted-imports': ['error', { patterns: ['../../*'] }],
'no-restricted-syntax': [
'error',
{
selector: ':not(ImportDeclaration[source.value=/\.css$/]) > ImportNamespaceSpecifier',
message: 'Importing entire module is not allowed.',
},
],
},
};
/**
* @type {import('eslint').Linter.Config}
*/
const defaultConfig$2 = { rules: {
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-debugger': 'error',
'no-alert': 'error',
'no-var': 'error',
'no-duplicate-imports': 'error',
'no-restricted-syntax': 'off',
} };
/**
* @type {import('eslint').Linter.Config}
*/
const typescriptConfig$1 = {
plugins: { '@typescript-eslint': typescript },
files: ['**/*.{js,ts,mjs,mts,cjs,cts,jsx,tsx}'],
rules: {
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-unused-vars': [
'error',
{
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
argsIgnorePattern: '^_',
},
],
'no-unused-vars': [
'error',
{
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
argsIgnorePattern: '^_',
},
],
'no-redeclare': 'error',
},
};
var baseRestrictConfig = [defaultConfig$2, typescriptConfig$1];
/**
* @type {import("eslint").Linter.Config}
*/
const config$2 = {
plugins: { '@stylistic': stylistic },
rules: {
'@stylistic/jsx-child-element-spacing': 'off',
'@stylistic/jsx-closing-bracket-location': ['error', 'tag-aligned'],
'@stylistic/jsx-closing-tag-location': ['error', 'line-aligned'],
'@stylistic/jsx-curly-brace-presence': [
'error',
{
props: 'never',
children: 'never',
propElementValues: 'always',
},
],
'@stylistic/jsx-curly-newline': [
'error',
{
multiline: 'consistent',
singleline: 'forbid',
},
],
'@stylistic/jsx-curly-spacing': [
'error',
'never',
{ allowMultiline: false },
],
'@stylistic/jsx-equals-spacing': ['error', 'never'],
'@stylistic/jsx-first-prop-new-line': ['error', 'multiline'],
'@stylistic/jsx-function-call-newline': ['error', 'multiline'],
'@stylistic/jsx-indent-props': ['error', 2],
'@stylistic/jsx-max-props-per-line': 'error',
'@stylistic/jsx-newline': [
'error',
{
prevent: true,
allowMultilines: true,
},
],
'@stylistic/jsx-one-expression-per-line': ['error', { allow: 'non-jsx' }],
'@stylistic/jsx-pascal-case': [
'error',
{
allowAllCaps: true,
allowNamespace: true,
},
],
'@stylistic/jsx-props-no-multi-spaces': 'error',
'@stylistic/jsx-quotes': ['error', 'prefer-single'],
'@stylistic/jsx-self-closing-comp': [
'error',
{
component: true,
html: true,
},
],
'@stylistic/jsx-sort-props': [
'error',
{
ignoreCase: true,
callbacksLast: true,
shorthandFirst: true,
multiline: 'last',
noSortAlphabetically: true,
reservedFirst: true,
},
],
'@stylistic/jsx-tag-spacing': [
'error',
{
closingSlash: 'allow',
beforeClosing: 'never',
beforeSelfClosing: 'always',
},
],
'@stylistic/jsx-wrap-multilines': [
'error',
{
declaration: 'parens-new-line',
assignment: 'parens-new-line',
return: 'parens-new-line',
arrow: 'parens-new-line',
condition: 'parens-new-line',
logical: 'parens-new-line',
prop: 'parens-new-line',
propertyValue: 'parens',
},
],
},
};
/**
* @type {import('eslint').Linter.Config}
*/
const config$1 = {
plugins: {
'@stylistic': stylistic,
'newline-destructuring': newlineDestructuring,
},
files: ['**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}'],
rules: {
'@stylistic/array-bracket-newline': [
'error',
{
minItems: 3,
multiline: true,
},
],
'@stylistic/array-bracket-spacing': ['error', 'never'],
'@stylistic/array-element-newline': [
'error',
{
ArrayExpression: 'consistent',
ArrayPattern: 'consistent',
},
],
'@stylistic/arrow-parens': ['error', 'as-needed'],
'@stylistic/arrow-spacing': [
'error',
{
after: true,
before: true,
},
],
'@stylistic/block-spacing': ['error', 'always'],
'@stylistic/brace-style': [
'error',
'1tbs',
{ allowSingleLine: true },
],
'@stylistic/comma-dangle': ['error', 'always-multiline'],
'@stylistic/comma-spacing': [
'error',
{
after: true,
before: false,
},
],
'@stylistic/comma-style': ['error', 'last'],
'@stylistic/computed-property-spacing': ['error', 'never'],
'@stylistic/curly-newline': ['error', 'always'],
'@stylistic/dot-location': ['error', 'property'],
'@stylistic/eol-last': ['error', 'always'],
'@stylistic/function-call-argument-newline': ['error', 'consistent'],
'@stylistic/function-call-spacing': ['error', 'never'],
'@stylistic/function-paren-newline': ['error', { minItems: 5 }],
'@stylistic/generator-star-spacing': [
'error',
{
after: true,
before: false,
},
],
'@stylistic/implicit-arrow-linebreak': ['error', 'beside'],
'@stylistic/indent': ['error', 2],
'@stylistic/indent-binary-ops': ['error', 2],
'@stylistic/key-spacing': [
'error',
{ align: {
beforeColon: false,
afterColon: true,
mode: 'strict',
on: 'value',
} },
],
'@stylistic/keyword-spacing': [
'error',
{
before: true,
after: true,
},
],
'@stylistic/line-comment-position': 'off',
'@stylistic/linebreak-style': ['off', 'unix'],
'@stylistic/lines-around-comment': [
'error',
{
beforeLineComment: true,
allowClassStart: false,
allowClassEnd: false,
allowObjectStart: false,
allowObjectEnd: false,
allowArrayStart: false,
allowArrayEnd: false,
allowBlockStart: true,
allowBlockEnd: false,
allowEnumStart: false,
allowEnumEnd: false,
allowInterfaceStart: false,
allowInterfaceEnd: false,
allowModuleStart: false,
allowModuleEnd: false,
allowTypeStart: false,
allowTypeEnd: false,
applyDefaultIgnorePatterns: false,
afterHashbangComment: true,
},
],
'@stylistic/lines-between-class-members': [
'error',
{ enforce: [
{
blankLine: 'always',
prev: 'method',
next: 'method',
},
] },
],
'@stylistic/max-len': [
'error',
{
code: Number.POSITIVE_INFINITY,
tabWidth: 2,
comments: 100,
ignoreComments: true,
ignoreTrailingComments: true,
ignoreUrls: true,
ignoreStrings: true,
ignoreTemplateLiterals: true,
ignoreRegExpLiterals: true,
},
],
'@stylistic/max-statements-per-line': ['error', { max: 2 }],
'@stylistic/member-delimiter-style': 'error',
'@stylistic/multiline-comment-style': ['error', 'starred-block'],
'@stylistic/multiline-ternary': ['error', 'always-multiline'],
'@stylistic/new-parens': ['error', 'never'],
'@stylistic/newline-per-chained-call': ['error', { ignoreChainWithDepth: 2 }],
'@stylistic/no-confusing-arrow': ['error', { onlyOneSimpleParam: true }],
'@stylistic/no-extra-parens': [
'error',
'all',
{
nestedBinaryExpressions: false,
ternaryOperandBinaryExpressions: false,
ignoreJSX: 'multi-line',
nestedConditionalExpressions: false,
enforceForArrowConditionals: false,
},
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'off',
'@stylistic/no-multiple-empty-lines': [
'error',
{
max: 1,
maxBOF: 0,
maxEOF: 1,
},
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/nonblock-statement-body-position': ['error', 'beside'],
'@stylistic/object-curly-newline': [
'error',
{
ObjectExpression: { minProperties: 2 },
ObjectPattern: { minProperties: 3 },
ImportDeclaration: { minProperties: 4 },
ExportDeclaration: 'always',
TSTypeLiteral: 'always',
TSInterfaceBody: 'always',
},
],
'@stylistic/object-curly-spacing': [
'error',
'always',
{ arraysInObjects: true },
],
'@stylistic/object-property-newline': [
'error',
{
allowAllPropertiesOnSameLine: true,
},
],
'@stylistic/one-var-declaration-per-line': ['error', 'always'],
'@stylistic/operator-linebreak': [
'error',
'after',
{ overrides: {
'?': 'before',
':': 'before',
} },
],
'@stylistic/padded-blocks': ['error', 'never'],
'@stylistic/padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: '*',
next: '*',
},
{
blankLine: 'any',
prev: 'import',
next: 'import',
},
{
blankLine: 'never',
prev: 'singleline-export',
next: 'singleline-export',
},
{
blankLine: 'never',
prev: 'singleline-const',
next: 'singleline-const',
},
{
blankLine: 'never',
prev: 'let',
next: 'let',
},
],
'@stylistic/quote-props': ['error', 'as-needed'],
'@stylistic/quotes': [
'error',
'single',
{ avoidEscape: true },
],
'@stylistic/rest-spread-spacing': 'error',
'@stylistic/semi': 'error',
'@stylistic/semi-spacing': [
'error',
{
before: false,
after: true,
},
],
'@stylistic/semi-style': 'error',
'@stylistic/space-before-blocks': 'error',
'@stylistic/space-before-function-paren': [
'error',
{
anonymous: 'never',
named: 'never',
asyncArrow: 'always',
},
],
'@stylistic/space-in-parens': 'error',
'@stylistic/space-infix-ops': 'error',
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': ['error', 'always'],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/template-curly-spacing': 'error',
'@stylistic/template-tag-spacing': 'error',
'@stylistic/type-annotation-spacing': 'error',
'@stylistic/type-generic-spacing': 'error',
'@stylistic/type-named-tuple-spacing': 'error',
'@stylistic/wrap-iife': ['error', 'inside'],
'@stylistic/wrap-regex': 'error',
'@stylistic/yield-star-spacing': ['error', 'after'],
'newline-destructuring/newline': ['error', { itemsWithRest: 2 }],
},
};
/**
* @type {import('eslint').Linter.Config}
*/
const config = {
plugins: {
'simple-import-sort': simpleImportSort,
'import-newlines': importNewLines,
'unused-imports': unusedImports,
},
settings: { 'import/resolver': {
typescript: {},
node: { extensions: [
'.js',
'.mjs',
'.cjs',
'.jsx',
'.ts',
'.mts',
'.cts',
'.tsx',
] },
} },
};
/**
* @type {import('eslint').Linter.Config}
*/
const defaultConfig$1 = { rules: {
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-debugger': 'error',
'no-alert': 'error',
'no-var': 'error',
'no-duplicate-imports': 'error',
'no-restricted-syntax': 'off',
} };
/**
* @type {import('eslint').Linter.Config}
*/
const typescriptConfig = {
plugins: { '@typescript-eslint': typescript },
files: ['**/*.{js,ts,mjs,mts,cjs,cts,jsx,tsx}'],
rules: {
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-unused-vars': [
'error',
{
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
argsIgnorePattern: '^_',
},
],
'no-unused-vars': [
'error',
{
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
argsIgnorePattern: '^_',
},
],
'no-redeclare': 'error',
},
};
var nestjsRestrictConfig = [defaultConfig$1, typescriptConfig];
const typedConfig = {
languageOptions: {
parser: tsParser,
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: process.cwd(),
sourceType: 'module',
},
},
};
var nestjsNestConfig = [
typedConfig,
config$1,
];
const configMap = {
react: [config$2],
nestjs: [
config$1,
config,
...nestjsRestrictConfig,
...nestjsNestConfig,
],
};
/**
* @type {Array<import('eslint').Linter.Config>}
*/
const defaultConfig = [
{
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: tsParser,
parserOptions: { ecmaFeatures: { jsx: true } },
},
settings: { react: { version: 'detect' } },
},
{ ignores: [
'**/node_modules/**',
'**/dist/**',
'**/build/**',
'**/.next/**',
'**/next-env.d.ts',
] },
config$4,
config$3,
...baseRestrictConfig,
];
function eslintCodeGuideline(extendsConfig) {
if (!extendsConfig) {
return defaultConfig;
}
let configs = [...defaultConfig];
if (extendsConfig) {
const extendItems = Array.isArray(extendsConfig) ? extendsConfig : [extendsConfig];
extendItems.forEach(item => {
configs = [...configs, ...configMap[item]];
});
}
return configs;
}
export { eslintCodeGuideline as default };