2012-05-07 01:06:26 +08:00
|
|
|
var sprintf = require("sprintf").sprintf;
|
|
|
|
|
var path = require("path");
|
|
|
|
|
module.exports = function(stats, options) {
|
|
|
|
|
var buf = [];
|
|
|
|
|
|
|
|
|
|
function c(str) {
|
|
|
|
|
return options.colors ? str : "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buf.push("Hash: "+c("\033[1m") + stats.hash + c("\033[22m"));
|
|
|
|
|
buf.push("Chunks: "+c("\033[1m") + stats.chunkCount + c("\033[22m"));
|
|
|
|
|
buf.push("Modules: "+c("\033[1m") + stats.modulesCount + c("\033[22m"));
|
|
|
|
|
buf.push("Modules including duplicates: "+c("\033[1m") + stats.modulesIncludingDuplicates + c("\033[22m"));
|
2012-07-04 17:47:35 +08:00
|
|
|
buf.push("Modules per chunk: "+c("\033[1m") + stats.modulesPerChunk + c("\033[22m"));
|
2012-05-07 01:06:26 +08:00
|
|
|
buf.push("Modules first chunk: "+c("\033[1m") + stats.modulesFirstChunk + c("\033[22m"));
|
|
|
|
|
if(stats.fileSizes)
|
2012-05-12 22:43:37 +08:00
|
|
|
Object.keys(stats.fileSizes).forEach(function(file) {
|
2012-05-07 01:06:26 +08:00
|
|
|
buf.push(c("\033[1m") + sprintf("%" + (3 + Object.keys(stats.fileSizes)[0].length) + "s", file) + c("\033[22m")+": "+c("\033[1m") + sprintf("%8d", stats.fileSizes[file]) + c("\033[22m") + " characters");
|
|
|
|
|
});
|
|
|
|
|
var cwd = process.cwd();
|
|
|
|
|
var cwdParent = path.dirname(cwd);
|
|
|
|
|
var buildins = path.join(__dirname, "..");
|
|
|
|
|
cwd = cwd.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
|
|
|
cwd = new RegExp("^" + cwd + "|(!)" + cwd, "g");
|
|
|
|
|
var buildinsAsModule = cwd.test(buildins);
|
|
|
|
|
cwdParent = cwdParent.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
|
|
|
cwdParent = new RegExp("^" + cwdParent + "|(!)" + cwdParent, "g");
|
|
|
|
|
buildins = buildins.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
|
|
|
buildins = new RegExp("^" + buildins + "|(!)" + buildins, "g");
|
|
|
|
|
var node_modulesRegExpA = /\/node_modules\//g;
|
|
|
|
|
var node_modulesRegExpB = /\\node_modules\\/g;
|
|
|
|
|
var index_jsRegExp = /[\\\/]index.js!/g;
|
|
|
|
|
function compressFilename(filename) {
|
|
|
|
|
if(!filename)
|
|
|
|
|
return filename;
|
|
|
|
|
if(buildinsAsModule)
|
|
|
|
|
filename = filename.replace(buildins, "!(webpack)");
|
|
|
|
|
filename = filename.replace(cwd, "!.");
|
|
|
|
|
if(!buildinsAsModule)
|
|
|
|
|
filename = filename.replace(buildins, "!(webpack)");
|
|
|
|
|
filename = filename.replace(node_modulesRegExpA, "/~/");
|
|
|
|
|
filename = filename.replace(node_modulesRegExpB, "\\~\\");
|
|
|
|
|
filename = filename.replace(index_jsRegExp, "!");
|
|
|
|
|
return filename.replace(/^!|!$/, "");
|
|
|
|
|
}
|
|
|
|
|
if(stats.fileModules) {
|
|
|
|
|
buf.push("");
|
|
|
|
|
buf.push(" <id> <size> <filename>");
|
|
|
|
|
if(options.verbose)
|
|
|
|
|
buf.push(" <reason> from <filename>");
|
2012-05-12 22:43:37 +08:00
|
|
|
Object.keys(stats.fileModules).forEach(function(file) {
|
2012-05-07 01:06:26 +08:00
|
|
|
buf.push(c("\033[1m\033[32m") + file + c("\033[39m\033[22m"));
|
|
|
|
|
var modules = stats.fileModules[file];
|
|
|
|
|
if(options["by-size"])
|
|
|
|
|
modules.sort(function(a, b) {
|
|
|
|
|
return b.size - a.size;
|
|
|
|
|
});
|
|
|
|
|
modules.forEach(function(module) {
|
|
|
|
|
buf.push(" "+c("\033[1m") + sprintf("%3s", module.id+"") + " " + (typeof module.size === "number" ? sprintf("%9s", Math.round(module.size)+"") : " ") + " " +
|
|
|
|
|
(compressFilename(module.filename) ||
|
|
|
|
|
(module.dirname && ("[context] " + compressFilename(module.dirname))) ||
|
2012-06-30 03:52:03 +08:00
|
|
|
"[unknown]") + c("\033[22m") + (module.fromCache ? " [from cache]" : module.toCache ? " [caching]" : ""));
|
2012-05-07 01:06:26 +08:00
|
|
|
if(options.verbose) {
|
|
|
|
|
module.reasons.forEach(function(reason) {
|
|
|
|
|
switch(reason.type) {
|
|
|
|
|
case "require":
|
|
|
|
|
buf.push(" "+c("\033[36m")+"require (" + reason.count + "x) from " + compressFilename(reason.filename) + c("\033[39m"));
|
|
|
|
|
break;
|
|
|
|
|
case "context":
|
|
|
|
|
buf.push(" "+c("\033[90m")+"context from " + compressFilename(reason.filename) + c("\033[39m"));
|
|
|
|
|
break;
|
|
|
|
|
case "async require":
|
|
|
|
|
buf.push(" "+c("\033[35m")+"async require (" + reason.count + "x) from " + compressFilename(reason.filename) + c("\033[39m"));
|
|
|
|
|
break;
|
|
|
|
|
case "async context":
|
|
|
|
|
buf.push(" "+c("\033[35ma")+"sync context from " + compressFilename(reason.filename) + c("\033[39m"));
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
buf.push(" "+c("\033[31m") + reason.type + c("\033[39m"));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if(stats.warnings) {
|
|
|
|
|
stats.warnings.forEach(function(warning) {
|
|
|
|
|
buf.push(c("\033[1m\033[33m")+"WARNING: " + warning + c("\033[39m\033[22m"));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if(stats.errors) {
|
|
|
|
|
stats.errors.forEach(function(error) {
|
|
|
|
|
buf.push(c("\033[1m\033[31m")+"ERROR: " + error + c("\033[39m\033[22m"));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return buf.join("\n");
|
|
|
|
|
};
|