This repository has been archived on 2025-10-10. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ESLegant/packages/core/src/index.js
2023-07-20 15:46:13 -03:00

84 lines
2.5 KiB
JavaScript

import { eslintrc } from './eslintrc-compact.js';
import tsESlint from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
import jsdoc from 'eslint-plugin-jsdoc';
import js from '@eslint/js';
import * as configs from './configs/index.js';
import { getTsConfigs } from './tsconfigs.js';
/**
* @param {import('./types').Config} userConfig
* User configuration
* @returns {Promise<import('./types').ESConfig[]>}
* The complete list of configs for ESLint
*/
export async function defineConfig(userConfig) {
userConfig.strict ??= true;
userConfig.rootDir ??= process.cwd();
userConfig.tsconfig ??= await getTsConfigs(userConfig.rootDir);
process.env.READABLE_ESLINT_STRICT = userConfig.strict;
process.env.READABLE_ESLINT_OPTIONS = {
inferrableTypes: userConfig.strict ? 'always' : 'never',
...userConfig.options,
};
const userOverrides = (typeof userConfig.overrides !== 'function'
? userConfig.overrides
: await userConfig.overrides(eslintrc)) ?? [];
return [
{
ignores: [
'**/node_modules',
'**/dist',
'**/fixtures',
'**/pnpm-lock.yaml',
'**/yarn.lock',
'**/package-lock.json',
],
},
js.configs.recommended,
{
files: ['**/*.js', '**/*.cjs', '**/*.mjs', '**/*.ts', '**/*.cts', '**/*.mts'],
plugins: {
'@typescript-eslint': tsESlint,
/**
* @todo
* Fix eslint-plugin-jsdoc type definitions.
* _Typescript should have detected [eslint-plugin-jsdoc.d.ts](./@types/eslint-plugin-jsdoc.d.ts)._
*/
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
'jsdoc': jsdoc,
},
languageOptions: {
sourceType: 'module',
parser: tsParser,
parserOptions: {
project: userConfig.tsconfig,
tsconfigRootDir: userConfig.rootDir,
},
},
// See plugins['jsdoc'] for more info on this error
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
rules: {
...tsESlint.configs.recommended.rules,
...tsESlint.configs['recommended-requiring-type-checking'].rules,
...tsESlint.configs['eslint-recommended'].rules,
...(userConfig.strict ? tsESlint.configs.strict.rules : null),
// See plugins['jsdoc'] for more info on this error
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
...jsdoc.configs['recommended-typescript-flavor-error'].rules,
},
},
configs.common,
configs.formatting,
configs.jsdoc,
configs.typescript,
...configs.environments(userConfig.environment),
...userOverrides,
];
}