Skip to content

Commit 6cad179

Browse files
jgozJohn Gozde
authored and
John Gozde
committed
Expose pipeline for output bundles on event.
- browserify instance emits ‘factor.pipeline’ event when the pipeline is created - pipeline uses labeled-stream-splicer and has ‘pack’ and ‘wrap’ stages
1 parent c86968f commit 6cad179

File tree

4 files changed

+41
-16
lines changed

4 files changed

+41
-16
lines changed

Diff for: index.js

+23-11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var fs = require('fs');
1212
var pack = require('browser-pack');
1313
var xtend = require('xtend');
1414
var defined = require('defined');
15+
var splicer = require('labeled-stream-splicer');
1516

1617
module.exports = function f (b, opts) {
1718
if (!opts) opts = {};
@@ -24,40 +25,51 @@ module.exports = function f (b, opts) {
2425

2526
var needRecords = !files.length;
2627

27-
opts.outputs = opts.outputs || opts.o;
28+
opts.outputs = defined(opts.outputs, opts.o, {});
2829
opts.objectMode = true;
2930
opts.raw = true;
3031
opts.rmap = {};
3132

33+
var packOpts = xtend(b._options, {
34+
raw: true,
35+
hasExports: true
36+
});
37+
3238
b.on('reset', addHooks);
3339
addHooks();
3440

35-
function addHooks() {
41+
function addHooks () {
3642
b.pipeline.get('record').push(through.obj(function(row, enc, next) {
3743
if (needRecords) {
3844
files.push(row.file);
3945
}
4046
next(null, row);
4147
}, function(next) {
4248
var cwd = defined(opts.basedir, b._options.basedir, process.cwd());
43-
var fileMap = files.reduce(function (acc, x, ix) {
44-
acc[path.resolve(cwd, x)] = opts.outputs[ix];
49+
var pipelines = files.reduce(function (acc, x, ix) {
50+
var pipeline = splicer.obj([
51+
'pack', [ pack(packOpts) ],
52+
'wrap', []
53+
]);
54+
var output = opts.outputs[ix];
55+
if (output) {
56+
var ws = isStream(output) ? output : fs.createWriteStream(output);
57+
pipeline.push(ws);
58+
}
59+
acc[path.resolve(cwd, x)] = pipeline;
4560
return acc;
4661
}, {});
4762

4863
// Force browser-pack to wrap the common bundle
4964
b._bpack.hasExports = true;
50-
var packOpts = xtend(b._options, {
51-
raw: true,
52-
hasExports: true
65+
66+
Object.keys(pipelines).forEach(function (id) {
67+
b.emit('factor.pipeline', id, pipelines[id]);
5368
});
5469

5570
var s = createStream(files, opts);
5671
s.on('stream', function (bundle) {
57-
var output = fileMap[bundle.file];
58-
var ws = isStream(output) ? output : fs.createWriteStream(output);
59-
60-
bundle.pipe(pack(packOpts)).pipe(ws);
72+
bundle.pipe(pipelines[bundle.file]);
6173
});
6274

6375
b.pipeline.get('pack').unshift(s);

Diff for: package.json

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"defined": "0.0.0",
1111
"deps-topo-sort": "~0.2.1",
1212
"inherits": "^2.0.1",
13+
"labeled-stream-splicer": "^1.0.0",
1314
"minimist": "~0.2.0",
1415
"nub": "0.0.0",
1516
"reversepoint": "~0.2.0",

Diff for: readme.markdown

+11
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,17 @@ default).
164164

165165
The entry file name is available as `stream.file`.
166166

167+
## b.on('factor.pipeline', function (file, pipeline) {})
168+
169+
Emits the full path to the entry file (`file`) and a [labeled-stream-splicer](https://npmjs.org/package/labeled-stream-splicer) (`pipeline`) for each entry file with these labels:
170+
171+
* `'pack'` - [browser-pack](https://npmjs.org/package/browser-pack)
172+
* `wrap` - apply final wrapping
173+
174+
You can call `pipeline.get` with a label name to get a handle on a stream pipeline that you can `push()`, `unshift()`, or `splice()` to insert your own transform streams.
175+
176+
Event handlers must be attached *before* calling `b.plugin`.
177+
167178
# install
168179

169180
With [npm](https://npmjs.org) do:

Diff for: test/plugin.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,13 @@ test('browserify plugin multiple bundle calls', function(t) {
7272

7373
var b = browserify(files);
7474
var sources = {};
75-
b.plugin(factor, {
76-
o: [
77-
function() { return concat(function(data) { sources.x = data }); },
78-
function() { return concat(function(data) { sources.y = data }); }
79-
]
75+
b.on('factor.pipeline', function(id, pipeline) {
76+
pipeline.pipe(concat(function(data) {
77+
if (/x\.js$/.test(id)) sources.x = data;
78+
else sources.y = data;
79+
}));
8080
});
81+
b.plugin(factor);
8182

8283
b.bundle().pipe(concat(function(data) {
8384
checkBundle(data);

0 commit comments

Comments
 (0)