sioux-offscreen
Version:
An off screen navigation item. Similar to the menu of the Facebook and Path app
117 lines (103 loc) • 3.79 kB
JavaScript
var browserify = require('../');
var path = require('path');
var spawn = require('child_process').spawn;
var parseShell = require('shell-quote').parse;
var duplexer = require('duplexer');
module.exports = function (args) {
var argv = require('optimist')(args)
.boolean(['deps','pack','ig','dg', 'im', 'd','list'])
.string(['s'])
.alias('insert-globals', 'ig')
.alias('detect-globals', 'dg')
.alias('ignore-missing', 'im')
.alias('debug', 'd')
.alias('standalone', 's')
.alias('ig', 'fast')
.alias('noparse', 'noParse')
.default('ig', false)
.default('im', false)
.default('dg', true)
.default('d', false)
.argv
;
var entries = argv._.concat(argv.e).concat(argv.entry)
.filter(Boolean).map(function(entry) {
return path.resolve(process.cwd(), entry);
});
var b = browserify({
noParse: [].concat(argv.noparse).filter(Boolean),
entries: entries
});
b.argv = argv;
[].concat(argv.i).concat(argv.ignore).filter(Boolean)
.forEach(function (i) { b.ignore(i) })
;
[].concat(argv.r).concat(argv.require).filter(Boolean)
.forEach(function (r) {
var xs = r.split(':');
b.require(xs[0], { expose: xs.length === 1 ? xs[0] : xs[1] })
})
;
// resolve any external files and add them to the bundle as externals
[].concat(argv.x).concat(argv.external).filter(Boolean)
.forEach(function (x) { b.external(path.resolve(process.cwd(), x)) })
;
[].concat(argv.t).concat(argv.transform).filter(Boolean)
.forEach(function (t) { b.transform(t) })
;
[].concat(argv.c).concat(argv.command).filter(Boolean)
.forEach(function (c) {
var cmd = parseShell(c);
b.transform(function (file) {
var env = Object.keys(process.env).reduce(function (acc, key) {
acc[key] = process.env[key];
return acc;
}, {});
env.FILENAME = file;
var ps = spawn(cmd[0], cmd.slice(1), { env: env });
var error = '';
ps.stderr.on('data', function (buf) { error += buf });
ps.on('exit', function (code) {
if (code === 0) return;
console.error([
'error running source transform command: ' + c,
error.split('\n').join('\n '),
''
].join('\n'));
process.exit(1);
});
return duplexer(ps.stdin, ps.stdout);
});
})
;
if (argv.standalone === true) {
process.nextTick(function () {
b.emit('error', '--standalone requires an export name argument');
});
return b;
}
var bundleOpts = {
detectGlobals: argv['detect-globals'] !== false && argv.dg !== false,
insertGlobals: argv['insert-globals'] || argv.ig,
ignoreMissing: argv['ignore-missing'] || argv.im,
debug: argv['debug'] || argv.d,
standalone: argv['standalone'] || argv.s
};
var bundle = b.bundle;
b.bundle = function (opts, cb) {
if (!opts) opts = {};
if (typeof opts === 'function') { cb = opts; opts = {} };
var bopts = copy(bundleOpts);
Object.keys(opts).forEach(function (key) {
bopts[key] = opts[key];
});
return bundle.call(b, bopts, cb);
};
return b;
};
function copy (obj) {
return Object.keys(obj).reduce(function (acc, key) {
acc[key] = obj[key];
return acc;
}, {});
}