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