grep.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. var assert = require("assert");
  2. var path = require("path");
  3. var Q = require("q");
  4. var fs = require("graceful-fs");
  5. var util = require("./util");
  6. var readdir = Q.denodeify(fs.readdir);
  7. var lstat = Q.denodeify(fs.lstat);
  8. function processDirP(pattern, dir) {
  9. return readdir(dir).then(function(files) {
  10. return Q.all(files.map(function(file) {
  11. file = path.join(dir, file);
  12. return lstat(file).then(function(stat) {
  13. return stat.isDirectory()
  14. ? processDirP(pattern, file)
  15. : processFileP(pattern, file);
  16. });
  17. })).then(function(results) {
  18. return util.flatten(results);
  19. });
  20. });
  21. }
  22. function processFileP(pattern, file) {
  23. return util.readFileP(file).then(function(contents) {
  24. var result = new RegExp(pattern, 'g').exec(contents);
  25. return result ? [{
  26. path: file,
  27. match: result[0]
  28. }] : [];
  29. });
  30. }
  31. module.exports = function(pattern, sourceDir) {
  32. assert.strictEqual(typeof pattern, "string");
  33. return processDirP(pattern, sourceDir).then(function(results) {
  34. var pathToMatch = {};
  35. results.forEach(function(result) {
  36. pathToMatch[path.relative(
  37. sourceDir,
  38. result.path
  39. ).split("\\").join("/")] = result.match;
  40. });
  41. return pathToMatch;
  42. });
  43. };