Skip to content

Commit 954654e

Browse files
jgozterinjokes
authored andcommitted
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 19ab08b commit 954654e

File tree

4 files changed

+41
-17
lines changed

4 files changed

+41
-17
lines changed

index.js

+23-12
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,41 +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

32-
var cwd = defined(opts.basedir, b._options.basedir, process.cwd());
33+
var cwd = defined(opts.basedir, b._options.basedir, process.cwd()),
34+
packOpts = xtend(b._options, {
35+
raw: true,
36+
hasExports: true
37+
});
3338

3439
b.on('reset', addHooks);
3540
addHooks();
3641

37-
function addHooks() {
42+
function addHooks () {
3843
b.pipeline.get('record').push(through.obj(function(row, enc, next) {
3944
if (needRecords) {
4045
files.push(row.file);
4146
}
4247
next(null, row);
4348
}, function(next) {
44-
var fileMap = files.reduce(function (acc, x, ix) {
45-
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;
4660
return acc;
4761
}, {});
4862

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

5670
var s = createStream(files, opts);
5771
s.on('stream', function (bundle) {
58-
var output = fileMap[bundle.file];
59-
var ws = isStream(output) ? output : fs.createWriteStream(output);
60-
61-
bundle.pipe(pack(packOpts)).pipe(ws);
72+
bundle.pipe(pipelines[bundle.file]);
6273
});
6374

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

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",

readme.markdown

+11
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,17 @@ default).
179179

180180
The entry file name is available as `stream.file`.
181181

182+
## b.on('factor.pipeline', function (file, pipeline) {})
183+
184+
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:
185+
186+
* `'pack'` - [browser-pack](https://npmjs.org/package/browser-pack)
187+
* `'wrap'` - apply final wrapping
188+
189+
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.
190+
191+
Event handlers must be attached *before* calling `b.plugin`.
192+
182193
# install
183194

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

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)