expose require.cache and require.resolve, fixes #4

This commit is contained in:
Tobias Koppers 2012-07-04 11:50:20 +02:00
parent b1a45f3341
commit 3b219e34af
6 changed files with 55 additions and 3 deletions

View File

@ -194,6 +194,7 @@ function walkExpression(context, expression) {
expression.arguments.length == 1 && expression.arguments.length == 1 &&
expression.callee.type === "Identifier" && expression.callee.type === "Identifier" &&
expression.callee.name === "require") { expression.callee.name === "require") {
// "require(...)"
var param = parseCalculatedString(expression.arguments[0]); var param = parseCalculatedString(expression.arguments[0]);
if(param.conditional) { if(param.conditional) {
context.requires = context.requires || []; context.requires = context.requires || [];
@ -252,6 +253,7 @@ function walkExpression(context, expression) {
expression.callee.object.name === "require" && expression.callee.object.name === "require" &&
expression.callee.property.type === "Identifier" && expression.callee.property.type === "Identifier" &&
{async:1, ensure:1}.hasOwnProperty(expression.callee.property.name)) { {async:1, ensure:1}.hasOwnProperty(expression.callee.property.name)) {
// "require.ensure(...)" or "require.async(...)"
var param = parseStringArray(expression.arguments[0]); var param = parseStringArray(expression.arguments[0]);
var newContext = { var newContext = {
requires: [], requires: [],
@ -292,6 +294,7 @@ function walkExpression(context, expression) {
expression.callee.object.name === "require" && expression.callee.object.name === "require" &&
expression.callee.property.type === "Identifier" && expression.callee.property.type === "Identifier" &&
expression.callee.property.name === "context") { expression.callee.property.name === "context") {
// "require.context(...)"
var param = parseString(expression.arguments[0]); var param = parseString(expression.arguments[0]);
context.contexts = context.contexts || []; context.contexts = context.contexts || [];
var newContext = { var newContext = {
@ -304,12 +307,37 @@ function walkExpression(context, expression) {
noCallee = true; noCallee = true;
} }
if(context.overwrite.indexOf("require") === -1 && if(context.overwrite.indexOf("require") === -1 &&
expression.callee && expression.callee && expression.arguments &&
expression.arguments.length == 1 &&
expression.callee.type === "MemberExpression" && expression.callee.type === "MemberExpression" &&
expression.callee.object.type === "Identifier" && expression.callee.object.type === "Identifier" &&
expression.callee.object.name === "require" && expression.callee.object.name === "require" &&
expression.callee.property.type === "Identifier" && expression.callee.property.type === "Identifier" &&
expression.callee.property.name === "valueOf") { expression.callee.property.name === "resolve") {
// "require.resolve(...)"
var param = parseCalculatedString(expression.arguments[0]);
if(param.conditional) {
context.requires = context.requires || [];
param.conditional.forEach(function(paramItem, idx) {
context.requires.push({
name: paramItem.value,
valueRange: paramItem.range,
deleteRange: idx === 0 ? expression.callee.range : undefined,
line: expression.loc.start.line,
column: expression.loc.start.column
});
});
} else {
// normal require
context.requires = context.requires || [];
context.requires.push({
name: param.value,
expressionRange: [expression.callee.range[0], expression.range[1]],
idOnly: true,
line: expression.loc.start.line,
column: expression.loc.start.column
});
}
noCallee = true; noCallee = true;
} }
@ -324,6 +352,11 @@ function walkExpression(context, expression) {
expression.property.type === "Identifier" && expression.property.type === "Identifier" &&
expression.property.name === "exports") expression.property.name === "exports")
break; break;
if(expression.object.type === "Identifier" &&
expression.object.name === "require" &&
expression.property.type === "Identifier" &&
{valueOf:1, cache:1, modules:1}.hasOwnProperty(expression.property.name))
break;
walkExpression(context, expression.object); walkExpression(context, expression.object);
if(expression.property.type !== "Identifier") if(expression.property.type !== "Identifier")
walkExpression(context, expression.property); walkExpression(context, expression.property);

View File

@ -42,7 +42,7 @@ module.exports = function(module, options, toRealId, toRealChuckId) {
replaces.push({ replaces.push({
from: requireItem.expressionRange[0], from: requireItem.expressionRange[0],
to: requireItem.expressionRange[1], to: requireItem.expressionRange[1],
value: "require(" + prefix + toRealId(requireItem.id) + ")" + (requireItem.append || "") value: (requireItem.idOnly ? "" : "require") + "(" + prefix + toRealId(requireItem.id) + ")" + (requireItem.append || "")
}); });
} else if(requireItem.valueRange) { } else if(requireItem.valueRange) {
replaces.push({ replaces.push({
@ -50,6 +50,13 @@ module.exports = function(module, options, toRealId, toRealChuckId) {
to: requireItem.valueRange[1], to: requireItem.valueRange[1],
value: prefix + toRealId(requireItem.id) value: prefix + toRealId(requireItem.id)
}); });
if(requireItem.deleteRange) {
replaces.push({
from: requireItem.deleteRange[0],
to: requireItem.deleteRange[1],
value: ""
});
}
} else if(requireItem.variable) { } else if(requireItem.variable) {
if(!freeVars[requireItem.variable]) { if(!freeVars[requireItem.variable]) {
freeVars[requireItem.variable] = requireItem; freeVars[requireItem.variable] = requireItem;

View File

@ -26,6 +26,7 @@
/******/ } /******/ }
/******/ }; /******/ };
/******/ require.modules = modules; /******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) { /******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules) /******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId]; /******/ modules[moduleId] = moreModules[moduleId];

View File

@ -14,5 +14,6 @@
/******/ callback(require); /******/ callback(require);
/******/ }; /******/ };
/******/ require.modules = modules; /******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0); /******/ return require(0);
/******/}) /******/})

View File

@ -146,6 +146,16 @@ var abc = "abc", scr = "script.coffee";
window.test(require("../resources/" + scr) === "coffee test", "context should process extensions"); window.test(require("../resources/" + scr) === "coffee test", "context should process extensions");
window.test(require("raw!../resources/" + abc + ".txt") === "abc", "raw loader with context"); window.test(require("raw!../resources/" + abc + ".txt") === "abc", "raw loader with context");
// require behavior
var singlarObj = require("./singluar2");
var singlarId = require.resolve("./singluar2");
var singlarIdInConditional = require.resolve(true ? "./singluar2" : "./singluar");
window.test(typeof singlarId == "number", "require.resolve returns a id");
window.test(singlarIdInConditional === singlarId, "require.resolve returns a id if in conditional");
window.test(typeof require.cache[singlarId] == "object", "require.cache can be read");
delete require.cache[singlarId];
window.test(require("./singluar2") !== singlarObj, "require.cache can be deleted");
// Tests from node.js // Tests from node.js
require("bundle!../nodetests"); require("bundle!../nodetests");

View File