diff --git a/.changeset/thin-candles-cross.md b/.changeset/thin-candles-cross.md new file mode 100644 index 0000000000..c7c4a8f007 --- /dev/null +++ b/.changeset/thin-candles-cross.md @@ -0,0 +1,5 @@ +--- +"stylelint": patch +--- + +Fix overrides.extends order when including same rules diff --git a/lib/__tests__/applyOverrides.test.js b/lib/__tests__/applyOverrides.test.js index 5a0f35cf98..4283531264 100644 --- a/lib/__tests__/applyOverrides.test.js +++ b/lib/__tests__/applyOverrides.test.js @@ -237,6 +237,30 @@ describe('two matching overrides', () => { expect(applied).toEqual(expectedConfig); }); + + test('with ordered extends', () => { + const config = { + extends: ['stylelint-config1'], + overrides: [ + { + files: ['*.module.css'], + extends: ['stylelint-config2', 'stylelint-config1'], + }, + { + files: ['*.css'], + extends: ['stylelint-config3'], + }, + ], + }; + + const expectedConfig = { + extends: ['stylelint-config2', 'stylelint-config1', 'stylelint-config3'], + }; + + const applied = applyOverrides(config, __dirname, path.join(__dirname, 'style.module.css')); + + expect(applied).toEqual(expectedConfig); + }); }); describe('no matching overrides', () => { diff --git a/lib/augmentConfig.js b/lib/augmentConfig.js index 9960b50ff7..c56fd125e3 100644 --- a/lib/augmentConfig.js +++ b/lib/augmentConfig.js @@ -265,8 +265,13 @@ function mergeConfigs(a, b) { } if (b.extends) { - extendsMerger.extends = [...new Set(extendsMerger.extends.concat(b.extends))]; + extendsMerger.extends = extendsMerger.extends.concat(b.extends); } + + // Remove duplicates from the array, the last item takes precedence + extendsMerger.extends = extendsMerger.extends.filter( + (item, index, arr) => arr.lastIndexOf(item) === index, + ); } const rulesMerger = {};