Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
for (const compoundSelector of compoundSelectors) {
// Compound selectors with only a single :dir pseudo class should be scoped, the dir pseudo
// class transform will take care of transforming it properly.
const containsSingleDirSelector =
compoundSelector.length === 1 && isDirPseudoClass(compoundSelector[0]);
// Compound selectors containing :host have a special treatment and should not be scoped
// like the rest of the complex selectors.
const containsHost = compoundSelector.some(isHostPseudoClass);
if (!containsSingleDirSelector && !containsHost) {
let nodeToScope: Node | undefined;
// In each compound selector we need to locate the last selector to scope.
for (const node of compoundSelector) {
if (!isPseudoElement(node)) {
nodeToScope = node;
}
}
const shadowAttribute = attribute({
attribute: SHADOW_ATTRIBUTE,
value: undefined,
raws: {},
});
if (nodeToScope) {
// Add the scoping attribute right after the node scope
selector.insertAfter(nodeToScope, shadowAttribute);
} else {
// Add the scoping token in the first position of the compound selector as a fallback
// when there is no node to scope. For example: ::after {}
const current = compoundSelectors[compoundSelectors.length - 1];
current.push(node);
}
});
for (const compoundSelector of compoundSelectors) {
// Compound selectors containing :host have a special treatment and should not be scoped like the rest of the
// complex selectors.
const shouldScopeCompoundSelector = compoundSelector.every(node => !isHostPseudoClass(node));
if (shouldScopeCompoundSelector) {
let nodeToScope: Node | undefined;
// In each compound selector we need to locate the last selector to scope.
for (const node of compoundSelector) {
if (!isPseudoElement(node)) {
nodeToScope = node;
}
}
const shadowAttribute = attribute({
attribute: SHADOW_ATTRIBUTE,
value: undefined,
raws: {},
});
if (nodeToScope) {
// Add the scoping attribute right after the node scope
selector.insertAfter(nodeToScope, shadowAttribute);
} else {
// Add the scoping token in the first position of the compound selector as a fallback
// when there is no node to scope. For example: ::after {}