package/LICENSE000644 0000001046 3560116604 010266 0ustar00000000 000000 Copyright 2013 Naitik Shah Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. package/lib/walker.js000644 0000005525 3560116604 011660 0ustar00000000 000000 module.exports = Walker var path = require('path') , fs = require('fs') , util = require('util') , EventEmitter = require('events').EventEmitter , makeError = require('makeerror') /** * To walk a directory. It's complicated (but it's async, so it must be fast). * * @param root {String} the directory to start with */ function Walker(root) { if (!(this instanceof Walker)) return new Walker(root) EventEmitter.call(this) this._pending = 0 this._filterDir = function() { return true } this.go(root) } util.inherits(Walker, EventEmitter) /** * Errors of this type are thrown when the type of a file could not be * determined. */ var UnknownFileTypeError = Walker.UnknownFileTypeError = makeError( 'UnknownFileTypeError', 'The type of this file could not be determined.' ) /** * Setup a function to filter out directory entries. * * @param fn {Function} a function that will be given a directory name, which * if returns true will include the directory and it's children */ Walker.prototype.filterDir = function(fn) { this._filterDir = fn return this } /** * Process a file or directory. */ Walker.prototype.go = function(entry) { var that = this this._pending++ fs.lstat(entry, function(er, stat) { if (er) { that.emit('error', er, entry, stat) that.doneOne() return } if (stat.isDirectory()) { if (!that._filterDir(entry, stat)) { that.doneOne() } else { fs.readdir(entry, function(er, files) { if (er) { that.emit('error', er, entry, stat) that.doneOne() return } that.emit('entry', entry, stat) that.emit('dir', entry, stat) files.forEach(function(part) { that.go(path.join(entry, part)) }) that.doneOne() }) } } else if (stat.isSymbolicLink()) { that.emit('entry', entry, stat) that.emit('symlink', entry, stat) that.doneOne() } else if (stat.isBlockDevice()) { that.emit('entry', entry, stat) that.emit('blockDevice', entry, stat) that.doneOne() } else if (stat.isCharacterDevice()) { that.emit('entry', entry, stat) that.emit('characterDevice', entry, stat) that.doneOne() } else if (stat.isFIFO()) { that.emit('entry', entry, stat) that.emit('fifo', entry, stat) that.doneOne() } else if (stat.isSocket()) { that.emit('entry', entry, stat) that.emit('socket', entry, stat) that.doneOne() } else if (stat.isFile()) { that.emit('entry', entry, stat) that.emit('file', entry, stat) that.doneOne() } else { that.emit('error', UnknownFileTypeError(), entry, stat) that.doneOne() } }) return this } Walker.prototype.doneOne = function() { if (--this._pending === 0) this.emit('end') return this } package/package.json000644 0000001071 3560116604 011545 0ustar00000000 000000 { "name": "walker", "description": "A simple directory tree walker.", "version": "1.0.8", "homepage": "https://github.com/daaku/nodejs-walker", "author": "Naitik Shah ", "keywords": [ "utils", "fs", "filesystem" ], "main": "lib/walker", "repository": { "type": "git", "url": "https://github.com/daaku/nodejs-walker" }, "scripts": { "test": "NODE_PATH=./lib mocha --ui exports" }, "dependencies": { "makeerror": "1.0.12" }, "devDependencies": { "mocha": "9.1.3" }, "license": "Apache-2.0" } package/readme.md000644 0000003320 3560116604 011035 0ustar00000000 000000 walker [![Build Status](https://secure.travis-ci.org/daaku/nodejs-walker.png)](http://travis-ci.org/daaku/nodejs-walker) ====== A nodejs directory walker. Broadcasts events for various file types as well as a generic "entry" event for all types and provides the ability to prune directory trees. This shows the entire API; everything is optional: ```javascript Walker('/etc/') .filterDir(function(dir, stat) { if (dir === '/etc/pam.d') { console.warn('Skipping /etc/pam.d and children') return false } return true }) .on('entry', function(entry, stat) { console.log('Got entry: ' + entry) }) .on('dir', function(dir, stat) { console.log('Got directory: ' + dir) }) .on('file', function(file, stat) { console.log('Got file: ' + file) }) .on('symlink', function(symlink, stat) { console.log('Got symlink: ' + symlink) }) .on('blockDevice', function(blockDevice, stat) { console.log('Got blockDevice: ' + blockDevice) }) .on('fifo', function(fifo, stat) { console.log('Got fifo: ' + fifo) }) .on('socket', function(socket, stat) { console.log('Got socket: ' + socket) }) .on('characterDevice', function(characterDevice, stat) { console.log('Got characterDevice: ' + characterDevice) }) .on('error', function(er, entry, stat) { console.log('Got error ' + er + ' on entry ' + entry) }) .on('end', function() { console.log('All files traversed.') }) ``` You specify a root directory to walk and optionally specify a function to prune sub-directory trees via the `filterDir` function. The Walker exposes a number of events, broadcasting various file type events a generic error event and finally the event to signal the end of the process. package/.travis.yml000644 0000000043 3560116604 011366 0ustar00000000 000000 language: node_js node_js: - 0.6