UNPKG

@blake.regalia/eslint-config-elite

Version:

ESLint config enforcing snake-type semantics and opinionated styling

150 lines 4.47 kB
import globals from 'globals'; import eslintjs from '@eslint/js'; import stylistic from '@stylistic/eslint-plugin'; import tseslint, {} from 'typescript-eslint'; import tseslint_parser from '@typescript-eslint/parser'; import * as modules_newline from 'eslint-plugin-modules-newline'; import * as eslint_plugin_import_x from 'eslint-plugin-import-x'; import perfectionist from 'eslint-plugin-perfectionist'; import { off } from './util.js'; import { H_RULES_TSESLINT } from './rules/tseslint.js'; import { H_RULES_STYLISTIC } from './rules/stylistic.js'; import { H_RULES_ESLINT } from './rules/eslint.js'; import { H_RULES_IMPORT_X } from './rules/import-x.js'; const G_APP = { languageOptions: { ecmaVersion: 2024, sourceType: 'module', globals: { ...globals.builtin, ...globals.node, ...globals.browser, chrome: 'readonly', }, parser: tseslint_parser, parserOptions: { tsconfigRootDir: process.cwd(), // extraFileExtensions: ['.svelte'], }, }, plugins: { '@stylistic': stylistic, '@typescript-eslint': tseslint.plugin, 'import-x': eslint_plugin_import_x, }, settings: { 'import-x/extensions': [ '.ts', '.js', '.cjs', '.mjs', '.svelte', ], 'import-x/external-module-folders': [ 'node_modules', 'node_modules/@types', ], 'import-x/parsers': { '@typescript-eslint/parser': [ '.ts', '.svelte', ], }, 'import-x/resolver': { typescript: { alwaysTryTypes: true, extensions: [ '.ts', '.svelte', ], }, }, }, rules: { // superceded by typescript-eslint ...off([ 'object-curly-spacing', 'padding-line-between-statements', 'quotes', 'no-redeclare', 'no-throw-literal', 'no-ex-assign', ]), // ...under({ // 'modules-newline/': { // 'import-declaration-newline': ['warn'], // 'export-declaration-newline': ['warn'], // }, ...H_RULES_IMPORT_X, ...H_RULES_STYLISTIC, ...H_RULES_TSESLINT, }, }; const R_TYPED_PLUGINS = /^@?(typescript-eslint|stylistic|import-x)\//; const A_TYPES_JS = ['**/*.{js,cjs,mjs,jsx}']; const A_TYPES_TS = ['**/*.{ts,mts,cts,tsx,d.ts}']; const ts_files_only = (g_config) => ({ ...g_config, files: A_TYPES_TS, }); const a_export = tseslint.config([ { name: 'eslint-all', rules: { ...eslintjs.configs.recommended.rules, ...H_RULES_ESLINT, }, }, ...tseslint.configs.strictTypeChecked.map(g => ts_files_only(g)), { name: 'tseslint-stylistic-type-checked', files: A_TYPES_TS, rules: tseslint.configs.stylisticTypeChecked.at(-1).rules || {}, }, // eslint_plugin_import_x.flatConfigs.recommended, // eslint_plugin_import_x.flatConfigs.typescript, // for all untyped js { ...tseslint.configs.disableTypeChecked, files: A_TYPES_JS, ignores: [ '**/*.{ts,svelte}' ], }, { name: 'elite-untyped', files: [ ...A_TYPES_JS, ...A_TYPES_TS, ], // default env that applies to all contexts languageOptions: { ecmaVersion: 2022, }, plugins: { 'perfectionist': perfectionist.configs['recommended-natural'], 'modules-newline': modules_newline, }, ignores: [ 'dist/', 'node_modules/', 'submodules/', ], // inherit non-typescript rules from app config rules: Object.fromEntries(Object.entries(G_APP.rules) .filter(([si_rule, w_rule]) => !R_TYPED_PLUGINS.test(si_rule))), }, // strongly typed { ...G_APP, name: 'elite-typescript', files: A_TYPES_TS, ignores: [ '**/*.{js,cjs,mjs}', ], rules: Object.fromEntries(Object.entries(G_APP.rules) .filter(([si_rule, w_rule]) => R_TYPED_PLUGINS.test(si_rule))), }, ]); export default a_export; //# sourceMappingURL=main.js.map