webpack/bin/webpack.js

212 lines
4.9 KiB
JavaScript
Raw Normal View History

2012-03-10 20:11:23 +08:00
#!/usr/bin/env node
2012-03-12 04:50:55 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
2012-03-10 20:11:23 +08:00
var path = require("path");
var fs = require("fs");
2012-03-15 07:05:29 +08:00
var util = require("util");
var sprintf = require("sprintf").sprintf;
2012-03-10 20:11:23 +08:00
var argv = require("optimist")
.usage("Usage: $0 <input> <output>")
2012-03-12 04:50:55 +08:00
2012-03-10 20:11:23 +08:00
.boolean("min")
.describe("min", "Minimize it with uglifyjs")
.default("min", false)
2012-03-12 04:50:55 +08:00
2012-03-10 20:11:23 +08:00
.boolean("filenames")
.describe("filenames", "Output Filenames Into File")
.default("filenames", false)
2012-03-12 04:50:55 +08:00
2012-03-10 20:11:23 +08:00
.string("options")
.describe("options", "Options JSON File")
2012-03-12 04:50:55 +08:00
2012-05-12 22:43:37 +08:00
.string("public-prefix")
.alias("public-prefix", "script-src-prefix")
.describe("public-prefix", "Path Prefix For JavaScript Loading")
2012-03-12 04:50:55 +08:00
2012-03-10 20:11:23 +08:00
.string("libary")
.describe("libary", "Stores the exports into this variable")
2012-03-12 04:50:55 +08:00
.boolean("colors")
.describe("colors", "Output Stats with colors")
.default("colors", false)
2012-03-15 07:05:29 +08:00
.boolean("json")
.describe("json", "Output Stats as JSON")
.default("json", false)
2012-04-03 22:26:08 +08:00
.boolean("by-size")
.describe("by-size", "Sort modules by size in Stats")
.default("by-size", false)
2012-04-05 20:59:01 +08:00
.boolean("verbose")
.describe("verbose", "Output dependencies in Stats")
.default("verbose", false)
.string("alias")
.describe("alias", "Set a alias name for a module. ex. http=http-browserify")
2012-03-15 07:05:29 +08:00
2012-04-03 22:26:08 +08:00
.boolean("debug")
.describe("debug", "Prints debug info to output files")
.default("debug", false)
2012-05-02 03:33:59 +08:00
.boolean("watch")
.describe("watch", "Recompiles on changes (except loaders)")
.default("watch", false)
2012-05-12 23:30:41 +08:00
.string("watch-delay")
.describe("watch-delay", "Timeout to wait for the last change")
.default("watch", false)
2012-05-02 03:33:59 +08:00
.boolean("progress")
.describe("progress", "Displays a progress while compiling")
.default("progress", false)
2012-05-12 22:43:37 +08:00
.demand(1) // DEPRECATED
2012-03-10 20:11:23 +08:00
.argv;
var input = argv._[0],
output = argv._[1];
if (input && input[0] !== '/' && input[1] !== ':') {
input = path.join(process.cwd(), input);
}
if (output && output[0] !== '/' && input[1] !== ':') {
output = path.join(process.cwd(), output);
}
var options = {};
if(argv.options) {
2012-05-12 22:43:37 +08:00
options = require(path.join(process.cwd(), argv.options));
2012-03-10 20:11:23 +08:00
}
2012-05-12 22:43:37 +08:00
if(argv["public-prefix"]) {
options.publicPrefix = argv["public-prefix"];
2012-03-10 20:11:23 +08:00
}
if(argv.min) {
options.minimize = true;
}
2012-04-03 22:26:08 +08:00
if(argv.debug) {
options.debug = true;
}
2012-05-02 03:33:59 +08:00
if(argv.watch) {
options.watch = true;
}
2012-05-12 23:30:41 +08:00
if(argv["watch-delay"]) {
options.watchDelay = parseInt(argv["watch-delay"], 10);
}
2012-03-10 20:11:23 +08:00
if(argv.filenames) {
options.includeFilenames = true;
}
if(argv.libary) {
options.libary = argv.libary;
}
if(argv.alias) {
if(typeof argv.alias === "string")
argv.alias = [argv.alias];
options.resolve = options.resolve || {};
options.resolve.alias = options.resolve.alias || {};
var aliasObj = options.resolve.alias;
argv.alias.forEach(function(alias) {
alias = alias.split("=");
aliasObj[alias[0]] = alias[1];
});
}
2012-03-10 20:11:23 +08:00
var webpack = require("../lib/webpack.js");
2012-05-07 01:06:26 +08:00
var formatOutput = require("../lib/formatOutput.js");
2012-03-10 20:11:23 +08:00
2012-05-02 03:33:59 +08:00
function c(str) {
return argv.colors ? str : "";
}
if(!output) {
2012-05-12 22:43:37 +08:00
// DEPRECATED
2012-03-10 20:11:23 +08:00
webpack(input, options, function(err, source) {
if(err) {
console.error(err);
return;
}
if(output) {
fs.writeFileSync(output, source, "utf-8");
} else {
process.stdout.write(source);
}
});
} else {
output = output || path.join(process.cwd(), "js", "web.js");
if(!options.outputDirectory) options.outputDirectory = path.dirname(output);
if(!options.output) options.output = path.basename(output);
if(!options.outputPostfix) options.outputPostfix = "." + path.basename(output);
2012-05-12 22:43:37 +08:00
// some listeners for the progress display
2012-05-02 20:06:42 +08:00
if(argv.progress) {
if(!options.events) options.events = new (require("events").EventEmitter)();
var events = options.events;
2012-05-12 22:43:37 +08:00
2012-05-02 20:06:42 +08:00
var sum = 0;
var finished = 0;
var chars = 0;
function print() {
var msg = "";
if(sum > 0) {
msg += "compiling... (" + c("\033[1m\033[33m");
msg += sprintf("%4s", finished+"") + "/" + sprintf("%4s", sum+"");
msg += " " + sprintf("%4s", Math.floor(finished*100/sum)+"%");
msg += c("\033[39m\033[22m") + ")";
}
for(var i = 0; i < chars; i++)
process.stderr.write("\b");
process.stderr.write(msg);
chars = msg.length;
}
events.on("task", function(name) {
sum++;
print();
});
events.on("task-end", function(name) {
finished++;
if(name) {
for(var i = 0; i < chars; i++)
process.stderr.write("\b \b");
process.stderr.write(name + " " + c("\033[1m\033[32m") + "done" + c("\033[39m\033[22m") + "\n");
chars = 0;
}
print();
});
events.on("bundle", function(name) {
sum = 0;
finished = 0;
for(var i = 0; i < chars; i++)
process.stderr.write("\b \b");
chars = 0;
});
}
2012-05-12 22:43:37 +08:00
// do the stuff
2012-05-02 20:06:42 +08:00
webpack(input, options, function(err, stats) {
2012-03-10 20:11:23 +08:00
if(err) {
console.error(err);
return;
}
2012-03-15 07:05:29 +08:00
if(argv.json)
console.log(util.inspect(stats, false, 10, argv.colors));
else {
2012-05-07 01:06:26 +08:00
console.log(formatOutput(stats, {
colors: argv.colors,
"by-size": argv["by-size"],
verbose: argv.verbose
}));
2012-03-15 07:05:29 +08:00
}
2012-03-10 20:11:23 +08:00
});
}