@bfra.me/eslint-config
Version:
Shared ESLint configuration for bfra.me
81 lines (74 loc) • 2.76 kB
text/typescript
import type {Config} from '../config'
import type {Flatten, OptionsOverrides, StylisticConfig} from '../options'
import {interopDefault} from '../utils'
export const StylisticConfigDefaults = {
indent: 2,
jsx: true,
quotes: 'single',
semi: false,
} as const
/**
* Configuration options for stylistic ESLint rules.
*
* Extends the base stylistic configuration with additional override options,
* providing a flattened interface for configuring code style and formatting rules.
*/
export interface StylisticOptions extends Flatten<StylisticConfig & OptionsOverrides> {}
/**
* Creates a stylistic ESLint configuration with customizable formatting rules.
*
* @param options - Configuration options for stylistic rules
* @param options.indent - Indentation style (spaces or tabs)
* @param options.jsx - Whether to enable JSX-specific rules
* @param options.overrides - Additional rule overrides to apply
* @param options.quotes - Quote style preference (single, double, or backtick)
* @param options.semi - Semicolon usage preference
* @returns Promise that resolves to an array of ESLint configuration objects
*
* @example
* ```typescript
* const config = await stylistic({
* indent: 2,
* quotes: 'single',
* semi: false
* });
* ```
*/
export async function stylistic(options: StylisticOptions = {}): Promise<Config[]> {
const {indent, jsx, overrides = {}, quotes, semi} = {...StylisticConfigDefaults, ...options}
const pluginStylistic = await interopDefault(import('@stylistic/eslint-plugin'))
const config = pluginStylistic.configs.customize({indent, jsx, quotes, semi})
return [
{
name: '@bfra.me/stylistic',
plugins: {'@stylistic': pluginStylistic},
rules: {
...config.rules,
'@stylistic/arrow-parens': ['error', 'as-needed'],
'@stylistic/brace-style': ['error', '1tbs', {allowSingleLine: true}],
'@stylistic/generator-star-spacing': ['error', {after: true, before: false}],
'@stylistic/member-delimiter-style': [
'error',
{
multiline: {delimiter: 'none', requireLast: false},
singleline: {delimiter: 'semi', requireLast: false},
},
],
'@stylistic/object-curly-spacing': ['error', 'never'],
'@stylistic/operator-linebreak': [
'error',
'after',
{overrides: {':': 'before', '?': 'before', '|': 'before'}},
],
'@stylistic/quote-props': ['error', 'as-needed'],
'@stylistic/quotes': [
'error',
quotes,
{allowTemplateLiterals: 'always', avoidEscape: true},
],
'@stylistic/yield-star-spacing': ['error', {after: true, before: false}],
...overrides,
},
},
]
}