123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- '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)
- ;
|