@feathers-community/eslint-config
Version:
Default eslint-config for feathers-community projects. It's esm and flat config only.
155 lines (149 loc) • 3.85 kB
text/typescript
import eslint from '@eslint/js'
import tseslint from 'typescript-eslint'
import type { ConfigArray } from 'typescript-eslint'
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
import eslintPluginImportX from 'eslint-plugin-import-x'
import tsParser from '@typescript-eslint/parser'
import unicorn from 'eslint-plugin-unicorn'
import globals from 'globals'
import unusedImports from 'eslint-plugin-unused-imports'
import { configs as packageJsonConfigs } from 'eslint-plugin-package-json'
import process from 'node:process'
export { ConfigArray }
export type FeathersEslintConfigOptions = {
tsconfig?: {
/**
* @default './tsconfig.json'
*/
path?: string
/**
* @default process.cwd()
*/
rootDir?: string
}
}
export const defaultConfig = (
options?: FeathersEslintConfigOptions,
): ConfigArray => {
const tsconfigPath = options?.tsconfig?.path ?? './tsconfig.json'
const tsconfigRootDir = options?.tsconfig?.rootDir ?? process.cwd()
return tseslint.config(
{
ignores: [
'**/node_modules',
'**/dist',
'**/coverage',
'docs/.vitepress/cache',
'docs/.vitepress/dist',
'**/*.d.ts',
'**/*.cjs',
'**/*.json',
],
},
eslint.configs.recommended,
// eslint-disable-next-line import-x/no-named-as-default-member
tseslint.configs.recommended,
{
rules: {
'no-unused-vars': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/consistent-type-imports': [
'error',
{
prefer: 'type-imports',
fixStyle: 'separate-type-imports',
},
],
},
},
eslintPluginImportX.flatConfigs.recommended,
eslintPluginImportX.flatConfigs.typescript,
{
files: ['**/*.{ts,tsx}'],
ignores: [],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
project: tsconfigPath,
tsconfigRootDir,
},
},
},
{
files: ['**/*.{js,mjs}'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
},
// import-x
{
rules: {
'import-x/no-dynamic-require': 'warn',
'import-x/no-nodejs-modules': 'off',
},
},
// unicorn
{
languageOptions: {
globals: globals.builtin,
},
plugins: {
unicorn,
},
rules: {
'unicorn/consistent-assert': 'warn',
'unicorn/consistent-date-clone': 'warn',
'unicorn/consistent-empty-array-spread': 'warn',
'unicorn/prefer-date-now': 'warn',
'unicorn/prefer-module': 'warn',
'unicorn/prefer-node-protocol': 'warn',
'unicorn/prefer-object-from-entries': 'warn',
'unicorn/prefer-set-size': 'warn',
},
},
// unused-imports
{
plugins: {
'unused-imports': unusedImports,
},
rules: {
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'unused-imports/no-unused-imports': 'error',
'unused-imports/no-unused-vars': [
'warn',
{
vars: 'all',
varsIgnorePattern: '^_',
args: 'after-used',
argsIgnorePattern: '^_',
ignoreRestSiblings: true,
},
],
},
},
// package.json
{
...packageJsonConfigs.recommended,
rules: {
'package-json/require-files': 'error',
},
},
// prettier
eslintPluginPrettierRecommended,
{
rules: {
'prettier/prettier': [
'error',
{
singleQuote: true,
semi: false,
},
],
},
},
)
}