Skip to content

Commit 6d1a7a7

Browse files
committed
nice output
1 parent 0bc303c commit 6d1a7a7

File tree

6 files changed

+122
-40
lines changed

6 files changed

+122
-40
lines changed

bin/webpack.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
*/
77
var path = require("path");
88
var fs = require("fs");
9+
var util = require("util");
10+
var sprintf = require("sprintf").sprintf;
911
var argv = require("optimist")
1012
.usage("Usage: $0 <input> <output>")
1113

@@ -34,6 +36,10 @@ var argv = require("optimist")
3436
.describe("colors", "Output Stats with colors")
3537
.default("colors", false)
3638

39+
.boolean("json")
40+
.describe("json", "Output Stats as JSON")
41+
.default("json", false)
42+
3743
.demand(1)
3844
.argv;
3945

@@ -96,6 +102,47 @@ if(argv.single) {
96102
console.error(err);
97103
return;
98104
}
99-
console.log(require("util").inspect(stats, false, 10, argv.colors));
105+
if(argv.json)
106+
console.log(util.inspect(stats, false, 10, argv.colors));
107+
else {
108+
console.log("Chunks: \033[1m" + stats.chunkCount + "\033[22m");
109+
console.log("Modules: \033[1m" + stats.modulesCount + "\033[22m");
110+
console.log("Modules including duplicates: \033[1m" + stats.modulesIncludingDuplicates + "\033[22m");
111+
console.log("Modules pre chunk: \033[1m" + stats.modulesPerChunk + "\033[22m");
112+
console.log("Modules first chunk: \033[1m" + stats.modulesFirstChunk + "\033[22m");
113+
if(stats.fileSizes)
114+
for(var file in stats.fileSizes) {
115+
console.log("\033[1m" + sprintf("%" + (5 + options.output.length) + "s", file) + "\033[22m: \033[1m" + sprintf("%8d", stats.fileSizes[file]) + "\033[22m characters");
116+
};
117+
if(stats.fileModules) {
118+
for(var file in stats.fileModules) {
119+
console.log("\033[1m\033[32m" + file + "\033[39m\033[22m");
120+
var modules = stats.fileModules[file];
121+
modules.forEach(function(module) {
122+
console.log(" \033[1m" + sprintf("%3s", module.id+"") + " " + (module.filename || (module.dirname && ("generated " + module.dirname)) || "generated") + "\033[22m");
123+
module.reasons.forEach(function(reason) {
124+
switch(reason.type) {
125+
case "require":
126+
console.log(" \033[36mrequire (" + reason.count + "x) from " + reason.filename + "\033[39m");
127+
break;
128+
case "context":
129+
console.log(" \033[90mcontext from " + reason.filename + "\033[39m");
130+
break;
131+
case "ensure":
132+
console.log(" \033[35mensure from " + reason.filename + "\033[39m");
133+
break;
134+
default:
135+
console.log(" \033[31m" + reason.type + "\033[39m");
136+
}
137+
});
138+
});
139+
}
140+
}
141+
if(stats.warnings) {
142+
stats.warnings.forEach(function(warning) {
143+
console.log("\033[1m\033[33mWARNING: " + warning + "\033[39m\033[22m");
144+
});
145+
}
146+
}
100147
});
101148
}

lib/buildDeps.js

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ module.exports = function buildDeps(context, mainModule, options, callback) {
3030
chunkModules: {} // used by checkObsolete
3131
}
3232
var mainModuleId;
33-
addModule(depTree, context, mainModule, options, function(err, id) {
33+
addModule(depTree, context, mainModule, options, {type: "main"}, function(err, id) {
3434
if(err) {
3535
callback(err);
3636
return;
@@ -45,11 +45,19 @@ module.exports = function buildDeps(context, mainModule, options, callback) {
4545
removeChunkIfEmpty(depTree, depTree.chunks[chunkId]);
4646
checkObsolete(depTree, depTree.chunks[chunkId]);
4747
}
48+
// cleanup
49+
delete depTree.chunkModules;
50+
depTree.modulesByFile = depTree.modules;
51+
depTree.modules = depTree.modulesById;
52+
delete depTree.modulesById;
53+
delete depTree.nextModuleId;
54+
delete depTree.nextChunkId;
55+
// return
4856
callback(null, depTree);
4957
}
5058
}
5159

52-
function addModule(depTree, context, module, options, callback) {
60+
function addModule(depTree, context, module, options, reason, callback) {
5361
if(context)
5462
resolve(context, module, options.resolve, resolved);
5563
else
@@ -60,11 +68,13 @@ function addModule(depTree, context, module, options, callback) {
6068
return;
6169
}
6270
if(depTree.modules[filename]) {
71+
depTree.modules[filename].reasons.push(reason);
6372
callback(null, depTree.modules[filename].id);
6473
} else {
6574
var module = depTree.modules[filename] = {
6675
id: depTree.nextModuleId++,
67-
filename: filename
76+
filename: filename,
77+
reasons: [reason]
6878
};
6979
depTree.modulesById[module.id] = module;
7080
fs.readFile(filename, "utf-8", function(err, source) {
@@ -113,7 +123,12 @@ function addModule(depTree, context, module, options, callback) {
113123
var errors = [];
114124
if(requiresNames.length)
115125
requiresNames.forEach(function(moduleName) {
116-
addModule(depTree, path.dirname(filename), moduleName, options, function(err, moduleId) {
126+
var reason = {
127+
type: "require",
128+
count: requires[moduleName].length,
129+
filename: filename
130+
};
131+
addModule(depTree, path.dirname(filename), moduleName, options, reason, function(err, moduleId) {
117132
if(err) {
118133
errors.push(err+"\n @ " + filename + " (line " + requires[moduleName][0].line + ", column " + requires[moduleName][0].column + ")");
119134
} else {
@@ -128,7 +143,11 @@ function addModule(depTree, context, module, options, callback) {
128143
contexts.forEach(function(contextObj) {
129144
var context = contextObj.context;
130145
var module = contextObj.module;
131-
addContextModule(depTree, path.dirname(filename), context.name, options, function(err, contextModuleId) {
146+
var reason = {
147+
type: "ensure",
148+
filename: filename
149+
};
150+
addContextModule(depTree, path.dirname(filename), context.name, options, reason, function(err, contextModuleId) {
132151
if(err) {
133152
errors.push(err+"\n @ " + filename + " (line " + context.line + ", column " + context.column + ")");
134153
} else {
@@ -159,21 +178,24 @@ function addModule(depTree, context, module, options, callback) {
159178
}
160179
}
161180

162-
function addContextModule(depTree, context, contextModuleName, options, callback) {
181+
function addContextModule(depTree, context, contextModuleName, options, reason, callback) {
163182
resolve.context(context, contextModuleName, options.resolve, resolved);
164183
function resolved(err, dirname) {
165184
if(err) {
166185
callback(err);
167186
return;
168187
}
169188
if(depTree.modules[dirname]) {
189+
depTree.modules[dirname].reasons.push(reason);
170190
callback(null, depTree.modules[dirname].id);
171191
} else {
172192
var contextModule = depTree.modules[dirname] = {
173193
name: contextModuleName,
194+
dirname: dirname,
174195
id: depTree.nextModuleId++,
175196
requireMap: {},
176-
requires: []
197+
requires: [],
198+
reasons: [reason]
177199
};
178200
depTree.modulesById[contextModule.id] = contextModule;
179201
var extensions = (options.resolve && options.resolve.extensions) || [".web.js", ".js"];
@@ -204,7 +226,10 @@ function addContextModule(depTree, context, contextModuleName, options, callback
204226
endOne();
205227
} else {
206228
if(stat.isDirectory()) {
207-
doDir(filename, moduleName + "/" + file, endOne);
229+
if(file === "node_modules" || file === "web_modules")
230+
endOne();
231+
else
232+
doDir(filename, moduleName + "/" + file, endOne);
208233
} else {
209234
var hasExt = false;
210235
extensions.forEach(function(ext) {
@@ -215,7 +240,11 @@ function addContextModule(depTree, context, contextModuleName, options, callback
215240
endOne();
216241
return;
217242
}
218-
addModule(depTree, null, filename, options, function(err, moduleId) {
243+
var modulereason = {
244+
type: "context",
245+
filename: reason.filename
246+
};
247+
addModule(depTree, null, filename, options, modulereason, function(err, moduleId) {
219248
if(err) {
220249
endOne(err);
221250
} else {
@@ -240,7 +269,7 @@ function addContextModule(depTree, context, contextModuleName, options, callback
240269
var extensionsAccess = [];
241270
extensions.forEach(function(ext) {
242271
extensionsAccess.push("||map[name+\"");
243-
extensionsAccess.push(ext.replace(/"/g, "\\\""));
272+
extensionsAccess.push(ext.replace(/\\/g, "\\\\").replace(/"/g, "\\\""));
244273
extensionsAccess.push("\"]");
245274
});
246275

lib/webpack.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,19 @@ module.exports = function(context, moduleName, options, callback) {
118118
fileSizeMap[path.basename(filename)] = buffer.length;
119119
var modulesArray = [];
120120
for(var moduleId in chunk.modules) {
121+
var modu = depTree.modules[moduleId];
121122
if(chunk.modules[moduleId] === "include")
122-
modulesArray.push({id: moduleId, filename: depTree.modulesById[moduleId].filename});
123+
modulesArray.push({
124+
id: moduleId,
125+
filename: depTree.modules[moduleId].filename,
126+
dirname: depTree.modules[moduleId].dirname,
127+
reasons: modu.reasons});
123128
}
124129
fileModulesMap[path.basename(filename)] = modulesArray;
125130
}
126131
buffer = {};
127132
buffer.chunkCount = chunksCount;
128-
buffer.modulesCount = Object.keys(depTree.modulesById).length;
133+
buffer.modulesCount = Object.keys(depTree.modules).length;
129134
var sum = 0;
130135
for(var chunkId in depTree.chunks) {
131136
for(var moduleId in depTree.chunks[chunkId].modules) {

lib/writeChunk.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ module.exports = function(depTree, chunk, options) {
1010
chunk = null;
1111
}
1212
var buffer = [];
13-
var modules = chunk ? chunk.modules : depTree.modulesById;
13+
var modules = chunk ? chunk.modules : depTree.modules;
1414
for(var moduleId in modules) {
1515
if(chunk) {
1616
if(chunk.modules[moduleId] !== "include")
1717
continue;
1818
}
19-
var module = depTree.modulesById[moduleId];
19+
var module = depTree.modules[moduleId];
2020
buffer.push("/******/");
2121
buffer.push(moduleId);
2222
buffer.push(": function(module, exports, require) {\n\n");

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
22
"name": "webpack",
3-
"version": "0.2.0",
3+
"version": "0.2.1",
44
"author": "Tobias Koppers @sokra",
55
"description": "Packs CommonJs Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand.",
66
"dependencies": {
77
"esprima": "0.9.8",
88
"optimist": "0.2.x",
9-
"uglify-js": "1.2.5"
9+
"uglify-js": "1.2.5",
10+
"sprintf": "0.1.x"
1011
},
1112
"licenses": [
1213
{

test/buildDeps_test.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ vows.describe("buildDeps").addBatch({
1414
},
1515

1616
"all modules loaded": function(depTree) {
17-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "main1.js")], null);
18-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")], null);
19-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "b.js")], null);
20-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")], null);
17+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "main1.js")], null);
18+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "a.js")], null);
19+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "b.js")], null);
20+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")], null);
2121
},
2222

2323
"one chunk": function(depTree) {
@@ -34,20 +34,20 @@ vows.describe("buildDeps").addBatch({
3434
},
3535

3636
"all modules loaded": function(depTree) {
37-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "main2.js")], null);
38-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")], null);
39-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "b.js")], null);
40-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")], null);
41-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "b.js")], null);
37+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "main2.js")], null);
38+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "a.js")], null);
39+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "b.js")], null);
40+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")], null);
41+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "node_modules", "m1", "b.js")], null);
4242
},
4343

4444
"two chunks": function(depTree) {
4545
assert.deepEqual(Object.keys(depTree.chunks), ["0", "1"]);
46-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "main2.js")].chunks, [0]);
47-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")].chunks, [0]);
48-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "b.js")].chunks, [0]);
49-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")].chunks, [1]);
50-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "b.js")].chunks, [1]);
46+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "main2.js")].chunks, [0]);
47+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "a.js")].chunks, [0]);
48+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "b.js")].chunks, [0]);
49+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")].chunks, [1]);
50+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "node_modules", "m1", "b.js")].chunks, [1]);
5151
}
5252
},
5353

@@ -57,19 +57,19 @@ vows.describe("buildDeps").addBatch({
5757
},
5858

5959
"all modules loaded": function(depTree) {
60-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "main3.js")], null);
61-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")], null);
62-
assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "c.js")], null);
60+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "main3.js")], null);
61+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "a.js")], null);
62+
assert.notEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "c.js")], null);
6363
},
6464

6565
"two chunks": function(depTree) {
6666
assert.deepEqual(Object.keys(depTree.chunks), ["0", "1"]);
67-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "main3.js")].chunks, [0]);
68-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")].chunks, [0, 1]);
69-
assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "c.js")].chunks, [1]);
70-
var main3id = ""+depTree.modules[path.join(__dirname, "fixtures", "main3.js")].id;
71-
var aid = ""+depTree.modules[path.join(__dirname, "fixtures", "a.js")].id;
72-
var cid = ""+depTree.modules[path.join(__dirname, "fixtures", "c.js")].id;
67+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "main3.js")].chunks, [0]);
68+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "a.js")].chunks, [0, 1]);
69+
assert.deepEqual(depTree.modulesByFile[path.join(__dirname, "fixtures", "c.js")].chunks, [1]);
70+
var main3id = ""+depTree.modulesByFile[path.join(__dirname, "fixtures", "main3.js")].id;
71+
var aid = ""+depTree.modulesByFile[path.join(__dirname, "fixtures", "a.js")].id;
72+
var cid = ""+depTree.modulesByFile[path.join(__dirname, "fixtures", "c.js")].id;
7373
assert.deepEqual(Object.keys(depTree.chunks[0].modules), [main3id, aid]);
7474
assert.deepEqual(Object.keys(depTree.chunks[1].modules), [cid, aid]);
7575
assert.deepEqual(depTree.chunks[0].modules[main3id], "include");

0 commit comments

Comments
 (0)