Error con mi archivo ".eslintrc.js" - "Error de análisis: se ha configurado 'parserOptions.project' para @typescript-eslint/parser."
ESLint parece ser incapaz de analizar un archivo ".eslintrc.js".
Pasos para reproducir: Configuré un nuevo proyecto TypeScript de "hola mundo" de la siguiente manera:
Make a new directory for our new project
mkdir test
Go into the new directory
cd test
Create a "package.json" file
npm init --yes
Install TypeScript
npm install typescript --save-dev
Install ESLint (the linter)
npm install eslint --save-dev
Install the Airbnb ESLint config (the most popular linting config in the world)
npm install eslint-config-airbnb-typescript --save-dev
The import plugin for ESLint is needed for the Airbnb config to work properly with TypeScript
npm install eslint-plugin-import@^2.22.0 --save-dev
The TypeScript plugin for ESLint is needed for the Airbnb config to work properly with TypeScript
npm install @typescript-eslint/eslint-plugin@^4.2.0 --save-dev
Create the config file for TypeScript
touch tsconfig.json
Create the config file for ESLint
touch .eslintrc.js
Create the entry point for our TypeScript application
touch main.ts
Relleno el archivo "tsconfig.json" con lo siguiente (una configuración en blanco/por defecto):
{}
Lleno el archivo ".eslintrc.js" con lo siguiente, según lo especificado en la documentación de Airbnb:
module.exports = {
extends: ['airbnb-typescript/base'],
parserOptions: {
project: './tsconfig.json',
},
};
Lleno el "main.ts" con lo siguiente:
const foo = 'bar';
Luego, cuando ejecuto npx eslint main.ts, genera correctamente el siguiente error:
1:7 error 'foo' is assigned a value but never used @typescript-eslint/no-unused-vars
Por lo tanto, ESLint parece estar funcionando correctamente. Sin embargo, cuando ejecuto npx eslint .eslintrc.js, obtengo el siguiente error:
0:0 error Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config: .eslintrc.js.
The file must be included in at least one of the projects provided
Este error también aparece en VSCode cada vez que abro el archivo ".eslintrc.js". El error necesita ser resuelto para que ESLint pueda analizar el resto del archivo. (Para aclarar, quiero que el archivo ".eslintrc.js" sea analizado de la misma manera que quiero que se analice mi código fuente de TypeScript, por ejemplo, tener una sangría de 2 espacios, etc.)
Información adicional: Estoy en Windows 10 LTSC con Node v14.8.0 y npm versión 6.14.7.
Respuesta #1
Cuando estás usando reglas de eslint impulsadas por typescript (cuando tu configuración de eslint incluye una configuración "parserOptions.project"), eslint lanza un error si intentas revisar un archivo que no esté incluido en el proyecto de typescript.
Esto se debe a razones de rendimiento: solía ser que eslint permitía esto, pero hacerlo causaba una gran pérdida de rendimiento, por lo que lo cambiaron para que lanzara un error en su lugar.
La solución para analizar archivos que no son parte de tu proyecto TS es crear un tsconfig que extienda tu tsconfig "real", pero que incluya todos los archivos que quieres analizar. Esto usualmente se llama tsconfig.eslint.json y se ve así:
// Special typescript project file, used by eslint only.
{
"extends": "./tsconfig.json",
"include": [
// repeated from base config's "include" setting
"src",
"tests",
// these are the eslint-only inclusions
".eslintrc.js",
]
}
Y en tu .eslintrc.js cambiarás project: './tsconfig.json' a project: './tsconfig.eslint.json'.
Esto debería resolver el error y permitir que el archivo .eslintrc.js sea analizado con lint.
Respuesta #2
La respuesta de Retsam funciona perfectamente. Sin embargo, también podrías usar solo @typescript-eslint/parser para los archivos TypeScript usando los overrides de ESLint. Esto evita tener que crear un nuevo tsconfig.json solo para ESLint.
module.exports = {
// Common configuration for .eslintrc.js and TypeScript files
rules: {
eqeqeq: "error",
"no-var": "error",
// ...
},
overrides: [{
files: "**/*.ts"
// TypeScript-only configuration
parser: "@typescript-eslint/parser",
parserOptions: {
project: "tsconfig.json",
tsconfigRootDir: __dirname,
sourceType: "module",
},
plugins: ["@typescript-eslint"],
rules: {
"@typescript-eslint/no-floating-promises": "error",
// ...
}
]},
}
