From 3ddb26ff369a9dff331fc24487e77424e8f3373c Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sat, 28 Feb 2015 00:51:15 +0100 Subject: [PATCH] more reliable parsing of wrapped expressions fixed #801 --- lib/BasicEvaluatedExpression.js | 2 +- lib/Parser.js | 10 +++++----- lib/dependencies/ContextDependencyHelpers.js | 10 +++++----- test/cases/context/issue-801/folder/file.js | 15 +++++++++++++++ test/cases/context/issue-801/index.js | 7 +++++++ 5 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 test/cases/context/issue-801/folder/file.js create mode 100644 test/cases/context/issue-801/index.js diff --git a/lib/BasicEvaluatedExpression.js b/lib/BasicEvaluatedExpression.js index d26376080..f4731b51f 100644 --- a/lib/BasicEvaluatedExpression.js +++ b/lib/BasicEvaluatedExpression.js @@ -35,7 +35,7 @@ BasicEvaluatedExpression.prototype.isIdentifier = function() { return Object.prototype.hasOwnProperty.call(this, "identifier"); }; BasicEvaluatedExpression.prototype.isWrapped = function() { - return Object.prototype.hasOwnProperty.call(this, "prefix"); + return Object.prototype.hasOwnProperty.call(this, "prefix") || Object.prototype.hasOwnProperty.call(this, "postfix"); }; BasicEvaluatedExpression.prototype.asBool = function() { if(this.isBoolean()) return this.bool; diff --git a/lib/Parser.js b/lib/Parser.js index ab7211fe8..f704b5833 100644 --- a/lib/Parser.js +++ b/lib/Parser.js @@ -66,14 +66,14 @@ Parser.prototype.initializeEvaluating = function() { res.setString(left.string + right.string); } else if(right.isNumber()) { res.setString(left.string + right.number); - } else if(right.isWrapped() && right.prefix.isString()) { + } else if(right.isWrapped() && right.prefix && right.prefix.isString()) { res.setWrapped( new BasicEvaluatedExpression() .setString(left.string + right.prefix.string) .setRange(joinRanges(left.range, right.prefix.range)), right.postfix); } else { - res.setWrapped(left, new BasicEvaluatedExpression().setString("")) + res.setWrapped(left, null) } } else if(left.isNumber()) { if(right.isString()) { @@ -82,13 +82,13 @@ Parser.prototype.initializeEvaluating = function() { res.setNumber(left.number + right.number); } } else if(left.isWrapped()) { - if(left.postfix.isString() && right.isString()) { + if(left.postfix && left.postfix.isString() && right.isString()) { res.setWrapped(left.prefix, new BasicEvaluatedExpression() .setString(left.postfix.string + right.string) .setRange(joinRanges(left.postfix.range, right.range)) ); - } else if(left.postfix.isString() && right.isNumber()) { + } else if(left.postfix && left.postfix.isString() && right.isNumber()) { res.setWrapped(left.prefix, new BasicEvaluatedExpression() .setString(left.postfix.string + right.number) @@ -106,7 +106,7 @@ Parser.prototype.initializeEvaluating = function() { } } else { if(right.isString()) { - res.setWrapped(new BasicEvaluatedExpression().setString(""), right); + res.setWrapped(null, right); } } res.setRange(expr.range); diff --git a/lib/dependencies/ContextDependencyHelpers.js b/lib/dependencies/ContextDependencyHelpers.js index 5764c6591..7a15cec75 100644 --- a/lib/dependencies/ContextDependencyHelpers.js +++ b/lib/dependencies/ContextDependencyHelpers.js @@ -5,10 +5,10 @@ var ContextDependencyHelpers = exports; ContextDependencyHelpers.create = function(Dep, range, param, expr, options) { - if(param.isWrapped() && param.prefix.isString()) { - var prefix = param.prefix.string; - var postfix = param.postfix.isString() ? param.postfix.string : ""; - var prefixRange = param.prefix.range; + if(param.isWrapped() && (param.prefix && param.prefix.isString() || param.postfix && param.postfix.isString())) { + var prefix = param.prefix && param.prefix.isString() ? param.prefix.string : ""; + var postfix = param.postfix && param.postfix.isString() ? param.postfix.string : ""; + var prefixRange = param.prefix && param.prefix.isString() ? param.prefix.range : null; var valueRange = [prefixRange ? prefixRange[1] : param.range[0], param.range[1]]; var idx = prefix.lastIndexOf("/"); var context = "."; @@ -22,7 +22,7 @@ ContextDependencyHelpers.create = function(Dep, range, param, expr, options) { postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"); var dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange); dep.loc = expr.loc; - dep.prepend = prefix; + dep.prepend = param.prefix && param.prefix.isString() ? prefix : null; dep.critical = options.wrappedContextCritical && "a part of the request of a dependency is an expression"; return dep; } else { diff --git a/test/cases/context/issue-801/folder/file.js b/test/cases/context/issue-801/folder/file.js new file mode 100644 index 000000000..0cb587eae --- /dev/null +++ b/test/cases/context/issue-801/folder/file.js @@ -0,0 +1,15 @@ +module.exports = function(arg) { + try { + var a = require(arg + ".js"); + } catch(e) {} + try { + var b = require("" + arg + ".js"); + } catch(e) {} + try { + var c = require("./" + arg + ".js"); + } catch(e) {} + try { + var d = require("./" + arg); + } catch(e) {} + return {a: typeof a === "function", b: typeof b === "function", c: typeof c === "function", d: typeof d === "function"} +}; \ No newline at end of file diff --git a/test/cases/context/issue-801/index.js b/test/cases/context/issue-801/index.js new file mode 100644 index 000000000..bacd8cc43 --- /dev/null +++ b/test/cases/context/issue-801/index.js @@ -0,0 +1,7 @@ +it("should emit valid code for dynamic require string with expr", function() { + var test = require("./folder/file"); + test("file").should.be.eql({ a: false, b: false, c: true, d: true }); + test("file.js").should.be.eql({ a: false, b: false, c: false, d: true }); + test("./file").should.be.eql({ a: true, b: true, c: false, d: false }); + test("./file.js").should.be.eql({ a: false, b: false, c: false, d: false }); +}); \ No newline at end of file