diff --git a/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts b/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts index 13169b4d41348..62755d9254f81 100644 --- a/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts +++ b/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts @@ -496,4 +496,70 @@ describe('convert-to-flat-config generator', () => { expect(tree.exists('eslint.config.js')).toBeTruthy(); expect(tree.exists('libs/test-lib/eslint.config.js')).toBeTruthy(); }); + + it('should handle parser options even if parser is extended', async () => { + addProjectConfiguration(tree, 'dx-assets-ui', { + root: 'apps/dx-assets-ui', + targets: {}, + }); + await lintProjectGenerator(tree, { + skipFormat: false, + linter: Linter.EsLint, + + project: 'dx-assets-ui', + setParserOptionsProject: false, + }); + updateJson(tree, 'apps/dx-assets-ui/.eslintrc.json', () => { + return { + extends: ['../../.eslintrc.json'], + ignorePatterns: ['!**/*', '__fixtures__/**/*'], + overrides: [ + { + files: ['*.ts', '*.tsx', '*.js', '*.jsx'], + parserOptions: { + project: ['apps/dx-assets-ui/tsconfig.*?.json'], + }, + rules: {}, + }, + { + files: ['*.ts', '*.tsx'], + rules: {}, + }, + { + files: ['*.js', '*.jsx'], + rules: {}, + }, + ], + }; + }); + + await convertToFlatConfigGenerator(tree, options); + expect(tree.exists('apps/dx-assets-ui/eslint.config.js')).toBeTruthy(); + expect(tree.exists('eslint.config.js')).toBeTruthy(); + expect(tree.read('apps/dx-assets-ui/eslint.config.js', 'utf-8')) + .toMatchInlineSnapshot(` + "const baseConfig = require('../../eslint.config.js'); + + module.exports = [ + ...baseConfig, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: {}, + languageSettings: { + parserOptions: { project: ['apps/dx-assets-ui/tsconfig.*?.json'] }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + rules: {}, + }, + { + files: ['**/*.js', '**/*.jsx'], + rules: {}, + }, + { ignores: ['__fixtures__/**/*'] }, + ]; + " + `); + }); }); diff --git a/packages/eslint/src/generators/utils/flat-config/ast-utils.ts b/packages/eslint/src/generators/utils/flat-config/ast-utils.ts index 34f3cb91273ed..4e779e29a140e 100644 --- a/packages/eslint/src/generators/utils/flat-config/ast-utils.ts +++ b/packages/eslint/src/generators/utils/flat-config/ast-utils.ts @@ -760,9 +760,13 @@ export function generateFlatOverride( !override.plugins && !override.parser ) { + if (override.parserOptions) { + const { parserOptions, ...rest } = override; + return generateAst({ ...rest, languageSettings: { parserOptions } }); + } return generateAst(override); } - const { files, excludedFiles, rules, ...rest } = override; + const { files, excludedFiles, rules, parserOptions, ...rest } = override; const objectLiteralElements: ts.ObjectLiteralElementLike[] = [ ts.factory.createSpreadAssignment(ts.factory.createIdentifier('config')), @@ -770,6 +774,11 @@ export function generateFlatOverride( addTSObjectProperty(objectLiteralElements, 'files', files); addTSObjectProperty(objectLiteralElements, 'excludedFiles', excludedFiles); addTSObjectProperty(objectLiteralElements, 'rules', rules); + if (parserOptions) { + addTSObjectProperty(objectLiteralElements, 'languageSettings', { + parserOptions, + }); + } return ts.factory.createSpreadElement( ts.factory.createCallExpression(