|
1 |
| -import { complex, replaceable } from './valid-selector.js' |
| 1 | +import { replaceable } from './valid-selector.js' |
2 | 2 |
|
3 | 3 | export default function mergeSelectors(fromSelectors, toSelectors) {
|
4 |
| - return fromSelectors.reduce( |
5 |
| - (selectors, fromSelector) => selectors.concat( |
6 |
| - toSelectors.map( |
7 |
| - (toSelector) => complex.test(toSelector) |
8 |
| - ? toSelector.replace(replaceable, `:is(${fromSelector})`) |
9 |
| - : toSelector.replace(replaceable, fromSelector) |
10 |
| - ) |
11 |
| - ), |
12 |
| - [] |
13 |
| - ) |
| 4 | + return toSelectors.map((toSelector) => { |
| 5 | + let needsIsOnFromSelector = false |
| 6 | + |
| 7 | + if (fromSelectors.length > 1) { |
| 8 | + needsIsOnFromSelector = true |
| 9 | + } |
| 10 | + |
| 11 | + // foo &foo foo & baz -> foo &:is(foo) foo & baz |
| 12 | + toSelector = toSelector.replace(/&((?:[\w-_|])(?:[^\s,{]*))/g, (match, p1) => { |
| 13 | + return `&:is(${p1})` |
| 14 | + }) |
| 15 | + |
| 16 | + // foo& -> foo:is(&) |
| 17 | + if (fromSelectors.length === 1 && /^(?:[\w-_|])/.test(fromSelectors[0])) { |
| 18 | + toSelector = toSelector.replace(/([\w-_|]+)(?:&)/g, (match, p1) => { |
| 19 | + return `${p1}:is(&)` |
| 20 | + }) |
| 21 | + } |
| 22 | + |
| 23 | + return needsIsOnFromSelector |
| 24 | + ? toSelector.replace(replaceable, `:is(${fromSelectors.join(', ')})`) |
| 25 | + : toSelector.replace(replaceable, fromSelectors.join(', ')) |
| 26 | + }) |
14 | 27 | }
|
0 commit comments