Also, don't roll your own CSV library, there's a couple decent ones already... ymmv, but there's a lot of edge cases to CSV parsing, and you will probably come across some issues if you aren't very careful.
Grr.. please don't use the modules the article mentions... use the built in, extensible streams...
import { Readable, Writeable, Transform, Duplex } from 'stream';
All you have to do is implement the minimal override in your own version.. for example...
import { Tranform } from 'stream';
// relies on split2 being run before this filter
export default class FileOutputSettingsFilter extends Tranform {
__line = 0;
constructor(options) {
super({ objectMode: true });
}
_tranform = (chunk, enc, cb) => {
const line = ++this.__line;
if (line > 3) return cb(null, chunk);
if (line = 2) this.emit('fileOutputSettings', chunk);
cb();
}
}
This lets me pluck the second line of input from a file, while passing everything after the third line through... in the case above, there is some prefixed data before CSV data at the top of the file.
It's easy enough to create readable/writeable streams as well... I have a few that will output to Message Queue services, or logging, etc.
What exactly is wrong with modules like through2? IMHO they are just tiny wrappers, which make handling streams more enjoyable. These are the stream modules I usually use in my projects: through2, from2, end-of-stream, pump and duplexify. Some of them handle some weird edge-cases, which would really not be that much fun to implement manually each time.
Here is also a nice collection of stream utilities: https://github.com/maxogden/mississippi
because `require('stream').Through` pretty much does everything through2 does...
new Transform({
objectMode: true,
transform(chunk, enc, cb) {},
flush(cb) {}
});
Is there something through2 inherently does that this doesn't?
The internals provide... I mean, you can either inherit from the template streams, or you can use streams that actually serve a purpose.. Readable handles backpressure by default, not sure why you'd want from2 or through2 ... end-of-stream comes down to knowing when to listen for 'end' (readable/through) and 'finish' (writable).
pump actually seems to serve a purpose... as does the likes of split2, and others... but the most basic readable/transform/writable bases are covered in the box, and it's really better to use them than bring in potentially a bunch of extra dependencies.
I agree with you that it may not make that much sense to use through2.
Generally I don't really mind pulling in small dependencies, even if they make stuff only a bit nicer. As long as the dependencies are easy replaceable and their code is understandable.