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.callee.type === "Identifier" &&
expression.callee.name === "require") {
// "require(...)"
var param = parseCalculatedString(expression.arguments[0]);
if(param.conditional) {
context.requires = context.requires || [];
@ -252,6 +253,7 @@ function walkExpression(context, expression) {
expression.callee.object.name === "require" &&
expression.callee.property.type === "Identifier" &&
{async:1, ensure:1}.hasOwnProperty(expression.callee.property.name)) {
// "require.ensure(...)" or "require.async(...)"
var param = parseStringArray(expression.arguments[0]);
var newContext = {
requires: [],
@ -292,6 +294,7 @@ function walkExpression(context, expression) {
expression.callee.object.name === "require" &&
expression.callee.property.type === "Identifier" &&
expression.callee.property.name === "context") {
// "require.context(...)"
var param = parseString(expression.arguments[0]);
context.contexts = context.contexts || [];
var newContext = {
@ -304,12 +307,37 @@ function walkExpression(context, expression) {
noCallee = true;
}
if(context.overwrite.indexOf("require") === -1 &&
expression.callee &&
expression.callee && expression.arguments &&
expression.arguments.length == 1 &&
expression.callee.type === "MemberExpression" &&
expression.callee.object.type === "Identifier" &&
expression.callee.object.name === "require" &&
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;
}
@ -324,6 +352,11 @@ function walkExpression(context, expression) {
expression.property.type === "Identifier" &&
expression.property.name === "exports")
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);
if(expression.property.type !== "Identifier")
walkExpression(context, expression.property);

View File

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

View File

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

View File

@ -14,5 +14,6 @@
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ 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("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
require("bundle!../nodetests");

View File