blob: c8e08e20d3f1b8c7c3b66986251d96bc2c645a7a [file] [log] [blame]
# labeled-stream-splicer
[stream splicer](https://npmjs.org/package/stream-splicer) with labels
[![build status](https://secure.travis-ci.org/substack/labeled-stream-splicer.png)](http://travis-ci.org/substack/labeled-stream-splicer)
# example
Here's an example that exposes a label for `deps` and `pack`:
``` js
var splicer = require('labeled-stream-splicer');
var through = require('through2');
var deps = require('module-deps');
var pack = require('browser-pack');
var lstream = require('lstream');
var pipeline = splicer.obj([
'deps', [ deps() ],
'pack', [ pack({ raw: true }) ]
]);
pipeline.get('deps').unshift(lstream());
pipeline.get('deps').push(through.obj(function (row, enc, next) {
row.source = row.source.toUpperCase();
this.push(row);
next();
}));
process.stdin.pipe(pipeline).pipe(process.stdout);
```
Here the `deps` sub-pipeline is augmented with a post-transformation that
uppercases its source input.
# methods
``` js
var splicer = require('labeled-stream-splicer')
```
The API is the same as
[stream-splicer](https://npmjs.org/package/stream-splicer),
except that `pipeline.get()`, `pipeline.splice()`, and `pipeline.indexOf()` can
accept string labels in addition to numeric indexes.
## var pipeline = splicer(streams, opts)
Create a `pipeline` duplex stream given an array of `streams`. Each `stream`
will be piped to the next. Writes to `pipeline` get written to the first stream
and data for reads from `pipeline` come from the last stream.
To signify a label, a stream may have a `.label` property or a string may be
placed in the `streams` array.
For example, for streams `[ a, 'foo', b, c, 'bar', d ]`, this pipeline is
constructed internally:
```
a.pipe(b).pipe(c).pipe(d)
```
with a label `'foo`' that points to `b` and a label `'bar'` that points to `d`.
If `a` or `c` has a `.label` property, that label would be used for addressing.
Input will get written into `a`. Output will be read from `d`.
If any of the elements in `streams` are arrays, they will be converted into
nested labeled pipelines. This is useful if you want to expose a hookable
pipeline with grouped insertion points.
## var pipeline = splicer.obj(streams, opts)
Create a `pipeline` with `opts.objectMode` set to true for convenience.
## var removed = pipeline.splice(index, howMany, stream, ...)
Splice the pipeline starting at `index`, removing `howMany` streams and
replacing them with each additional `stream` argument provided.
The streams that were removed from the splice and returned.
`index` can be an integer index or a label.
## pipeline.push(stream, ...)
Push one or more streams to the end of the pipeline.
The stream arguments may have a `label` property that will be used for string
lookups.
## var stream = pipeline.pop()
Pop a stream from the end of the pipeline.
## pipeline.unshift(stream, ...)
Unshift one or more streams to the begining of the pipeline.
The stream arguments may have a `label` property that will be used for string
lookups.
## var stream = pipeline.shift()
Shift a stream from the begining of the pipeline.
## var stream = pipeline.get(index)
Return the stream at index `index`.
`index` can be an integer or a string label.
# install
With [npm](https://npmjs.org) do:
```
npm install labeled-stream-splicer
```
# license
MIT