diff options
Diffstat (limited to 'node_modules/walker')
-rw-r--r-- | node_modules/walker/.travis.yml | 3 | ||||
-rw-r--r-- | node_modules/walker/LICENSE | 13 | ||||
-rw-r--r-- | node_modules/walker/lib/walker.js | 111 | ||||
-rw-r--r-- | node_modules/walker/package.json | 27 | ||||
-rw-r--r-- | node_modules/walker/readme.md | 52 |
5 files changed, 206 insertions, 0 deletions
diff --git a/node_modules/walker/.travis.yml b/node_modules/walker/.travis.yml new file mode 100644 index 0000000..2d26206 --- /dev/null +++ b/node_modules/walker/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.6 diff --git a/node_modules/walker/LICENSE b/node_modules/walker/LICENSE new file mode 100644 index 0000000..ebfef1f --- /dev/null +++ b/node_modules/walker/LICENSE @@ -0,0 +1,13 @@ +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. diff --git a/node_modules/walker/lib/walker.js b/node_modules/walker/lib/walker.js new file mode 100644 index 0000000..1907842 --- /dev/null +++ b/node_modules/walker/lib/walker.js @@ -0,0 +1,111 @@ +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 +} diff --git a/node_modules/walker/package.json b/node_modules/walker/package.json new file mode 100644 index 0000000..4156086 --- /dev/null +++ b/node_modules/walker/package.json @@ -0,0 +1,27 @@ +{ + "name": "walker", + "description": "A simple directory tree walker.", + "version": "1.0.8", + "homepage": "https://github.com/daaku/nodejs-walker", + "author": "Naitik Shah <n@daaku.org>", + "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" +} diff --git a/node_modules/walker/readme.md b/node_modules/walker/readme.md new file mode 100644 index 0000000..604a7e2 --- /dev/null +++ b/node_modules/walker/readme.md @@ -0,0 +1,52 @@ +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. |