From bba719283d484f27659e2a69ff214cf287f15ab7 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Wed, 27 Jan 2021 20:36:02 +0800 Subject: [PATCH] JS: Simplify `clean` function (#10154) --- src/language-js/clean.js | 67 +++++++++++++--------------------------- 1 file changed, 22 insertions(+), 45 deletions(-) diff --git a/src/language-js/clean.js b/src/language-js/clean.js index 8da157caf..c96987da8 100644 --- a/src/language-js/clean.js +++ b/src/language-js/clean.js @@ -18,6 +18,12 @@ const ignoredProperties = new Set([ "tokens", ]); +const removeTemplateElementsValue = (node) => { + for (const templateElement of node.quasis) { + delete templateElement.value; + } +}; + function clean(ast, newObj, parent) { if (ast.type === "Program") { delete newObj.sourceType; @@ -94,21 +100,13 @@ function clean(ast, newObj, parent) { ast.openingElement.name.name === "style" && ast.openingElement.attributes.some((attr) => attr.name.name === "jsx") ) { - const templateLiterals = newObj.children - .filter( - (child) => - child.type === "JSXExpressionContainer" && - child.expression.type === "TemplateLiteral" - ) - .map((container) => container.expression); - - const quasis = templateLiterals.reduce( - (quasis, templateLiteral) => [...quasis, ...templateLiteral.quasis], - [] - ); - - for (const q of quasis) { - delete q.value; + for (const { type, expression } of newObj.children) { + if ( + type === "JSXExpressionContainer" && + expression.type === "TemplateLiteral" + ) { + removeTemplateElementsValue(expression); + } } } @@ -119,9 +117,7 @@ function clean(ast, newObj, parent) { ast.value.type === "JSXExpressionContainer" && ast.value.expression.type === "TemplateLiteral" ) { - for (const q of newObj.value.expression.quasis) { - delete q.value; - } + removeTemplateElementsValue(newObj.value.expression); } // We change quotes @@ -147,26 +143,18 @@ function clean(ast, newObj, parent) { index, prop, ] of newObj.expression.arguments[0].properties.entries()) { - let templateLiteral = null; - switch (astProps[index].key.name) { case "styles": if (prop.value.type === "ArrayExpression") { - templateLiteral = prop.value.elements[0]; + removeTemplateElementsValue(prop.value.elements[0]); } break; case "template": if (prop.value.type === "TemplateLiteral") { - templateLiteral = prop.value; + removeTemplateElementsValue(prop.value); } break; } - - if (templateLiteral) { - for (const q of templateLiteral.quasis) { - delete q.value; - } - } } } @@ -183,9 +171,7 @@ function clean(ast, newObj, parent) { ast.tag.name === "html")) || ast.tag.type === "CallExpression") ) { - for (const quasi of newObj.quasi.quasis) { - delete quasi.value; - } + removeTemplateElementsValue(newObj.quasi); } if (ast.type === "TemplateLiteral") { // This checks for a leading comment that is exactly `/* GraphQL */` @@ -204,21 +190,12 @@ function clean(ast, newObj, parent) { ); if ( hasLanguageComment || - (parent.type === "CallExpression" && parent.callee.name === "graphql") + (parent.type === "CallExpression" && parent.callee.name === "graphql") || + // TODO: check parser + // `flow` and `typescript` don't have `leadingComments` + !ast.leadingComments ) { - for (const quasi of newObj.quasis) { - delete quasi.value; - } - } - - // TODO: check parser - // `flow` and `typescript` don't have `leadingComments` - if (!ast.leadingComments) { - for (const quasi of newObj.quasis) { - if (quasi.value) { - delete quasi.value.cooked; - } - } + removeTemplateElementsValue(newObj); } }