@pixi/eslint-config
Version:
ESLint config for PixiJS plugin creators
385 lines (364 loc) • 14.7 kB
JavaScript
import importPlugin from 'eslint-plugin-import';
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import globals from 'globals';
import tseslint from 'typescript-eslint';
import eslint from '@eslint/js';
import stylistic from '@stylistic/eslint-plugin';
export default tseslint.config(
{ ignores: ['dist'] },
eslint.configs.recommended,
tseslint.configs.recommended,
{
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: {
...globals.browser,
...globals.es2023,
...globals.mocha,
...globals.node,
...globals.jest,
...globals.worker,
},
},
plugins: {
'simple-import-sort': simpleImportSort,
import: importPlugin,
},
rules: {
// Possible Errors
'comma-dangle': [1, 'only-multiline'],
'no-cond-assign': [1, 'except-parens'],
'no-console': [1, { allow: ['warn', 'error'] }],
'no-constant-condition': 1,
'no-control-regex': 1,
'no-debugger': 1,
'no-dupe-args': 1,
'no-dupe-keys': 1,
'no-duplicate-case': 0,
'no-empty': 1,
'no-empty-character-class': 1,
'no-ex-assign': 1,
'no-extra-boolean-cast': 1,
'no-extra-parens': 0,
'no-extra-semi': 1,
'no-func-assign': 1,
'no-inner-declarations': 1,
'no-invalid-regexp': 1,
'no-irregular-whitespace': 1,
'no-negated-in-lhs': 1,
'no-obj-calls': 1,
'no-prototype-builtins': 1,
'no-regex-spaces': 1,
'no-sparse-arrays': 1,
'no-unexpected-multiline': 1,
'no-unreachable': 1,
'no-unsafe-finally': 1,
'use-isnan': 1,
'valid-jsdoc': [
0,
{
requireReturn: false,
requireReturnType: true,
requireParamDescription: true,
requireReturnDescription: true,
},
],
'valid-typeof': 1,
// Best Practices
'accessor-pairs': 1,
'array-callback-return': 1,
'block-scoped-var': 1,
complexity: 0,
'consistent-return': 1,
curly: [1, 'multi-line'],
'default-case': 0,
'dot-location': [1, 'property'],
'dot-notation': 1,
eqeqeq: 1,
'guard-for-in': 0,
'no-alert': 1,
'no-caller': 1,
'no-case-declarations': 1,
'no-div-regex': 1,
'no-else-return': 1,
'no-empty-function': 1,
'no-empty-pattern': 1,
'no-eq-null': 1,
'no-eval': 1,
'no-extend-native': 1,
'no-extra-bind': 1,
'no-extra-label': 1,
'no-fallthrough': 1,
'no-floating-decimal': 1,
'no-implicit-coercion': [1, { boolean: false, number: true, string: true, allow: [] }],
'no-implicit-globals': 1,
'no-implied-eval': 1,
'no-invalid-this': 0,
'no-iterator': 1,
'no-labels': 1,
'no-lone-blocks': 1,
'no-loop-func': 1,
'no-magic-numbers': [0],
'no-multi-spaces': [1, { exceptions: {} }],
'no-multi-str': 1,
'no-native-reassign': 1,
'no-new': 1,
'no-new-func': 1,
'no-new-wrappers': 1,
'no-octal': 1,
'no-octal-escape': 1,
'no-param-reassign': 0,
'no-proto': 1,
'no-redeclare': 1,
'no-return-assign': 1,
'no-script-url': 1,
'no-self-assign': 1,
'no-self-compare': 1,
'no-sequences': 1,
'no-throw-literal': 1,
'no-unmodified-loop-condition': 1,
'no-unused-expressions': 0,
'no-unused-labels': 1,
'no-useless-call': 1,
'no-useless-concat': 1,
'no-useless-escape': 0,
'no-void': ['error', { allowAsStatement: true }],
'no-warning-comments': 0,
'no-with': 1,
radix: 1,
'vars-on-top': 0,
'wrap-iife': [1, 'inside'],
yoda: 1,
// Strict Mode
strict: [1, 'global'],
// Variables
'init-declarations': 0,
'no-catch-shadow': 1,
'no-delete-var': 1,
'no-label-var': 1,
'no-restricted-globals': ['error', 'event', 'fdescribe'],
'no-shadow': 0,
'no-shadow-restricted-names': 1,
'no-undef': 1,
'no-undef-init': 1,
'no-undefined': 0,
'no-unused-vars': 0,
'no-use-before-define': [1, 'nofunc'],
// Node.js and CommonJS
'callback-return': 0,
'global-require': 1,
'handle-callback-err': 1,
'no-mixed-requires': 1,
'no-new-require': 1,
'no-path-concat': 1,
'no-process-env': 0,
'no-process-exit': 0,
'no-restricted-modules': 0,
'no-sync': 0,
// Stylistic Issues
'operator-assignment': [1, 'always'],
'array-bracket-spacing': [1, 'never'],
'block-spacing': [1, 'always'],
'brace-style': [1, 'allman', { allowSingleLine: true }],
camelcase: [1, { allow: ['^v\\d{1,}_\\d{1,}_\\d{1,}$'] }],
'comma-spacing': [1, { before: false, after: true }],
'comma-style': [1, 'last'],
'computed-property-spacing': [1, 'never'],
'consistent-this': 0,
'eol-last': [1, 'unix'],
'func-names': [1, 'always'],
'func-style': [1, 'declaration', { allowArrowFunctions: true }],
'id-blacklist': 0,
'id-length': 0,
'id-match': 0,
indent: [1, 4, { SwitchCase: 1, VariableDeclarator: { var: 1, let: 1, const: 1 } }],
'jsx-quotes': [1, 'prefer-double'],
'key-spacing': [1, { beforeColon: false, afterColon: true, mode: 'minimum' }],
'keyword-spacing': [1, { before: true, after: true }],
'linebreak-style': [1, 'unix'],
'lines-around-comment': 0,
'max-depth': [1, 6],
'max-len': [1, { code: 125, tabWidth: 4 }],
'max-lines': 0,
'max-nested-callbacks': [1, { max: 5 }],
'max-params': [1, { max: 10 }],
'max-statements': 0,
'max-statements-per-line': [1, { max: 2 }],
'new-cap': [1, { newIsCap: true, capIsNew: false, properties: false }],
'new-parens': 1,
'newline-after-var': [1, 'always'],
'newline-before-return': 1,
'newline-per-chained-call': [1, { ignoreChainWithDepth: 4 }],
'no-array-constructor': 1,
'no-bitwise': 0,
'no-continue': 0,
'no-inline-comments': 0,
'no-lonely-if': 1,
'no-mixed-operators': 1,
'no-mixed-spaces-and-tabs': 1,
'no-multiple-empty-lines': [1, { max: 1, maxEOF: 1, maxBOF: 0 }],
'no-negated-condition': 0,
'no-nested-ternary': 1,
'no-new-object': 1,
'no-plusplus': 0,
'no-restricted-syntax': [1, 'DebuggerStatement', 'EmptyStatement', 'LabeledStatement', 'WithStatement'],
'no-spaced-func': 1,
'no-ternary': 0,
'no-trailing-spaces': 1,
'no-underscore-dangle': 0,
'no-unneeded-ternary': 1,
'no-whitespace-before-property': 1,
'object-curly-newline': [1, { multiline: true, consistent: true }],
'object-curly-spacing': [1, 'always'],
'object-property-newline': 0,
'one-var': [1, 'never'],
'one-var-declaration-per-line': [1, 'always'],
'operator-linebreak': [1, 'before'],
'padded-blocks': [1, 'never'],
'quote-props': [1, 'as-needed'],
quotes: [1, 'single', { allowTemplateLiterals: true }],
'require-jsdoc': [
0,
{ require: { FunctionDeclaration: false, ClassDeclaration: true, MethodDefinition: true } },
],
semi: [1, 'always'],
'semi-spacing': [1, { before: false, after: true }],
'sort-vars': 0,
'space-before-blocks': [1, 'always'],
'space-before-function-paren': [1, { anonymous: 'always', named: 'never' }],
'space-in-parens': [1, 'never'],
'space-infix-ops': 1,
'space-unary-ops': [1, { words: true, nonwords: false }],
'spaced-comment': [1, 'always', { markers: ['/'] }],
'unicode-bom': [1, 'never'],
'wrap-regex': 1,
// ECMAScript 6
'arrow-body-style': [1, 'as-needed'],
'arrow-parens': 1,
'arrow-spacing': [1, { before: true, after: true }],
'constructor-super': 1,
'generator-star-spacing': [1, { before: true, after: false }],
'no-class-assign': 1,
'no-confusing-arrow': [1, { allowParens: true }],
'no-const-assign': 1,
'no-dupe-class-members': 0,
'no-duplicate-imports': 1,
'no-new-symbol': 1,
'no-restricted-imports': 0,
'no-this-before-super': 1,
'no-useless-computed-key': 1,
'no-useless-constructor': 1,
'no-useless-rename': 1,
'no-var': 1,
'object-shorthand': 1,
'prefer-arrow-callback': 0,
'prefer-const': 1,
'prefer-reflect': 0,
'prefer-rest-params': 0,
'prefer-spread': 0,
'prefer-template': 1,
'require-yield': 1,
'rest-spread-spacing': [1, 'never'],
'sort-imports': 0,
'template-curly-spacing': [1, 'never'],
'yield-star-spacing': [1, 'before'],
'no-async-promise-executor': 0,
// Imports and Exports
'import/first': 1,
'import/newline-after-import': 1,
'import/no-duplicates': 1,
'simple-import-sort/imports': [
1,
{
groups: [
[
'^\\w', // External
'^\\u0000', // External side effect
'^@pixi/', // @pixi/*
'^\\u0000@pixi/', // @pixi/* side effect
'^\\.', // Relative
'^\\u0000\\.', // Relative side effect
'^', // Others
],
[
'^\\w.*\\u0000$', // External types
'^@pixi/.*\\u0000$', // @pixi/* types
'^\\..*\\u0000$', // Relative types
'\\u0000$', // Other types
],
],
},
],
'simple-import-sort/exports': 1,
},
},
{
files: ['**/*.{ts,tsx,mts,cts}'],
plugins: { '@typescript-eslint': tseslint.plugin, '@stylistic': stylistic },
languageOptions: {
parser: tseslint.parser,
sourceType: 'module',
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
'@typescript-eslint/require-await': 0,
'@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/interface-name-prefix': 0,
'@typescript-eslint/consistent-type-imports': [
1,
{ disallowTypeAnnotations: false, fixStyle: 'inline-type-imports' },
],
'@typescript-eslint/no-floating-promises': 'error',
'@stylistic/space-infix-ops': [1, { int32Hint: false }],
'@stylistic/type-annotation-spacing': 1,
'@stylistic/no-extra-semi': 1,
'@stylistic/semi': 1,
'@stylistic/comma-dangle': [1, 'only-multiline'],
'@stylistic/space-before-function-paren': [1, { anonymous: 'always', named: 'never' }],
'@stylistic/quotes': [1, 'single', { allowTemplateLiterals: true }],
'@stylistic/brace-style': [1, 'allman', { allowSingleLine: true }],
'@stylistic/comma-spacing': [1, { before: false, after: true }],
/* ************************ TypeScript ESLint Clashes ************************ */
'@stylistic/indent': [1, 4, { SwitchCase: 1, VariableDeclarator: { var: 1, let: 1, const: 1 } }],
indent: 0,
'no-mixed-operators': 0,
'@stylistic/no-mixed-operators': 0,
'no-undef': 0,
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': 'error',
'no-unused-expressions': 0,
'@typescript-eslint/no-unused-expressions': [1, { allowShortCircuit: true, allowTernary: true }],
'@typescript-eslint/no-use-before-define': [1, 'nofunc'],
'no-use-before-define': 0,
'@typescript-eslint/no-unused-vars': [
'error',
{
args: 'all',
argsIgnorePattern: '^_',
caughtErrors: 'all',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
varsIgnorePattern: '^_',
ignoreRestSiblings: true,
},
],
'no-unused-vars': 0,
'@typescript-eslint/no-array-constructor': 1,
'no-array-constructor': 0,
'@typescript-eslint/no-empty-function': 1,
'no-empty-function': 0,
'no-duplicate-imports': 0,
'@typescript-eslint/no-useless-constructor': 1,
'no-useless-constructor': 0,
/* ************************ TypeScript ESLint Clashes ************************ */
},
},
{
files: ['**/*.js', '**/*.mjs'],
extends: [tseslint.configs.disableTypeChecked],
},
);