|
1 |
| -import transformMediaList from './transform-media-list'; |
2 |
| -import mediaASTFromString from './media-ast-from-string'; |
| 1 | +import transformMediaList from "./transform-media-list"; |
| 2 | +import mediaASTFromString from "./media-ast-from-string"; |
3 | 3 |
|
4 | 4 | // transform custom pseudo selectors with custom selectors
|
5 |
| -export default (root, customMedia, opts) => { |
6 |
| - root.walkAtRules(mediaAtRuleRegExp, atrule => { |
7 |
| - if (customPseudoRegExp.test(atrule.params)) { |
| 5 | +export default (atrule, { preserve }, { customMedia }) => { |
| 6 | + if (customPseudoRegExp.test(atrule.params)) { |
| 7 | + // prevent infinite loops when using 'preserve' option |
| 8 | + if (!atrule[visitedFlag]) { |
| 9 | + atrule[visitedFlag] = true; |
| 10 | + |
8 | 11 | const mediaAST = mediaASTFromString(atrule.params);
|
9 | 12 | const params = String(transformMediaList(mediaAST, customMedia));
|
10 | 13 |
|
11 |
| - if (opts.preserve) { |
12 |
| - atrule.cloneBefore({ params }); |
13 |
| - } else { |
| 14 | + if (preserve) { |
| 15 | + // keep an original copy |
| 16 | + const node = atrule.cloneAfter(); |
| 17 | + node[visitedFlag] = true; |
| 18 | + } |
| 19 | + // replace the variable with the params from @custom-media rule |
| 20 | + // skip if the variable is undefined |
| 21 | + if (params != null) { |
14 | 22 | atrule.params = params;
|
15 | 23 | }
|
16 | 24 | }
|
17 |
| - }); |
| 25 | + } |
18 | 26 | };
|
19 | 27 |
|
20 |
| -const mediaAtRuleRegExp = /^media$/i; |
| 28 | +const visitedFlag = Symbol("customMediaVisited"); |
21 | 29 | const customPseudoRegExp = /\(--[A-z][\w-]*\)/;
|
0 commit comments