added __resourceQuery, __dir/__filename compile time constant

This commit is contained in:
Tobias Koppers 2013-02-16 22:23:22 +01:00
parent a0680280f3
commit 2183f05db8
8 changed files with 87 additions and 1 deletions

View File

@ -3,6 +3,7 @@
Author Tobias Koppers @sokra
*/
var ConstDependency = require("./dependencies/ConstDependency");
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
var NullFactory = require("./NullFactory");
@ -22,4 +23,16 @@ ConstPlugin.prototype.apply = function(compiler) {
return param.bool;
}
});
compiler.parser.plugin("evaluate Identifier __resourceQuery", function(expr) {
if(!this.state.module) return;
var res = new BasicEvaluatedExpression();
res.setString(this.state.module.splitQuery(this.state.module.resource)[1]);
res.setRange(expr.range);
return res;
});
compiler.parser.plugin("expression __resourceQuery", function(expr) {
if(!this.state.module) return;
this.state.current.addDependency(new ConstDependency(JSON.stringify(this.state.module.splitQuery(this.state.module.resource)[1]), expr.range));
return true;
});
};

View File

@ -10,6 +10,8 @@ function ModuleParseError(module, source, err) {
if(typeof err.lineNumber === "number") {
source = source.split("\n");
this.message += "\n" + source.slice(err.lineNumber - 2, 5).join("\n");
} else {
this.message += "\n" + err.stack;
}
this.module = module;
this.error = err;

View File

@ -6,6 +6,7 @@ var path = require("path");
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
var ModuleParserHelpers = require("./ModuleParserHelpers");
var ConstDependency = require("./dependencies/ConstDependency");
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
function NodeStuffPlugin() {
}
@ -16,10 +17,24 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
this.state.current.addVariable("__filename", JSON.stringify("/index.js"));
return true;
});
compiler.parser.plugin("evaluate Identifier __filename", function(expr) {
if(!this.state.module) return;
var res = new BasicEvaluatedExpression();
res.setString(this.state.module.splitQuery(this.state.module.resource)[0]);
res.setRange(expr.range);
return res;
});
compiler.parser.plugin("expression __dirname", function(expr) {
this.state.current.addVariable("__dirname", JSON.stringify("/"));
return true;
});
compiler.parser.plugin("evaluate Identifier __dirname", function(expr) {
if(!this.state.module) return;
var res = new BasicEvaluatedExpression();
res.setString(this.state.module.context);
res.setRange(expr.range);
return res;
});
compiler.parser.plugin("expression require.main", function(expr) {
var dep = new ConstDependency("require.cache[0]", expr.range);
dep.loc = expr.loc;

View File

@ -127,6 +127,55 @@ Parser.prototype.initializeEvaluating = function() {
this.plugin("evaluate Identifier", function(expr) {
return this.applyPluginsBailResult("evaluate Identifier " + expr.name, expr);
});
this.plugin("evaluate CallExpression", function(expr) {
if(expr.callee.type != "MemberExpression") return;
if(expr.callee.property.type != "Identifier") return;
var param = this.evaluateExpression(expr.callee.object);
if(!param) return;
return this.applyPluginsBailResult("evaluate CallExpression ." + expr.callee.property.name, expr, param);
});
this.plugin("evaluate CallExpression .substr", function(expr, param) {
if(!param.isString()) return;
var result, str = param.string;
switch(expr.arguments.length) {
case 1:
var arg1 = this.evaluateExpression(expr.arguments[0]);
if(!arg1.isNumber()) return;
result = str.substr(arg1.number);
break;
case 2:
var arg1 = this.evaluateExpression(expr.arguments[0]);
var arg2 = this.evaluateExpression(expr.arguments[0]);
if(!arg1.isNumber()) return;
if(!arg2.isNumber()) return;
result = str.substr(arg1.number, arg2.number);
break;
default:
return;
}
return new BasicEvaluatedExpression().setString(result).setRange(expr.range);
});
this.plugin("evaluate CallExpression .substring", function(expr, param) {
if(!param.isString()) return;
var result, str = param.string;
switch(expr.arguments.length) {
case 1:
var arg1 = this.evaluateExpression(expr.arguments[0]);
if(!arg1.isNumber()) return;
result = str.substring(arg1.number);
break;
case 2:
var arg1 = this.evaluateExpression(expr.arguments[0]);
var arg2 = this.evaluateExpression(expr.arguments[1]);
if(!arg1.isNumber()) return;
if(!arg2.isNumber()) return;
result = str.substring(arg1.number, arg2.number);
break;
default:
return;
}
return new BasicEvaluatedExpression().setString(result).setRange(expr.range);
});
this.plugin("evaluate ConditionalExpression", function(expr) {
var consequent = this.evaluateExpression(expr.consequent);
var alternate = this.evaluateExpression(expr.alternate);

View File

@ -1,6 +1,6 @@
{
"name": "webpack",
"version": "0.9.0-beta22",
"version": "0.9.0-beta23",
"author": "Tobias Koppers @sokra",
"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.",
"dependencies": {

View File

@ -416,6 +416,11 @@ describe("main", function() {
prev: "test content"
});
});
it("should evaluate __dirname and __resourceQuery", function() {
var result = require("../resourceQuery/index?" + __dirname);
result.should.be.eql("?resourceQuery");
});
});
describe("AMD", function() {

View File

@ -0,0 +1 @@
module.exports = require(__resourceQuery.substr(1) + "/../resourceQuery/returnRQ?resourceQuery");

View File

@ -0,0 +1 @@
module.exports = __resourceQuery;