mirror of
https://github.com/abrendan/MicDropMessages.git
synced 2025-08-25 05:52:02 +02:00
Initial commit
This commit is contained in:
41
node_modules/walk/LICENSE
generated
vendored
Normal file
41
node_modules/walk/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
Copyright 2011 AJ ONeal
|
||||
|
||||
This is open source software; you can redistribute it and/or modify it under the
|
||||
terms of either:
|
||||
|
||||
a) the "MIT License"
|
||||
b) the "Apache-2.0 License"
|
||||
|
||||
MIT License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
Apache-2.0 License Summary
|
||||
|
||||
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.
|
306
node_modules/walk/README.md
generated
vendored
Normal file
306
node_modules/walk/README.md
generated
vendored
Normal file
@@ -0,0 +1,306 @@
|
||||
node-walk
|
||||
====
|
||||
|
||||
| Sponsored by [ppl](https://ppl.family)
|
||||
|
||||
nodejs walk implementation.
|
||||
|
||||
This is somewhat of a port python's `os.walk`, but using Node.JS conventions.
|
||||
|
||||
* EventEmitter
|
||||
* Asynchronous
|
||||
* Chronological (optionally)
|
||||
* Built-in flow-control
|
||||
* includes Synchronous version (same API as Asynchronous)
|
||||
|
||||
As few file descriptors are opened at a time as possible.
|
||||
This is particularly well suited for single hard disks which are not flash or solid state.
|
||||
|
||||
Installation
|
||||
----
|
||||
|
||||
```bash
|
||||
npm install --save walk
|
||||
```
|
||||
|
||||
Getting Started
|
||||
====
|
||||
|
||||
```javascript
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var walk = require('walk');
|
||||
var fs = require('fs');
|
||||
var walker;
|
||||
|
||||
walker = walk.walk("/tmp", options);
|
||||
|
||||
walker.on("file", function (root, fileStats, next) {
|
||||
fs.readFile(fileStats.name, function () {
|
||||
// doStuff
|
||||
next();
|
||||
});
|
||||
});
|
||||
|
||||
walker.on("errors", function (root, nodeStatsArray, next) {
|
||||
next();
|
||||
});
|
||||
|
||||
walker.on("end", function () {
|
||||
console.log("all done");
|
||||
});
|
||||
}());
|
||||
```
|
||||
|
||||
Common Events
|
||||
-----
|
||||
|
||||
All single event callbacks are in the form of `function (root, stat, next) {}`.
|
||||
|
||||
All multiple event callbacks callbacks are in the form of `function (root, stats, next) {}`, except **names** which is an array of strings.
|
||||
|
||||
All **error** event callbacks are in the form `function (root, stat/stats, next) {}`.
|
||||
**`stat.error`** contains the error.
|
||||
|
||||
* `names`
|
||||
* `directory`
|
||||
* `directories`
|
||||
* `file`
|
||||
* `files`
|
||||
* `end`
|
||||
* `nodeError` (`stat` failed)
|
||||
* `directoryError` (`stat` succedded, but `readdir` failed)
|
||||
* `errors` (a collection of any errors encountered)
|
||||
|
||||
|
||||
A typical `stat` event looks like this:
|
||||
|
||||
```javascript
|
||||
{ dev: 16777223,
|
||||
mode: 33188,
|
||||
nlink: 1,
|
||||
uid: 501,
|
||||
gid: 20,
|
||||
rdev: 0,
|
||||
blksize: 4096,
|
||||
ino: 49868100,
|
||||
size: 5617,
|
||||
blocks: 16,
|
||||
atime: Mon Jan 05 2015 18:18:10 GMT-0700 (MST),
|
||||
mtime: Thu Sep 25 2014 21:21:28 GMT-0600 (MDT),
|
||||
ctime: Thu Sep 25 2014 21:21:28 GMT-0600 (MDT),
|
||||
birthtime: Thu Sep 25 2014 21:21:28 GMT-0600 (MDT),
|
||||
name: 'README.md',
|
||||
type: 'file' }
|
||||
```
|
||||
|
||||
Advanced Example
|
||||
====
|
||||
|
||||
Both Asynchronous and Synchronous versions are provided.
|
||||
|
||||
```javascript
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var walk = require('walk');
|
||||
var fs = require('fs');
|
||||
var options;
|
||||
var walker;
|
||||
|
||||
options = {
|
||||
followLinks: false
|
||||
// directories with these keys will be skipped
|
||||
, filters: ["Temp", "_Temp"]
|
||||
};
|
||||
|
||||
walker = walk.walk("/tmp", options);
|
||||
|
||||
// OR
|
||||
// walker = walk.walkSync("/tmp", options);
|
||||
|
||||
walker.on("names", function (root, nodeNamesArray) {
|
||||
nodeNamesArray.sort(function (a, b) {
|
||||
if (a > b) return 1;
|
||||
if (a < b) return -1;
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
|
||||
walker.on("directories", function (root, dirStatsArray, next) {
|
||||
// dirStatsArray is an array of `stat` objects with the additional attributes
|
||||
// * type
|
||||
// * error
|
||||
// * name
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
walker.on("file", function (root, fileStats, next) {
|
||||
fs.readFile(fileStats.name, function () {
|
||||
// doStuff
|
||||
next();
|
||||
});
|
||||
});
|
||||
|
||||
walker.on("errors", function (root, nodeStatsArray, next) {
|
||||
next();
|
||||
});
|
||||
|
||||
walker.on("end", function () {
|
||||
console.log("all done");
|
||||
});
|
||||
}());
|
||||
```
|
||||
|
||||
### Sync
|
||||
|
||||
Note: You **can't use EventEmitter** if you want truly synchronous walker
|
||||
(although it's synchronous under the hood, it appears not to be due to the use of `process.nextTick()`).
|
||||
|
||||
Instead **you must use `options.listeners`** for truly synchronous walker.
|
||||
|
||||
Although the sync version uses all of the `fs.readSync`, `fs.readdirSync`, and other sync methods,
|
||||
I don't think I can prevent the `process.nextTick()` that `EventEmitter` calls.
|
||||
|
||||
```javascript
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var walk = require('walk');
|
||||
var fs = require('fs');
|
||||
var options;
|
||||
var walker;
|
||||
|
||||
// To be truly synchronous in the emitter and maintain a compatible api,
|
||||
// the listeners must be listed before the object is created
|
||||
options = {
|
||||
listeners: {
|
||||
names: function (root, nodeNamesArray) {
|
||||
nodeNamesArray.sort(function (a, b) {
|
||||
if (a > b) return 1;
|
||||
if (a < b) return -1;
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
, directories: function (root, dirStatsArray, next) {
|
||||
// dirStatsArray is an array of `stat` objects with the additional attributes
|
||||
// * type
|
||||
// * error
|
||||
// * name
|
||||
|
||||
next();
|
||||
}
|
||||
, file: function (root, fileStats, next) {
|
||||
fs.readFile(fileStats.name, function () {
|
||||
// doStuff
|
||||
next();
|
||||
});
|
||||
}
|
||||
, errors: function (root, nodeStatsArray, next) {
|
||||
next();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
walker = walk.walkSync("/tmp", options);
|
||||
|
||||
console.log("all done");
|
||||
}());
|
||||
```
|
||||
|
||||
API
|
||||
====
|
||||
|
||||
Emitted Values
|
||||
|
||||
* `on('XYZ', function(root, stats, next) {})`
|
||||
|
||||
* `root` - the containing the files to be inspected
|
||||
* *stats[Array]* - a single `stats` object or an array with some added attributes
|
||||
* type - 'file', 'directory', etc
|
||||
* error
|
||||
* name - the name of the file, dir, etc
|
||||
* next - no more files will be read until this is called
|
||||
|
||||
Single Events - fired immediately
|
||||
|
||||
* `end` - No files, dirs, etc left to inspect
|
||||
|
||||
* `directoryError` - Error when `fstat` succeeded, but reading path failed (Probably due to permissions).
|
||||
* `nodeError` - Error `fstat` did not succeeded.
|
||||
* `node` - a `stats` object for a node of any type
|
||||
* `file` - includes links when `followLinks` is `true`
|
||||
* `directory` - **NOTE** you could get a recursive loop if `followLinks` and a directory links to its parent
|
||||
* `symbolicLink` - always empty when `followLinks` is `true`
|
||||
* `blockDevice`
|
||||
* `characterDevice`
|
||||
* `FIFO`
|
||||
* `socket`
|
||||
|
||||
Events with Array Arguments - fired after all files in the dir have been `stat`ed
|
||||
|
||||
* `names` - before any `stat` takes place. Useful for sorting and filtering.
|
||||
* Note: the array is an array of `string`s, not `stat` objects
|
||||
* Note: the `next` argument is a `noop`
|
||||
|
||||
* `errors` - errors encountered by `fs.stat` when reading ndes in a directory
|
||||
* `nodes` - an array of `stats` of any type
|
||||
* `files`
|
||||
* `directories` - modification of this array - sorting, removing, etc - affects traversal
|
||||
* `symbolicLinks`
|
||||
* `blockDevices`
|
||||
* `characterDevices`
|
||||
* `FIFOs`
|
||||
* `sockets`
|
||||
|
||||
**Warning** beware of infinite loops when `followLinks` is true (using `walk-recurse` varient).
|
||||
|
||||
Comparisons
|
||||
====
|
||||
|
||||
Tested on my `/System` containing 59,490 (+ self) directories (and lots of files).
|
||||
The size of the text output was 6mb.
|
||||
|
||||
`find`:
|
||||
time bash -c "find /System -type d | wc"
|
||||
59491 97935 6262916
|
||||
|
||||
real 2m27.114s
|
||||
user 0m1.193s
|
||||
sys 0m14.859s
|
||||
|
||||
`find.js`:
|
||||
|
||||
Note that `find.js` omits the start directory
|
||||
|
||||
time bash -c "node examples/find.js /System -type d | wc"
|
||||
59490 97934 6262908
|
||||
|
||||
# Test 1
|
||||
real 2m52.273s
|
||||
user 0m20.374s
|
||||
sys 0m27.800s
|
||||
|
||||
# Test 2
|
||||
real 2m23.725s
|
||||
user 0m18.019s
|
||||
sys 0m23.202s
|
||||
|
||||
# Test 3
|
||||
real 2m50.077s
|
||||
user 0m17.661s
|
||||
sys 0m24.008s
|
||||
|
||||
In conclusion node.js asynchronous walk is much slower than regular "find".
|
||||
|
||||
LICENSE
|
||||
===
|
||||
|
||||
`node-walk` is available under the following licenses:
|
||||
|
||||
* MIT
|
||||
* Apache 2
|
||||
|
||||
Copyright 2011 - Present AJ ONeal
|
92
node_modules/walk/lib/node-type-emitter.js
generated
vendored
Normal file
92
node_modules/walk/lib/node-type-emitter.js
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
/*jshint strict:true node:true es5:true onevar:true laxcomma:true laxbreak:true*/
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
// "FIFO" isn't easy to convert to camelCase and back reliably
|
||||
var isFnodeTypes = [
|
||||
"isFile", "isDirectory", "isSymbolicLink", "isBlockDevice", "isCharacterDevice", "isFIFO", "isSocket"
|
||||
],
|
||||
fnodeTypes = [
|
||||
"file", "directory", "symbolicLink", "blockDevice", "characterDevice", "FIFO", "socket"
|
||||
],
|
||||
fnodeTypesPlural = [
|
||||
"files", "directories", "symbolicLinks", "blockDevices", "characterDevices", "FIFOs", "sockets"
|
||||
];
|
||||
|
||||
|
||||
//
|
||||
function createNodeGroups() {
|
||||
var nodeGroups = {};
|
||||
fnodeTypesPlural.concat("nodes", "errors").forEach(function (fnodeTypePlural) {
|
||||
nodeGroups[fnodeTypePlural] = [];
|
||||
});
|
||||
return nodeGroups;
|
||||
}
|
||||
|
||||
|
||||
// Determine each file node's type
|
||||
//
|
||||
function sortFnodesByType(stat, fnodes) {
|
||||
var i, isType;
|
||||
|
||||
for (i = 0; i < isFnodeTypes.length; i += 1) {
|
||||
isType = isFnodeTypes[i];
|
||||
if (stat[isType]()) {
|
||||
stat.type = fnodeTypes[i];
|
||||
fnodes[fnodeTypesPlural[i]].push(stat);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Get the current number of listeners (which may change)
|
||||
// Emit events to each listener
|
||||
// Wait for all listeners to `next()` before continueing
|
||||
// (in theory this may avoid disk thrashing)
|
||||
function emitSingleEvents(emitter, path, stats, next, self) {
|
||||
var num = 1 + emitter.listeners(stats.type).length + emitter.listeners("node").length;
|
||||
|
||||
function nextWhenReady(flag) {
|
||||
if (flag) {
|
||||
stats.flag = flag;
|
||||
}
|
||||
num -= 1;
|
||||
if (0 === num) { next.call(self); }
|
||||
}
|
||||
|
||||
emitter.emit(stats.type, path, stats, nextWhenReady);
|
||||
emitter.emit("node", path, stats, nextWhenReady);
|
||||
nextWhenReady();
|
||||
}
|
||||
|
||||
|
||||
// Since the risk for disk thrashing among anything
|
||||
// other than files is relatively low, all types are
|
||||
// emitted at once, but all must complete before advancing
|
||||
function emitPluralEvents(emitter, path, nodes, next, self) {
|
||||
var num = 1;
|
||||
|
||||
function nextWhenReady() {
|
||||
num -= 1;
|
||||
if (0 === num) { next.call(self); }
|
||||
}
|
||||
|
||||
fnodeTypesPlural.concat(["nodes", "errors"]).forEach(function (fnodeType) {
|
||||
if (0 === nodes[fnodeType].length) { return; }
|
||||
num += emitter.listeners(fnodeType).length;
|
||||
emitter.emit(fnodeType, path, nodes[fnodeType], nextWhenReady);
|
||||
});
|
||||
nextWhenReady();
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
emitNodeType: emitSingleEvents,
|
||||
emitNodeTypeGroups: emitPluralEvents,
|
||||
isFnodeTypes: isFnodeTypes,
|
||||
fnodeTypes: fnodeTypes,
|
||||
fnodeTypesPlural: fnodeTypesPlural,
|
||||
sortFnodesByType: sortFnodesByType,
|
||||
createNodeGroups: createNodeGroups
|
||||
};
|
||||
}());
|
93
node_modules/walk/lib/walk-async-only.js
generated
vendored
Normal file
93
node_modules/walk/lib/walk-async-only.js
generated
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
(function () {
|
||||
"use strict"
|
||||
|
||||
// Array.prototype.forEachAsync(next, item, i, collection)
|
||||
require('futures/forEachAsync');
|
||||
|
||||
function noop() {}
|
||||
|
||||
var fs = require('fs'),
|
||||
path = require('path'),
|
||||
EventEmitter = require('events').EventEmitter,
|
||||
TypeEmitter = require('./node-type-emitter');
|
||||
|
||||
// 2010-11-25 jorge@jorgechamorro.com
|
||||
function create(pathname, cb) {
|
||||
var emitter = new EventEmitter(),
|
||||
q = [],
|
||||
queue = [q],
|
||||
curpath;
|
||||
|
||||
function walk() {
|
||||
fs.readdir(curpath, function(err, files) {
|
||||
if (err) {
|
||||
emitter.emit('directoryError', curpath, { error: err }, noop);
|
||||
//emitter.emit('error', curpath, { error: err });
|
||||
}
|
||||
// XXX bug was here. next() was omitted
|
||||
if (!files || 0 == files.length) {
|
||||
return next();
|
||||
}
|
||||
|
||||
var fnodeGroups = TypeEmitter.createNodeGroups();
|
||||
|
||||
// TODO could allow user to selectively stat
|
||||
// and don't stat if there are no stat listeners
|
||||
emitter.emit('names', curpath, files, noop);
|
||||
files.forEachAsync(function (cont, file) {
|
||||
emitter.emit('name', curpath, file, noop);
|
||||
fs.lstat(curpath + path.sep + file, function (err, stat) {
|
||||
stat = stat || {};
|
||||
stat.name = file;
|
||||
if (err) {
|
||||
stat.error = err;
|
||||
//emitter.emit('error', curpath, stat);
|
||||
emitter.emit('nodeError', curpath, stat, noop);
|
||||
fnodeGroups.errors.push(stat);
|
||||
cont();
|
||||
} else {
|
||||
TypeEmitter.sortFnodesByType(stat, fnodeGroups);
|
||||
TypeEmitter.emitNodeType(emitter, curpath, stat, cont);
|
||||
}
|
||||
});
|
||||
}).then(function () {
|
||||
if (fnodeGroups.errors.length) {
|
||||
emitter.emit('errors', curpath, fnodeGroups.errors, noop);
|
||||
}
|
||||
TypeEmitter.emitNodeTypeGroups(emitter, curpath, fnodeGroups, function () {
|
||||
var dirs = [];
|
||||
fnodeGroups.directories.forEach(function (stat) {
|
||||
dirs.push(stat.name);
|
||||
});
|
||||
dirs.forEach(fullPath);
|
||||
queue.push(q = dirs);
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function next() {
|
||||
if (q.length) {
|
||||
curpath = q.pop();
|
||||
return walk();
|
||||
}
|
||||
if (queue.length -= 1) {
|
||||
q = queue[queue.length-1];
|
||||
return next();
|
||||
}
|
||||
emitter.emit('end');
|
||||
}
|
||||
|
||||
function fullPath(v,i,o) {
|
||||
o[i]= [curpath, path.sep, v].join('');
|
||||
}
|
||||
|
||||
curpath = pathname;
|
||||
walk();
|
||||
|
||||
return emitter;
|
||||
}
|
||||
|
||||
module.exports = create;
|
||||
}());
|
302
node_modules/walk/lib/walk.js
generated
vendored
Normal file
302
node_modules/walk/lib/walk.js
generated
vendored
Normal file
@@ -0,0 +1,302 @@
|
||||
// Adapted from work by jorge@jorgechamorro.com on 2010-11-25
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
function noop() {}
|
||||
|
||||
var fs = require('fs')
|
||||
, forEachAsync = require('foreachasync').forEachAsync
|
||||
, EventEmitter = require('events').EventEmitter
|
||||
, TypeEmitter = require('./node-type-emitter')
|
||||
, util = require('util')
|
||||
, path = require('path')
|
||||
;
|
||||
|
||||
function appendToDirs(stat) {
|
||||
/*jshint validthis:true*/
|
||||
if(stat.flag && stat.flag === NO_DESCEND) { return; }
|
||||
this.push(stat.name);
|
||||
}
|
||||
|
||||
function wFilesHandlerWrapper(items) {
|
||||
/*jshint validthis:true*/
|
||||
this._wFilesHandler(noop, items);
|
||||
}
|
||||
|
||||
function Walker(pathname, options, sync) {
|
||||
EventEmitter.call(this);
|
||||
|
||||
var me = this
|
||||
;
|
||||
|
||||
options = options || {};
|
||||
me._wStat = options.followLinks && 'stat' || 'lstat';
|
||||
me._wStatSync = me._wStat + 'Sync';
|
||||
me._wsync = sync;
|
||||
me._wq = [];
|
||||
me._wqueue = [me._wq];
|
||||
me._wcurpath = undefined;
|
||||
me._wfilters = options.filters || [];
|
||||
me._wfirstrun = true;
|
||||
me._wcurpath = pathname;
|
||||
|
||||
if (me._wsync) {
|
||||
//console.log('_walkSync');
|
||||
me._wWalk = me._wWalkSync;
|
||||
} else {
|
||||
//console.log('_walkASync');
|
||||
me._wWalk = me._wWalkAsync;
|
||||
}
|
||||
|
||||
options.listeners = options.listeners || {};
|
||||
Object.keys(options.listeners).forEach(function (event) {
|
||||
var callbacks = options.listeners[event]
|
||||
;
|
||||
|
||||
if ('function' === typeof callbacks) {
|
||||
callbacks = [callbacks];
|
||||
}
|
||||
|
||||
callbacks.forEach(function (callback) {
|
||||
me.on(event, callback);
|
||||
});
|
||||
});
|
||||
|
||||
me._wWalk();
|
||||
}
|
||||
|
||||
// Inherits must come before prototype additions
|
||||
util.inherits(Walker, EventEmitter);
|
||||
|
||||
Walker.prototype._wLstatHandler = function (err, stat) {
|
||||
var me = this
|
||||
;
|
||||
|
||||
stat = stat || {};
|
||||
stat.name = me._wcurfile;
|
||||
|
||||
if (err) {
|
||||
stat.error = err;
|
||||
//me.emit('error', curpath, stat);
|
||||
// TODO v3.0 (don't noop the next if there are listeners)
|
||||
me.emit('nodeError', me._wcurpath, stat, noop);
|
||||
me._wfnodegroups.errors.push(stat);
|
||||
me._wCurFileCallback();
|
||||
} else {
|
||||
TypeEmitter.sortFnodesByType(stat, me._wfnodegroups);
|
||||
// NOTE: wCurFileCallback doesn't need thisness, so this is okay
|
||||
TypeEmitter.emitNodeType(me, me._wcurpath, stat, me._wCurFileCallback, me);
|
||||
}
|
||||
};
|
||||
Walker.prototype._wFilesHandler = function (cont, file) {
|
||||
var statPath
|
||||
, me = this
|
||||
;
|
||||
|
||||
|
||||
me._wcurfile = file;
|
||||
me._wCurFileCallback = cont;
|
||||
me.emit('name', me._wcurpath, file, noop);
|
||||
|
||||
statPath = me._wcurpath + path.sep + file;
|
||||
|
||||
if (!me._wsync) {
|
||||
// TODO how to remove this anony?
|
||||
fs[me._wStat](statPath, function (err, stat) {
|
||||
me._wLstatHandler(err, stat);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
me._wLstatHandler(null, fs[me._wStatSync](statPath));
|
||||
} catch(e) {
|
||||
me._wLstatHandler(e);
|
||||
}
|
||||
};
|
||||
Walker.prototype._wOnEmitDone = function () {
|
||||
var me = this
|
||||
, dirs = []
|
||||
;
|
||||
|
||||
me._wfnodegroups.directories.forEach(appendToDirs, dirs);
|
||||
dirs.forEach(me._wJoinPath, me);
|
||||
me._wqueue.push(me._wq = dirs);
|
||||
me._wNext();
|
||||
};
|
||||
Walker.prototype._wPostFilesHandler = function () {
|
||||
var me = this
|
||||
;
|
||||
|
||||
if (me._wfnodegroups.errors.length) {
|
||||
// TODO v3.0 (don't noop the next)
|
||||
// .errors is an array of stats with { name: name, error: error }
|
||||
me.emit('errors', me._wcurpath, me._wfnodegroups.errors, noop);
|
||||
}
|
||||
// XXX emitNodeTypes still needs refactor
|
||||
TypeEmitter.emitNodeTypeGroups(me, me._wcurpath, me._wfnodegroups, me._wOnEmitDone, me);
|
||||
};
|
||||
Walker.prototype._wReadFiles = function () {
|
||||
var me = this
|
||||
;
|
||||
|
||||
if (!me._wcurfiles || 0 === me._wcurfiles.length) {
|
||||
return me._wNext();
|
||||
}
|
||||
|
||||
// TODO could allow user to selectively stat
|
||||
// and don't stat if there are no stat listeners
|
||||
me.emit('names', me._wcurpath, me._wcurfiles, noop);
|
||||
|
||||
if (me._wsync) {
|
||||
me._wcurfiles.forEach(wFilesHandlerWrapper, me);
|
||||
me._wPostFilesHandler();
|
||||
} else {
|
||||
forEachAsync(me._wcurfiles, me._wFilesHandler, me).then(me._wPostFilesHandler);
|
||||
}
|
||||
};
|
||||
Walker.prototype._wReaddirHandler = function (err, files) {
|
||||
var fnodeGroups = TypeEmitter.createNodeGroups()
|
||||
, me = this
|
||||
, parent
|
||||
, child
|
||||
;
|
||||
|
||||
me._wfnodegroups = fnodeGroups;
|
||||
me._wcurfiles = files;
|
||||
|
||||
// no error, great
|
||||
if (!err) {
|
||||
me._wReadFiles();
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO path.sep
|
||||
me._wcurpath = me._wcurpath.replace(/\/$/, '');
|
||||
|
||||
// error? not first run? => directory error
|
||||
if (!me._wfirstrun) {
|
||||
// TODO v3.0 (don't noop the next if there are listeners)
|
||||
me.emit('directoryError', me._wcurpath, { error: err }, noop);
|
||||
// TODO v3.0
|
||||
//me.emit('directoryError', me._wcurpath.replace(/^(.*)\/.*$/, '$1'), { name: me._wcurpath.replace(/^.*\/(.*)/, '$1'), error: err }, noop);
|
||||
me._wReadFiles();
|
||||
return;
|
||||
}
|
||||
|
||||
// error? first run? => maybe a file, maybe a true error
|
||||
me._wfirstrun = false;
|
||||
|
||||
// readdir failed (might be a file), try a stat on the parent
|
||||
parent = me._wcurpath.replace(/^(.*)\/.*$/, '$1');
|
||||
fs[me._wStat](parent, function (e, stat) {
|
||||
|
||||
if (stat) {
|
||||
// success
|
||||
// now try stat on this as a child of the parent directory
|
||||
child = me._wcurpath.replace(/^.*\/(.*)$/, '$1');
|
||||
me._wcurfiles = [child];
|
||||
me._wcurpath = parent;
|
||||
} else {
|
||||
// TODO v3.0
|
||||
//me.emit('directoryError', me._wcurpath.replace(/^(.*)\/.*$/, '$1'), { name: me._wcurpath.replace(/^.*\/(.*)/, '$1'), error: err }, noop);
|
||||
// TODO v3.0 (don't noop the next)
|
||||
// the original readdir error, not the parent stat error
|
||||
me.emit('nodeError', me._wcurpath, { error: err }, noop);
|
||||
}
|
||||
|
||||
me._wReadFiles();
|
||||
});
|
||||
};
|
||||
Walker.prototype._wFilter = function () {
|
||||
var me = this
|
||||
, exclude
|
||||
;
|
||||
|
||||
// Stop directories that contain filter keywords
|
||||
// from continuing through the walk process
|
||||
exclude = me._wfilters.some(function (filter) {
|
||||
if (me._wcurpath.match(filter)) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
return exclude;
|
||||
};
|
||||
Walker.prototype._wWalkSync = function () {
|
||||
//console.log('walkSync');
|
||||
var err
|
||||
, files
|
||||
, me = this
|
||||
;
|
||||
|
||||
try {
|
||||
files = fs.readdirSync(me._wcurpath);
|
||||
} catch(e) {
|
||||
err = e;
|
||||
}
|
||||
|
||||
me._wReaddirHandler(err, files);
|
||||
};
|
||||
Walker.prototype._wWalkAsync = function () {
|
||||
//console.log('walkAsync');
|
||||
var me = this
|
||||
;
|
||||
|
||||
// TODO how to remove this anony?
|
||||
fs.readdir(me._wcurpath, function (err, files) {
|
||||
me._wReaddirHandler(err, files);
|
||||
});
|
||||
};
|
||||
Walker.prototype._wNext = function () {
|
||||
var me = this
|
||||
;
|
||||
|
||||
if (me._paused) {
|
||||
return;
|
||||
}
|
||||
if (me._wq.length) {
|
||||
me._wcurpath = me._wq.pop();
|
||||
while (me._wq.length && me._wFilter()) {
|
||||
me._wcurpath = me._wq.pop();
|
||||
}
|
||||
if (me._wcurpath && !me._wFilter()) {
|
||||
me._wWalk();
|
||||
} else {
|
||||
me._wNext();
|
||||
}
|
||||
return;
|
||||
}
|
||||
me._wqueue.length -= 1;
|
||||
if (me._wqueue.length) {
|
||||
me._wq = me._wqueue[me._wqueue.length - 1];
|
||||
return me._wNext();
|
||||
}
|
||||
|
||||
// To not break compatibility
|
||||
//process.nextTick(function () {
|
||||
me.emit('end');
|
||||
//});
|
||||
};
|
||||
Walker.prototype._wJoinPath = function (v, i, o) {
|
||||
var me = this
|
||||
;
|
||||
|
||||
o[i] = [me._wcurpath, path.sep, v].join('');
|
||||
};
|
||||
Walker.prototype.pause = function () {
|
||||
this._paused = true;
|
||||
};
|
||||
Walker.prototype.resume = function () {
|
||||
this._paused = false;
|
||||
this._wNext();
|
||||
};
|
||||
|
||||
exports.walk = function (path, opts) {
|
||||
return new Walker(path, opts, false);
|
||||
};
|
||||
|
||||
exports.walkSync = function (path, opts) {
|
||||
return new Walker(path, opts, true);
|
||||
};
|
||||
}());
|
68
node_modules/walk/package.json
generated
vendored
Normal file
68
node_modules/walk/package.json
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"_from": "walk@2.3.14",
|
||||
"_id": "walk@2.3.14",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==",
|
||||
"_location": "/walk",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "walk@2.3.14",
|
||||
"name": "walk",
|
||||
"escapedName": "walk",
|
||||
"rawSpec": "2.3.14",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.3.14"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/hbs"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz",
|
||||
"_shasum": "60ec8631cfd23276ae1e7363ce11d626452e1ef3",
|
||||
"_spec": "walk@2.3.14",
|
||||
"_where": "/home/runner/Socketio-Chat-Template/node_modules/hbs",
|
||||
"author": {
|
||||
"name": "AJ ONeal",
|
||||
"email": "coolaj86@gmail.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://git.coolaj86.com/coolaj86/fs-walk.js/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [],
|
||||
"dependencies": {
|
||||
"foreachasync": "^3.0.0"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "A node port of python's os.walk",
|
||||
"devDependencies": {},
|
||||
"directories": {
|
||||
"example": "examples",
|
||||
"test": "test"
|
||||
},
|
||||
"files": [
|
||||
"lib"
|
||||
],
|
||||
"homepage": "https://git.coolaj86.com/coolaj86/fs-walk.js",
|
||||
"keywords": [
|
||||
"util",
|
||||
"os",
|
||||
"sys",
|
||||
"fs",
|
||||
"walk",
|
||||
"walkSync"
|
||||
],
|
||||
"lib": ".",
|
||||
"license": "(MIT OR Apache-2.0)",
|
||||
"main": "./lib/walk.js",
|
||||
"name": "walk",
|
||||
"repository": {
|
||||
"url": "https://git.coolaj86.com/coolaj86/fs-walk.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "./test/walk-test.sh"
|
||||
},
|
||||
"url": "http://git.coolaj86.com/coolaj86/fs-walk.js",
|
||||
"version": "2.3.14"
|
||||
}
|
Reference in New Issue
Block a user