diff --git a/packages/typescript-eslint/src/config-helper.ts b/packages/typescript-eslint/src/config-helper.ts index 847047f37098..77085838c76a 100644 --- a/packages/typescript-eslint/src/config-helper.ts +++ b/packages/typescript-eslint/src/config-helper.ts @@ -91,16 +91,16 @@ export function config( return config; } - const extension = { - ...(config.files && { files: config.files }), - ...(config.ignores && { ignores: config.ignores }), - }; - return [ - ...extendsArr.map(conf => ({ - ...conf, - ...extension, - })), + ...extendsArr.map(extension => { + const name = [config.name, extension.name].filter(Boolean).join('__'); + return { + ...extension, + ...(config.files && { files: config.files }), + ...(config.ignores && { ignores: config.ignores }), + ...(name && { name }), + }; + }), config, ]; }); diff --git a/packages/typescript-eslint/tests/configs.test.ts b/packages/typescript-eslint/tests/configs.test.ts index 61f4f2a92dc9..63bf079e1b79 100644 --- a/packages/typescript-eslint/tests/configs.test.ts +++ b/packages/typescript-eslint/tests/configs.test.ts @@ -367,4 +367,100 @@ describe('config helper', () => { }, ]); }); + + it('flattens extended configs with config name', () => { + expect( + plugin.config({ + extends: [{ rules: { rule1: 'error' } }, { rules: { rule2: 'error' } }], + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule: 'error' }, + }), + ).toEqual([ + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule1: 'error' }, + }, + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule2: 'error' }, + }, + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule: 'error' }, + }, + ]); + }); + + it('flattens extended configs with names if base config is unnamed', () => { + expect( + plugin.config({ + extends: [ + { name: 'extension-1', rules: { rule1: 'error' } }, + { rules: { rule2: 'error' } }, + ], + files: ['common-file'], + ignores: ['common-ignored'], + rules: { rule: 'error' }, + }), + ).toEqual([ + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'extension-1', + rules: { rule1: 'error' }, + }, + { + files: ['common-file'], + ignores: ['common-ignored'], + rules: { rule2: 'error' }, + }, + { + files: ['common-file'], + ignores: ['common-ignored'], + rules: { rule: 'error' }, + }, + ]); + }); + + it('merges config items names', () => { + expect( + plugin.config({ + extends: [ + { name: 'extension-1', rules: { rule1: 'error' } }, + { rules: { rule2: 'error' } }, + ], + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule: 'error' }, + }), + ).toEqual([ + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config__extension-1', + rules: { rule1: 'error' }, + }, + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule2: 'error' }, + }, + { + files: ['common-file'], + ignores: ['common-ignored'], + name: 'my-config', + rules: { rule: 'error' }, + }, + ]); + }); });