FreeTube/eslint.config.mjs

235 lines
5.3 KiB
JavaScript
Raw Normal View History

import eslintPluginVue from 'eslint-plugin-vue'
import vuejsAccessibility from 'eslint-plugin-vuejs-accessibility'
import eslintPluginUnicorn from 'eslint-plugin-unicorn'
import eslintConfigPrettier from 'eslint-config-prettier'
import intlifyVueI18N from '@intlify/eslint-plugin-vue-i18n'
import globals from 'globals'
import vueEslintParser from 'vue-eslint-parser'
import js from '@eslint/js'
import { FlatCompat } from '@eslint/eslintrc'
import { fixupConfigRules } from '@eslint/compat'
import jsoncEslintParser from 'jsonc-eslint-parser'
import eslintPluginJsonc from 'eslint-plugin-jsonc'
import eslintPluginYml from 'eslint-plugin-yml'
import yamlEslintParser from 'yaml-eslint-parser'
import activeLocales from './static/locales/activeLocales.json' with { type: 'json' }
const compat = new FlatCompat({
baseDirectory: import.meta.dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
})
export default [
{
ignores: [
'dist/',
'eslint.config.mjs'
]
},
...fixupConfigRules(
compat.config({
extends: ['standard']
})
),
js.configs.recommended,
eslintConfigPrettier,
...eslintPluginVue.configs['flat/vue2-recommended'],
...vuejsAccessibility.configs["flat/recommended"],
...intlifyVueI18N.configs['flat/recommended'],
{
files: [
'**/*.{js,vue}',
],
ignores: [
'_scripts/',
],
plugins: {
unicorn: eslintPluginUnicorn,
},
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
parser: vueEslintParser,
ecmaVersion: 2022,
sourceType: 'module',
},
settings: {
'vue-i18n': {
localeDir: `./static/locales/{${activeLocales.join(',')}}.yaml`,
messageSyntaxVersion: '^8.0.0',
},
},
rules: {
'space-before-function-paren': 'off',
'comma-dangle': ['error', 'only-multiline'],
'vue/no-v-html': 'off',
'no-console': ['error', {
allow: ['warn', 'error'],
}],
'no-unused-vars': 'warn',
'no-undef': 'warn',
'object-shorthand': 'off',
'vue/no-template-key': 'warn',
'vue/multi-word-component-names': 'off',
'vuejs-accessibility/no-onchange': 'off',
'vuejs-accessibility/label-has-for': ['error', {
required: {
some: ['nesting', 'id'],
},
}],
'vuejs-accessibility/no-static-element-interactions': 'off',
'n/no-callback-literal': 'warn',
'n/no-path-concat': 'warn',
'unicorn/better-regex': 'error',
'unicorn/no-array-push-push': 'error',
'unicorn/prefer-keyboard-event-key': 'error',
'unicorn/prefer-regexp-test': 'error',
'unicorn/prefer-string-replace-all': 'error',
'@intlify/vue-i18n/no-dynamic-keys': 'error',
'@intlify/vue-i18n/no-duplicate-keys-in-locale': 'error',
'@intlify/vue-i18n/no-raw-text': ['error', {
attributes: {
'/.+/': [
'title',
'aria-label',
'aria-placeholder',
'aria-roledescription',
'aria-valuetext',
'tooltip',
'message',
],
input: ['placeholder', 'value'],
img: ['alt'],
},
ignoreText: ['-', '•', '/', 'YouTube', 'Invidious', 'FreeTube'],
}],
'@intlify/vue-i18n/no-deprecated-tc': 'off',
'vue/require-explicit-emits': 'error',
'vue/no-unused-emit-declarations': 'error',
},
},
...eslintPluginJsonc.configs['flat/base'],
{
files: ['**/*.json'],
ignores: [
'_scripts/',
],
languageOptions: {
parser: jsoncEslintParser,
},
rules: {
'no-tabs': 'off',
'comma-spacing': 'off',
'no-irregular-whitespace': 'off',
},
settings: {
'vue-i18n': {
localeDir: `./static/locales/{${activeLocales.join(',')}}.yaml`,
messageSyntaxVersion: '^8.0.0',
},
},
},
...eslintPluginYml.configs['flat/recommended'],
{
files: ['**/*.{yml,yaml}'],
ignores: [
'.github/',
'_scripts/'
],
languageOptions: {
parser: yamlEslintParser,
},
rules: {
'yml/no-irregular-whitespace': 'off',
},
settings: {
'vue-i18n': {
localeDir: `./static/locales/{${activeLocales.join(',')}}.yaml`,
messageSyntaxVersion: '^8.0.0',
},
},
},
{
files: ['.github/**/*.{yml,yaml}'],
languageOptions: {
parser: yamlEslintParser,
},
rules: {
'yml/no-empty-mapping-value': 'off',
'yml/no-irregular-whitespace': 'off',
},
settings: {
'vue-i18n': {
localeDir: `./static/locales/{${activeLocales.join(',')}}.yaml`,
messageSyntaxVersion: '^8.0.0',
},
},
},
{
files: ['_scripts/*.js'],
languageOptions: {
globals: {
...globals.node
},
ecmaVersion: 'latest',
},
plugins: {
unicorn: eslintPluginUnicorn,
},
rules: {
'no-console': 'off',
'n/no-path-concat': 'off',
'unicorn/better-regex': 'error',
}
},
{
files: ['_scripts/*.mjs'],
languageOptions: {
globals: {
...globals.node,
},
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: {
unicorn: eslintPluginUnicorn,
},
rules: {
'no-console': 'off',
'n/no-path-concat': 'off',
'unicorn/better-regex': 'error',
}
}
]