diff --git a/index.js b/index.js index ac78f48..d58deaa 100644 --- a/index.js +++ b/index.js @@ -8,11 +8,12 @@ module.exports = function resolveNestedSelector(selector, node) { var parentSelectors = (parentIsNestAtRule) ? split(parent.params, ',', false).map((x) => x.trim()) : parent.selectors; + var selectorParts = split(selector, '&', true); var resolvedSelectors = parentSelectors.reduce(function(result, parentSelector) { - if (selector.indexOf('&') !== -1) { + if (selectorParts.length > 1) { var newlyResolvedSelectors = resolveNestedSelector(parentSelector, parent).map(function(resolvedParentSelector) { - return split(selector, '&', true).join(resolvedParentSelector); + return selectorParts.join(resolvedParentSelector); }); return result.concat(newlyResolvedSelectors); } diff --git a/test/api.test.mjs b/test/api.test.mjs index 2a45b89..74c3f54 100644 --- a/test/api.test.mjs +++ b/test/api.test.mjs @@ -2,6 +2,16 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import util from './util.mjs'; +for (const selector of ['[data-label="&"]', String.raw`.\&`, ':is([data-label="&"])']) { + test(`preserves ancestor selectors when ${selector} has only literal ampersands`, async () => { + const code = `.outer { .parent { ${selector} { color: red } } }`; + assert.deepEqual( + await util.resolveChosenSelector(code, selector), + [`.outer .parent ${selector}`], + ); + }); +} + test(async t => { const code = `a { b { top: 0; c { d {}}}}`; assert.deepEqual(