fix(css): at rules improve formatting and tests (#3828)

This commit is contained in:
Evilebot Tnawi authored and GitHub committed 2018-02-02 18:06:47 +03:00
1 parent e591b00005
commit f5e74cd70a
40 files changed
+6016 -89

No files matched your search

+92 -11
View File
@@ -168,10 +168,12 @@ const GLOBAL_SCSS_DIRECTIVE = "!global";
function parseNestedCSS(node) {
if (node && typeof node === "object") {
delete node.parent;
for (const key in node) {
parseNestedCSS(node[key]);
}
if (typeof node.selector === "string") {
if (typeof node.selector === "string" && node.selector.trim().length > 0) {
const selector = node.raws.selector
? node.raws.selector.raw
: node.selector;
@@ -194,11 +196,15 @@ function parseNestedCSS(node) {
value: selector
};
}
return node;
}
if (
node.type &&
node.type !== "css-comment-yaml" &&
typeof node.value === "string"
typeof node.value === "string" &&
node.value.trim().length > 0
) {
try {
if (node.value.endsWith(DEFAULT_SCSS_DIRECTIVE)) {
@@ -218,26 +224,101 @@ function parseNestedCSS(node) {
node.source
);
}
return node;
}
if (node.type === "css-atrule" && typeof node.params === "string") {
if (
node.type === "css-atrule" &&
typeof node.params === "string" &&
node.params.trim().length > 0
) {
if (
node.name === "charset" ||
node.name.toLowerCase() === "counter-style" ||
node.name.toLowerCase().endsWith("keyframes") ||
node.name.toLowerCase() === "page" ||
node.name.toLowerCase() === "font-feature-values"
) {
return node;
}
if (node.name === "warn" || node.name === "error") {
node.params = {
type: "media-unknown",
value: node.params
};
} else {
if (node.params.includes("#{")) {
// Workaround for media at rule with scss interpolation
return {
type: "media-unknown",
value: node.params
};
return node;
}
if (node.name === "extend") {
node.selector = parseSelector(node.params);
delete node.params;
return node;
}
if (node.name === "at-root") {
if (/^\(\s*(without|with)\s*:[\s\S]+\)$/.test(node.params)) {
node.params = parseMediaQuery(node.params);
} else {
node.selector = parseSelector(node.params);
delete node.params;
}
node.params = parseMediaQuery(node.params);
return node;
}
if (
node.name === "if" ||
node.name === "else" ||
node.name === "for" ||
node.name === "each" ||
node.name === "while" ||
node.name === "debug" ||
node.name === "mixin" ||
node.name === "include" ||
node.name === "function" ||
node.name === "return"
) {
// Remove unnecessary spaces in SCSS variable arguments
node.params = node.params.replace(/\s+\.\.\./, "...");
// Remove unnecessary spaces before SCSS control, mixin and function directives
node.params = node.params.replace(/^(\S+)\s+\(/, "$1(");
node.value = parseValue(node.params);
delete node.params;
return node;
}
if (node.params.includes("#{")) {
// Workaround for media at rule with scss interpolation
return {
type: "media-unknown",
value: node.params
};
}
if (/^custom-selector$/i.test(node.name)) {
const customSelector = node.params.match(/:--\S+?\s+/)[0].trim();
node.customSelector = customSelector;
node.selector = parseSelector(
node.params.substring(customSelector.length)
);
delete node.params;
return node;
}
node.params = parseMediaQuery(node.params);
return node;
}
}
return node;
}