webpack/lib/writeSource.js

113 lines
3.2 KiB
JavaScript
Raw Normal View History

2012-03-12 04:50:55 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
2012-03-12 04:37:18 +08:00
function stringify(str) {
return '"' + str.replace(/\\/g, "\\\\").replace(/\"/g, "\\\"") + '"';
}
module.exports = function(module, options) {
if(!module.source) {
if(module.requireMap) {
var extensions = (options.resolve && options.resolve.extensions) || [".web.js", ".js"];
var extensionsAccess = [];
extensions.forEach(function(ext) {
extensionsAccess.push("||map[name+\"");
extensionsAccess.push(ext.replace(/\\/g, "\\\\").replace(/"/g, "\\\""));
extensionsAccess.push("\"]");
});
2012-03-20 03:13:33 +08:00
return "/***/module.exports = function(name) {\n" +
"/***/\tvar map = " + JSON.stringify(module.requireMap) + ";\n" +
2012-03-20 03:13:33 +08:00
"/***/\treturn require(map[name]" + extensionsAccess.join("") + "||name);\n" +
"/***/};";
}
return;
}
2012-03-10 20:11:23 +08:00
var replaces = []; // { from: 123, to: 125, value: "4" }
function genReplaceRequire(requireItem) {
if(requireItem.id !== undefined) {
var prefix = "";
if(requireItem.name)
prefix += "/* " + requireItem.name + " */";
if(requireItem.expressionRange) {
replaces.push({
from: requireItem.expressionRange[0],
to: requireItem.expressionRange[1],
value: "require(" + prefix + requireItem.id + ")"
});
} else if(requireItem.valueRange) {
replaces.push({
from: requireItem.valueRange[0],
to: requireItem.valueRange[1],
value: prefix + requireItem.id
});
}
2012-03-10 20:11:23 +08:00
}
}
2012-03-12 04:37:18 +08:00
function genContextReplaces(contextItem) {
var postfix = "";
var prefix = "";
if(contextItem.name)
prefix += "/* " + contextItem.name + " */";
2012-03-12 04:37:18 +08:00
if(contextItem.require) {
replaces.push({
from: contextItem.calleeRange[0],
to: contextItem.calleeRange[1],
value: "require(" + prefix + ((contextItem.id || "throw new Error('there is not id for this')") + "") + ")"
2012-03-12 04:37:18 +08:00
});
if(contextItem.replace)
replaces.push({
from: contextItem.replace[0][0],
to: contextItem.replace[0][1],
value: stringify(contextItem.replace[1])
});
2012-03-12 04:37:18 +08:00
} else {
replaces.push({
from: contextItem.expressionRange[0],
to: contextItem.expressionRange[1],
value: "require(" + prefix + ((contextItem.id || "throw new Error('there is not id for this')") + "") + ")" + postfix
2012-03-12 04:37:18 +08:00
});
}
}
2012-03-10 20:11:23 +08:00
if(module.requires) {
module.requires.forEach(genReplaceRequire);
}
2012-03-12 04:37:18 +08:00
if(module.contexts) {
module.contexts.forEach(genContextReplaces);
}
2012-03-10 20:11:23 +08:00
if(module.asyncs) {
module.asyncs.forEach(function genReplacesAsync(asyncItem) {
if(asyncItem.requires) {
asyncItem.requires.forEach(genReplaceRequire);
}
if(asyncItem.asyncs) {
asyncItem.asyncs.forEach(genReplacesAsync);
}
2012-03-12 04:37:18 +08:00
if(asyncItem.contexts) {
asyncItem.contexts.forEach(genContextReplaces);
}
2012-03-10 20:11:23 +08:00
if(asyncItem.namesRange) {
replaces.push({
from: asyncItem.namesRange[0],
to: asyncItem.namesRange[1],
value: ((asyncItem.chunkId || "0") + "")
});
}
});
}
replaces.sort(function(a, b) {
return b.from - a.from;
});
var source = module.source;
var result = [source];
replaces.forEach(function(repl) {
var remSource = result.shift();
result.unshift(
remSource.substr(0, repl.from),
repl.value,
remSource.substr(repl.to+1)
);
});
return result.join("");
}