From 59d5bf9f6b5b3e004f95a1f38e6d9715ead1dfb0 Mon Sep 17 00:00:00 2001 From: Fedya Petrakov Date: Tue, 4 Jul 2023 09:59:34 +0300 Subject: [PATCH] Add support JS objects for extends config option (#6998) Co-authored-by: Masafumi Koba <473530+ybiquitous@users.noreply.github.com> --- .changeset/gorgeous-cobras-beam.md | 5 +++++ lib/__tests__/extends.test.mjs | 14 ++++++++++++++ lib/__tests__/fixtures/config-block-no-empty.mjs | 5 +++++ .../fixtures/config-extending-with-object.mjs | 5 +++++ lib/augmentConfig.js | 8 +++++++- 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 .changeset/gorgeous-cobras-beam.md create mode 100644 lib/__tests__/fixtures/config-block-no-empty.mjs create mode 100644 lib/__tests__/fixtures/config-extending-with-object.mjs diff --git a/.changeset/gorgeous-cobras-beam.md b/.changeset/gorgeous-cobras-beam.md new file mode 100644 index 0000000000..6f7bd89a38 --- /dev/null +++ b/.changeset/gorgeous-cobras-beam.md @@ -0,0 +1,5 @@ +--- +"stylelint": minor +--- + +Added: support for JS objects with `extends` config option diff --git a/lib/__tests__/extends.test.mjs b/lib/__tests__/extends.test.mjs index f457453dd4..8a57823769 100644 --- a/lib/__tests__/extends.test.mjs +++ b/lib/__tests__/extends.test.mjs @@ -1,5 +1,6 @@ import { fileURLToPath } from 'node:url'; +import configExtendingWithObject from './fixtures/config-extending-with-object.mjs'; import readJSONFile from '../testUtils/readJSONFile.mjs'; import safeChdir from '../testUtils/safeChdir.mjs'; import standalone from '../standalone.js'; @@ -29,6 +30,19 @@ it('basic extending', async () => { expect(linted.results[0].warnings[0].rule).toBe('block-no-empty'); }); +it('basic extending with object', async () => { + const linted = await standalone({ + code: 'a {}', + config: configExtendingWithObject, + configBasedir: fixturesPath, + }); + + expect(typeof linted.output).toBe('string'); + expect(linted.results).toHaveLength(1); + expect(linted.results[0].warnings).toHaveLength(1); + expect(linted.results[0].warnings[0].rule).toBe('block-no-empty'); +}); + it('recursive extending', async () => { const linted = await standalone({ code: 'a {}', diff --git a/lib/__tests__/fixtures/config-block-no-empty.mjs b/lib/__tests__/fixtures/config-block-no-empty.mjs new file mode 100644 index 0000000000..3df71a824f --- /dev/null +++ b/lib/__tests__/fixtures/config-block-no-empty.mjs @@ -0,0 +1,5 @@ +export default { + rules: { + 'block-no-empty': true, + }, +}; diff --git a/lib/__tests__/fixtures/config-extending-with-object.mjs b/lib/__tests__/fixtures/config-extending-with-object.mjs new file mode 100644 index 0000000000..a365358b8b --- /dev/null +++ b/lib/__tests__/fixtures/config-extending-with-object.mjs @@ -0,0 +1,5 @@ +import configBlockNoEmpty from './config-block-no-empty.mjs'; + +export default { + extends: configBlockNoEmpty, +}; diff --git a/lib/augmentConfig.js b/lib/augmentConfig.js index 0bed3118cd..9e87635d6c 100644 --- a/lib/augmentConfig.js +++ b/lib/augmentConfig.js @@ -178,7 +178,13 @@ async function extendConfig(stylelint, config, configDir, rootConfigDir, filePat let resultConfig = originalWithoutExtends; for (const extendLookup of normalizedExtends) { - const extendResult = await loadExtendedConfig(stylelint, configDir, extendLookup); + let extendResult; + + if (typeof extendLookup === 'string') { + extendResult = await loadExtendedConfig(stylelint, configDir, extendLookup); + } else if (typeof extendLookup === 'object' && extendLookup !== null) { + extendResult = { config: extendLookup }; + } if (extendResult) { let extendResultConfig = extendResult.config;