Skip to content

Commit

Permalink
Reduce bundle size of parser-postcss.js (prettier#12204)
Browse files Browse the repository at this point in the history
* Extract utils

* Move `utils.js` to `utils/index.js`
  • Loading branch information
sosukesuzuki committed Jan 31, 2022
1 parent 54df16c commit a0cc4ab
Show file tree
Hide file tree
Showing 12 changed files with 134 additions and 115 deletions.
3 changes: 2 additions & 1 deletion src/language-css/loc.js
@@ -1,7 +1,8 @@
"use strict";

const { skipEverythingButNewLine } = require("../utils/text/skip.js");
const getLast = require("../utils/get-last.js");
const lineColumnToIndex = require("../utils/line-column-to-index.js");
const { getLast, skipEverythingButNewLine } = require("../common/util.js");

function calculateLocStart(node, text) {
// value-* nodes have this
Expand Down
18 changes: 8 additions & 10 deletions src/language-css/parser-postcss.js
Expand Up @@ -4,18 +4,16 @@ const createError = require("../common/parser-create-error.js");
const getLast = require("../utils/get-last.js");
const parseFrontMatter = require("../utils/front-matter/parse.js");
const { hasPragma } = require("./pragma.js");
const {
hasSCSSInterpolation,
hasStringOrFunction,
isLessParser,
isSCSS,
isSCSSNestedPropertyNode,
isSCSSVariable,
stringifyNode,
isModuleRuleName,
} = require("./utils.js");
const { locStart, locEnd } = require("./loc.js");
const { calculateLoc, replaceQuotesInInlineComments } = require("./loc.js");
const hasSCSSInterpolation = require("./utils/has-SCSS-interpolation.js");
const hasStringOrFunction = require("./utils/has-string-or-function.js");
const isLessParser = require("./utils/is-less-parser.js");
const isSCSS = require("./utils/is-scss.js");
const isSCSSNestedPropertyNode = require("./utils/is-SCSS-nested-property-node.js");
const isSCSSVariable = require("./utils/is-SCSS-variable.js");
const stringifyNode = require("./utils/stringify-node.js");
const isModuleRuleName = require("./utils/is-module-rule-name.js");

const getHighestAncestor = (node) => {
while (node.parent) {
Expand Down
6 changes: 3 additions & 3 deletions src/language-css/printer-postcss.js
Expand Up @@ -38,9 +38,7 @@ const {
insideURLFunctionInImportAtRuleNode,
isKeyframeAtRuleKeywords,
isWideKeywords,
isSCSS,
isLastNode,
isLessParser,
isSCSSControlDirectiveNode,
isDetachedRulesetDeclarationNode,
isRelationalOperatorNode,
Expand Down Expand Up @@ -76,8 +74,10 @@ const {
isAtWordPlaceholderNode,
isConfigurationNode,
isParenGroupNode,
} = require("./utils.js");
} = require("./utils/index.js");
const { locStart, locEnd } = require("./loc.js");
const isLessParser = require("./utils/is-less-parser.js");
const isSCSS = require("./utils/is-scss.js");

function shouldPrintComma(options) {
return options.trailingComma === "es5" || options.trailingComma === "all";
Expand Down
22 changes: 22 additions & 0 deletions src/language-css/utils/has-SCSS-interpolation.js
@@ -0,0 +1,22 @@
"use strict";

const isNonEmptyArray = require("../../utils/is-non-empty-array.js");

function hasSCSSInterpolation(groupList) {
if (isNonEmptyArray(groupList)) {
for (let i = groupList.length - 1; i > 0; i--) {
// If we find `#{`, return true.
if (
groupList[i].type === "word" &&
groupList[i].value === "{" &&
groupList[i - 1].type === "word" &&
groupList[i - 1].value.endsWith("#")
) {
return true;
}
}
}
return false;
}

module.exports = hasSCSSInterpolation;
16 changes: 16 additions & 0 deletions src/language-css/utils/has-string-or-function.js
@@ -0,0 +1,16 @@
"use strict";

const isNonEmptyArray = require("../../utils/is-non-empty-array.js");

function hasStringOrFunction(groupList) {
if (isNonEmptyArray(groupList)) {
for (let i = 0; i < groupList.length; i++) {
if (groupList[i].type === "string" || groupList[i].type === "func") {
return true;
}
}
}
return false;
}

module.exports = hasStringOrFunction;
101 changes: 0 additions & 101 deletions src/language-css/utils.js → src/language-css/utils/index.js
@@ -1,6 +1,5 @@
"use strict";

const { isNonEmptyArray } = require("../common/util.js");
const colorAdjusterFunctions = new Set([
"red",
"green",
Expand Down Expand Up @@ -28,7 +27,6 @@ const colorAdjusterFunctions = new Set([
"hwb",
"hwba",
]);
const moduleRuleNames = new Set(["import", "use", "forward"]);

function getAncestorCounter(path, typeOrTypes) {
const types = Array.isArray(typeOrTypes) ? typeOrTypes : [typeOrTypes];
Expand Down Expand Up @@ -60,46 +58,6 @@ function getPropOfDeclNode(path) {
);
}

function hasSCSSInterpolation(groupList) {
if (isNonEmptyArray(groupList)) {
for (let i = groupList.length - 1; i > 0; i--) {
// If we find `#{`, return true.
if (
groupList[i].type === "word" &&
groupList[i].value === "{" &&
groupList[i - 1].type === "word" &&
groupList[i - 1].value.endsWith("#")
) {
return true;
}
}
}
return false;
}

function hasStringOrFunction(groupList) {
if (isNonEmptyArray(groupList)) {
for (let i = 0; i < groupList.length; i++) {
if (groupList[i].type === "string" || groupList[i].type === "func") {
return true;
}
}
}
return false;
}

function isSCSS(parser, text) {
const hasExplicitParserChoice = parser === "less" || parser === "scss";
const IS_POSSIBLY_SCSS = /(?:\w\s*:\s*[^:}]+|#){|@import[^\n]+(?:url|,)/;
return hasExplicitParserChoice
? parser === "scss"
: IS_POSSIBLY_SCSS.test(text);
}

function isSCSSVariable(node) {
return Boolean(node && node.type === "word" && node.value.startsWith("$"));
}

function isWideKeywords(value) {
return ["initial", "inherit", "unset", "revert"].includes(
value.toLowerCase()
Expand Down Expand Up @@ -267,19 +225,6 @@ function isSCSSControlDirectiveNode(node) {
);
}

function isSCSSNestedPropertyNode(node) {
/* istanbul ignore next */
if (!node.selector) {
return false;
}

return node.selector
.replace(/\/\*.*?\*\//, "")
.replace(/\/\/.*\n/, "")
.trim()
.endsWith(":");
}

function isDetachedRulesetCallNode(node) {
return node.raws && node.raws.params && /^\(\s*\)$/.test(node.raws.params);
}
Expand Down Expand Up @@ -434,44 +379,10 @@ function isColorAdjusterFuncNode(node) {
return colorAdjusterFunctions.has(node.value.toLowerCase());
}

// TODO: only check `less` when we don't use `less` to parse `css`
function isLessParser(options) {
return options.parser === "css" || options.parser === "less";
}

function lastLineHasInlineComment(text) {
return /\/\//.test(text.split(/[\n\r]/).pop());
}

function stringifyNode(node) {
if (node.groups) {
const open = node.open && node.open.value ? node.open.value : "";
const groups = node.groups.reduce(
(previousValue, currentValue, index) =>
previousValue +
stringifyNode(currentValue) +
(node.groups[0].type === "comma_group" &&
index !== node.groups.length - 1
? ","
: ""),
""
);
const close = node.close && node.close.value ? node.close.value : "";

return open + groups + close;
}

const before = node.raws && node.raws.before ? node.raws.before : "";
const quote = node.raws && node.raws.quote ? node.raws.quote : "";
const atword = node.type === "atword" ? "@" : "";
const value = node.value ? node.value : "";
const unit = node.unit ? node.unit : "";
const group = node.group ? stringifyNode(node.group) : "";
const after = node.raws && node.raws.after ? node.raws.after : "";

return before + quote + atword + value + quote + unit + group + after;
}

function isAtWordPlaceholderNode(node) {
return (
node &&
Expand All @@ -480,10 +391,6 @@ function isAtWordPlaceholderNode(node) {
);
}

function isModuleRuleName(name) {
return moduleRuleNames.has(name);
}

function isConfigurationNode(node, parentNode) {
if (
!node.open ||
Expand Down Expand Up @@ -522,19 +429,14 @@ module.exports = {
getAncestorCounter,
getAncestorNode,
getPropOfDeclNode,
hasSCSSInterpolation,
hasStringOrFunction,
maybeToLowerCase,
insideValueFunctionNode,
insideICSSRuleNode,
insideAtRuleNode,
insideURLFunctionInImportAtRuleNode,
isKeyframeAtRuleKeywords,
isWideKeywords,
isSCSS,
isSCSSVariable,
isLastNode,
isLessParser,
isSCSSControlDirectiveNode,
isDetachedRulesetDeclarationNode,
isRelationalOperatorNode,
Expand All @@ -552,7 +454,6 @@ module.exports = {
hasComposesNode,
hasParensAroundNode,
hasEmptyRawBefore,
isSCSSNestedPropertyNode,
isDetachedRulesetCallNode,
isTemplatePlaceholderNode,
isTemplatePropNode,
Expand All @@ -570,9 +471,7 @@ module.exports = {
isMediaAndSupportsKeywords,
isColorAdjusterFuncNode,
lastLineHasInlineComment,
stringifyNode,
isAtWordPlaceholderNode,
isModuleRuleName,
isConfigurationNode,
isParenGroupNode,
};
16 changes: 16 additions & 0 deletions src/language-css/utils/is-SCSS-nested-property-node.js
@@ -0,0 +1,16 @@
"use strict";

function isSCSSNestedPropertyNode(node) {
/* istanbul ignore next */
if (!node.selector) {
return false;
}

return node.selector
.replace(/\/\*.*?\*\//, "")
.replace(/\/\/.*\n/, "")
.trim()
.endsWith(":");
}

module.exports = isSCSSNestedPropertyNode;
7 changes: 7 additions & 0 deletions src/language-css/utils/is-SCSS-variable.js
@@ -0,0 +1,7 @@
"use strict";

function isSCSSVariable(node) {
return Boolean(node && node.type === "word" && node.value.startsWith("$"));
}

module.exports = isSCSSVariable;
8 changes: 8 additions & 0 deletions src/language-css/utils/is-less-parser.js
@@ -0,0 +1,8 @@
"use strict";

// TODO: only check `less` when we don't use `less` to parse `css`
function isLessParser(options) {
return options.parser === "css" || options.parser === "less";
}

module.exports = isLessParser;
9 changes: 9 additions & 0 deletions src/language-css/utils/is-module-rule-name.js
@@ -0,0 +1,9 @@
"use strict";

const moduleRuleNames = new Set(["import", "use", "forward"]);

function isModuleRuleName(name) {
return moduleRuleNames.has(name);
}

module.exports = isModuleRuleName;
11 changes: 11 additions & 0 deletions src/language-css/utils/is-scss.js
@@ -0,0 +1,11 @@
"use strict";

function isSCSS(parser, text) {
const hasExplicitParserChoice = parser === "less" || parser === "scss";
const IS_POSSIBLY_SCSS = /(?:\w\s*:\s*[^:}]+|#){|@import[^\n]+(?:url|,)/;
return hasExplicitParserChoice
? parser === "scss"
: IS_POSSIBLY_SCSS.test(text);
}

module.exports = isSCSS;
32 changes: 32 additions & 0 deletions src/language-css/utils/stringify-node.js
@@ -0,0 +1,32 @@
"use strict";

function stringifyNode(node) {
if (node.groups) {
const open = node.open && node.open.value ? node.open.value : "";
const groups = node.groups.reduce(
(previousValue, currentValue, index) =>
previousValue +
stringifyNode(currentValue) +
(node.groups[0].type === "comma_group" &&
index !== node.groups.length - 1
? ","
: ""),
""
);
const close = node.close && node.close.value ? node.close.value : "";

return open + groups + close;
}

const before = node.raws && node.raws.before ? node.raws.before : "";
const quote = node.raws && node.raws.quote ? node.raws.quote : "";
const atword = node.type === "atword" ? "@" : "";
const value = node.value ? node.value : "";
const unit = node.unit ? node.unit : "";
const group = node.group ? stringifyNode(node.group) : "";
const after = node.raws && node.raws.after ? node.raws.after : "";

return before + quote + atword + value + quote + unit + group + after;
}

module.exports = stringifyNode;

0 comments on commit a0cc4ab

Please sign in to comment.