Skip to content

Commit b630d95

Browse files
committed
fix(tailwind): Infinite loop during sanitization
cause by me
1 parent 3bcd5da commit b630d95

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

packages/tailwind/src/utils/css/sanitize-non-inlinable-classes.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,25 @@ export const sanitizeNonInlinableClasses = (root: Root) => {
1717
const sanitizedRules: (Rule | AtRule)[] = [];
1818
const nonInlinableClasses: string[] = [];
1919

20+
const selectorProcessor = selectorParser();
21+
2022
// Process rules within at-rules (like media queries)
2123
root.walkAtRules((atRule) => {
2224
const sanitizedAtRule = atRule.clone();
2325

2426
sanitizedAtRule.walkRules((rule) => {
25-
const processedSelector = selectorParser((selectorRoot) => {
26-
selectorRoot.walkClasses((className) => {
27-
sanitizeSelectorClassName(className);
28-
nonInlinableClasses.push(className.value);
29-
});
30-
}).processSync(rule.selector);
31-
32-
const processedRule = rule.clone({ selector: processedSelector });
27+
const selectorRoot = selectorProcessor.astSync(rule.selector);
28+
selectorRoot.walkClasses((className) => {
29+
nonInlinableClasses.push(className.value);
30+
sanitizeSelectorClassName(className);
31+
});
32+
33+
const processedRule = rule.clone({ selector: selectorRoot.toString() });
3334
processedRule.walkDecls((decl) => {
3435
decl.important = true;
3536
});
3637

37-
sanitizedAtRule.append(processedRule);
38+
rule.replaceWith(processedRule);
3839
});
3940

4041
const equivalentRule = sanitizedRules.find(
@@ -52,23 +53,22 @@ export const sanitizeNonInlinableClasses = (root: Root) => {
5253
root.walkRules((rule) => {
5354
if (rule.parent && rule.parent.type !== 'root') return;
5455

55-
let hasPseudoSelector = false as boolean;
56+
const selectorRoot = selectorProcessor.astSync(rule.selector);
5657

57-
const processedSelector = selectorParser((selectorRoot) => {
58-
selectorRoot.walkPseudos(() => {
59-
hasPseudoSelector = true;
60-
});
58+
let hasPseudoSelector = false as boolean;
59+
selectorRoot.walkPseudos(() => {
60+
hasPseudoSelector = true;
61+
});
6162

62-
if (!hasPseudoSelector) return;
63+
if (!hasPseudoSelector) return;
6364

64-
selectorRoot.walkClasses((className) => {
65-
sanitizeSelectorClassName(className);
66-
nonInlinableClasses.push(className.value);
67-
});
68-
}).processSync(rule.selector);
65+
selectorRoot.walkClasses((className) => {
66+
nonInlinableClasses.push(className.value);
67+
sanitizeSelectorClassName(className);
68+
});
6969

7070
if (hasPseudoSelector) {
71-
const processedRule = rule.clone({ selector: processedSelector });
71+
const processedRule = rule.clone({ selector: selectorRoot.toString() });
7272
processedRule.walkDecls((decl) => {
7373
decl.important = true;
7474
});

0 commit comments

Comments
 (0)