Skip to content

Commit 2183f05

Browse files
committed
added __resourceQuery, __dir/__filename compile time constant
1 parent a068028 commit 2183f05

File tree

8 files changed

+87
-1
lines changed

8 files changed

+87
-1
lines changed

lib/ConstPlugin.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Author Tobias Koppers @sokra
44
*/
55
var ConstDependency = require("./dependencies/ConstDependency");
6+
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
67

78
var NullFactory = require("./NullFactory");
89

@@ -22,4 +23,16 @@ ConstPlugin.prototype.apply = function(compiler) {
2223
return param.bool;
2324
}
2425
});
26+
compiler.parser.plugin("evaluate Identifier __resourceQuery", function(expr) {
27+
if(!this.state.module) return;
28+
var res = new BasicEvaluatedExpression();
29+
res.setString(this.state.module.splitQuery(this.state.module.resource)[1]);
30+
res.setRange(expr.range);
31+
return res;
32+
});
33+
compiler.parser.plugin("expression __resourceQuery", function(expr) {
34+
if(!this.state.module) return;
35+
this.state.current.addDependency(new ConstDependency(JSON.stringify(this.state.module.splitQuery(this.state.module.resource)[1]), expr.range));
36+
return true;
37+
});
2538
};

lib/ModuleParseError.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ function ModuleParseError(module, source, err) {
1010
if(typeof err.lineNumber === "number") {
1111
source = source.split("\n");
1212
this.message += "\n" + source.slice(err.lineNumber - 2, 5).join("\n");
13+
} else {
14+
this.message += "\n" + err.stack;
1315
}
1416
this.module = module;
1517
this.error = err;

lib/NodeStuffPlugin.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var path = require("path");
66
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
77
var ModuleParserHelpers = require("./ModuleParserHelpers");
88
var ConstDependency = require("./dependencies/ConstDependency");
9+
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
910

1011
function NodeStuffPlugin() {
1112
}
@@ -16,10 +17,24 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
1617
this.state.current.addVariable("__filename", JSON.stringify("/index.js"));
1718
return true;
1819
});
20+
compiler.parser.plugin("evaluate Identifier __filename", function(expr) {
21+
if(!this.state.module) return;
22+
var res = new BasicEvaluatedExpression();
23+
res.setString(this.state.module.splitQuery(this.state.module.resource)[0]);
24+
res.setRange(expr.range);
25+
return res;
26+
});
1927
compiler.parser.plugin("expression __dirname", function(expr) {
2028
this.state.current.addVariable("__dirname", JSON.stringify("/"));
2129
return true;
2230
});
31+
compiler.parser.plugin("evaluate Identifier __dirname", function(expr) {
32+
if(!this.state.module) return;
33+
var res = new BasicEvaluatedExpression();
34+
res.setString(this.state.module.context);
35+
res.setRange(expr.range);
36+
return res;
37+
});
2338
compiler.parser.plugin("expression require.main", function(expr) {
2439
var dep = new ConstDependency("require.cache[0]", expr.range);
2540
dep.loc = expr.loc;

lib/Parser.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,55 @@ Parser.prototype.initializeEvaluating = function() {
127127
this.plugin("evaluate Identifier", function(expr) {
128128
return this.applyPluginsBailResult("evaluate Identifier " + expr.name, expr);
129129
});
130+
this.plugin("evaluate CallExpression", function(expr) {
131+
if(expr.callee.type != "MemberExpression") return;
132+
if(expr.callee.property.type != "Identifier") return;
133+
var param = this.evaluateExpression(expr.callee.object);
134+
if(!param) return;
135+
return this.applyPluginsBailResult("evaluate CallExpression ." + expr.callee.property.name, expr, param);
136+
});
137+
this.plugin("evaluate CallExpression .substr", function(expr, param) {
138+
if(!param.isString()) return;
139+
var result, str = param.string;
140+
switch(expr.arguments.length) {
141+
case 1:
142+
var arg1 = this.evaluateExpression(expr.arguments[0]);
143+
if(!arg1.isNumber()) return;
144+
result = str.substr(arg1.number);
145+
break;
146+
case 2:
147+
var arg1 = this.evaluateExpression(expr.arguments[0]);
148+
var arg2 = this.evaluateExpression(expr.arguments[0]);
149+
if(!arg1.isNumber()) return;
150+
if(!arg2.isNumber()) return;
151+
result = str.substr(arg1.number, arg2.number);
152+
break;
153+
default:
154+
return;
155+
}
156+
return new BasicEvaluatedExpression().setString(result).setRange(expr.range);
157+
});
158+
this.plugin("evaluate CallExpression .substring", function(expr, param) {
159+
if(!param.isString()) return;
160+
var result, str = param.string;
161+
switch(expr.arguments.length) {
162+
case 1:
163+
var arg1 = this.evaluateExpression(expr.arguments[0]);
164+
if(!arg1.isNumber()) return;
165+
result = str.substring(arg1.number);
166+
break;
167+
case 2:
168+
var arg1 = this.evaluateExpression(expr.arguments[0]);
169+
var arg2 = this.evaluateExpression(expr.arguments[1]);
170+
if(!arg1.isNumber()) return;
171+
if(!arg2.isNumber()) return;
172+
result = str.substring(arg1.number, arg2.number);
173+
break;
174+
default:
175+
return;
176+
}
177+
return new BasicEvaluatedExpression().setString(result).setRange(expr.range);
178+
});
130179
this.plugin("evaluate ConditionalExpression", function(expr) {
131180
var consequent = this.evaluateExpression(expr.consequent);
132181
var alternate = this.evaluateExpression(expr.alternate);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webpack",
3-
"version": "0.9.0-beta22",
3+
"version": "0.9.0-beta23",
44
"author": "Tobias Koppers @sokra",
55
"description": "Packs CommonJs/AMD Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jade, coffee, css, less, ... and your custom stuff.",
66
"dependencies": {

test/browsertest/lib/index.web.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,11 @@ describe("main", function() {
416416
prev: "test content"
417417
});
418418
});
419+
420+
it("should evaluate __dirname and __resourceQuery", function() {
421+
var result = require("../resourceQuery/index?" + __dirname);
422+
result.should.be.eql("?resourceQuery");
423+
});
419424
});
420425

421426
describe("AMD", function() {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require(__resourceQuery.substr(1) + "/../resourceQuery/returnRQ?resourceQuery");
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = __resourceQuery;

0 commit comments

Comments
 (0)