From 9df98e65f842cf3acae09cbdd969966f42d64469 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sat, 14 Oct 2017 18:40:54 +0200 Subject: update dependencies --- node_modules/webpack/lib/Parser.js | 99 +++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 34 deletions(-) (limited to 'node_modules/webpack/lib/Parser.js') diff --git a/node_modules/webpack/lib/Parser.js b/node_modules/webpack/lib/Parser.js index 88f9b65db..3150f847a 100644 --- a/node_modules/webpack/lib/Parser.js +++ b/node_modules/webpack/lib/Parser.js @@ -321,45 +321,76 @@ class Parser extends Tapable { } return new BasicEvaluatedExpression().setString(result).setRange(expr.range); }); + }); - /** - * @param {string} kind "cooked" | "raw" - * @param {any[]} quasis quasis - * @param {any[]} expressions expressions - * @return {BasicEvaluatedExpression[]} Simplified template - */ - function getSimplifiedTemplateResult(kind, quasis, expressions) { - const parts = []; - - for(let i = 0; i < quasis.length; i++) { - parts.push(new BasicEvaluatedExpression().setString(quasis[i].value[kind]).setRange(quasis[i].range)); - - if(i > 0) { - const prevExpr = parts[parts.length - 2], - lastExpr = parts[parts.length - 1]; - const expr = this.evaluateExpression(expressions[i - 1]); - if(!(expr.isString() || expr.isNumber())) continue; - - prevExpr.setString(prevExpr.string + (expr.isString() ? expr.string : expr.number) + lastExpr.string); - prevExpr.setRange([prevExpr.range[0], lastExpr.range[1]]); - parts.pop(); - } + /** + * @param {string} kind "cooked" | "raw" + * @param {any[]} quasis quasis + * @param {any[]} expressions expressions + * @return {BasicEvaluatedExpression[]} Simplified template + */ + function getSimplifiedTemplateResult(kind, quasis, expressions) { + const parts = []; + + for(let i = 0; i < quasis.length; i++) { + parts.push(new BasicEvaluatedExpression().setString(quasis[i].value[kind]).setRange(quasis[i].range)); + + if(i > 0) { + const prevExpr = parts[parts.length - 2], + lastExpr = parts[parts.length - 1]; + const expr = this.evaluateExpression(expressions[i - 1]); + if(!(expr.isString() || expr.isNumber())) continue; + + prevExpr.setString(prevExpr.string + (expr.isString() ? expr.string : expr.number) + lastExpr.string); + prevExpr.setRange([prevExpr.range[0], lastExpr.range[1]]); + parts.pop(); } - return parts; } + return parts; + } - this.plugin("evaluate TemplateLiteral", function(node) { - const parts = getSimplifiedTemplateResult.call(this, "cooked", node.quasis, node.expressions); - if(parts.length === 1) { - return parts[0].setRange(node.range); + this.plugin("evaluate TemplateLiteral", function(node) { + const parts = getSimplifiedTemplateResult.call(this, "cooked", node.quasis, node.expressions); + if(parts.length === 1) { + return parts[0].setRange(node.range); + } + return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range); + }); + this.plugin("evaluate TaggedTemplateExpression", function(node) { + if(this.evaluateExpression(node.tag).identifier !== "String.raw") return; + const parts = getSimplifiedTemplateResult.call(this, "raw", node.quasi.quasis, node.quasi.expressions); + return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range); + }); + + this.plugin("evaluate CallExpression .concat", function(expr, param) { + if(!param.isString() && !param.isWrapped()) return; + + let stringSuffix = null; + let hasUnknownParams = false; + for(let i = expr.arguments.length - 1; i >= 0; i--) { + const argExpr = this.evaluateExpression(expr.arguments[i]); + if(!argExpr.isString() && !argExpr.isNumber()) { + hasUnknownParams = true; + break; } - return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range); - }); - this.plugin("evaluate TaggedTemplateExpression", function(node) { - if(this.evaluateExpression(node.tag).identifier !== "String.raw") return; - const parts = getSimplifiedTemplateResult.call(this, "raw", node.quasi.quasis, node.quasi.expressions); - return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range); - }); + + const value = argExpr.isString() ? argExpr.string : "" + argExpr.number; + + const newString = value + (stringSuffix ? stringSuffix.string : ""); + const newRange = [argExpr.range[0], (stringSuffix || argExpr).range[1]]; + stringSuffix = new BasicEvaluatedExpression().setString(newString).setRange(newRange); + } + + if(hasUnknownParams) { + const prefix = param.isString() ? param : param.prefix; + return new BasicEvaluatedExpression().setWrapped(prefix, stringSuffix).setRange(expr.range); + } else if(param.isWrapped()) { + const postfix = stringSuffix || param.postfix; + return new BasicEvaluatedExpression().setWrapped(param.prefix, postfix).setRange(expr.range); + } else { + const newString = param.string + (stringSuffix ? stringSuffix.string : ""); + return new BasicEvaluatedExpression().setString(newString).setRange(expr.range); + } }); this.plugin("evaluate CallExpression .split", function(expr, param) { if(!param.isString()) return; -- cgit v1.2.3