Skip to content

Commit

Permalink
expose require.cache and require.resolve, fixes #4
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra committed Jul 4, 2012
1 parent b1a45f3 commit 3b219e3
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 3 deletions.
37 changes: 35 additions & 2 deletions lib/parse.js
Expand Up @@ -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 || [];
Expand Down Expand Up @@ -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: [],
Expand Down Expand Up @@ -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 = {
Expand All @@ -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;
}

Expand All @@ -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);
Expand Down
9 changes: 8 additions & 1 deletion lib/writeSource.js
Expand Up @@ -42,14 +42,21 @@ 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({
from: requireItem.valueRange[0],
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;
Expand Down
1 change: 1 addition & 0 deletions templates/browserAsync.js
Expand Up @@ -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];
Expand Down
1 change: 1 addition & 0 deletions templates/browserSingle.js
Expand Up @@ -14,5 +14,6 @@
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
10 changes: 10 additions & 0 deletions test/browsertest/lib/index.web.js
Expand Up @@ -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");
Empty file.

0 comments on commit 3b219e3

Please sign in to comment.