UNPKG

@nitra/eslint-config

Version:

A Eslint shareable config for projects using 'Vue' and 'Node'

256 lines (239 loc) 7.68 kB
// 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 }