Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81146 views
1
var browserify = require('../');
2
var path = require('path');
3
var spawn = require('child_process').spawn;
4
var parseShell = require('shell-quote').parse;
5
var insertGlobals = require('insert-module-globals');
6
var duplexer = require('duplexer2');
7
var subarg = require('subarg');
8
var glob = require('glob');
9
var Readable = require('readable-stream').Readable;
10
var xtend = require('xtend');
11
12
module.exports = function (args, opts) {
13
var argv = subarg(args, {
14
'boolean': [
15
'deps', 'pack', 'ig', 'dg', 'im', 'd', 'list', 'builtins',
16
'commondir', 'bare', 'full-paths', 'bundle-external'
17
],
18
string: [ 's', 'r', 'u', 'x', 't', 'i', 'o', 'e', 'c', 'it' ],
19
alias: {
20
ig: [ 'insert-globals', 'fast' ],
21
dg: [ 'detect-globals', 'detectGlobals', 'dg' ],
22
im: 'ignore-missing',
23
it: 'ignore-transform',
24
igv: 'insert-global-vars',
25
d: 'debug',
26
s: 'standalone',
27
noParse: [ 'noparse' ],
28
'full-paths': [ 'fullpaths', 'fullPaths' ],
29
r: 'require',
30
u: 'exclude',
31
x: 'external',
32
t: 'transform',
33
i: 'ignore',
34
o: 'outfile',
35
e: 'entry',
36
c: 'command',
37
bare: 'bear'
38
},
39
'default': {
40
ig: false,
41
im: false,
42
dg: true,
43
d: false,
44
builtins: true,
45
commondir: true,
46
'bundle-external': true
47
}
48
});
49
50
var entries = argv._.concat(argv.entry)
51
.filter(Boolean).map(function (entry) {
52
if (entry === '-') {
53
var s = process.stdin;
54
if (typeof s.read === 'function') return s;
55
// only needed for 0.8, remove at some point later:
56
var rs = Readable().wrap(s);
57
s.resume();
58
return rs;
59
}
60
return path.resolve(process.cwd(), entry);
61
});
62
63
if (argv.bare) {
64
argv.builtins = false;
65
argv.commondir = false;
66
argv.detectGlobals = false;
67
if (argv.igv === undefined) {
68
argv.igv = '__filename,__dirname';
69
}
70
}
71
72
var ignoreTransform = argv['ignore-transform'] || argv.it;
73
var b = browserify(xtend({
74
noParse: Array.isArray(argv.noParse) ? argv.noParse : [argv.noParse],
75
extensions: [].concat(argv.extension).filter(Boolean),
76
ignoreTransform: [].concat(ignoreTransform).filter(Boolean),
77
entries: entries,
78
fullPaths: argv['full-paths'],
79
builtins: argv.builtins === false ? false : undefined,
80
commondir: argv.commondir === false ? false : undefined,
81
bundleExternal: argv['bundle-external'],
82
basedir: argv.basedir,
83
84
detectGlobals: argv.detectGlobals,
85
insertGlobals: argv['insert-globals'] || argv.ig,
86
insertGlobalVars: insertGlobalVars,
87
ignoreMissing: argv['ignore-missing'] || argv.im,
88
debug: argv['debug'] || argv.d,
89
standalone: argv['standalone'] || argv.s
90
}, opts));
91
function error (msg) {
92
var e = new Error(msg);
93
process.nextTick(function () { b.emit('error', e) });
94
}
95
b.argv = argv;
96
[].concat(argv.p).concat(argv.plugin).filter(Boolean)
97
.forEach(function (p) {
98
var pf = p, pOpts = {};
99
if (typeof p === 'object') {
100
pf = p._.shift(), pOpts = p;
101
}
102
b.plugin(pf, pOpts);
103
})
104
;
105
106
[].concat(argv.ignore).filter(Boolean)
107
.forEach(function (i) {
108
b._pending ++;
109
glob(i, function (err, files) {
110
if (err) return b.emit('error', err);
111
if (files.length === 0) {
112
b.ignore(i);
113
}
114
else {
115
files.forEach(function (file) { b.ignore(file) });
116
}
117
if (--b._pending === 0) b.emit('_ready');
118
});
119
})
120
;
121
122
[].concat(argv.exclude).filter(Boolean)
123
.forEach(function (u) {
124
b.exclude(u);
125
126
b._pending ++;
127
glob(u, function (err, files) {
128
if (err) return b.emit('error', err);
129
files.forEach(function (file) { b.exclude(file) });
130
if (--b._pending === 0) b.emit('_ready');
131
});
132
})
133
;
134
135
[].concat(argv.require).filter(Boolean)
136
.forEach(function (r) {
137
var xs = r.split(':');
138
b.require(xs[0], { expose: xs.length === 1 ? xs[0] : xs[1] })
139
})
140
;
141
142
// resolve any external files and add them to the bundle as externals
143
[].concat(argv.external).filter(Boolean)
144
.forEach(function (x) {
145
if (/:/.test(x)) {
146
var xs = x.split(':');
147
add(xs[0], { expose: xs[1] });
148
}
149
else if (/\*/.test(x)) {
150
b.external(x);
151
glob(x, function (err, files) {
152
files.forEach(function (file) {
153
add(file, {});
154
});
155
});
156
}
157
else add(x, {});
158
159
function add (x, opts) {
160
if (/^[\/.]/.test(x)) b.external(path.resolve(x), opts)
161
else b.external(x, opts)
162
}
163
})
164
;
165
166
[].concat(argv.transform)
167
.filter(Boolean)
168
.forEach(function (t) { addTransform(t) })
169
;
170
171
[].concat(argv.g).concat(argv['global-transform'])
172
.filter(Boolean)
173
.forEach(function (t) {
174
addTransform(t, { global: true });
175
})
176
;
177
178
function addTransform (t, opts) {
179
if (typeof t === 'string' || typeof t === 'function') {
180
b.transform(opts, t);
181
}
182
else if (t && typeof t === 'object') {
183
if (!t._[0] || typeof t._[0] !== 'string') {
184
return error(
185
'expected first parameter to be a transform string'
186
);
187
}
188
if (opts) Object.keys(opts).forEach(function (key) {
189
t[key] = opts[key];
190
});
191
b.transform(t, t._.shift());
192
}
193
else error('unexpected transform of type ' + typeof t);
194
}
195
196
[].concat(argv.command).filter(Boolean)
197
.forEach(function (c) {
198
var cmd = parseShell(c);
199
b.transform(function (file) {
200
var env = Object.keys(process.env).reduce(function (acc, key) {
201
acc[key] = process.env[key];
202
return acc;
203
}, {});
204
env.FILENAME = file;
205
var ps = spawn(cmd[0], cmd.slice(1), { env: env });
206
var error = '';
207
ps.stderr.on('data', function (buf) { error += buf });
208
209
ps.on('exit', function (code) {
210
if (code === 0) return;
211
console.error([
212
'error running source transform command: ' + c,
213
error.split('\n').join('\n '),
214
''
215
].join('\n'));
216
process.exit(1);
217
});
218
return duplexer(ps.stdin, ps.stdout);
219
});
220
})
221
;
222
223
if (argv.standalone === '') {
224
error('--standalone requires an export name argument');
225
return b;
226
}
227
228
var insertGlobalVars;
229
if (argv.igv) {
230
insertGlobalVars = argv.igv.split(',').reduce(function (vars, x) {
231
vars[x] = insertGlobals.vars[x];
232
return vars;
233
}, {});
234
}
235
236
return b;
237
};
238
239
function copy (obj) {
240
return Object.keys(obj).reduce(function (acc, key) {
241
acc[key] = obj[key];
242
return acc;
243
}, {});
244
}
245
246