aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/Parser.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/Parser.js')
-rw-r--r--node_modules/webpack/lib/Parser.js99
1 files changed, 65 insertions, 34 deletions
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;