; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.globalifySelector = void 0; | |
/* eslint-disable line-comment-position */ | |
/* | |
* Split a selector string (ex: div > foo ~ .potato) by | |
* separators: space, >, +, ~ and comma (maybe not needed) | |
* We use a negative lookbehind assertion to prevent matching | |
* escaped combinators like `\~`. | |
*/ | |
// TODO: maybe replace this ugly pattern with an actual selector parser? (https://github.com/leaverou/parsel, 2kb) | |
const combinatorPattern = /(?<!\\)(?:\\\\)*([ >+~,]\s*)(?![^[]+\]|\d)/g; | |
function globalifySelector(selector) { | |
const parts = selector.trim().split(combinatorPattern); | |
const newSelector = []; | |
for (let i = 0; i < parts.length; i++) { | |
const part = parts[i]; | |
// if this is a separator or a :global | |
if (i % 2 !== 0 || part === '' || part.startsWith(':global')) { | |
newSelector.push(part); | |
continue; | |
} | |
// :local() with scope | |
if (part.startsWith(':local(')) { | |
newSelector.push(part.replace(/:local\((.+?)\)/g, '$1')); | |
continue; | |
} | |
// :local inlined in a selector | |
if (part.startsWith(':local')) { | |
// + 2 to ignore the :local and space combinator | |
const startIndex = i + 2; | |
let endIndex = parts.findIndex((p, idx) => idx > startIndex && p.startsWith(':global')); | |
endIndex = endIndex === -1 ? parts.length - 1 : endIndex; | |
newSelector.push(...parts.slice(startIndex, endIndex + 1)); | |
i = endIndex; | |
continue; | |
} | |
newSelector.push(`:global(${part})`); | |
} | |
return newSelector.join(''); | |
} | |
exports.globalifySelector = globalifySelector; | |