Ctrl K
ComunidadGuías…

eslint.config.js

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import globals from 'globals';
import svelte from 'eslint-plugin-svelte';
import svelteParser from 'svelte-eslint-parser';
import ts from 'typescript-eslint';
import svelteConfig from './svelte.config.js';

const practices = {
	curly: ['error', 'all'],
	eqeqeq: ['error', 'always', { null: 'ignore' }],
	'no-var': 'error',
	'prefer-const': 'error',
	'prefer-template': 'error',
	'default-case': 'error',
	'default-case-last': 'error',
	'no-eval': 'error',
	'no-implied-eval': 'error',
	'no-new-func': 'error',
	'no-void': 'error',
	'no-extend-native': 'error',
	'no-throw-literal': 'error',
	'no-new-wrappers': 'error',
	'no-array-constructor': 'error',
	'no-object-constructor': 'error',
	'no-proto': 'error',
	'no-caller': 'error',
	'no-script-url': 'error',
	'no-implicit-globals': 'error',
	'no-useless-concat': 'error',
	'prefer-promise-reject-errors': 'error',
	'prefer-spread': 'error',
	'prefer-rest-params': 'error',
	'prefer-object-spread': 'error',
	'default-param-last': 'error',
	'no-useless-return': 'error',
	'no-useless-catch': 'error',
	'no-lonely-if': 'error',
	'no-else-return': 'error',
	'no-unneeded-ternary': 'error',
	'no-param-reassign': 'error',
	'prefer-exponentiation-operator': 'error',
	'no-duplicate-imports': ['error', { allowSeparateTypeImports: true }],
	'no-empty': ['error', { allowEmptyCatch: true }],
	'no-multi-assign': 'error',
	'init-declarations': ['error', 'always'],
	'max-params': ['error', 3],
	'max-depth': ['error', 4],
	'max-lines-per-function': ['error', { max: 80, skipBlankLines: true, skipComments: true }],
	'prefer-regex-literals': ['error', { disallowRedundantWrapping: true }],
	'no-restricted-syntax': [
		'error',
		{
			selector: "AssignmentExpression[left.type='MemberExpression'][left.property.name='length']",
			message: 'Clear or truncate arrays with splice instead of writing to length.'
		}
	],
	'@typescript-eslint/no-unused-vars': ['error', { args: 'none', caughtErrors: 'none', varsIgnorePattern: '^_', ignoreRestSiblings: true }],
	'@typescript-eslint/no-explicit-any': 'error'
};

const typed = {
	'@typescript-eslint/prefer-destructuring': [
		'error',
		{ VariableDeclarator: { object: true, array: false }, AssignmentExpression: { object: false, array: false } }
	],
	'@typescript-eslint/only-throw-error': 'error',
	'@typescript-eslint/prefer-promise-reject-errors': 'error',
	'@typescript-eslint/naming-convention': [
		'error',
		{
			selector: ['variable', 'parameter'],
			types: ['boolean'],
			format: null,
			leadingUnderscore: 'allow',
			custom: { regex: '^((is|has|are|can|should|did|was|will|does)[A-Z0-9_]|[A-Z][A-Z0-9_]*$)', match: true }
		}
	]
};

const magicNumbers = {
	'@typescript-eslint/no-magic-numbers': [
		'error',
		{
			ignore: [-1, 0, 1, 2],
			ignoreArrayIndexes: true,
			ignoreDefaultValues: true,
			ignoreClassFieldInitialValues: true,
			ignoreEnums: true,
			ignoreNumericLiteralTypes: true,
			ignoreReadonlyClassProperties: true,
			ignoreTypeIndexes: true
		}
	]
};

const numericDataModules = [
	'src/lib/frontend/fx/**/*.ts',
	'src/lib/effects.ts',
	'src/lib/frontend/sfx.ts',
	'src/lib/frontend/components/landing/globe.ts',
	'src/lib/backend/demo/seedDemo.ts'
];

const runes = {
	'prefer-const': 'off',
	'svelte/prefer-const': 'error'
};

export default [
	{ ignores: ['build/', 'bots/', 'otel/', '.svelte-kit/', '.claude/', '.probe/', '.fxprof/', 'graphify-out/', 'static/', 'node_modules/'] },
	{
		files: ['**/*.ts', '**/*.js', '**/*.svelte'],
		plugins: { '@typescript-eslint': ts.plugin, svelte },
		languageOptions: {
			parser: ts.parser,
			ecmaVersion: 'latest',
			sourceType: 'module',
			globals: { ...globals.browser, ...globals.node }
		},
		rules: practices
	},
	{
		files: ['src/lib/frontend/fx/**/*.ts'],
		rules: { 'max-params': 'off', 'max-depth': 'off', 'max-lines-per-function': 'off' }
	},
	{
		files: ['src/**/*.ts', 'src/**/*.svelte', '*.ts'],
		ignores: numericDataModules,
		rules: magicNumbers
	},
	{
		files: ['src/**/*.ts', 'tests/**/*.ts'],
		languageOptions: {
			parserOptions: { projectService: true, tsconfigRootDir: import.meta.dirname }
		},
		rules: typed
	},
	{
		files: ['**/*.svelte'],
		languageOptions: {
			parser: svelteParser,
			parserOptions: { parser: ts.parser, extraFileExtensions: ['.svelte'], svelteConfig }
		},
		rules: runes
	},
	{
		files: ['**/*.svelte.ts'],
		languageOptions: {
			parser: svelteParser,
			parserOptions: { parser: ts.parser, svelteConfig }
		},
		rules: runes
	}
];