-
-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Description
Environment
Environment Info:
Node version: v18.10.0
npm version: v8.19.2
Local ESLint version: v8.27.0 (Currently used)
Global ESLint version: Not found
Operating System: darwin 21.6.0
What parser are you using?
@typescript-eslint/parser
What did you do?
I used new ESLint configuration file eslint.config.js
with some plugins, and noticed that some plugin rules do not work correctly when used with a non-default parser. For example, the no-default-export
rule in eslint-plugin-import
does not report errors at all only when used with eslint.config.js
and non-default parser such as @typescript-eslint/parser
.
I found that this is because parserOptions
in context object passed to rule creator functions becomes empty in that case. The no-default-export
rule checks parserOptions.sourceType
on rule creation, and skips running if the sourceType
is not module
.
https://github.com/import-js/eslint-plugin-import/blob/48e8130a9f33afd0f9d06635c25d4f1df4d63340/src/rules/no-default-export.js#L15-L18
I created a reproduction repository: https://github.com/ryym/eslint-flat-config-ts-parser-issue
In this repo I created a local ESLint rule that just prints context.parserOptions
and used it in four patterns:
npm run old-config
....eslintrc.js
with default parsernpm run old-config-ts
....eslintrc.js
with@typescript-plugin/parser
parsernpm run new-config
...eslint.config.js
with default parsernpm run new-config-ts
...eslint.config.js
with@typescript-plugin/parser
parser
You can see the output is an empty object only in new-config-ts
.
reproduction flow and output
- clone the repo
npm install
npm run check
% npm run check
> check
> npm run old-config && npm run old-config-ts && npm run new-config && npm run new-config-ts
> old-config
> ESLINT_USE_FLAT_CONFIG=false npx eslint a.js
{
ecmaVersion: 11,
sourceType: 'module',
ecmaFeatures: { globalReturn: false }
}
> old-config-ts
> ESLINT_USE_FLAT_CONFIG=false TS_PARSER=true npx eslint a.js
{
ecmaVersion: 11,
sourceType: 'module',
ecmaFeatures: { globalReturn: false }
}
> new-config
> ESLINT_USE_FLAT_CONFIG=true npx eslint a.js
{ sourceType: 'module' }
> new-config-ts
> ESLINT_USE_FLAT_CONFIG=true TS_PARSER=true npx eslint a.js
{}
I also confirmed that this occurs with @babel/eslint-parser
as well.
What did you expect to happen?
ESLint rules using context.parserOptions
internally work in any combination of config file format and parser.
What actually happened?
As I wrote before, a rule using context.parserOptions
do not work with new flat config eslint.config.js
with non-default parser such-as @typescript-eslint/parser
, @babel-eslint/parser
. This is because parserOptions
becomes an empty object only in that case.
Participation
- I am willing to submit a pull request for this issue.
Additional comments
No response
Metadata
Metadata
Assignees
Labels
Type
Projects
Status