| 'use strict'; |
| var readdirp = require('..') |
| , util = require('util') |
| , fs = require('fs') |
| , path = require('path') |
| , es = require('event-stream') |
| ; |
| |
| function findLinesMatching (searchTerm) { |
| |
| return es.through(function (entry) { |
| var lineno = 0 |
| , matchingLines = [] |
| , fileStream = this; |
| |
| function filter () { |
| return es.mapSync(function (line) { |
| lineno++; |
| return ~line.indexOf(searchTerm) ? lineno + ': ' + line : undefined; |
| }); |
| } |
| |
| function aggregate () { |
| return es.through( |
| function write (data) { |
| matchingLines.push(data); |
| } |
| , function end () { |
| |
| // drop files that had no matches |
| if (matchingLines.length) { |
| var result = { file: entry, lines: matchingLines }; |
| |
| // pass result on to file stream |
| fileStream.emit('data', result); |
| } |
| this.emit('end'); |
| } |
| ); |
| } |
| |
| fs.createReadStream(entry.fullPath, { encoding: 'utf-8' }) |
| |
| // handle file contents line by line |
| .pipe(es.split('\n')) |
| |
| // keep only the lines that matched the term |
| .pipe(filter()) |
| |
| // aggregate all matching lines and delegate control back to the file stream |
| .pipe(aggregate()) |
| ; |
| }); |
| } |
| |
| console.log('grepping for "arguments"'); |
| |
| // create a stream of all javascript files found in this and all sub directories |
| readdirp({ root: path.join(__dirname), fileFilter: '*.js' }) |
| |
| // find all lines matching the term for each file (if none found, that file is ignored) |
| .pipe(findLinesMatching('arguments')) |
| |
| // format the results and output |
| .pipe( |
| es.mapSync(function (res) { |
| return '\n\n' + res.file.path + '\n\t' + res.lines.join('\n\t'); |
| }) |
| ) |
| .pipe(process.stdout) |
| ; |