webpack/lib/writeSource.js

211 lines
6.3 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
*/
module.exports = function(module, options, toRealId) {
var result;
if(typeof module.source !== "string") {
if(module.requireMap) {
var extensions = (options.resolve && options.resolve.extensions) || [".web.js", ".js"];
var extensionsAccess = [];
extensions.forEach(function(ext) {
2012-04-07 09:20:45 +08:00
extensionsAccess.push("map[name+\"" +
ext.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") +
"\"]");
});
var realRequireMap = {};
Object.keys(module.requireMap).sort().forEach(function(file) {
realRequireMap[file] = toRealId(module.requireMap[file]);
});
result = "/***/module.exports = function(name) {\n" +
"/***/\tvar map = " + JSON.stringify(realRequireMap) + ";\n" +
2012-04-07 09:20:45 +08:00
"/***/\treturn require(" + extensionsAccess.join("||") + "||name);\n" +
"/***/};";
} else
return;
} else {
var freeVars = {};
var replaces = []; // { from: 123, to: 125, value: "4" }
var modulePrepends = [];
var moduleAppends = [];
function genReplaceRequire(requireItem) {
if(requireItem.id !== undefined && toRealId(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 + toRealId(requireItem.id) + ")" + (requireItem.append || "")
});
} else if(requireItem.valueRange) {
replaces.push({
from: requireItem.valueRange[0],
to: requireItem.valueRange[1],
value: prefix + toRealId(requireItem.id)
});
} else if(requireItem.variable) {
if(!freeVars[requireItem.variable]) {
freeVars[requireItem.variable] = requireItem;
}
}
}
}
function genContextReplaces(contextItem) {
var postfix = "";
var prefix = "";
if(contextItem.name)
prefix += "/* " + contextItem.name + " */";
if(contextItem.require) {
replaces.push({
from: contextItem.calleeRange[0],
to: contextItem.calleeRange[1],
value: "require(" + prefix + (((contextItem.id && toRealId(contextItem.id)) || JSON.stringify("context: " + contextItem.name || "context failed")) + "") + ")"
});
if(contextItem.replace)
replaces.push({
from: contextItem.replace[0][0],
to: contextItem.replace[0][1],
value: JSON.stringify(contextItem.replace[1])
});
} else {
replaces.push({
from: contextItem.expressionRange[0],
to: contextItem.expressionRange[1],
value: "require(" + prefix + (((contextItem.id && toRealId(contextItem.id)) || JSON.stringify("context: " + contextItem.name || "context failed")) + "") + ")" + postfix
});
}
2012-03-10 20:11:23 +08:00
}
if(module.requires) {
module.requires.forEach(genReplaceRequire);
}
if(module.contexts) {
module.contexts.forEach(genContextReplaces);
}
if(module.asyncs) {
module.asyncs.forEach(function genReplacesAsync(asyncItem) {
var oldFreeVars = freeVars;
freeVars = {};
if(asyncItem.requires) {
asyncItem.requires.forEach(genReplaceRequire);
}
if(asyncItem.asyncs) {
asyncItem.asyncs.forEach(genReplacesAsync);
}
if(asyncItem.contexts) {
asyncItem.contexts.forEach(genContextReplaces);
}
if(asyncItem.namesRange) {
replaces.push({
from: asyncItem.namesRange[0],
to: asyncItem.namesRange[1],
value: ((asyncItem.chunkId || "0") + "")
});
}
if(asyncItem.blockRange) {
genReplacesFreeVars(asyncItem.blockRange, freeVars);
}
freeVars = oldFreeVars;
});
}
function genReplacesFreeVars(blockRange, freeVars) {
var keys = Object.keys(freeVars);
var values = [];
var removeKeys = [];
keys.forEach(function(key, idx) {
if(freeVars[key].id === module.id) {
removeKeys.push(idx);
} else {
values.push(freeVars[key]);
}
});
removeKeys.reverse().forEach(function(idx) {
keys.splice(idx, 1);
});
if(keys.length === 0) return;
values.forEach(function(requireItem, idx) {
if(requireItem.id !== undefined && toRealId(requireItem.id) !== undefined) {
var prefix = "";
if(requireItem.name)
prefix += "/* " + requireItem.name + " */";
values[idx] = "require(" + prefix + toRealId(requireItem.id) + ")" + (requireItem.append || "");
}
2012-03-12 04:37:18 +08:00
});
var start = "/* WEBPACK FREE VAR INJECTION */ (function(" + keys.join(",") + ") {";
var end = "/* WEBPACK FREE VAR INJECTION */ }(" + values.join(",") + "))"
if(blockRange) {
replaces.push({
from: blockRange[0],
to: blockRange[0]-1,
value: start
});
2012-03-10 20:11:23 +08:00
replaces.push({
from: blockRange[1],
to: blockRange[1]-1,
value: end
2012-03-10 20:11:23 +08:00
});
2012-04-05 20:59:01 +08:00
} else {
modulePrepends.unshift("/******/ " + start + "\n");
moduleAppends.push("\n/******/ " + end);
2012-04-05 20:59:01 +08:00
}
}
genReplacesFreeVars(null, freeVars);
replaces.sort(function(a, b) {
return b.from - a.from;
2012-04-05 20:59:01 +08:00
});
var source = module.source;
result = [source];
replaces.forEach(function(repl) {
var remSource = result.shift();
result.unshift(
remSource.substr(0, repl.from),
repl.value,
remSource.substr(repl.to+1)
);
2012-04-05 20:59:01 +08:00
});
result = result.join("");
2012-03-10 20:11:23 +08:00
}
2012-05-07 01:03:16 +08:00
if(options.minimize) {
var minimized = uglify(result, module.filename);
module.size = minimized.length;
if(options.debug) {
result = minimized;
2012-04-03 22:26:08 +08:00
}
2012-05-07 01:03:16 +08:00
} else {
module.size = result.length;
}
if(options.debug) {
result = [
"eval(",
2012-05-02 20:16:55 +08:00
JSON.stringify([
result,
"\n\n// WEBPACK FOOTER //\n",
"// module.id = ", module.id, "\n",
"// module.realId = ", module.realId, "\n",
"// module.chunks = ", module.chunks.join(", "), "\n",
2012-05-04 22:42:38 +08:00
"//@ sourceURL=webpack-module://", encodeURI(module.filename || module.dirname).replace(/%5C|%2F/g, "/")
2012-05-02 20:16:55 +08:00
].join("")),
");"].join("");
2012-04-03 22:26:08 +08:00
}
var finalResult = [];
finalResult.push.apply(finalResult, modulePrepends);
finalResult.push(result);
finalResult.push.apply(finalResult, moduleAppends);
return finalResult.join("");
2012-04-03 22:26:08 +08:00
}
function uglify(input, filename) {
var uglify = require("uglify-js");
try {
source = uglify.parser.parse(input);
source = uglify.uglify.ast_mangle(source);
source = uglify.uglify.ast_squeeze(source);
source = uglify.uglify.gen_code(source);
} catch(e) {
throw new Error(filename + " @ Line " + e.line + ", Col " + e.col + ", " + e.message);
return input;
}
return source;
2012-03-10 20:11:23 +08:00
}