@nitra/eslint-config
Version:
A Eslint shareable config for projects using 'Vue' and 'Node'
256 lines (239 loc) • 7.68 kB
JavaScript
// import sdlPlugin from '@microsoft/eslint-plugin-sdl'
import js from '@eslint/js'
import configPrettier from 'eslint-config-prettier'
import { flatConfigs as importPlugin } from 'eslint-plugin-import'
import jsdocPlugin from 'eslint-plugin-jsdoc'
import markdownPlugin from 'eslint-plugin-markdown'
import nodePlugin from 'eslint-plugin-n'
import oxlint from 'eslint-plugin-oxlint'
import securityPlugin from 'eslint-plugin-security'
import unicornPlugin from 'eslint-plugin-unicorn'
import vuePlugin from 'eslint-plugin-vue'
import eslintYmlPlugin from 'eslint-plugin-yml'
import globals from 'globals'
// import configStandard from 'eslint-config-standard'
// Перевизначаємо версію EcmaScript на останню
const importPluginEcmaLatest = importPlugin.recommended
importPluginEcmaLatest.languageOptions.ecmaVersion = 'latest'
const all = [
{
// До дефолтних "**/node_modules/", ".git/" додаємо
ignores: ['.yarn/**', '**/dist/**']
},
// Загальні правила для всіх Yaml файлів проекту
...eslintYmlPlugin.configs['flat/prettier'],
// Загальні правила для всіх MD файлів проекту
// @ts-ignore
...markdownPlugin.configs.recommended,
// Плагін eslint-plugin-import
importPluginEcmaLatest,
{
rules: {
'import/no-unresolved': 'off', // не працює з monorepo та #alias
'import/newline-after-import': ['error', { count: 1 }],
// 'import/order': ['error', { warnOnUnassignedImports: true }],
'import/no-useless-path-segments': ['error', { noUselessIndex: false }]
}
},
// Загальні правила для всіх js файлів проекту
jsdocPlugin.configs['flat/recommended'],
configPrettier,
{
files: ['**/*.js'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
rules: {
...js.configs.recommended.rules,
'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }]
}
},
// Unicorn правила
unicornPlugin.configs['flat/recommended'],
{
rules: {
'unicorn/filename-case': 'off',
'unicorn/no-null': 'off',
'unicorn/prefer-string-slice': 'off',
'unicorn/prevent-abbreviations': 'off',
'unicorn/no-anonymous-default-export': 'off',
'unicorn/prefer-ternary': 'off',
'unicorn/no-array-push-push': 'off',
'unicorn/explicit-length-check': 'off',
'unicorn/prefer-number-properties': 'off',
'unicorn/no-object-as-default-parameter': 'off',
'unicorn/prefer-top-level-await': 'off',
'unicorn/no-nested-ternary': 'off',
'unicorn/prefer-math-min-max': 'off',
'unicorn/numeric-separators-style': [
'error',
{ onlyIfContainsSeparator: true, binary: { onlyIfContainsSeparator: false } }
]
}
}
]
// Тільки для node js проектів
const node = [
nodePlugin.configs['flat/recommended-module'],
securityPlugin.configs.recommended,
// { plugins: { '@microsoft/eslint-plugin-sdl': sdlPlugin } },
{
rules: {
'n/no-missing-import': 'off', // покривається oxlint https://github.com/oxc-project/oxc/issues/481#issuecomment-3135766557
'security/detect-non-literal-fs-filename': 'off',
'security/detect-object-injection': 'off'
},
languageOptions: {
globals: {
...globals.node
}
}
}
]
// Тільки для Vue проектів
// files: ['**/vite.config.js']
const vueVite = [
{
languageOptions: {
globals: {
process: 'readonly'
}
}
}
]
// Для усіх файлів Vue проектів
// files: ['**/*.js', '**/*.vue']
const vueAllVite = [
{
languageOptions: {
globals: {
...globals.browser,
Intl: 'readonly',
createLogger: 'readonly',
gql: 'readonly',
$ref: 'readonly',
$computed: 'readonly',
ref: 'readonly',
useQuery: 'readonly',
watch: 'readonly',
computed: 'readonly'
}
}
}
]
// Для Vue файлів Vue проектів
// files: ['**/*.vue']
const vue = [
...vuePlugin.configs['flat/recommended'],
{
rules: {
'vue/no-v-html': 'off',
'vue/html-indent': 'off',
'vue/max-attributes-per-line': 'off',
'vue/html-closing-bracket-newline': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/multi-word-component-names': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always' // під преттієр https://github.com/prettier/prettier/issues/5641
}
}
],
// Нітра порядок сортування
'vue/attributes-order': [
'error',
{
order: [
'DEFINITION',
'LIST_RENDERING',
'CONDITIONALS',
'RENDER_MODIFIERS',
'GLOBAL',
['UNIQUE', 'SLOT'],
'TWO_WAY_BINDING',
'OTHER_DIRECTIVES',
'EVENTS',
'OTHER_ATTR',
'CONTENT'
],
alphabetical: false
}
]
}
}
]
const vue2 = [
{
rules: {
'vue/no-deprecated-v-bind-sync': 'off'
}
}
]
/**
* Eslint правила
* @param {{node?: Array, vue?: Array, vue2?: Array}} params список директорій до яких примінити Eslint правили
* @returns {Array} конфігурації eslint
*/
// oxlint-disable-next-line unicorn/no-object-as-default-parameter
export function getConfig(params = { node: [], vue: [], vue2: [] }) {
const result = all
// якщо присутні nodejs проекти в monorepo
if (params.node?.length) {
const files = params.node.map(name => `${name}/**/*.js`)
const nodeConfig = node.map(configObject => ({
files,
...configObject
}))
result.push(...nodeConfig)
}
// Правила для Vue3
if (params.vue?.length) {
// по певним файлам правили
const filesVite = params.vue.map(name => `${name}/**/vite.config.js`)
const vueViteConfig = vueVite.map(configObject => ({
files: filesVite,
...configObject
}))
// @ts-ignore
result.push(...vueViteConfig)
// Для Vue файлів правила
const files = params.vue.map(name => `${name}/**/*.vue`)
const vueConfig = [...vueAllVite, ...vue].map(configObject => ({
files,
...configObject
}))
result.push(...vueConfig)
// Для js файлів всередині Vue проектів правила
const filesJS = params.vue.map(name => `${name}/**/*.js`)
const vueJSConfig = vueAllVite.map(configObject => ({
files: filesJS,
...configObject
}))
// @ts-ignore
result.push(...vueJSConfig)
}
// Правила для Vue2
if (params.vue2?.length) {
// по певним файлам правили
// Для Vue файлів правила
const files = params.vue2.map(name => `${name}/**/*.vue`)
const vueConfig = [...vueAllVite, ...vue, ...vue2].map(configObject => ({
files,
...configObject
}))
result.push(...vueConfig)
// Для js файлів всередині Vue проектів правила
const filesJS = params.vue2.map(name => `${name}/**/*.js`)
const vueJSConfig = vueAllVite.map(configObject => ({
files: filesJS,
...configObject
}))
// @ts-ignore
result.push(...vueJSConfig)
}
result.push(...oxlint.configs['flat/recommended'])
return result
}