jellyfin-web/.eslintrc.js

274 lines
8.7 KiB
JavaScript
Raw Normal View History

2020-08-24 18:12:35 -07:00
const restrictedGlobals = require('confusing-browser-globals');
2020-04-25 05:06:56 -07:00
module.exports = {
root: true,
plugins: [
2020-07-31 01:01:51 -07:00
'@babel',
2021-05-28 09:31:31 -07:00
'react',
2020-04-25 05:06:56 -07:00
'promise',
'import',
2022-09-30 14:57:47 -07:00
'eslint-comments',
'sonarjs'
2020-04-25 05:06:56 -07:00
],
env: {
node: true,
es6: true,
es2017: true,
es2020: true
},
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
ecmaFeatures: {
2021-05-27 08:30:03 -07:00
impliedStrict: true,
jsx: true
2020-04-25 05:06:56 -07:00
}
},
extends: [
'eslint:recommended',
2021-05-28 09:31:31 -07:00
'plugin:react/recommended',
2020-04-25 05:06:56 -07:00
// 'plugin:promise/recommended',
'plugin:import/errors',
'plugin:eslint-comments/recommended',
2022-09-30 14:57:47 -07:00
'plugin:compat/recommended',
'plugin:sonarjs/recommended'
2020-04-25 05:06:56 -07:00
],
rules: {
'array-callback-return': ['error', { 'checkForEach': true }],
2020-05-30 14:15:06 -07:00
'block-spacing': ['error'],
2020-08-01 04:50:37 -07:00
'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
2020-05-30 14:15:06 -07:00
'comma-dangle': ['error', 'never'],
'comma-spacing': ['error'],
'default-case-last': ['error'],
2020-05-30 14:15:06 -07:00
'eol-last': ['error'],
'indent': ['error', 4, { 'SwitchCase': 1 }],
2021-05-28 09:31:31 -07:00
'jsx-quotes': ['error', 'prefer-single'],
2020-05-30 14:15:06 -07:00
'keyword-spacing': ['error'],
2022-08-11 11:43:36 -07:00
'no-throw-literal': ['error'],
2020-05-30 14:15:06 -07:00
'max-statements-per-line': ['error'],
'no-duplicate-imports': ['error'],
2021-11-22 08:36:49 -07:00
'no-empty-function': ['error'],
2020-05-30 14:15:06 -07:00
'no-floating-decimal': ['error'],
'no-multi-spaces': ['error'],
'no-multiple-empty-lines': ['error', { 'max': 1 }],
'no-nested-ternary': ['error'],
2020-08-24 18:12:35 -07:00
'no-restricted-globals': ['error'].concat(restrictedGlobals),
'no-return-assign': ['error'],
2022-08-09 04:51:43 -07:00
'no-return-await': ['error'],
2022-09-30 14:57:47 -07:00
'no-sequences': ['error', { 'allowInParentheses': false }],
2022-12-16 14:02:11 -07:00
'no-shadow': ['error'],
2020-05-30 14:15:06 -07:00
'no-trailing-spaces': ['error'],
2020-07-31 19:07:00 -07:00
'@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }],
'no-useless-constructor': ['error'],
'no-var': ['error'],
2022-04-13 07:33:06 -07:00
'no-void': ['error', { 'allowAsStatement': true }],
'no-warning-comments': ['warn', { 'terms': ['fixme', 'hack', 'xxx'] }],
2020-05-30 14:15:06 -07:00
'one-var': ['error', 'never'],
2020-07-26 23:06:46 -07:00
'padded-blocks': ['error', 'never'],
'prefer-const': ['error', { 'destructuring': 'all' }],
2020-05-30 14:15:06 -07:00
'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
2020-07-31 19:07:00 -07:00
'@babel/semi': ['error'],
2020-05-30 14:15:06 -07:00
'space-before-blocks': ['error'],
2020-07-30 07:05:34 -07:00
'space-infix-ops': 'error',
2022-04-21 10:40:17 -07:00
'yoda': 'error',
2022-09-29 09:50:25 -07:00
2022-09-30 14:57:47 -07:00
'react/jsx-filename-extension': ['error', { 'extensions': ['.jsx', '.tsx'] }],
2022-12-16 14:02:11 -07:00
'react/jsx-no-bind': ['error'],
'react/jsx-no-constructed-context-values': ['error'],
'react/no-array-index-key': ['error'],
2022-09-30 14:57:47 -07:00
2022-12-16 14:02:11 -07:00
'sonarjs/no-inverted-boolean-check': ['error'],
2022-09-30 14:57:47 -07:00
// TODO: Enable the following rules and fix issues
2022-12-16 14:02:11 -07:00
'sonarjs/cognitive-complexity': ['off'],
'sonarjs/no-duplicate-string': ['off']
2020-04-25 05:06:56 -07:00
},
2021-05-28 09:31:31 -07:00
settings: {
react: {
version: 'detect'
},
'import/extensions': [
'.js',
'.ts',
'.jsx',
'.tsx'
],
'import/parsers': {
'@typescript-eslint/parser': [ '.ts', '.tsx' ]
},
polyfills: [
// Native Promises Only
'Promise',
// whatwg-fetch
'fetch',
// document-register-element
'document.registerElement',
// resize-observer-polyfill
'ResizeObserver',
// fast-text-encoding
'TextEncoder',
// intersection-observer
'IntersectionObserver',
// Core-js
'Object.assign',
'Object.is',
'Object.setPrototypeOf',
'Object.toString',
'Object.freeze',
'Object.seal',
'Object.preventExtensions',
'Object.isFrozen',
'Object.isSealed',
'Object.isExtensible',
'Object.getOwnPropertyDescriptor',
'Object.getPrototypeOf',
'Object.keys',
'Object.entries',
'Object.getOwnPropertyNames',
'Function.name',
'Function.hasInstance',
'Array.from',
'Array.arrayOf',
'Array.copyWithin',
'Array.fill',
'Array.find',
'Array.findIndex',
'Array.iterator',
'String.fromCodePoint',
'String.raw',
'String.iterator',
'String.codePointAt',
'String.endsWith',
'String.includes',
'String.repeat',
'String.startsWith',
'String.trim',
'String.anchor',
'String.big',
'String.blink',
'String.bold',
'String.fixed',
'String.fontcolor',
'String.fontsize',
'String.italics',
'String.link',
'String.small',
'String.strike',
'String.sub',
'String.sup',
'RegExp',
'Number',
'Math',
'Date',
'async',
'Symbol',
'Map',
'Set',
'WeakMap',
'WeakSet',
'ArrayBuffer',
'DataView',
'Int8Array',
'Uint8Array',
'Uint8ClampedArray',
'Int16Array',
'Uint16Array',
'Int32Array',
'Uint32Array',
'Float32Array',
'Float64Array',
'Reflect',
// Temporary while eslint-compat-plugin is buggy
'document.querySelector'
]
2021-05-28 09:31:31 -07:00
},
2020-04-25 05:06:56 -07:00
overrides: [
// Config files and development scripts
{
files: [
'./babel.config.js',
'./.eslintrc.js',
'./postcss.config.js',
'./webpack.*.js',
'./scripts/**/*.js'
]
},
// JavaScript source files
2020-04-25 05:06:56 -07:00
{
files: [
'./src/**/*.js',
2022-09-29 09:50:25 -07:00
'./src/**/*.jsx',
'./src/**/*.ts'
2020-04-25 05:06:56 -07:00
],
2020-07-31 01:01:51 -07:00
parser: '@babel/eslint-parser',
2020-04-25 05:06:56 -07:00
env: {
node: false,
amd: true,
browser: true,
es6: true,
es2017: true,
es2020: true
},
globals: {
// Browser globals
'MediaMetadata': 'readonly',
// Tizen globals
'tizen': 'readonly',
'webapis': 'readonly',
// WebOS globals
'webOS': 'readonly',
// Dependency globals
'$': 'readonly',
'jQuery': 'readonly',
// Jellyfin globals
'ApiClient': 'writable',
2021-09-07 16:46:43 -07:00
'Events': 'writable',
2020-04-25 05:06:56 -07:00
'chrome': 'writable',
'DlnaProfilePage': 'writable',
'DashboardPage': 'writable',
'Emby': 'readonly',
'Globalize': 'writable',
'Hls': 'writable',
'LibraryMenu': 'writable',
'LinkParser': 'writable',
'LiveTvHelpers': 'writable',
2021-05-22 04:38:20 -07:00
'Loading': 'writable',
2020-04-25 05:06:56 -07:00
'MetadataEditor': 'writable',
2021-06-11 10:16:11 -07:00
'ServerNotifications': 'writable',
'TaskButton': 'writable',
2020-04-25 05:06:56 -07:00
'UserParentalControlPage': 'writable',
'Windows': 'readonly'
},
rules: {
}
},
// TypeScript source files
{
files: [
'./src/**/*.ts',
'./src/**/*.tsx'
],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:import/typescript',
'plugin:@typescript-eslint/recommended',
'plugin:eslint-comments/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:jsx-a11y/recommended'
],
rules: {
2022-12-16 14:02:11 -07:00
// Use TypeScript equivalent rules when required
'no-shadow': ['off'],
'@typescript-eslint/no-shadow': ['error'],
'no-useless-constructor': ['off'],
2022-12-16 14:02:11 -07:00
'@typescript-eslint/no-useless-constructor': ['error'],
'max-params': ['error', 7],
'sonarjs/cognitive-complexity': ['warn']
}
2020-04-25 05:06:56 -07:00
}
]
2020-06-28 00:38:06 -07:00
};