├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── examples ├── filter-pipe.js ├── pipe.js ├── reader.js └── symlink-write.js ├── fstream.js ├── lib ├── abstract.js ├── collect.js ├── dir-reader.js ├── dir-writer.js ├── file-reader.js ├── file-writer.js ├── get-type.js ├── link-reader.js ├── link-writer.js ├── proxy-reader.js ├── proxy-writer.js ├── reader.js ├── socket-reader.js └── writer.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | .*.swp 2 | node_modules/ 3 | examples/deep-copy/ 4 | examples/path/ 5 | examples/filter-copy/ 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "6" 4 | - "4" 5 | - "0.10" 6 | - "0.12" 7 | before_install: 8 | - "npm config set spin false" 9 | - "npm install -g npm/npm" 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter and Contributors 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 15 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Like FS streams, but with stat on them, and supporting directories and 2 | symbolic links, as well as normal files. Also, you can use this to set 3 | the stats on a file, even if you don't change its contents, or to create 4 | a symlink, etc. 5 | 6 | So, for example, you can "write" a directory, and it'll call `mkdir`. You 7 | can specify a uid and gid, and it'll call `chown`. You can specify a 8 | `mtime` and `atime`, and it'll call `utimes`. You can call it a symlink 9 | and provide a `linkpath` and it'll call `symlink`. 10 | 11 | Note that it won't automatically resolve symbolic links. So, if you 12 | call `fstream.Reader('/some/symlink')` then you'll get an object 13 | that stats and then ends immediately (since it has no data). To follow 14 | symbolic links, do this: `fstream.Reader({path:'/some/symlink', follow: 15 | true })`. 16 | 17 | There are various checks to make sure that the bytes emitted are the 18 | same as the intended size, if the size is set. 19 | 20 | ## Examples 21 | 22 | ```javascript 23 | fstream 24 | .Writer({ path: "path/to/file" 25 | , mode: 0755 26 | , size: 6 27 | }) 28 | .write("hello\n") 29 | .end() 30 | ``` 31 | 32 | This will create the directories if they're missing, and then write 33 | `hello\n` into the file, chmod it to 0755, and assert that 6 bytes have 34 | been written when it's done. 35 | 36 | ```javascript 37 | fstream 38 | .Writer({ path: "path/to/file" 39 | , mode: 0755 40 | , size: 6 41 | , flags: "a" 42 | }) 43 | .write("hello\n") 44 | .end() 45 | ``` 46 | 47 | You can pass flags in, if you want to append to a file. 48 | 49 | ```javascript 50 | fstream 51 | .Writer({ path: "path/to/symlink" 52 | , linkpath: "./file" 53 | , SymbolicLink: true 54 | , mode: "0755" // octal strings supported 55 | }) 56 | .end() 57 | ``` 58 | 59 | If isSymbolicLink is a function, it'll be called, and if it returns 60 | true, then it'll treat it as a symlink. If it's not a function, then 61 | any truish value will make a symlink, or you can set `type: 62 | 'SymbolicLink'`, which does the same thing. 63 | 64 | Note that the linkpath is relative to the symbolic link location, not 65 | the parent dir or cwd. 66 | 67 | ```javascript 68 | fstream 69 | .Reader("path/to/dir") 70 | .pipe(fstream.Writer("path/to/other/dir")) 71 | ``` 72 | 73 | This will do like `cp -Rp path/to/dir path/to/other/dir`. If the other 74 | dir exists and isn't a directory, then it'll emit an error. It'll also 75 | set the uid, gid, mode, etc. to be identical. In this way, it's more 76 | like `rsync -a` than simply a copy. 77 | -------------------------------------------------------------------------------- /examples/filter-pipe.js: -------------------------------------------------------------------------------- 1 | var fstream = require('../fstream.js') 2 | var path = require('path') 3 | 4 | var r = fstream.Reader({ 5 | path: path.dirname(__dirname), 6 | filter: function () { 7 | return !this.basename.match(/^\./) && 8 | !this.basename.match(/^node_modules$/) && 9 | !this.basename.match(/^deep-copy$/) && 10 | !this.basename.match(/^filter-copy$/) 11 | } 12 | }) 13 | 14 | // this writer will only write directories 15 | var w = fstream.Writer({ 16 | path: path.resolve(__dirname, 'filter-copy'), 17 | type: 'Directory', 18 | filter: function () { 19 | return this.type === 'Directory' 20 | } 21 | }) 22 | 23 | var indent = '' 24 | 25 | r.on('entry', appears) 26 | r.on('ready', function () { 27 | console.error('ready to begin!', r.path) 28 | }) 29 | 30 | function appears (entry) { 31 | console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename) 32 | if (foggy) { 33 | console.error('FOGGY!') 34 | var p = entry 35 | do { 36 | console.error(p.depth, p.path, p._paused) 37 | p = p.parent 38 | } while (p) 39 | 40 | throw new Error('\u001b[mshould not have entries while foggy') 41 | } 42 | indent += '\t' 43 | entry.on('data', missile(entry)) 44 | entry.on('end', runaway(entry)) 45 | entry.on('entry', appears) 46 | } 47 | 48 | var foggy 49 | function missile (entry) { 50 | function liftFog (who) { 51 | if (!foggy) return 52 | if (who) { 53 | console.error('%s breaks the spell!', who && who.path) 54 | } else { 55 | console.error('the spell expires!') 56 | } 57 | console.error('\u001b[mthe fog lifts!\n') 58 | clearTimeout(foggy) 59 | foggy = null 60 | if (entry._paused) entry.resume() 61 | } 62 | 63 | if (entry.type === 'Directory') { 64 | var ended = false 65 | entry.once('end', function () { ended = true }) 66 | return function (c) { 67 | // throw in some pathological pause()/resume() behavior 68 | // just for extra fun. 69 | process.nextTick(function () { 70 | if (!foggy && !ended) { // && Math.random() < 0.3) { 71 | console.error(indent + '%s casts a spell', entry.basename) 72 | console.error('\na slowing fog comes over the battlefield...\n\u001b[32m') 73 | entry.pause() 74 | entry.once('resume', liftFog) 75 | foggy = setTimeout(liftFog, 1000) 76 | } 77 | }) 78 | } 79 | } 80 | 81 | return function (c) { 82 | var e = Math.random() < 0.5 83 | console.error(indent + '%s %s for %d damage!', 84 | entry.basename, 85 | e ? 'is struck' : 'fires a chunk', 86 | c.length) 87 | } 88 | } 89 | 90 | function runaway (entry) { 91 | return function () { 92 | var e = Math.random() < 0.5 93 | console.error(indent + '%s %s', 94 | entry.basename, 95 | e ? 'turns to flee' : 'is vanquished!') 96 | indent = indent.slice(0, -1) 97 | } 98 | } 99 | 100 | w.on('entry', attacks) 101 | // w.on('ready', function () { attacks(w) }) 102 | function attacks (entry) { 103 | console.error(indent + '%s %s!', entry.basename, 104 | entry.type === 'Directory' ? 'calls for backup' : 'attacks') 105 | entry.on('entry', attacks) 106 | } 107 | 108 | var ended = false 109 | var i = 1 110 | r.on('end', function () { 111 | if (foggy) clearTimeout(foggy) 112 | console.error("\u001b[mIT'S OVER!!") 113 | console.error('A WINNAR IS YOU!') 114 | 115 | console.log('ok ' + (i++) + ' A WINNAR IS YOU') 116 | ended = true 117 | // now go through and verify that everything in there is a dir. 118 | var p = path.resolve(__dirname, 'filter-copy') 119 | var checker = fstream.Reader({ path: p }) 120 | checker.checker = true 121 | checker.on('child', function (e) { 122 | var ok = e.type === 'Directory' 123 | console.log((ok ? '' : 'not ') + 'ok ' + (i++) + 124 | ' should be a dir: ' + 125 | e.path.substr(checker.path.length + 1)) 126 | }) 127 | }) 128 | 129 | process.on('exit', function () { 130 | console.log((ended ? '' : 'not ') + 'ok ' + (i) + ' ended') 131 | console.log('1..' + i) 132 | }) 133 | 134 | r.pipe(w) 135 | -------------------------------------------------------------------------------- /examples/pipe.js: -------------------------------------------------------------------------------- 1 | var fstream = require('../fstream.js') 2 | var path = require('path') 3 | 4 | var r = fstream.Reader({ 5 | path: path.dirname(__dirname), 6 | filter: function () { 7 | return !this.basename.match(/^\./) && 8 | !this.basename.match(/^node_modules$/) && 9 | !this.basename.match(/^deep-copy$/) 10 | } 11 | }) 12 | 13 | var w = fstream.Writer({ 14 | path: path.resolve(__dirname, 'deep-copy'), 15 | type: 'Directory' 16 | }) 17 | 18 | var indent = '' 19 | 20 | r.on('entry', appears) 21 | r.on('ready', function () { 22 | console.error('ready to begin!', r.path) 23 | }) 24 | 25 | function appears (entry) { 26 | console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename, entry) 27 | if (foggy) { 28 | console.error('FOGGY!') 29 | var p = entry 30 | do { 31 | console.error(p.depth, p.path, p._paused) 32 | p = p.parent 33 | } while (p) 34 | 35 | throw new Error('\u001b[mshould not have entries while foggy') 36 | } 37 | indent += '\t' 38 | entry.on('data', missile(entry)) 39 | entry.on('end', runaway(entry)) 40 | entry.on('entry', appears) 41 | } 42 | 43 | var foggy 44 | function missile (entry) { 45 | function liftFog (who) { 46 | if (!foggy) return 47 | if (who) { 48 | console.error('%s breaks the spell!', who && who.path) 49 | } else { 50 | console.error('the spell expires!') 51 | } 52 | console.error('\u001b[mthe fog lifts!\n') 53 | clearTimeout(foggy) 54 | foggy = null 55 | if (entry._paused) entry.resume() 56 | } 57 | 58 | if (entry.type === 'Directory') { 59 | var ended = false 60 | entry.once('end', function () { ended = true }) 61 | return function (c) { 62 | // throw in some pathological pause()/resume() behavior 63 | // just for extra fun. 64 | process.nextTick(function () { 65 | if (!foggy && !ended) { // && Math.random() < 0.3) { 66 | console.error(indent + '%s casts a spell', entry.basename) 67 | console.error('\na slowing fog comes over the battlefield...\n\u001b[32m') 68 | entry.pause() 69 | entry.once('resume', liftFog) 70 | foggy = setTimeout(liftFog, 10) 71 | } 72 | }) 73 | } 74 | } 75 | 76 | return function (c) { 77 | var e = Math.random() < 0.5 78 | console.error(indent + '%s %s for %d damage!', 79 | entry.basename, 80 | e ? 'is struck' : 'fires a chunk', 81 | c.length) 82 | } 83 | } 84 | 85 | function runaway (entry) { 86 | return function () { 87 | var e = Math.random() < 0.5 88 | console.error(indent + '%s %s', 89 | entry.basename, 90 | e ? 'turns to flee' : 'is vanquished!') 91 | indent = indent.slice(0, -1) 92 | } 93 | } 94 | 95 | w.on('entry', attacks) 96 | // w.on('ready', function () { attacks(w) }) 97 | function attacks (entry) { 98 | console.error(indent + '%s %s!', entry.basename, 99 | entry.type === 'Directory' ? 'calls for backup' : 'attacks') 100 | entry.on('entry', attacks) 101 | } 102 | 103 | var ended = false 104 | r.on('end', function () { 105 | if (foggy) clearTimeout(foggy) 106 | console.error("\u001b[mIT'S OVER!!") 107 | console.error('A WINNAR IS YOU!') 108 | 109 | console.log('ok 1 A WINNAR IS YOU') 110 | ended = true 111 | }) 112 | 113 | process.on('exit', function () { 114 | console.log((ended ? '' : 'not ') + 'ok 2 ended') 115 | console.log('1..2') 116 | }) 117 | 118 | r.pipe(w) 119 | -------------------------------------------------------------------------------- /examples/reader.js: -------------------------------------------------------------------------------- 1 | var fstream = require('../fstream.js') 2 | var tap = require('tap') 3 | var fs = require('fs') 4 | var path = require('path') 5 | var dir = path.dirname(__dirname) 6 | 7 | tap.test('reader test', function (t) { 8 | var children = -1 9 | var gotReady = false 10 | var ended = false 11 | 12 | var r = fstream.Reader({ 13 | path: dir, 14 | filter: function () { 15 | // return this.parent === r 16 | return this.parent === r || this === r 17 | } 18 | }) 19 | 20 | r.on('ready', function () { 21 | gotReady = true 22 | children = fs.readdirSync(dir).length 23 | console.error('Setting expected children to ' + children) 24 | t.equal(r.type, 'Directory', 'should be a directory') 25 | }) 26 | 27 | r.on('entry', function (entry) { 28 | children-- 29 | if (!gotReady) { 30 | t.fail('children before ready!') 31 | } 32 | t.equal(entry.dirname, r.path, 'basename is parent dir') 33 | }) 34 | 35 | r.on('error', function (er) { 36 | t.fail(er) 37 | t.end() 38 | process.exit(1) 39 | }) 40 | 41 | r.on('end', function () { 42 | t.equal(children, 0, 'should have seen all children') 43 | ended = true 44 | }) 45 | 46 | var closed = false 47 | r.on('close', function () { 48 | t.ok(ended, 'saw end before close') 49 | t.notOk(closed, 'close should only happen once') 50 | closed = true 51 | t.end() 52 | }) 53 | }) 54 | 55 | tap.test('reader error test', function (t) { 56 | // assumes non-root on a *nix system 57 | var r = fstream.Reader({ path: '/etc/shadow' }) 58 | 59 | r.once('error', function (er) { 60 | t.ok(true) 61 | t.end() 62 | }) 63 | 64 | r.on('end', function () { 65 | t.fail('reader ended without error') 66 | t.end() 67 | }) 68 | }) 69 | -------------------------------------------------------------------------------- /examples/symlink-write.js: -------------------------------------------------------------------------------- 1 | var fstream = require('../fstream.js') 2 | var notOpen = false 3 | process.chdir(__dirname) 4 | 5 | fstream 6 | .Writer({ 7 | path: 'path/to/symlink', 8 | linkpath: './file', 9 | isSymbolicLink: true, 10 | mode: '0755' // octal strings supported 11 | }) 12 | .on('close', function () { 13 | notOpen = true 14 | var fs = require('fs') 15 | var s = fs.lstatSync('path/to/symlink') 16 | var isSym = s.isSymbolicLink() 17 | console.log((isSym ? '' : 'not ') + 'ok 1 should be symlink') 18 | var t = fs.readlinkSync('path/to/symlink') 19 | var isTarget = t === './file' 20 | console.log((isTarget ? '' : 'not ') + 'ok 2 should link to ./file') 21 | }) 22 | .end() 23 | 24 | process.on('exit', function () { 25 | console.log((notOpen ? '' : 'not ') + 'ok 3 should be closed') 26 | console.log('1..3') 27 | }) 28 | -------------------------------------------------------------------------------- /fstream.js: -------------------------------------------------------------------------------- 1 | exports.Abstract = require('./lib/abstract.js') 2 | exports.Reader = require('./lib/reader.js') 3 | exports.Writer = require('./lib/writer.js') 4 | 5 | exports.File = { 6 | Reader: require('./lib/file-reader.js'), 7 | Writer: require('./lib/file-writer.js') 8 | } 9 | 10 | exports.Dir = { 11 | Reader: require('./lib/dir-reader.js'), 12 | Writer: require('./lib/dir-writer.js') 13 | } 14 | 15 | exports.Link = { 16 | Reader: require('./lib/link-reader.js'), 17 | Writer: require('./lib/link-writer.js') 18 | } 19 | 20 | exports.Proxy = { 21 | Reader: require('./lib/proxy-reader.js'), 22 | Writer: require('./lib/proxy-writer.js') 23 | } 24 | 25 | exports.Reader.Dir = exports.DirReader = exports.Dir.Reader 26 | exports.Reader.File = exports.FileReader = exports.File.Reader 27 | exports.Reader.Link = exports.LinkReader = exports.Link.Reader 28 | exports.Reader.Proxy = exports.ProxyReader = exports.Proxy.Reader 29 | 30 | exports.Writer.Dir = exports.DirWriter = exports.Dir.Writer 31 | exports.Writer.File = exports.FileWriter = exports.File.Writer 32 | exports.Writer.Link = exports.LinkWriter = exports.Link.Writer 33 | exports.Writer.Proxy = exports.ProxyWriter = exports.Proxy.Writer 34 | 35 | exports.collect = require('./lib/collect.js') 36 | -------------------------------------------------------------------------------- /lib/abstract.js: -------------------------------------------------------------------------------- 1 | // the parent class for all fstreams. 2 | 3 | module.exports = Abstract 4 | 5 | var Stream = require('stream').Stream 6 | var inherits = require('inherits') 7 | 8 | function Abstract () { 9 | Stream.call(this) 10 | } 11 | 12 | inherits(Abstract, Stream) 13 | 14 | Abstract.prototype.on = function (ev, fn) { 15 | if (ev === 'ready' && this.ready) { 16 | process.nextTick(fn.bind(this)) 17 | } else { 18 | Stream.prototype.on.call(this, ev, fn) 19 | } 20 | return this 21 | } 22 | 23 | Abstract.prototype.abort = function () { 24 | this._aborted = true 25 | this.emit('abort') 26 | } 27 | 28 | Abstract.prototype.destroy = function () {} 29 | 30 | Abstract.prototype.warn = function (msg, code) { 31 | var self = this 32 | var er = decorate(msg, code, self) 33 | if (!self.listeners('warn')) { 34 | console.error('%s %s\n' + 35 | 'path = %s\n' + 36 | 'syscall = %s\n' + 37 | 'fstream_type = %s\n' + 38 | 'fstream_path = %s\n' + 39 | 'fstream_unc_path = %s\n' + 40 | 'fstream_class = %s\n' + 41 | 'fstream_stack =\n%s\n', 42 | code || 'UNKNOWN', 43 | er.stack, 44 | er.path, 45 | er.syscall, 46 | er.fstream_type, 47 | er.fstream_path, 48 | er.fstream_unc_path, 49 | er.fstream_class, 50 | er.fstream_stack.join('\n')) 51 | } else { 52 | self.emit('warn', er) 53 | } 54 | } 55 | 56 | Abstract.prototype.info = function (msg, code) { 57 | this.emit('info', msg, code) 58 | } 59 | 60 | Abstract.prototype.error = function (msg, code, th) { 61 | var er = decorate(msg, code, this) 62 | if (th) throw er 63 | else this.emit('error', er) 64 | } 65 | 66 | function decorate (er, code, self) { 67 | if (!(er instanceof Error)) er = new Error(er) 68 | er.code = er.code || code 69 | er.path = er.path || self.path 70 | er.fstream_type = er.fstream_type || self.type 71 | er.fstream_path = er.fstream_path || self.path 72 | if (self._path !== self.path) { 73 | er.fstream_unc_path = er.fstream_unc_path || self._path 74 | } 75 | if (self.linkpath) { 76 | er.fstream_linkpath = er.fstream_linkpath || self.linkpath 77 | } 78 | er.fstream_class = er.fstream_class || self.constructor.name 79 | er.fstream_stack = er.fstream_stack || 80 | new Error().stack.split(/\n/).slice(3).map(function (s) { 81 | return s.replace(/^ {4}at /, '') 82 | }) 83 | 84 | return er 85 | } 86 | -------------------------------------------------------------------------------- /lib/collect.js: -------------------------------------------------------------------------------- 1 | module.exports = collect 2 | 3 | function collect (stream) { 4 | if (stream._collected) return 5 | 6 | if (stream._paused) return stream.on('resume', collect.bind(null, stream)) 7 | 8 | stream._collected = true 9 | stream.pause() 10 | 11 | stream.on('data', save) 12 | stream.on('end', save) 13 | var buf = [] 14 | function save (b) { 15 | if (typeof b === 'string') b = new Buffer(b) 16 | if (Buffer.isBuffer(b) && !b.length) return 17 | buf.push(b) 18 | } 19 | 20 | stream.on('entry', saveEntry) 21 | var entryBuffer = [] 22 | function saveEntry (e) { 23 | collect(e) 24 | entryBuffer.push(e) 25 | } 26 | 27 | stream.on('proxy', proxyPause) 28 | function proxyPause (p) { 29 | p.pause() 30 | } 31 | 32 | // replace the pipe method with a new version that will 33 | // unlock the buffered stuff. if you just call .pipe() 34 | // without a destination, then it'll re-play the events. 35 | stream.pipe = (function (orig) { 36 | return function (dest) { 37 | // console.error(' === open the pipes', dest && dest.path) 38 | 39 | // let the entries flow through one at a time. 40 | // Once they're all done, then we can resume completely. 41 | var e = 0 42 | ;(function unblockEntry () { 43 | var entry = entryBuffer[e++] 44 | // console.error(" ==== unblock entry", entry && entry.path) 45 | if (!entry) return resume() 46 | entry.on('end', unblockEntry) 47 | if (dest) dest.add(entry) 48 | else stream.emit('entry', entry) 49 | })() 50 | 51 | function resume () { 52 | stream.removeListener('entry', saveEntry) 53 | stream.removeListener('data', save) 54 | stream.removeListener('end', save) 55 | 56 | stream.pipe = orig 57 | if (dest) stream.pipe(dest) 58 | 59 | buf.forEach(function (b) { 60 | if (b) stream.emit('data', b) 61 | else stream.emit('end') 62 | }) 63 | 64 | stream.resume() 65 | } 66 | 67 | return dest 68 | } 69 | })(stream.pipe) 70 | } 71 | -------------------------------------------------------------------------------- /lib/dir-reader.js: -------------------------------------------------------------------------------- 1 | // A thing that emits "entry" events with Reader objects 2 | // Pausing it causes it to stop emitting entry events, and also 3 | // pauses the current entry if there is one. 4 | 5 | module.exports = DirReader 6 | 7 | var fs = require('graceful-fs') 8 | var inherits = require('inherits') 9 | var path = require('path') 10 | var Reader = require('./reader.js') 11 | var assert = require('assert').ok 12 | 13 | inherits(DirReader, Reader) 14 | 15 | function DirReader (props) { 16 | var self = this 17 | if (!(self instanceof DirReader)) { 18 | throw new Error('DirReader must be called as constructor.') 19 | } 20 | 21 | // should already be established as a Directory type 22 | if (props.type !== 'Directory' || !props.Directory) { 23 | throw new Error('Non-directory type ' + props.type) 24 | } 25 | 26 | self.entries = null 27 | self._index = -1 28 | self._paused = false 29 | self._length = -1 30 | 31 | if (props.sort) { 32 | this.sort = props.sort 33 | } 34 | 35 | Reader.call(this, props) 36 | } 37 | 38 | DirReader.prototype._getEntries = function () { 39 | var self = this 40 | 41 | // race condition. might pause() before calling _getEntries, 42 | // and then resume, and try to get them a second time. 43 | if (self._gotEntries) return 44 | self._gotEntries = true 45 | 46 | fs.readdir(self._path, function (er, entries) { 47 | if (er) return self.error(er) 48 | 49 | self.entries = entries 50 | 51 | self.emit('entries', entries) 52 | if (self._paused) self.once('resume', processEntries) 53 | else processEntries() 54 | 55 | function processEntries () { 56 | self._length = self.entries.length 57 | if (typeof self.sort === 'function') { 58 | self.entries = self.entries.sort(self.sort.bind(self)) 59 | } 60 | self._read() 61 | } 62 | }) 63 | } 64 | 65 | // start walking the dir, and emit an "entry" event for each one. 66 | DirReader.prototype._read = function () { 67 | var self = this 68 | 69 | if (!self.entries) return self._getEntries() 70 | 71 | if (self._paused || self._currentEntry || self._aborted) { 72 | // console.error('DR paused=%j, current=%j, aborted=%j', self._paused, !!self._currentEntry, self._aborted) 73 | return 74 | } 75 | 76 | self._index++ 77 | if (self._index >= self.entries.length) { 78 | if (!self._ended) { 79 | self._ended = true 80 | self.emit('end') 81 | self.emit('close') 82 | } 83 | return 84 | } 85 | 86 | // ok, handle this one, then. 87 | 88 | // save creating a proxy, by stat'ing the thing now. 89 | var p = path.resolve(self._path, self.entries[self._index]) 90 | assert(p !== self._path) 91 | assert(self.entries[self._index]) 92 | 93 | // set this to prevent trying to _read() again in the stat time. 94 | self._currentEntry = p 95 | fs[ self.props.follow ? 'stat' : 'lstat' ](p, function (er, stat) { 96 | if (er) return self.error(er) 97 | 98 | var who = self._proxy || self 99 | 100 | stat.path = p 101 | stat.basename = path.basename(p) 102 | stat.dirname = path.dirname(p) 103 | var childProps = self.getChildProps.call(who, stat) 104 | childProps.path = p 105 | childProps.basename = path.basename(p) 106 | childProps.dirname = path.dirname(p) 107 | 108 | var entry = Reader(childProps, stat) 109 | 110 | // console.error("DR Entry", p, stat.size) 111 | 112 | self._currentEntry = entry 113 | 114 | // "entry" events are for direct entries in a specific dir. 115 | // "child" events are for any and all children at all levels. 116 | // This nomenclature is not completely final. 117 | 118 | entry.on('pause', function (who) { 119 | if (!self._paused && !entry._disowned) { 120 | self.pause(who) 121 | } 122 | }) 123 | 124 | entry.on('resume', function (who) { 125 | if (self._paused && !entry._disowned) { 126 | self.resume(who) 127 | } 128 | }) 129 | 130 | entry.on('stat', function (props) { 131 | self.emit('_entryStat', entry, props) 132 | if (entry._aborted) return 133 | if (entry._paused) { 134 | entry.once('resume', function () { 135 | self.emit('entryStat', entry, props) 136 | }) 137 | } else self.emit('entryStat', entry, props) 138 | }) 139 | 140 | entry.on('ready', function EMITCHILD () { 141 | // console.error("DR emit child", entry._path) 142 | if (self._paused) { 143 | // console.error(" DR emit child - try again later") 144 | // pause the child, and emit the "entry" event once we drain. 145 | // console.error("DR pausing child entry") 146 | entry.pause(self) 147 | return self.once('resume', EMITCHILD) 148 | } 149 | 150 | // skip over sockets. they can't be piped around properly, 151 | // so there's really no sense even acknowledging them. 152 | // if someone really wants to see them, they can listen to 153 | // the "socket" events. 154 | if (entry.type === 'Socket') { 155 | self.emit('socket', entry) 156 | } else { 157 | self.emitEntry(entry) 158 | } 159 | }) 160 | 161 | var ended = false 162 | entry.on('close', onend) 163 | entry.on('disown', onend) 164 | function onend () { 165 | if (ended) return 166 | ended = true 167 | self.emit('childEnd', entry) 168 | self.emit('entryEnd', entry) 169 | self._currentEntry = null 170 | if (!self._paused) { 171 | self._read() 172 | } 173 | } 174 | 175 | // XXX Remove this. Works in node as of 0.6.2 or so. 176 | // Long filenames should not break stuff. 177 | entry.on('error', function (er) { 178 | if (entry._swallowErrors) { 179 | self.warn(er) 180 | entry.emit('end') 181 | entry.emit('close') 182 | } else { 183 | self.emit('error', er) 184 | } 185 | }) 186 | 187 | // proxy up some events. 188 | ;[ 189 | 'child', 190 | 'childEnd', 191 | 'warn' 192 | ].forEach(function (ev) { 193 | entry.on(ev, self.emit.bind(self, ev)) 194 | }) 195 | }) 196 | } 197 | 198 | DirReader.prototype.disown = function (entry) { 199 | entry.emit('beforeDisown') 200 | entry._disowned = true 201 | entry.parent = entry.root = null 202 | if (entry === this._currentEntry) { 203 | this._currentEntry = null 204 | } 205 | entry.emit('disown') 206 | } 207 | 208 | DirReader.prototype.getChildProps = function () { 209 | return { 210 | depth: this.depth + 1, 211 | root: this.root || this, 212 | parent: this, 213 | follow: this.follow, 214 | filter: this.filter, 215 | sort: this.props.sort, 216 | hardlinks: this.props.hardlinks 217 | } 218 | } 219 | 220 | DirReader.prototype.pause = function (who) { 221 | var self = this 222 | if (self._paused) return 223 | who = who || self 224 | self._paused = true 225 | if (self._currentEntry && self._currentEntry.pause) { 226 | self._currentEntry.pause(who) 227 | } 228 | self.emit('pause', who) 229 | } 230 | 231 | DirReader.prototype.resume = function (who) { 232 | var self = this 233 | if (!self._paused) return 234 | who = who || self 235 | 236 | self._paused = false 237 | // console.error('DR Emit Resume', self._path) 238 | self.emit('resume', who) 239 | if (self._paused) { 240 | // console.error('DR Re-paused', self._path) 241 | return 242 | } 243 | 244 | if (self._currentEntry) { 245 | if (self._currentEntry.resume) self._currentEntry.resume(who) 246 | } else self._read() 247 | } 248 | 249 | DirReader.prototype.emitEntry = function (entry) { 250 | this.emit('entry', entry) 251 | this.emit('child', entry) 252 | } 253 | -------------------------------------------------------------------------------- /lib/dir-writer.js: -------------------------------------------------------------------------------- 1 | // It is expected that, when .add() returns false, the consumer 2 | // of the DirWriter will pause until a "drain" event occurs. Note 3 | // that this is *almost always going to be the case*, unless the 4 | // thing being written is some sort of unsupported type, and thus 5 | // skipped over. 6 | 7 | module.exports = DirWriter 8 | 9 | var Writer = require('./writer.js') 10 | var inherits = require('inherits') 11 | var mkdir = require('mkdirp') 12 | var path = require('path') 13 | var collect = require('./collect.js') 14 | 15 | inherits(DirWriter, Writer) 16 | 17 | function DirWriter (props) { 18 | var self = this 19 | if (!(self instanceof DirWriter)) { 20 | self.error('DirWriter must be called as constructor.', null, true) 21 | } 22 | 23 | // should already be established as a Directory type 24 | if (props.type !== 'Directory' || !props.Directory) { 25 | self.error('Non-directory type ' + props.type + ' ' + 26 | JSON.stringify(props), null, true) 27 | } 28 | 29 | Writer.call(this, props) 30 | } 31 | 32 | DirWriter.prototype._create = function () { 33 | var self = this 34 | mkdir(self._path, Writer.dirmode, function (er) { 35 | if (er) return self.error(er) 36 | // ready to start getting entries! 37 | self.ready = true 38 | self.emit('ready') 39 | self._process() 40 | }) 41 | } 42 | 43 | // a DirWriter has an add(entry) method, but its .write() doesn't 44 | // do anything. Why a no-op rather than a throw? Because this 45 | // leaves open the door for writing directory metadata for 46 | // gnu/solaris style dumpdirs. 47 | DirWriter.prototype.write = function () { 48 | return true 49 | } 50 | 51 | DirWriter.prototype.end = function () { 52 | this._ended = true 53 | this._process() 54 | } 55 | 56 | DirWriter.prototype.add = function (entry) { 57 | var self = this 58 | 59 | // console.error('\tadd', entry._path, '->', self._path) 60 | collect(entry) 61 | if (!self.ready || self._currentEntry) { 62 | self._buffer.push(entry) 63 | return false 64 | } 65 | 66 | // create a new writer, and pipe the incoming entry into it. 67 | if (self._ended) { 68 | return self.error('add after end') 69 | } 70 | 71 | self._buffer.push(entry) 72 | self._process() 73 | 74 | return this._buffer.length === 0 75 | } 76 | 77 | DirWriter.prototype._process = function () { 78 | var self = this 79 | 80 | // console.error('DW Process p=%j', self._processing, self.basename) 81 | 82 | if (self._processing) return 83 | 84 | var entry = self._buffer.shift() 85 | if (!entry) { 86 | // console.error("DW Drain") 87 | self.emit('drain') 88 | if (self._ended) self._finish() 89 | return 90 | } 91 | 92 | self._processing = true 93 | // console.error("DW Entry", entry._path) 94 | 95 | self.emit('entry', entry) 96 | 97 | // ok, add this entry 98 | // 99 | // don't allow recursive copying 100 | var p = entry 101 | var pp 102 | do { 103 | pp = p._path || p.path 104 | if (pp === self.root._path || pp === self._path || 105 | (pp && pp.indexOf(self._path) === 0)) { 106 | // console.error('DW Exit (recursive)', entry.basename, self._path) 107 | self._processing = false 108 | if (entry._collected) entry.pipe() 109 | return self._process() 110 | } 111 | p = p.parent 112 | } while (p) 113 | 114 | // console.error("DW not recursive") 115 | 116 | // chop off the entry's root dir, replace with ours 117 | var props = { 118 | parent: self, 119 | root: self.root || self, 120 | type: entry.type, 121 | depth: self.depth + 1 122 | } 123 | 124 | pp = entry._path || entry.path || entry.props.path 125 | if (entry.parent) { 126 | pp = pp.substr(entry.parent._path.length + 1) 127 | } 128 | // get rid of any ../../ shenanigans 129 | props.path = path.join(self.path, path.join('/', pp)) 130 | 131 | // if i have a filter, the child should inherit it. 132 | props.filter = self.filter 133 | 134 | // all the rest of the stuff, copy over from the source. 135 | Object.keys(entry.props).forEach(function (k) { 136 | if (!props.hasOwnProperty(k)) { 137 | props[k] = entry.props[k] 138 | } 139 | }) 140 | 141 | // not sure at this point what kind of writer this is. 142 | var child = self._currentChild = new Writer(props) 143 | child.on('ready', function () { 144 | // console.error("DW Child Ready", child.type, child._path) 145 | // console.error(" resuming", entry._path) 146 | entry.pipe(child) 147 | entry.resume() 148 | }) 149 | 150 | // XXX Make this work in node. 151 | // Long filenames should not break stuff. 152 | child.on('error', function (er) { 153 | if (child._swallowErrors) { 154 | self.warn(er) 155 | child.emit('end') 156 | child.emit('close') 157 | } else { 158 | self.emit('error', er) 159 | } 160 | }) 161 | 162 | // we fire _end internally *after* end, so that we don't move on 163 | // until any "end" listeners have had their chance to do stuff. 164 | child.on('close', onend) 165 | var ended = false 166 | function onend () { 167 | if (ended) return 168 | ended = true 169 | // console.error("* DW Child end", child.basename) 170 | self._currentChild = null 171 | self._processing = false 172 | self._process() 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /lib/file-reader.js: -------------------------------------------------------------------------------- 1 | // Basically just a wrapper around an fs.ReadStream 2 | 3 | module.exports = FileReader 4 | 5 | var fs = require('graceful-fs') 6 | var inherits = require('inherits') 7 | var Reader = require('./reader.js') 8 | var EOF = {EOF: true} 9 | var CLOSE = {CLOSE: true} 10 | 11 | inherits(FileReader, Reader) 12 | 13 | function FileReader (props) { 14 | // console.error(" FR create", props.path, props.size, new Error().stack) 15 | var self = this 16 | if (!(self instanceof FileReader)) { 17 | throw new Error('FileReader must be called as constructor.') 18 | } 19 | 20 | // should already be established as a File type 21 | // XXX Todo: preserve hardlinks by tracking dev+inode+nlink, 22 | // with a HardLinkReader class. 23 | if (!((props.type === 'Link' && props.Link) || 24 | (props.type === 'File' && props.File))) { 25 | throw new Error('Non-file type ' + props.type) 26 | } 27 | 28 | self._buffer = [] 29 | self._bytesEmitted = 0 30 | Reader.call(self, props) 31 | } 32 | 33 | FileReader.prototype._getStream = function () { 34 | var self = this 35 | var stream = self._stream = fs.createReadStream(self._path, self.props) 36 | 37 | if (self.props.blksize) { 38 | stream.bufferSize = self.props.blksize 39 | } 40 | 41 | stream.on('open', self.emit.bind(self, 'open')) 42 | 43 | stream.on('data', function (c) { 44 | // console.error('\t\t%d %s', c.length, self.basename) 45 | self._bytesEmitted += c.length 46 | // no point saving empty chunks 47 | if (!c.length) { 48 | return 49 | } else if (self._paused || self._buffer.length) { 50 | self._buffer.push(c) 51 | self._read() 52 | } else self.emit('data', c) 53 | }) 54 | 55 | stream.on('end', function () { 56 | if (self._paused || self._buffer.length) { 57 | // console.error('FR Buffering End', self._path) 58 | self._buffer.push(EOF) 59 | self._read() 60 | } else { 61 | self.emit('end') 62 | } 63 | 64 | if (self._bytesEmitted !== self.props.size) { 65 | self.error("Didn't get expected byte count\n" + 66 | 'expect: ' + self.props.size + '\n' + 67 | 'actual: ' + self._bytesEmitted) 68 | } 69 | }) 70 | 71 | stream.on('close', function () { 72 | if (self._paused || self._buffer.length) { 73 | // console.error('FR Buffering Close', self._path) 74 | self._buffer.push(CLOSE) 75 | self._read() 76 | } else { 77 | // console.error('FR close 1', self._path) 78 | self.emit('close') 79 | } 80 | }) 81 | 82 | stream.on('error', function (e) { 83 | self.emit('error', e) 84 | }) 85 | 86 | self._read() 87 | } 88 | 89 | FileReader.prototype._read = function () { 90 | var self = this 91 | // console.error('FR _read', self._path) 92 | if (self._paused) { 93 | // console.error('FR _read paused', self._path) 94 | return 95 | } 96 | 97 | if (!self._stream) { 98 | // console.error('FR _getStream calling', self._path) 99 | return self._getStream() 100 | } 101 | 102 | // clear out the buffer, if there is one. 103 | if (self._buffer.length) { 104 | // console.error('FR _read has buffer', self._buffer.length, self._path) 105 | var buf = self._buffer 106 | for (var i = 0, l = buf.length; i < l; i++) { 107 | var c = buf[i] 108 | if (c === EOF) { 109 | // console.error('FR Read emitting buffered end', self._path) 110 | self.emit('end') 111 | } else if (c === CLOSE) { 112 | // console.error('FR Read emitting buffered close', self._path) 113 | self.emit('close') 114 | } else { 115 | // console.error('FR Read emitting buffered data', self._path) 116 | self.emit('data', c) 117 | } 118 | 119 | if (self._paused) { 120 | // console.error('FR Read Re-pausing at '+i, self._path) 121 | self._buffer = buf.slice(i) 122 | return 123 | } 124 | } 125 | self._buffer.length = 0 126 | } 127 | // console.error("FR _read done") 128 | // that's about all there is to it. 129 | } 130 | 131 | FileReader.prototype.pause = function (who) { 132 | var self = this 133 | // console.error('FR Pause', self._path) 134 | if (self._paused) return 135 | who = who || self 136 | self._paused = true 137 | if (self._stream) self._stream.pause() 138 | self.emit('pause', who) 139 | } 140 | 141 | FileReader.prototype.resume = function (who) { 142 | var self = this 143 | // console.error('FR Resume', self._path) 144 | if (!self._paused) return 145 | who = who || self 146 | self.emit('resume', who) 147 | self._paused = false 148 | if (self._stream) self._stream.resume() 149 | self._read() 150 | } 151 | -------------------------------------------------------------------------------- /lib/file-writer.js: -------------------------------------------------------------------------------- 1 | module.exports = FileWriter 2 | 3 | var fs = require('graceful-fs') 4 | var Writer = require('./writer.js') 5 | var inherits = require('inherits') 6 | var EOF = {} 7 | 8 | inherits(FileWriter, Writer) 9 | 10 | function FileWriter (props) { 11 | var self = this 12 | if (!(self instanceof FileWriter)) { 13 | throw new Error('FileWriter must be called as constructor.') 14 | } 15 | 16 | // should already be established as a File type 17 | if (props.type !== 'File' || !props.File) { 18 | throw new Error('Non-file type ' + props.type) 19 | } 20 | 21 | self._buffer = [] 22 | self._bytesWritten = 0 23 | 24 | Writer.call(this, props) 25 | } 26 | 27 | FileWriter.prototype._create = function () { 28 | var self = this 29 | if (self._stream) return 30 | 31 | var so = {} 32 | if (self.props.flags) so.flags = self.props.flags 33 | so.mode = Writer.filemode 34 | if (self._old && self._old.blksize) so.bufferSize = self._old.blksize 35 | 36 | self._stream = fs.createWriteStream(self._path, so) 37 | 38 | self._stream.on('open', function () { 39 | // console.error("FW open", self._buffer, self._path) 40 | self.ready = true 41 | self._buffer.forEach(function (c) { 42 | if (c === EOF) self._stream.end() 43 | else self._stream.write(c) 44 | }) 45 | self.emit('ready') 46 | // give this a kick just in case it needs it. 47 | self.emit('drain') 48 | }) 49 | 50 | self._stream.on('error', function (er) { self.emit('error', er) }) 51 | 52 | self._stream.on('drain', function () { self.emit('drain') }) 53 | 54 | self._stream.on('close', function () { 55 | // console.error('\n\nFW Stream Close', self._path, self.size) 56 | self._finish() 57 | }) 58 | } 59 | 60 | FileWriter.prototype.write = function (c) { 61 | var self = this 62 | 63 | self._bytesWritten += c.length 64 | 65 | if (!self.ready) { 66 | if (!Buffer.isBuffer(c) && typeof c !== 'string') { 67 | throw new Error('invalid write data') 68 | } 69 | self._buffer.push(c) 70 | return false 71 | } 72 | 73 | var ret = self._stream.write(c) 74 | // console.error('\t-- fw wrote, _stream says', ret, self._stream._queue.length) 75 | 76 | // allow 2 buffered writes, because otherwise there's just too 77 | // much stop and go bs. 78 | if (ret === false && self._stream._queue) { 79 | return self._stream._queue.length <= 2 80 | } else { 81 | return ret 82 | } 83 | } 84 | 85 | FileWriter.prototype.end = function (c) { 86 | var self = this 87 | 88 | if (c) self.write(c) 89 | 90 | if (!self.ready) { 91 | self._buffer.push(EOF) 92 | return false 93 | } 94 | 95 | return self._stream.end() 96 | } 97 | 98 | FileWriter.prototype._finish = function () { 99 | var self = this 100 | if (typeof self.size === 'number' && self._bytesWritten !== self.size) { 101 | self.error( 102 | 'Did not get expected byte count.\n' + 103 | 'expect: ' + self.size + '\n' + 104 | 'actual: ' + self._bytesWritten) 105 | } 106 | Writer.prototype._finish.call(self) 107 | } 108 | -------------------------------------------------------------------------------- /lib/get-type.js: -------------------------------------------------------------------------------- 1 | module.exports = getType 2 | 3 | function getType (st) { 4 | var types = [ 5 | 'Directory', 6 | 'File', 7 | 'SymbolicLink', 8 | 'Link', // special for hardlinks from tarballs 9 | 'BlockDevice', 10 | 'CharacterDevice', 11 | 'FIFO', 12 | 'Socket' 13 | ] 14 | var type 15 | 16 | if (st.type && types.indexOf(st.type) !== -1) { 17 | st[st.type] = true 18 | return st.type 19 | } 20 | 21 | for (var i = 0, l = types.length; i < l; i++) { 22 | type = types[i] 23 | var is = st[type] || st['is' + type] 24 | if (typeof is === 'function') is = is.call(st) 25 | if (is) { 26 | st[type] = true 27 | st.type = type 28 | return type 29 | } 30 | } 31 | 32 | return null 33 | } 34 | -------------------------------------------------------------------------------- /lib/link-reader.js: -------------------------------------------------------------------------------- 1 | // Basically just a wrapper around an fs.readlink 2 | // 3 | // XXX: Enhance this to support the Link type, by keeping 4 | // a lookup table of {:}, so that hardlinks 5 | // can be preserved in tarballs. 6 | 7 | module.exports = LinkReader 8 | 9 | var fs = require('graceful-fs') 10 | var inherits = require('inherits') 11 | var Reader = require('./reader.js') 12 | 13 | inherits(LinkReader, Reader) 14 | 15 | function LinkReader (props) { 16 | var self = this 17 | if (!(self instanceof LinkReader)) { 18 | throw new Error('LinkReader must be called as constructor.') 19 | } 20 | 21 | if (!((props.type === 'Link' && props.Link) || 22 | (props.type === 'SymbolicLink' && props.SymbolicLink))) { 23 | throw new Error('Non-link type ' + props.type) 24 | } 25 | 26 | Reader.call(self, props) 27 | } 28 | 29 | // When piping a LinkReader into a LinkWriter, we have to 30 | // already have the linkpath property set, so that has to 31 | // happen *before* the "ready" event, which means we need to 32 | // override the _stat method. 33 | LinkReader.prototype._stat = function (currentStat) { 34 | var self = this 35 | fs.readlink(self._path, function (er, linkpath) { 36 | if (er) return self.error(er) 37 | self.linkpath = self.props.linkpath = linkpath 38 | self.emit('linkpath', linkpath) 39 | Reader.prototype._stat.call(self, currentStat) 40 | }) 41 | } 42 | 43 | LinkReader.prototype._read = function () { 44 | var self = this 45 | if (self._paused) return 46 | // basically just a no-op, since we got all the info we need 47 | // from the _stat method 48 | if (!self._ended) { 49 | self.emit('end') 50 | self.emit('close') 51 | self._ended = true 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/link-writer.js: -------------------------------------------------------------------------------- 1 | module.exports = LinkWriter 2 | 3 | var fs = require('graceful-fs') 4 | var Writer = require('./writer.js') 5 | var inherits = require('inherits') 6 | var path = require('path') 7 | var rimraf = require('rimraf') 8 | 9 | inherits(LinkWriter, Writer) 10 | 11 | function LinkWriter (props) { 12 | var self = this 13 | if (!(self instanceof LinkWriter)) { 14 | throw new Error('LinkWriter must be called as constructor.') 15 | } 16 | 17 | // should already be established as a Link type 18 | if (!((props.type === 'Link' && props.Link) || 19 | (props.type === 'SymbolicLink' && props.SymbolicLink))) { 20 | throw new Error('Non-link type ' + props.type) 21 | } 22 | 23 | if (props.linkpath === '') props.linkpath = '.' 24 | if (!props.linkpath) { 25 | self.error('Need linkpath property to create ' + props.type) 26 | } 27 | 28 | Writer.call(this, props) 29 | } 30 | 31 | LinkWriter.prototype._create = function () { 32 | // console.error(" LW _create") 33 | var self = this 34 | var hard = self.type === 'Link' || process.platform === 'win32' 35 | var link = hard ? 'link' : 'symlink' 36 | var lp = hard ? path.resolve(self.dirname, self.linkpath) : self.linkpath 37 | 38 | // can only change the link path by clobbering 39 | // For hard links, let's just assume that's always the case, since 40 | // there's no good way to read them if we don't already know. 41 | if (hard) return clobber(self, lp, link) 42 | 43 | fs.readlink(self._path, function (er, p) { 44 | // only skip creation if it's exactly the same link 45 | if (p && p === lp) return finish(self) 46 | clobber(self, lp, link) 47 | }) 48 | } 49 | 50 | function clobber (self, lp, link) { 51 | rimraf(self._path, function (er) { 52 | if (er) return self.error(er) 53 | create(self, lp, link) 54 | }) 55 | } 56 | 57 | function create (self, lp, link) { 58 | fs[link](lp, self._path, function (er) { 59 | // if this is a hard link, and we're in the process of writing out a 60 | // directory, it's very possible that the thing we're linking to 61 | // doesn't exist yet (especially if it was intended as a symlink), 62 | // so swallow ENOENT errors here and just soldier in. 63 | // Additionally, an EPERM or EACCES can happen on win32 if it's trying 64 | // to make a link to a directory. Again, just skip it. 65 | // A better solution would be to have fs.symlink be supported on 66 | // windows in some nice fashion. 67 | if (er) { 68 | if ((er.code === 'ENOENT' || 69 | er.code === 'EACCES' || 70 | er.code === 'EPERM') && process.platform === 'win32') { 71 | self.ready = true 72 | self.emit('ready') 73 | self.emit('end') 74 | self.emit('close') 75 | self.end = self._finish = function () {} 76 | } else return self.error(er) 77 | } 78 | finish(self) 79 | }) 80 | } 81 | 82 | function finish (self) { 83 | self.ready = true 84 | self.emit('ready') 85 | if (self._ended && !self._finished) self._finish() 86 | } 87 | 88 | LinkWriter.prototype.end = function () { 89 | // console.error("LW finish in end") 90 | this._ended = true 91 | if (this.ready) { 92 | this._finished = true 93 | this._finish() 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/proxy-reader.js: -------------------------------------------------------------------------------- 1 | // A reader for when we don't yet know what kind of thing 2 | // the thing is. 3 | 4 | module.exports = ProxyReader 5 | 6 | var Reader = require('./reader.js') 7 | var getType = require('./get-type.js') 8 | var inherits = require('inherits') 9 | var fs = require('graceful-fs') 10 | 11 | inherits(ProxyReader, Reader) 12 | 13 | function ProxyReader (props) { 14 | var self = this 15 | if (!(self instanceof ProxyReader)) { 16 | throw new Error('ProxyReader must be called as constructor.') 17 | } 18 | 19 | self.props = props 20 | self._buffer = [] 21 | self.ready = false 22 | 23 | Reader.call(self, props) 24 | } 25 | 26 | ProxyReader.prototype._stat = function () { 27 | var self = this 28 | var props = self.props 29 | // stat the thing to see what the proxy should be. 30 | var stat = props.follow ? 'stat' : 'lstat' 31 | 32 | fs[stat](props.path, function (er, current) { 33 | var type 34 | if (er || !current) { 35 | type = 'File' 36 | } else { 37 | type = getType(current) 38 | } 39 | 40 | props[type] = true 41 | props.type = self.type = type 42 | 43 | self._old = current 44 | self._addProxy(Reader(props, current)) 45 | }) 46 | } 47 | 48 | ProxyReader.prototype._addProxy = function (proxy) { 49 | var self = this 50 | if (self._proxyTarget) { 51 | return self.error('proxy already set') 52 | } 53 | 54 | self._proxyTarget = proxy 55 | proxy._proxy = self 56 | 57 | ;[ 58 | 'error', 59 | 'data', 60 | 'end', 61 | 'close', 62 | 'linkpath', 63 | 'entry', 64 | 'entryEnd', 65 | 'child', 66 | 'childEnd', 67 | 'warn', 68 | 'stat' 69 | ].forEach(function (ev) { 70 | // console.error('~~ proxy event', ev, self.path) 71 | proxy.on(ev, self.emit.bind(self, ev)) 72 | }) 73 | 74 | self.emit('proxy', proxy) 75 | 76 | proxy.on('ready', function () { 77 | // console.error("~~ proxy is ready!", self.path) 78 | self.ready = true 79 | self.emit('ready') 80 | }) 81 | 82 | var calls = self._buffer 83 | self._buffer.length = 0 84 | calls.forEach(function (c) { 85 | proxy[c[0]].apply(proxy, c[1]) 86 | }) 87 | } 88 | 89 | ProxyReader.prototype.pause = function () { 90 | return this._proxyTarget ? this._proxyTarget.pause() : false 91 | } 92 | 93 | ProxyReader.prototype.resume = function () { 94 | return this._proxyTarget ? this._proxyTarget.resume() : false 95 | } 96 | -------------------------------------------------------------------------------- /lib/proxy-writer.js: -------------------------------------------------------------------------------- 1 | // A writer for when we don't know what kind of thing 2 | // the thing is. That is, it's not explicitly set, 3 | // so we're going to make it whatever the thing already 4 | // is, or "File" 5 | // 6 | // Until then, collect all events. 7 | 8 | module.exports = ProxyWriter 9 | 10 | var Writer = require('./writer.js') 11 | var getType = require('./get-type.js') 12 | var inherits = require('inherits') 13 | var collect = require('./collect.js') 14 | var fs = require('fs') 15 | 16 | inherits(ProxyWriter, Writer) 17 | 18 | function ProxyWriter (props) { 19 | var self = this 20 | if (!(self instanceof ProxyWriter)) { 21 | throw new Error('ProxyWriter must be called as constructor.') 22 | } 23 | 24 | self.props = props 25 | self._needDrain = false 26 | 27 | Writer.call(self, props) 28 | } 29 | 30 | ProxyWriter.prototype._stat = function () { 31 | var self = this 32 | var props = self.props 33 | // stat the thing to see what the proxy should be. 34 | var stat = props.follow ? 'stat' : 'lstat' 35 | 36 | fs[stat](props.path, function (er, current) { 37 | var type 38 | if (er || !current) { 39 | type = 'File' 40 | } else { 41 | type = getType(current) 42 | } 43 | 44 | props[type] = true 45 | props.type = self.type = type 46 | 47 | self._old = current 48 | self._addProxy(Writer(props, current)) 49 | }) 50 | } 51 | 52 | ProxyWriter.prototype._addProxy = function (proxy) { 53 | // console.error("~~ set proxy", this.path) 54 | var self = this 55 | if (self._proxy) { 56 | return self.error('proxy already set') 57 | } 58 | 59 | self._proxy = proxy 60 | ;[ 61 | 'ready', 62 | 'error', 63 | 'close', 64 | 'pipe', 65 | 'drain', 66 | 'warn' 67 | ].forEach(function (ev) { 68 | proxy.on(ev, self.emit.bind(self, ev)) 69 | }) 70 | 71 | self.emit('proxy', proxy) 72 | 73 | var calls = self._buffer 74 | calls.forEach(function (c) { 75 | // console.error("~~ ~~ proxy buffered call", c[0], c[1]) 76 | proxy[c[0]].apply(proxy, c[1]) 77 | }) 78 | self._buffer.length = 0 79 | if (self._needsDrain) self.emit('drain') 80 | } 81 | 82 | ProxyWriter.prototype.add = function (entry) { 83 | // console.error("~~ proxy add") 84 | collect(entry) 85 | 86 | if (!this._proxy) { 87 | this._buffer.push(['add', [entry]]) 88 | this._needDrain = true 89 | return false 90 | } 91 | return this._proxy.add(entry) 92 | } 93 | 94 | ProxyWriter.prototype.write = function (c) { 95 | // console.error('~~ proxy write') 96 | if (!this._proxy) { 97 | this._buffer.push(['write', [c]]) 98 | this._needDrain = true 99 | return false 100 | } 101 | return this._proxy.write(c) 102 | } 103 | 104 | ProxyWriter.prototype.end = function (c) { 105 | // console.error('~~ proxy end') 106 | if (!this._proxy) { 107 | this._buffer.push(['end', [c]]) 108 | return false 109 | } 110 | return this._proxy.end(c) 111 | } 112 | -------------------------------------------------------------------------------- /lib/reader.js: -------------------------------------------------------------------------------- 1 | module.exports = Reader 2 | 3 | var fs = require('graceful-fs') 4 | var Stream = require('stream').Stream 5 | var inherits = require('inherits') 6 | var path = require('path') 7 | var getType = require('./get-type.js') 8 | var hardLinks = Reader.hardLinks = {} 9 | var Abstract = require('./abstract.js') 10 | 11 | // Must do this *before* loading the child classes 12 | inherits(Reader, Abstract) 13 | 14 | var LinkReader = require('./link-reader.js') 15 | 16 | function Reader (props, currentStat) { 17 | var self = this 18 | if (!(self instanceof Reader)) return new Reader(props, currentStat) 19 | 20 | if (typeof props === 'string') { 21 | props = { path: props } 22 | } 23 | 24 | // polymorphism. 25 | // call fstream.Reader(dir) to get a DirReader object, etc. 26 | // Note that, unlike in the Writer case, ProxyReader is going 27 | // to be the *normal* state of affairs, since we rarely know 28 | // the type of a file prior to reading it. 29 | 30 | var type 31 | var ClassType 32 | 33 | if (props.type && typeof props.type === 'function') { 34 | type = props.type 35 | ClassType = type 36 | } else { 37 | type = getType(props) 38 | ClassType = Reader 39 | } 40 | 41 | if (currentStat && !type) { 42 | type = getType(currentStat) 43 | props[type] = true 44 | props.type = type 45 | } 46 | 47 | switch (type) { 48 | case 'Directory': 49 | ClassType = require('./dir-reader.js') 50 | break 51 | 52 | case 'Link': 53 | // XXX hard links are just files. 54 | // However, it would be good to keep track of files' dev+inode 55 | // and nlink values, and create a HardLinkReader that emits 56 | // a linkpath value of the original copy, so that the tar 57 | // writer can preserve them. 58 | // ClassType = HardLinkReader 59 | // break 60 | 61 | case 'File': 62 | ClassType = require('./file-reader.js') 63 | break 64 | 65 | case 'SymbolicLink': 66 | ClassType = LinkReader 67 | break 68 | 69 | case 'Socket': 70 | ClassType = require('./socket-reader.js') 71 | break 72 | 73 | case null: 74 | ClassType = require('./proxy-reader.js') 75 | break 76 | } 77 | 78 | if (!(self instanceof ClassType)) { 79 | return new ClassType(props) 80 | } 81 | 82 | Abstract.call(self) 83 | 84 | if (!props.path) { 85 | self.error('Must provide a path', null, true) 86 | } 87 | 88 | self.readable = true 89 | self.writable = false 90 | 91 | self.type = type 92 | self.props = props 93 | self.depth = props.depth = props.depth || 0 94 | self.parent = props.parent || null 95 | self.root = props.root || (props.parent && props.parent.root) || self 96 | 97 | self._path = self.path = path.resolve(props.path) 98 | if (process.platform === 'win32') { 99 | self.path = self._path = self.path.replace(/\?/g, '_') 100 | if (self._path.length >= 260) { 101 | // how DOES one create files on the moon? 102 | // if the path has spaces in it, then UNC will fail. 103 | self._swallowErrors = true 104 | // if (self._path.indexOf(" ") === -1) { 105 | self._path = '\\\\?\\' + self.path.replace(/\//g, '\\') 106 | // } 107 | } 108 | } 109 | self.basename = props.basename = path.basename(self.path) 110 | self.dirname = props.dirname = path.dirname(self.path) 111 | 112 | // these have served their purpose, and are now just noisy clutter 113 | props.parent = props.root = null 114 | 115 | // console.error("\n\n\n%s setting size to", props.path, props.size) 116 | self.size = props.size 117 | self.filter = typeof props.filter === 'function' ? props.filter : null 118 | if (props.sort === 'alpha') props.sort = alphasort 119 | 120 | // start the ball rolling. 121 | // this will stat the thing, and then call self._read() 122 | // to start reading whatever it is. 123 | // console.error("calling stat", props.path, currentStat) 124 | self._stat(currentStat) 125 | } 126 | 127 | function alphasort (a, b) { 128 | return a === b ? 0 129 | : a.toLowerCase() > b.toLowerCase() ? 1 130 | : a.toLowerCase() < b.toLowerCase() ? -1 131 | : a > b ? 1 132 | : -1 133 | } 134 | 135 | Reader.prototype._stat = function (currentStat) { 136 | var self = this 137 | var props = self.props 138 | var stat = props.follow ? 'stat' : 'lstat' 139 | // console.error("Reader._stat", self._path, currentStat) 140 | if (currentStat) process.nextTick(statCb.bind(null, null, currentStat)) 141 | else fs[stat](self._path, statCb) 142 | 143 | function statCb (er, props_) { 144 | // console.error("Reader._stat, statCb", self._path, props_, props_.nlink) 145 | if (er) return self.error(er) 146 | 147 | Object.keys(props_).forEach(function (k) { 148 | props[k] = props_[k] 149 | }) 150 | 151 | // if it's not the expected size, then abort here. 152 | if (undefined !== self.size && props.size !== self.size) { 153 | return self.error('incorrect size') 154 | } 155 | self.size = props.size 156 | 157 | var type = getType(props) 158 | var handleHardlinks = props.hardlinks !== false 159 | 160 | // special little thing for handling hardlinks. 161 | if (handleHardlinks && type !== 'Directory' && props.nlink && props.nlink > 1) { 162 | var k = props.dev + ':' + props.ino 163 | // console.error("Reader has nlink", self._path, k) 164 | if (hardLinks[k] === self._path || !hardLinks[k]) { 165 | hardLinks[k] = self._path 166 | } else { 167 | // switch into hardlink mode. 168 | type = self.type = self.props.type = 'Link' 169 | self.Link = self.props.Link = true 170 | self.linkpath = self.props.linkpath = hardLinks[k] 171 | // console.error("Hardlink detected, switching mode", self._path, self.linkpath) 172 | // Setting __proto__ would arguably be the "correct" 173 | // approach here, but that just seems too wrong. 174 | self._stat = self._read = LinkReader.prototype._read 175 | } 176 | } 177 | 178 | if (self.type && self.type !== type) { 179 | self.error('Unexpected type: ' + type) 180 | } 181 | 182 | // if the filter doesn't pass, then just skip over this one. 183 | // still have to emit end so that dir-walking can move on. 184 | if (self.filter) { 185 | var who = self._proxy || self 186 | // special handling for ProxyReaders 187 | if (!self.filter.call(who, who, props)) { 188 | if (!self._disowned) { 189 | self.abort() 190 | self.emit('end') 191 | self.emit('close') 192 | } 193 | return 194 | } 195 | } 196 | 197 | // last chance to abort or disown before the flow starts! 198 | var events = ['_stat', 'stat', 'ready'] 199 | var e = 0 200 | ;(function go () { 201 | if (self._aborted) { 202 | self.emit('end') 203 | self.emit('close') 204 | return 205 | } 206 | 207 | if (self._paused && self.type !== 'Directory') { 208 | self.once('resume', go) 209 | return 210 | } 211 | 212 | var ev = events[e++] 213 | if (!ev) { 214 | return self._read() 215 | } 216 | self.emit(ev, props) 217 | go() 218 | })() 219 | } 220 | } 221 | 222 | Reader.prototype.pipe = function (dest) { 223 | var self = this 224 | if (typeof dest.add === 'function') { 225 | // piping to a multi-compatible, and we've got directory entries. 226 | self.on('entry', function (entry) { 227 | var ret = dest.add(entry) 228 | if (ret === false) { 229 | self.pause() 230 | } 231 | }) 232 | } 233 | 234 | // console.error("R Pipe apply Stream Pipe") 235 | return Stream.prototype.pipe.apply(this, arguments) 236 | } 237 | 238 | Reader.prototype.pause = function (who) { 239 | this._paused = true 240 | who = who || this 241 | this.emit('pause', who) 242 | if (this._stream) this._stream.pause(who) 243 | } 244 | 245 | Reader.prototype.resume = function (who) { 246 | this._paused = false 247 | who = who || this 248 | this.emit('resume', who) 249 | if (this._stream) this._stream.resume(who) 250 | this._read() 251 | } 252 | 253 | Reader.prototype._read = function () { 254 | this.error('Cannot read unknown type: ' + this.type) 255 | } 256 | -------------------------------------------------------------------------------- /lib/socket-reader.js: -------------------------------------------------------------------------------- 1 | // Just get the stats, and then don't do anything. 2 | // You can't really "read" from a socket. You "connect" to it. 3 | // Mostly, this is here so that reading a dir with a socket in it 4 | // doesn't blow up. 5 | 6 | module.exports = SocketReader 7 | 8 | var inherits = require('inherits') 9 | var Reader = require('./reader.js') 10 | 11 | inherits(SocketReader, Reader) 12 | 13 | function SocketReader (props) { 14 | var self = this 15 | if (!(self instanceof SocketReader)) { 16 | throw new Error('SocketReader must be called as constructor.') 17 | } 18 | 19 | if (!(props.type === 'Socket' && props.Socket)) { 20 | throw new Error('Non-socket type ' + props.type) 21 | } 22 | 23 | Reader.call(self, props) 24 | } 25 | 26 | SocketReader.prototype._read = function () { 27 | var self = this 28 | if (self._paused) return 29 | // basically just a no-op, since we got all the info we have 30 | // from the _stat method 31 | if (!self._ended) { 32 | self.emit('end') 33 | self.emit('close') 34 | self._ended = true 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/writer.js: -------------------------------------------------------------------------------- 1 | module.exports = Writer 2 | 3 | var fs = require('graceful-fs') 4 | var inherits = require('inherits') 5 | var rimraf = require('rimraf') 6 | var mkdir = require('mkdirp') 7 | var path = require('path') 8 | var umask = process.platform === 'win32' ? 0 : process.umask() 9 | var getType = require('./get-type.js') 10 | var Abstract = require('./abstract.js') 11 | 12 | // Must do this *before* loading the child classes 13 | inherits(Writer, Abstract) 14 | 15 | Writer.dirmode = parseInt('0777', 8) & (~umask) 16 | Writer.filemode = parseInt('0666', 8) & (~umask) 17 | 18 | var DirWriter = require('./dir-writer.js') 19 | var LinkWriter = require('./link-writer.js') 20 | var FileWriter = require('./file-writer.js') 21 | var ProxyWriter = require('./proxy-writer.js') 22 | 23 | // props is the desired state. current is optionally the current stat, 24 | // provided here so that subclasses can avoid statting the target 25 | // more than necessary. 26 | function Writer (props, current) { 27 | var self = this 28 | 29 | if (typeof props === 'string') { 30 | props = { path: props } 31 | } 32 | 33 | // polymorphism. 34 | // call fstream.Writer(dir) to get a DirWriter object, etc. 35 | var type = getType(props) 36 | var ClassType = Writer 37 | 38 | switch (type) { 39 | case 'Directory': 40 | ClassType = DirWriter 41 | break 42 | case 'File': 43 | ClassType = FileWriter 44 | break 45 | case 'Link': 46 | case 'SymbolicLink': 47 | ClassType = LinkWriter 48 | break 49 | case null: 50 | default: 51 | // Don't know yet what type to create, so we wrap in a proxy. 52 | ClassType = ProxyWriter 53 | break 54 | } 55 | 56 | if (!(self instanceof ClassType)) return new ClassType(props) 57 | 58 | // now get down to business. 59 | 60 | Abstract.call(self) 61 | 62 | if (!props.path) self.error('Must provide a path', null, true) 63 | 64 | // props is what we want to set. 65 | // set some convenience properties as well. 66 | self.type = props.type 67 | self.props = props 68 | self.depth = props.depth || 0 69 | self.clobber = props.clobber === false ? props.clobber : true 70 | self.parent = props.parent || null 71 | self.root = props.root || (props.parent && props.parent.root) || self 72 | 73 | self._path = self.path = path.resolve(props.path) 74 | if (process.platform === 'win32') { 75 | self.path = self._path = self.path.replace(/\?/g, '_') 76 | if (self._path.length >= 260) { 77 | self._swallowErrors = true 78 | self._path = '\\\\?\\' + self.path.replace(/\//g, '\\') 79 | } 80 | } 81 | self.basename = path.basename(props.path) 82 | self.dirname = path.dirname(props.path) 83 | self.linkpath = props.linkpath || null 84 | 85 | props.parent = props.root = null 86 | 87 | // console.error("\n\n\n%s setting size to", props.path, props.size) 88 | self.size = props.size 89 | 90 | if (typeof props.mode === 'string') { 91 | props.mode = parseInt(props.mode, 8) 92 | } 93 | 94 | self.readable = false 95 | self.writable = true 96 | 97 | // buffer until ready, or while handling another entry 98 | self._buffer = [] 99 | self.ready = false 100 | 101 | self.filter = typeof props.filter === 'function' ? props.filter : null 102 | 103 | // start the ball rolling. 104 | // this checks what's there already, and then calls 105 | // self._create() to call the impl-specific creation stuff. 106 | self._stat(current) 107 | } 108 | 109 | // Calling this means that it's something we can't create. 110 | // Just assert that it's already there, otherwise raise a warning. 111 | Writer.prototype._create = function () { 112 | var self = this 113 | fs[self.props.follow ? 'stat' : 'lstat'](self._path, function (er) { 114 | if (er) { 115 | return self.warn('Cannot create ' + self._path + '\n' + 116 | 'Unsupported type: ' + self.type, 'ENOTSUP') 117 | } 118 | self._finish() 119 | }) 120 | } 121 | 122 | Writer.prototype._stat = function (current) { 123 | var self = this 124 | var props = self.props 125 | var stat = props.follow ? 'stat' : 'lstat' 126 | var who = self._proxy || self 127 | 128 | if (current) statCb(null, current) 129 | else fs[stat](self._path, statCb) 130 | 131 | function statCb (er, current) { 132 | if (self.filter && !self.filter.call(who, who, current)) { 133 | self._aborted = true 134 | self.emit('end') 135 | self.emit('close') 136 | return 137 | } 138 | 139 | // if it's not there, great. We'll just create it. 140 | // if it is there, then we'll need to change whatever differs 141 | if (er || !current) { 142 | return create(self) 143 | } 144 | 145 | self._old = current 146 | var currentType = getType(current) 147 | 148 | // if it's a type change, then we need to clobber or error. 149 | // if it's not a type change, then let the impl take care of it. 150 | if (currentType !== self.type || self.type === 'File' && current.nlink > 1) { 151 | return rimraf(self._path, function (er) { 152 | if (er) return self.error(er) 153 | self._old = null 154 | create(self) 155 | }) 156 | } 157 | 158 | // otherwise, just handle in the app-specific way 159 | // this creates a fs.WriteStream, or mkdir's, or whatever 160 | create(self) 161 | } 162 | } 163 | 164 | function create (self) { 165 | // console.error("W create", self._path, Writer.dirmode) 166 | 167 | // XXX Need to clobber non-dirs that are in the way, 168 | // unless { clobber: false } in the props. 169 | mkdir(path.dirname(self._path), Writer.dirmode, function (er, made) { 170 | // console.error("W created", path.dirname(self._path), er) 171 | if (er) return self.error(er) 172 | 173 | // later on, we have to set the mode and owner for these 174 | self._madeDir = made 175 | return self._create() 176 | }) 177 | } 178 | 179 | function endChmod (self, want, current, path, cb) { 180 | var wantMode = want.mode 181 | var chmod = want.follow || self.type !== 'SymbolicLink' 182 | ? 'chmod' : 'lchmod' 183 | 184 | if (!fs[chmod]) return cb() 185 | if (typeof wantMode !== 'number') return cb() 186 | 187 | var curMode = current.mode & parseInt('0777', 8) 188 | wantMode = wantMode & parseInt('0777', 8) 189 | if (wantMode === curMode) return cb() 190 | 191 | fs[chmod](path, wantMode, cb) 192 | } 193 | 194 | function endChown (self, want, current, path, cb) { 195 | // Don't even try it unless root. Too easy to EPERM. 196 | if (process.platform === 'win32') return cb() 197 | if (!process.getuid || process.getuid() !== 0) return cb() 198 | if (typeof want.uid !== 'number' && 199 | typeof want.gid !== 'number') return cb() 200 | 201 | if (current.uid === want.uid && 202 | current.gid === want.gid) return cb() 203 | 204 | var chown = (self.props.follow || self.type !== 'SymbolicLink') 205 | ? 'chown' : 'lchown' 206 | if (!fs[chown]) return cb() 207 | 208 | if (typeof want.uid !== 'number') want.uid = current.uid 209 | if (typeof want.gid !== 'number') want.gid = current.gid 210 | 211 | fs[chown](path, want.uid, want.gid, cb) 212 | } 213 | 214 | function endUtimes (self, want, current, path, cb) { 215 | if (!fs.utimes || process.platform === 'win32') return cb() 216 | 217 | var utimes = (want.follow || self.type !== 'SymbolicLink') 218 | ? 'utimes' : 'lutimes' 219 | 220 | if (utimes === 'lutimes' && !fs[utimes]) { 221 | utimes = 'utimes' 222 | } 223 | 224 | if (!fs[utimes]) return cb() 225 | 226 | var curA = current.atime 227 | var curM = current.mtime 228 | var meA = want.atime 229 | var meM = want.mtime 230 | 231 | if (meA === undefined) meA = curA 232 | if (meM === undefined) meM = curM 233 | 234 | if (!isDate(meA)) meA = new Date(meA) 235 | if (!isDate(meM)) meA = new Date(meM) 236 | 237 | if (meA.getTime() === curA.getTime() && 238 | meM.getTime() === curM.getTime()) return cb() 239 | 240 | fs[utimes](path, meA, meM, cb) 241 | } 242 | 243 | // XXX This function is beastly. Break it up! 244 | Writer.prototype._finish = function () { 245 | var self = this 246 | 247 | if (self._finishing) return 248 | self._finishing = true 249 | 250 | // console.error(" W Finish", self._path, self.size) 251 | 252 | // set up all the things. 253 | // At this point, we're already done writing whatever we've gotta write, 254 | // adding files to the dir, etc. 255 | var todo = 0 256 | var errState = null 257 | var done = false 258 | 259 | if (self._old) { 260 | // the times will almost *certainly* have changed. 261 | // adds the utimes syscall, but remove another stat. 262 | self._old.atime = new Date(0) 263 | self._old.mtime = new Date(0) 264 | // console.error(" W Finish Stale Stat", self._path, self.size) 265 | setProps(self._old) 266 | } else { 267 | var stat = self.props.follow ? 'stat' : 'lstat' 268 | // console.error(" W Finish Stating", self._path, self.size) 269 | fs[stat](self._path, function (er, current) { 270 | // console.error(" W Finish Stated", self._path, self.size, current) 271 | if (er) { 272 | // if we're in the process of writing out a 273 | // directory, it's very possible that the thing we're linking to 274 | // doesn't exist yet (especially if it was intended as a symlink), 275 | // so swallow ENOENT errors here and just soldier on. 276 | if (er.code === 'ENOENT' && 277 | (self.type === 'Link' || self.type === 'SymbolicLink') && 278 | process.platform === 'win32') { 279 | self.ready = true 280 | self.emit('ready') 281 | self.emit('end') 282 | self.emit('close') 283 | self.end = self._finish = function () {} 284 | return 285 | } else return self.error(er) 286 | } 287 | setProps(self._old = current) 288 | }) 289 | } 290 | 291 | return 292 | 293 | function setProps (current) { 294 | todo += 3 295 | endChmod(self, self.props, current, self._path, next('chmod')) 296 | endChown(self, self.props, current, self._path, next('chown')) 297 | endUtimes(self, self.props, current, self._path, next('utimes')) 298 | } 299 | 300 | function next (what) { 301 | return function (er) { 302 | // console.error(" W Finish", what, todo) 303 | if (errState) return 304 | if (er) { 305 | er.fstream_finish_call = what 306 | return self.error(errState = er) 307 | } 308 | if (--todo > 0) return 309 | if (done) return 310 | done = true 311 | 312 | // we may still need to set the mode/etc. on some parent dirs 313 | // that were created previously. delay end/close until then. 314 | if (!self._madeDir) return end() 315 | else endMadeDir(self, self._path, end) 316 | 317 | function end (er) { 318 | if (er) { 319 | er.fstream_finish_call = 'setupMadeDir' 320 | return self.error(er) 321 | } 322 | // all the props have been set, so we're completely done. 323 | self.emit('end') 324 | self.emit('close') 325 | } 326 | } 327 | } 328 | } 329 | 330 | function endMadeDir (self, p, cb) { 331 | var made = self._madeDir 332 | // everything *between* made and path.dirname(self._path) 333 | // needs to be set up. Note that this may just be one dir. 334 | var d = path.dirname(p) 335 | 336 | endMadeDir_(self, d, function (er) { 337 | if (er) return cb(er) 338 | if (d === made) { 339 | return cb() 340 | } 341 | endMadeDir(self, d, cb) 342 | }) 343 | } 344 | 345 | function endMadeDir_ (self, p, cb) { 346 | var dirProps = {} 347 | Object.keys(self.props).forEach(function (k) { 348 | dirProps[k] = self.props[k] 349 | 350 | // only make non-readable dirs if explicitly requested. 351 | if (k === 'mode' && self.type !== 'Directory') { 352 | dirProps[k] = dirProps[k] | parseInt('0111', 8) 353 | } 354 | }) 355 | 356 | var todo = 3 357 | var errState = null 358 | fs.stat(p, function (er, current) { 359 | if (er) return cb(errState = er) 360 | endChmod(self, dirProps, current, p, next) 361 | endChown(self, dirProps, current, p, next) 362 | endUtimes(self, dirProps, current, p, next) 363 | }) 364 | 365 | function next (er) { 366 | if (errState) return 367 | if (er) return cb(errState = er) 368 | if (--todo === 0) return cb() 369 | } 370 | } 371 | 372 | Writer.prototype.pipe = function () { 373 | this.error("Can't pipe from writable stream") 374 | } 375 | 376 | Writer.prototype.add = function () { 377 | this.error("Can't add to non-Directory type") 378 | } 379 | 380 | Writer.prototype.write = function () { 381 | return true 382 | } 383 | 384 | function objectToString (d) { 385 | return Object.prototype.toString.call(d) 386 | } 387 | 388 | function isDate (d) { 389 | return typeof d === 'object' && objectToString(d) === '[object Date]' 390 | } 391 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fstream", 3 | "version": "1.0.12", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "graceful-fs": { 8 | "version": "4.1.15", 9 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 10 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 11 | }, 12 | "inherits": { 13 | "version": "2.0.0", 14 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.0.tgz", 15 | "integrity": "sha1-dsgbOxwQ3e46YL8sJHFivDafi6g=" 16 | }, 17 | "mkdirp": { 18 | "version": "0.5.0", 19 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 20 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 21 | "requires": { 22 | "minimist": "0.0.8" 23 | }, 24 | "dependencies": { 25 | "minimist": { 26 | "version": "0.0.8", 27 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 28 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 29 | } 30 | } 31 | }, 32 | "rimraf": { 33 | "version": "2.0.2", 34 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.2.tgz", 35 | "integrity": "sha1-KoYPP3S9eXUAL3PLCwA7IY7DUeQ=", 36 | "requires": { 37 | "graceful-fs": "~1.1" 38 | }, 39 | "dependencies": { 40 | "graceful-fs": { 41 | "version": "1.1.14", 42 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz", 43 | "integrity": "sha1-BweNtfY3f2Mh/Oqu30l94STclGU=", 44 | "optional": true 45 | } 46 | } 47 | }, 48 | "standard": { 49 | "version": "4.0.0", 50 | "resolved": "https://registry.npmjs.org/standard/-/standard-4.0.0.tgz", 51 | "integrity": "sha1-V3FFQMrmI0Qxe59u6NIb3pYDHEw=", 52 | "dev": true, 53 | "requires": { 54 | "dezalgo": "^1.0.1", 55 | "eslint": "^0.21.0", 56 | "eslint-config-standard": "~2.0.0", 57 | "eslint-plugin-react": "^2.1.0", 58 | "find-root": "^0.1.1", 59 | "get-stdin": "^4.0.1", 60 | "glob": "^5.0.0", 61 | "ignore": "^2.2.15", 62 | "minimist": "^1.1.0", 63 | "run-parallel": "^1.0.0", 64 | "standard-format": "^1.3.3", 65 | "uniq": "^1.0.1", 66 | "xtend": "^4.0.0" 67 | }, 68 | "dependencies": { 69 | "dezalgo": { 70 | "version": "1.0.2", 71 | "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.2.tgz", 72 | "integrity": "sha1-K8i1oWgxMXZKmN735KoiEFpoilo=", 73 | "dev": true, 74 | "requires": { 75 | "asap": "^1.0.0", 76 | "wrappy": "1" 77 | }, 78 | "dependencies": { 79 | "asap": { 80 | "version": "1.0.0", 81 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 82 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=", 83 | "dev": true 84 | }, 85 | "wrappy": { 86 | "version": "1.0.1", 87 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 88 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 89 | "dev": true 90 | } 91 | } 92 | }, 93 | "eslint": { 94 | "version": "0.21.2", 95 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-0.21.2.tgz", 96 | "integrity": "sha1-vt3yR4ANSGf2sQUdIkvbg8LSAcc=", 97 | "dev": true, 98 | "requires": { 99 | "chalk": "^1.0.0", 100 | "concat-stream": "^1.4.6", 101 | "debug": "^2.1.1", 102 | "doctrine": "^0.6.2", 103 | "escape-string-regexp": "^1.0.2", 104 | "escope": "^3.0.1", 105 | "espree": "^2.0.1", 106 | "estraverse": "^2.0.0", 107 | "estraverse-fb": "^1.3.1", 108 | "globals": "^6.1.0", 109 | "inquirer": "^0.8.2", 110 | "js-yaml": "^3.2.5", 111 | "minimatch": "^2.0.1", 112 | "mkdirp": "^0.5.0", 113 | "object-assign": "^2.0.0", 114 | "optionator": "^0.5.0", 115 | "path-is-absolute": "^1.0.0", 116 | "strip-json-comments": "~1.0.1", 117 | "text-table": "~0.2.0", 118 | "user-home": "^1.0.0", 119 | "xml-escape": "~1.0.0" 120 | }, 121 | "dependencies": { 122 | "chalk": { 123 | "version": "1.0.0", 124 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz", 125 | "integrity": "sha1-s89O0P9Tl8mcdbj2edsvUoMfltw=", 126 | "dev": true, 127 | "requires": { 128 | "ansi-styles": "^2.0.1", 129 | "escape-string-regexp": "^1.0.2", 130 | "has-ansi": "^1.0.3", 131 | "strip-ansi": "^2.0.1", 132 | "supports-color": "^1.3.0" 133 | }, 134 | "dependencies": { 135 | "ansi-styles": { 136 | "version": "2.0.1", 137 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.1.tgz", 138 | "integrity": "sha1-sDP1f5Pi0oreuLwRE4+hPaD9IKM=", 139 | "dev": true 140 | }, 141 | "has-ansi": { 142 | "version": "1.0.3", 143 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz", 144 | "integrity": "sha1-wLWxYV2eOCsP9nFp2We0JeSMpTg=", 145 | "dev": true, 146 | "requires": { 147 | "ansi-regex": "^1.1.0", 148 | "get-stdin": "^4.0.1" 149 | }, 150 | "dependencies": { 151 | "ansi-regex": { 152 | "version": "1.1.1", 153 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", 154 | "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", 155 | "dev": true 156 | } 157 | } 158 | }, 159 | "strip-ansi": { 160 | "version": "2.0.1", 161 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", 162 | "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", 163 | "dev": true, 164 | "requires": { 165 | "ansi-regex": "^1.0.0" 166 | }, 167 | "dependencies": { 168 | "ansi-regex": { 169 | "version": "1.1.1", 170 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", 171 | "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", 172 | "dev": true 173 | } 174 | } 175 | }, 176 | "supports-color": { 177 | "version": "1.3.1", 178 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz", 179 | "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", 180 | "dev": true 181 | } 182 | } 183 | }, 184 | "concat-stream": { 185 | "version": "1.4.8", 186 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.8.tgz", 187 | "integrity": "sha1-6DJbuJ5VAA5StibZdGb94aKM/l0=", 188 | "dev": true, 189 | "requires": { 190 | "inherits": "~2.0.1", 191 | "readable-stream": "~1.1.9", 192 | "typedarray": "~0.0.5" 193 | }, 194 | "dependencies": { 195 | "inherits": { 196 | "version": "2.0.1", 197 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 198 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 199 | "dev": true 200 | }, 201 | "readable-stream": { 202 | "version": "1.1.13", 203 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", 204 | "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", 205 | "dev": true, 206 | "requires": { 207 | "core-util-is": "~1.0.0", 208 | "inherits": "~2.0.1", 209 | "isarray": "0.0.1", 210 | "string_decoder": "~0.10.x" 211 | }, 212 | "dependencies": { 213 | "core-util-is": { 214 | "version": "1.0.1", 215 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", 216 | "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", 217 | "dev": true 218 | }, 219 | "isarray": { 220 | "version": "0.0.1", 221 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 222 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 223 | "dev": true 224 | }, 225 | "string_decoder": { 226 | "version": "0.10.31", 227 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 228 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 229 | "dev": true 230 | } 231 | } 232 | }, 233 | "typedarray": { 234 | "version": "0.0.6", 235 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 236 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 237 | "dev": true 238 | } 239 | } 240 | }, 241 | "debug": { 242 | "version": "2.2.0", 243 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 244 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 245 | "dev": true, 246 | "requires": { 247 | "ms": "0.7.1" 248 | }, 249 | "dependencies": { 250 | "ms": { 251 | "version": "0.7.1", 252 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 253 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 254 | "dev": true 255 | } 256 | } 257 | }, 258 | "doctrine": { 259 | "version": "0.6.4", 260 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.6.4.tgz", 261 | "integrity": "sha1-gUKEkalC7xiwSSBW7aOADu5X1h0=", 262 | "dev": true, 263 | "requires": { 264 | "esutils": "^1.1.6", 265 | "isarray": "0.0.1" 266 | }, 267 | "dependencies": { 268 | "esutils": { 269 | "version": "1.1.6", 270 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", 271 | "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", 272 | "dev": true 273 | }, 274 | "isarray": { 275 | "version": "0.0.1", 276 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 277 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 278 | "dev": true 279 | } 280 | } 281 | }, 282 | "escape-string-regexp": { 283 | "version": "1.0.3", 284 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz", 285 | "integrity": "sha1-ni2LJbwlVcMzZyN1DgPwmcJzW7U=", 286 | "dev": true 287 | }, 288 | "escope": { 289 | "version": "3.1.0", 290 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.1.0.tgz", 291 | "integrity": "sha1-kspI9ihrOA5DiOCRiKkEsPodm34=", 292 | "dev": true, 293 | "requires": { 294 | "es6-map": "^0.1.1", 295 | "es6-weak-map": "^0.1.2", 296 | "esrecurse": "^3.1.1", 297 | "estraverse": "^3.1.0" 298 | }, 299 | "dependencies": { 300 | "es6-map": { 301 | "version": "0.1.1", 302 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.1.tgz", 303 | "integrity": "sha1-uHkjnteBngsIxAum4Z+gR8p8jR0=", 304 | "dev": true, 305 | "requires": { 306 | "d": "~0.1.1", 307 | "es5-ext": "~0.10.4", 308 | "es6-iterator": "~0.1.1", 309 | "es6-set": "~0.1.1", 310 | "es6-symbol": "~0.1.1", 311 | "event-emitter": "~0.3.1" 312 | }, 313 | "dependencies": { 314 | "d": { 315 | "version": "0.1.1", 316 | "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", 317 | "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", 318 | "dev": true, 319 | "requires": { 320 | "es5-ext": "~0.10.2" 321 | } 322 | }, 323 | "es5-ext": { 324 | "version": "0.10.7", 325 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.7.tgz", 326 | "integrity": "sha1-366lByEwEELi2JwXGdQ0k/qCFlY=", 327 | "dev": true, 328 | "requires": { 329 | "es6-iterator": "~0.1.3", 330 | "es6-symbol": "~2.0.1" 331 | }, 332 | "dependencies": { 333 | "es6-symbol": { 334 | "version": "2.0.1", 335 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", 336 | "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", 337 | "dev": true, 338 | "requires": { 339 | "d": "~0.1.1", 340 | "es5-ext": "~0.10.5" 341 | } 342 | } 343 | } 344 | }, 345 | "es6-iterator": { 346 | "version": "0.1.3", 347 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", 348 | "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", 349 | "dev": true, 350 | "requires": { 351 | "d": "~0.1.1", 352 | "es5-ext": "~0.10.5", 353 | "es6-symbol": "~2.0.1" 354 | }, 355 | "dependencies": { 356 | "es6-symbol": { 357 | "version": "2.0.1", 358 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", 359 | "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", 360 | "dev": true, 361 | "requires": { 362 | "d": "~0.1.1", 363 | "es5-ext": "~0.10.5" 364 | } 365 | } 366 | } 367 | }, 368 | "es6-set": { 369 | "version": "0.1.1", 370 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.1.tgz", 371 | "integrity": "sha1-SXzSNcmiaR9Mqg4z3XPvhr3nOKw=", 372 | "dev": true, 373 | "requires": { 374 | "d": "~0.1.1", 375 | "es5-ext": "~0.10.4", 376 | "es6-iterator": "~0.1.1", 377 | "es6-symbol": "~0.1.1", 378 | "event-emitter": "~0.3.1" 379 | } 380 | }, 381 | "es6-symbol": { 382 | "version": "0.1.1", 383 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-0.1.1.tgz", 384 | "integrity": "sha1-nPf6su2v8bHaj+jmi/4/Wspsohg=", 385 | "dev": true, 386 | "requires": { 387 | "d": "~0.1.1", 388 | "es5-ext": "~0.10.4" 389 | } 390 | }, 391 | "event-emitter": { 392 | "version": "0.3.3", 393 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.3.tgz", 394 | "integrity": "sha1-346AZUHGirj/IKeaGEG5GrqhvuQ=", 395 | "dev": true, 396 | "requires": { 397 | "d": "~0.1.1", 398 | "es5-ext": "~0.10.5" 399 | } 400 | } 401 | } 402 | }, 403 | "es6-weak-map": { 404 | "version": "0.1.4", 405 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", 406 | "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", 407 | "dev": true, 408 | "requires": { 409 | "d": "~0.1.1", 410 | "es5-ext": "~0.10.6", 411 | "es6-iterator": "~0.1.3", 412 | "es6-symbol": "~2.0.1" 413 | }, 414 | "dependencies": { 415 | "d": { 416 | "version": "0.1.1", 417 | "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", 418 | "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", 419 | "dev": true, 420 | "requires": { 421 | "es5-ext": "~0.10.2" 422 | } 423 | }, 424 | "es5-ext": { 425 | "version": "0.10.7", 426 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.7.tgz", 427 | "integrity": "sha1-366lByEwEELi2JwXGdQ0k/qCFlY=", 428 | "dev": true, 429 | "requires": { 430 | "es6-iterator": "~0.1.3", 431 | "es6-symbol": "~2.0.1" 432 | } 433 | }, 434 | "es6-iterator": { 435 | "version": "0.1.3", 436 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", 437 | "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", 438 | "dev": true, 439 | "requires": { 440 | "d": "~0.1.1", 441 | "es5-ext": "~0.10.5", 442 | "es6-symbol": "~2.0.1" 443 | } 444 | }, 445 | "es6-symbol": { 446 | "version": "2.0.1", 447 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", 448 | "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", 449 | "dev": true, 450 | "requires": { 451 | "d": "~0.1.1", 452 | "es5-ext": "~0.10.5" 453 | } 454 | } 455 | } 456 | }, 457 | "esrecurse": { 458 | "version": "3.1.1", 459 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-3.1.1.tgz", 460 | "integrity": "sha1-j+uWNpnU0bLWWlds1LEpZnKg8Ok=", 461 | "dev": true, 462 | "requires": { 463 | "estraverse": "~3.1.0" 464 | } 465 | }, 466 | "estraverse": { 467 | "version": "3.1.0", 468 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz", 469 | "integrity": "sha1-FeKKRGuLgrxwDMyLlseK9NoNbLo=", 470 | "dev": true 471 | } 472 | } 473 | }, 474 | "espree": { 475 | "version": "2.0.2", 476 | "resolved": "https://registry.npmjs.org/espree/-/espree-2.0.2.tgz", 477 | "integrity": "sha1-ra79gDrVAXeeIGOzV1Sa4zZv0Uw=", 478 | "dev": true 479 | }, 480 | "estraverse": { 481 | "version": "2.0.0", 482 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-2.0.0.tgz", 483 | "integrity": "sha1-WuRpYyQ2ACBmdMyySgnhZnT83KE=", 484 | "dev": true 485 | }, 486 | "estraverse-fb": { 487 | "version": "1.3.1", 488 | "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.1.tgz", 489 | "integrity": "sha1-Fg51qA5gWwjOiUvM4v4+Qpq/kr8=", 490 | "dev": true 491 | }, 492 | "globals": { 493 | "version": "6.4.1", 494 | "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", 495 | "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", 496 | "dev": true 497 | }, 498 | "inquirer": { 499 | "version": "0.8.5", 500 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.8.5.tgz", 501 | "integrity": "sha1-29dAz2yjtzEpamPOb22WGFHzNt8=", 502 | "dev": true, 503 | "requires": { 504 | "ansi-regex": "^1.1.1", 505 | "chalk": "^1.0.0", 506 | "cli-width": "^1.0.1", 507 | "figures": "^1.3.5", 508 | "lodash": "^3.3.1", 509 | "readline2": "^0.1.1", 510 | "rx": "^2.4.3", 511 | "through": "^2.3.6" 512 | }, 513 | "dependencies": { 514 | "ansi-regex": { 515 | "version": "1.1.1", 516 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", 517 | "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", 518 | "dev": true 519 | }, 520 | "cli-width": { 521 | "version": "1.0.1", 522 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.0.1.tgz", 523 | "integrity": "sha1-FNT2hwI02R6X992B52voJxQQoe8=", 524 | "dev": true 525 | }, 526 | "figures": { 527 | "version": "1.3.5", 528 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.3.5.tgz", 529 | "integrity": "sha1-0aMfTh0sKTjs3lwGqhYTTPKfR3E=", 530 | "dev": true 531 | }, 532 | "lodash": { 533 | "version": "3.9.3", 534 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", 535 | "integrity": "sha1-AVnoaDL+/8bWHYUrEqlTuZSWvTI=", 536 | "dev": true 537 | }, 538 | "readline2": { 539 | "version": "0.1.1", 540 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", 541 | "integrity": "sha1-mUQ7pug7gw7zBRv9fcJBqCco1Wg=", 542 | "dev": true, 543 | "requires": { 544 | "mute-stream": "0.0.4", 545 | "strip-ansi": "^2.0.1" 546 | }, 547 | "dependencies": { 548 | "mute-stream": { 549 | "version": "0.0.4", 550 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", 551 | "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=", 552 | "dev": true 553 | }, 554 | "strip-ansi": { 555 | "version": "2.0.1", 556 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", 557 | "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", 558 | "dev": true, 559 | "requires": { 560 | "ansi-regex": "^1.0.0" 561 | } 562 | } 563 | } 564 | }, 565 | "rx": { 566 | "version": "2.5.2", 567 | "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.2.tgz", 568 | "integrity": "sha1-UvI2tabSTlOKofuogVKQkyKgKIY=", 569 | "dev": true 570 | }, 571 | "through": { 572 | "version": "2.3.7", 573 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.7.tgz", 574 | "integrity": "sha1-X8w2kP7S/fmMb8iLTSB6RiSsO4c=", 575 | "dev": true 576 | } 577 | } 578 | }, 579 | "js-yaml": { 580 | "version": "3.3.1", 581 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.3.1.tgz", 582 | "integrity": "sha1-yhrNNCPsJ10SFAp7q1HbAVugs8A=", 583 | "dev": true, 584 | "requires": { 585 | "argparse": "~1.0.2", 586 | "esprima": "~2.2.0" 587 | }, 588 | "dependencies": { 589 | "argparse": { 590 | "version": "1.0.2", 591 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.2.tgz", 592 | "integrity": "sha1-vPrjkFllbRlz0LnmoadBVLWpoTY=", 593 | "dev": true, 594 | "requires": { 595 | "lodash": ">= 3.2.0 < 4.0.0", 596 | "sprintf-js": "~1.0.2" 597 | }, 598 | "dependencies": { 599 | "lodash": { 600 | "version": "3.9.3", 601 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", 602 | "integrity": "sha1-AVnoaDL+/8bWHYUrEqlTuZSWvTI=", 603 | "dev": true 604 | }, 605 | "sprintf-js": { 606 | "version": "1.0.2", 607 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.2.tgz", 608 | "integrity": "sha1-EeTYT/MhRONbC/Omb4WH842PmXg=", 609 | "dev": true 610 | } 611 | } 612 | }, 613 | "esprima": { 614 | "version": "2.2.0", 615 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.2.0.tgz", 616 | "integrity": "sha1-QpLB1o5Bc9gV+iKQ3Hr8ltgfzYM=", 617 | "dev": true 618 | } 619 | } 620 | }, 621 | "minimatch": { 622 | "version": "2.0.8", 623 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.8.tgz", 624 | "integrity": "sha1-C8IPa/NXCmmO8N3/kCBjxsq9pr8=", 625 | "dev": true, 626 | "requires": { 627 | "brace-expansion": "^1.0.0" 628 | }, 629 | "dependencies": { 630 | "brace-expansion": { 631 | "version": "1.1.0", 632 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", 633 | "integrity": "sha1-ybfQPAPze8cEvhAOUitA249s/Nk=", 634 | "dev": true, 635 | "requires": { 636 | "balanced-match": "^0.2.0", 637 | "concat-map": "0.0.1" 638 | }, 639 | "dependencies": { 640 | "balanced-match": { 641 | "version": "0.2.0", 642 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", 643 | "integrity": "sha1-OPZzDAOqttXtu1K9k0iF51bXFnQ=", 644 | "dev": true 645 | }, 646 | "concat-map": { 647 | "version": "0.0.1", 648 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 649 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 650 | "dev": true 651 | } 652 | } 653 | } 654 | } 655 | }, 656 | "object-assign": { 657 | "version": "2.0.0", 658 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.0.0.tgz", 659 | "integrity": "sha1-+DCbCQg7ASYezj73Nz8rV7jdcEI=", 660 | "dev": true 661 | }, 662 | "optionator": { 663 | "version": "0.5.0", 664 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz", 665 | "integrity": "sha1-t1qJlaLUF98ltuTjhi9QqohlE2g=", 666 | "dev": true, 667 | "requires": { 668 | "deep-is": "~0.1.2", 669 | "fast-levenshtein": "~1.0.0", 670 | "levn": "~0.2.5", 671 | "prelude-ls": "~1.1.1", 672 | "type-check": "~0.3.1", 673 | "wordwrap": "~0.0.2" 674 | }, 675 | "dependencies": { 676 | "deep-is": { 677 | "version": "0.1.3", 678 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 679 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 680 | "dev": true 681 | }, 682 | "fast-levenshtein": { 683 | "version": "1.0.6", 684 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.6.tgz", 685 | "integrity": "sha1-O+2xhOOflcsNiJKGiOax7jJzRGo=", 686 | "dev": true 687 | }, 688 | "levn": { 689 | "version": "0.2.5", 690 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", 691 | "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", 692 | "dev": true, 693 | "requires": { 694 | "prelude-ls": "~1.1.0", 695 | "type-check": "~0.3.1" 696 | } 697 | }, 698 | "prelude-ls": { 699 | "version": "1.1.2", 700 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 701 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 702 | "dev": true 703 | }, 704 | "type-check": { 705 | "version": "0.3.1", 706 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.1.tgz", 707 | "integrity": "sha1-kjOSPE2hdNCsVIDs/W74TDSetY0=", 708 | "dev": true, 709 | "requires": { 710 | "prelude-ls": "~1.1.0" 711 | } 712 | }, 713 | "wordwrap": { 714 | "version": "0.0.3", 715 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 716 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 717 | "dev": true 718 | } 719 | } 720 | }, 721 | "path-is-absolute": { 722 | "version": "1.0.0", 723 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", 724 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", 725 | "dev": true 726 | }, 727 | "strip-json-comments": { 728 | "version": "1.0.2", 729 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.2.tgz", 730 | "integrity": "sha1-WkirlgI9usG3uND/q/b2PxZ3vp8=", 731 | "dev": true 732 | }, 733 | "text-table": { 734 | "version": "0.2.0", 735 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 736 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 737 | "dev": true 738 | }, 739 | "user-home": { 740 | "version": "1.1.1", 741 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 742 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 743 | "dev": true 744 | }, 745 | "xml-escape": { 746 | "version": "1.0.0", 747 | "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.0.0.tgz", 748 | "integrity": "sha1-AJY9aXsq3wwYXE4E5zF0upsojrI=", 749 | "dev": true 750 | } 751 | } 752 | }, 753 | "eslint-config-standard": { 754 | "version": "2.0.0", 755 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-2.0.0.tgz", 756 | "integrity": "sha1-JSOsF8mpG4MuouiV8gkxicOoxsg=", 757 | "dev": true 758 | }, 759 | "eslint-plugin-react": { 760 | "version": "2.4.0", 761 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-2.4.0.tgz", 762 | "integrity": "sha1-ZnttUf3iviuQTkOH2S7GTGDqfro=", 763 | "dev": true 764 | }, 765 | "find-root": { 766 | "version": "0.1.1", 767 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-0.1.1.tgz", 768 | "integrity": "sha1-9jbUbz518IXzKJ63x3keUDmjd8o=", 769 | "dev": true 770 | }, 771 | "get-stdin": { 772 | "version": "4.0.1", 773 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 774 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 775 | "dev": true 776 | }, 777 | "glob": { 778 | "version": "5.0.10", 779 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.10.tgz", 780 | "integrity": "sha1-PuNQMZ8x81LO9omaSPa2t4NMaJk=", 781 | "dev": true, 782 | "requires": { 783 | "inflight": "^1.0.4", 784 | "inherits": "2", 785 | "minimatch": "^2.0.1", 786 | "once": "^1.3.0", 787 | "path-is-absolute": "^1.0.0" 788 | }, 789 | "dependencies": { 790 | "inflight": { 791 | "version": "1.0.4", 792 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", 793 | "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", 794 | "dev": true, 795 | "requires": { 796 | "once": "^1.3.0", 797 | "wrappy": "1" 798 | }, 799 | "dependencies": { 800 | "wrappy": { 801 | "version": "1.0.1", 802 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 803 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 804 | "dev": true 805 | } 806 | } 807 | }, 808 | "minimatch": { 809 | "version": "2.0.8", 810 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.8.tgz", 811 | "integrity": "sha1-C8IPa/NXCmmO8N3/kCBjxsq9pr8=", 812 | "dev": true, 813 | "requires": { 814 | "brace-expansion": "^1.0.0" 815 | }, 816 | "dependencies": { 817 | "brace-expansion": { 818 | "version": "1.1.0", 819 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", 820 | "integrity": "sha1-ybfQPAPze8cEvhAOUitA249s/Nk=", 821 | "dev": true, 822 | "requires": { 823 | "balanced-match": "^0.2.0", 824 | "concat-map": "0.0.1" 825 | }, 826 | "dependencies": { 827 | "balanced-match": { 828 | "version": "0.2.0", 829 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", 830 | "integrity": "sha1-OPZzDAOqttXtu1K9k0iF51bXFnQ=", 831 | "dev": true 832 | }, 833 | "concat-map": { 834 | "version": "0.0.1", 835 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 836 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 837 | "dev": true 838 | } 839 | } 840 | } 841 | } 842 | }, 843 | "once": { 844 | "version": "1.3.2", 845 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", 846 | "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", 847 | "dev": true, 848 | "requires": { 849 | "wrappy": "1" 850 | }, 851 | "dependencies": { 852 | "wrappy": { 853 | "version": "1.0.1", 854 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 855 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 856 | "dev": true 857 | } 858 | } 859 | }, 860 | "path-is-absolute": { 861 | "version": "1.0.0", 862 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", 863 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", 864 | "dev": true 865 | } 866 | } 867 | }, 868 | "ignore": { 869 | "version": "2.2.15", 870 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-2.2.15.tgz", 871 | "integrity": "sha1-a9VSGF4NHNOTtBZgPuaGh57DvDs=", 872 | "dev": true 873 | }, 874 | "minimist": { 875 | "version": "1.1.1", 876 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.1.tgz", 877 | "integrity": "sha1-G8K8cWWM3KVxJHVoQ2NhWwtPaVs=", 878 | "dev": true 879 | }, 880 | "run-parallel": { 881 | "version": "1.1.1", 882 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.1.tgz", 883 | "integrity": "sha1-BDwfQOXqlEhfaFi3nGygglTQcg4=", 884 | "dev": true, 885 | "requires": { 886 | "dezalgo": "^1.0.1" 887 | } 888 | }, 889 | "standard-format": { 890 | "version": "1.3.6", 891 | "resolved": "https://registry.npmjs.org/standard-format/-/standard-format-1.3.6.tgz", 892 | "integrity": "sha1-d78pCHzxWgN8hMucUZctn5dOhjk=", 893 | "dev": true, 894 | "requires": { 895 | "esformatter": "^0.6.0", 896 | "esformatter-eol-last": "^1.0.0", 897 | "esformatter-literal-notation": "^1.0.0", 898 | "esformatter-quotes": "^1.0.0", 899 | "esformatter-spaced-lined-comment": "^2.0.0", 900 | "find-root": "^0.1.1", 901 | "glob": "^4.3.5", 902 | "minimatch": "^2.0.1", 903 | "minimist": "^1.1.0", 904 | "stdin": "0.0.1" 905 | }, 906 | "dependencies": { 907 | "esformatter": { 908 | "version": "0.6.1", 909 | "resolved": "https://registry.npmjs.org/esformatter/-/esformatter-0.6.1.tgz", 910 | "integrity": "sha1-sLrJsb3jeTvAz/LFkPlAzIatS8Q=", 911 | "dev": true, 912 | "requires": { 913 | "debug": "^0.7.4", 914 | "mout": ">=0.9 <2.0", 915 | "npm-run": "^1.1.1", 916 | "optimist": "~0.6.0", 917 | "resolve": "^1.1.5", 918 | "rocambole": ">=0.5 <2.0", 919 | "rocambole-indent": "^2.0.3", 920 | "rocambole-linebreak": "^1.0.0", 921 | "rocambole-node": "~1.0", 922 | "rocambole-token": "^1.1.2", 923 | "rocambole-whitespace": "^1.0.0", 924 | "semver": "~2.2.1", 925 | "stdin": "*", 926 | "strip-json-comments": "~0.1.1" 927 | }, 928 | "dependencies": { 929 | "debug": { 930 | "version": "0.7.4", 931 | "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", 932 | "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", 933 | "dev": true 934 | }, 935 | "mout": { 936 | "version": "0.11.0", 937 | "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.0.tgz", 938 | "integrity": "sha1-k83weRrIokhzzutCpbAWt8hnq+4=", 939 | "dev": true 940 | }, 941 | "npm-run": { 942 | "version": "1.1.1", 943 | "resolved": "https://registry.npmjs.org/npm-run/-/npm-run-1.1.1.tgz", 944 | "integrity": "sha1-xDEkUfOCt67npIWOYCg6vz26yOw=", 945 | "dev": true, 946 | "requires": { 947 | "minimist": "^1.1.0", 948 | "npm-path": "^1.0.1", 949 | "serializerr": "^1.0.1", 950 | "sync-exec": "^0.5.0" 951 | }, 952 | "dependencies": { 953 | "npm-path": { 954 | "version": "1.0.1", 955 | "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-1.0.1.tgz", 956 | "integrity": "sha1-FddQ78nYgIGUxyFIHfohD73kFcU=", 957 | "dev": true, 958 | "requires": { 959 | "which": "^1.0.5" 960 | }, 961 | "dependencies": { 962 | "which": { 963 | "version": "1.1.1", 964 | "resolved": "https://registry.npmjs.org/which/-/which-1.1.1.tgz", 965 | "integrity": "sha1-nOUSRZlGFm4SwIPwjsBzOA/Iy7s=", 966 | "dev": true, 967 | "requires": { 968 | "is-absolute": "^0.1.7" 969 | }, 970 | "dependencies": { 971 | "is-absolute": { 972 | "version": "0.1.7", 973 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", 974 | "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", 975 | "dev": true, 976 | "requires": { 977 | "is-relative": "^0.1.0" 978 | }, 979 | "dependencies": { 980 | "is-relative": { 981 | "version": "0.1.3", 982 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", 983 | "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", 984 | "dev": true 985 | } 986 | } 987 | } 988 | } 989 | } 990 | } 991 | }, 992 | "serializerr": { 993 | "version": "1.0.1", 994 | "resolved": "https://registry.npmjs.org/serializerr/-/serializerr-1.0.1.tgz", 995 | "integrity": "sha1-c1FhX8BqbxdWpgcLtOjSfEFJpT8=", 996 | "dev": true, 997 | "requires": { 998 | "protochain": "^1.0.1" 999 | }, 1000 | "dependencies": { 1001 | "protochain": { 1002 | "version": "1.0.2", 1003 | "resolved": "https://registry.npmjs.org/protochain/-/protochain-1.0.2.tgz", 1004 | "integrity": "sha1-khFVgci8A4KnrQ0MeKNVFzYz3lA=", 1005 | "dev": true 1006 | } 1007 | } 1008 | }, 1009 | "sync-exec": { 1010 | "version": "0.5.0", 1011 | "resolved": "https://registry.npmjs.org/sync-exec/-/sync-exec-0.5.0.tgz", 1012 | "integrity": "sha1-P3JY5KW6FyRTgZCfpqb2z1BuFmE=", 1013 | "dev": true 1014 | } 1015 | } 1016 | }, 1017 | "optimist": { 1018 | "version": "0.6.1", 1019 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1020 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1021 | "dev": true, 1022 | "requires": { 1023 | "minimist": "~0.0.1", 1024 | "wordwrap": "~0.0.2" 1025 | }, 1026 | "dependencies": { 1027 | "minimist": { 1028 | "version": "0.0.10", 1029 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1030 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 1031 | "dev": true 1032 | }, 1033 | "wordwrap": { 1034 | "version": "0.0.3", 1035 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1036 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1037 | "dev": true 1038 | } 1039 | } 1040 | }, 1041 | "resolve": { 1042 | "version": "1.1.6", 1043 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.6.tgz", 1044 | "integrity": "sha1-00kq0FTKgA9b76YS5hvqwe7Jj48=", 1045 | "dev": true 1046 | }, 1047 | "rocambole": { 1048 | "version": "0.6.0", 1049 | "resolved": "https://registry.npmjs.org/rocambole/-/rocambole-0.6.0.tgz", 1050 | "integrity": "sha1-U08jWih8wX+bBXuVvRHQ8Nw1RSw=", 1051 | "dev": true, 1052 | "requires": { 1053 | "esprima": "^2.0" 1054 | }, 1055 | "dependencies": { 1056 | "esprima": { 1057 | "version": "2.2.0", 1058 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.2.0.tgz", 1059 | "integrity": "sha1-QpLB1o5Bc9gV+iKQ3Hr8ltgfzYM=", 1060 | "dev": true 1061 | } 1062 | } 1063 | }, 1064 | "rocambole-indent": { 1065 | "version": "2.0.4", 1066 | "resolved": "https://registry.npmjs.org/rocambole-indent/-/rocambole-indent-2.0.4.tgz", 1067 | "integrity": "sha1-oYokl3ygQAuGHapGMehh3LUtCFw=", 1068 | "dev": true, 1069 | "requires": { 1070 | "debug": "^2.1.3", 1071 | "mout": "^0.11.0", 1072 | "rocambole-token": "^1.2.1" 1073 | }, 1074 | "dependencies": { 1075 | "debug": { 1076 | "version": "2.2.0", 1077 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1078 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1079 | "dev": true, 1080 | "requires": { 1081 | "ms": "0.7.1" 1082 | }, 1083 | "dependencies": { 1084 | "ms": { 1085 | "version": "0.7.1", 1086 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1087 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1088 | "dev": true 1089 | } 1090 | } 1091 | } 1092 | } 1093 | }, 1094 | "rocambole-linebreak": { 1095 | "version": "1.0.1", 1096 | "resolved": "https://registry.npmjs.org/rocambole-linebreak/-/rocambole-linebreak-1.0.1.tgz", 1097 | "integrity": "sha1-Y/YrEQwRCOcYRGD50rrDG5TFw8A=", 1098 | "dev": true, 1099 | "requires": { 1100 | "debug": "^2.1.3", 1101 | "rocambole-token": "^1.2.1", 1102 | "semver": "^4.3.1" 1103 | }, 1104 | "dependencies": { 1105 | "debug": { 1106 | "version": "2.2.0", 1107 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1108 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1109 | "dev": true, 1110 | "requires": { 1111 | "ms": "0.7.1" 1112 | }, 1113 | "dependencies": { 1114 | "ms": { 1115 | "version": "0.7.1", 1116 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1117 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1118 | "dev": true 1119 | } 1120 | } 1121 | }, 1122 | "semver": { 1123 | "version": "4.3.6", 1124 | "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", 1125 | "dev": true 1126 | } 1127 | } 1128 | }, 1129 | "rocambole-node": { 1130 | "version": "1.0.0", 1131 | "resolved": "https://registry.npmjs.org/rocambole-node/-/rocambole-node-1.0.0.tgz", 1132 | "integrity": "sha1-21tJ3nQHsAgN1RSHLyjjk9D3/z8=", 1133 | "dev": true 1134 | }, 1135 | "rocambole-token": { 1136 | "version": "1.2.1", 1137 | "resolved": "https://registry.npmjs.org/rocambole-token/-/rocambole-token-1.2.1.tgz", 1138 | "integrity": "sha1-x4XfdCjcPLJ614lwR71SOMwHDTU=", 1139 | "dev": true 1140 | }, 1141 | "rocambole-whitespace": { 1142 | "version": "1.0.0", 1143 | "resolved": "https://registry.npmjs.org/rocambole-whitespace/-/rocambole-whitespace-1.0.0.tgz", 1144 | "integrity": "sha1-YzMJSSVrKZQfWbGQRZ+ZnGsdO/k=", 1145 | "dev": true, 1146 | "requires": { 1147 | "debug": "^2.1.3", 1148 | "repeat-string": "^1.5.0", 1149 | "rocambole-token": "^1.2.1" 1150 | }, 1151 | "dependencies": { 1152 | "debug": { 1153 | "version": "2.2.0", 1154 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1155 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1156 | "dev": true, 1157 | "requires": { 1158 | "ms": "0.7.1" 1159 | }, 1160 | "dependencies": { 1161 | "ms": { 1162 | "version": "0.7.1", 1163 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1164 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1165 | "dev": true 1166 | } 1167 | } 1168 | }, 1169 | "repeat-string": { 1170 | "version": "1.5.2", 1171 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", 1172 | "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=", 1173 | "dev": true 1174 | } 1175 | } 1176 | }, 1177 | "semver": { 1178 | "version": "2.2.1", 1179 | "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", 1180 | "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM=", 1181 | "dev": true 1182 | }, 1183 | "strip-json-comments": { 1184 | "version": "0.1.3", 1185 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz", 1186 | "integrity": "sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ=", 1187 | "dev": true 1188 | } 1189 | } 1190 | }, 1191 | "esformatter-eol-last": { 1192 | "version": "1.0.0", 1193 | "resolved": "https://registry.npmjs.org/esformatter-eol-last/-/esformatter-eol-last-1.0.0.tgz", 1194 | "integrity": "sha1-RaeP9GIrHUnkT1a0mQV2amMpDAc=", 1195 | "dev": true, 1196 | "requires": { 1197 | "string.prototype.endswith": "^0.2.0" 1198 | }, 1199 | "dependencies": { 1200 | "string.prototype.endswith": { 1201 | "version": "0.2.0", 1202 | "resolved": "https://registry.npmjs.org/string.prototype.endswith/-/string.prototype.endswith-0.2.0.tgz", 1203 | "integrity": "sha1-oZwg3uUamHd+mkfhDwm+OTubunU=", 1204 | "dev": true 1205 | } 1206 | } 1207 | }, 1208 | "esformatter-literal-notation": { 1209 | "version": "1.0.0", 1210 | "resolved": "https://registry.npmjs.org/esformatter-literal-notation/-/esformatter-literal-notation-1.0.0.tgz", 1211 | "integrity": "sha1-0CAdBAaZMESqrzjTJUhCXKy1OOU=", 1212 | "dev": true, 1213 | "requires": { 1214 | "rocambole": "^0.3.6", 1215 | "rocambole-token": "^1.2.1" 1216 | }, 1217 | "dependencies": { 1218 | "rocambole": { 1219 | "version": "0.3.6", 1220 | "resolved": "https://registry.npmjs.org/rocambole/-/rocambole-0.3.6.tgz", 1221 | "integrity": "sha1-Teu/WUMUS8e2AG2Vvo+swLdDUqc=", 1222 | "dev": true, 1223 | "requires": { 1224 | "esprima": "~1.0" 1225 | }, 1226 | "dependencies": { 1227 | "esprima": { 1228 | "version": "1.0.4", 1229 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 1230 | "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", 1231 | "dev": true 1232 | } 1233 | } 1234 | }, 1235 | "rocambole-token": { 1236 | "version": "1.2.1", 1237 | "resolved": "https://registry.npmjs.org/rocambole-token/-/rocambole-token-1.2.1.tgz", 1238 | "integrity": "sha1-x4XfdCjcPLJ614lwR71SOMwHDTU=", 1239 | "dev": true 1240 | } 1241 | } 1242 | }, 1243 | "esformatter-quotes": { 1244 | "version": "1.0.1", 1245 | "resolved": "https://registry.npmjs.org/esformatter-quotes/-/esformatter-quotes-1.0.1.tgz", 1246 | "integrity": "sha1-7L9L3eRnJ5L2HnvqYueLJytUMVw=", 1247 | "dev": true 1248 | }, 1249 | "esformatter-spaced-lined-comment": { 1250 | "version": "2.0.1", 1251 | "resolved": "https://registry.npmjs.org/esformatter-spaced-lined-comment/-/esformatter-spaced-lined-comment-2.0.1.tgz", 1252 | "integrity": "sha1-3F80B/k8KV4eVkRr00RWDaXm3Kw=", 1253 | "dev": true 1254 | }, 1255 | "glob": { 1256 | "version": "4.5.3", 1257 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", 1258 | "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", 1259 | "dev": true, 1260 | "requires": { 1261 | "inflight": "^1.0.4", 1262 | "inherits": "2", 1263 | "minimatch": "^2.0.1", 1264 | "once": "^1.3.0" 1265 | }, 1266 | "dependencies": { 1267 | "inflight": { 1268 | "version": "1.0.4", 1269 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", 1270 | "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", 1271 | "dev": true, 1272 | "requires": { 1273 | "once": "^1.3.0", 1274 | "wrappy": "1" 1275 | }, 1276 | "dependencies": { 1277 | "wrappy": { 1278 | "version": "1.0.1", 1279 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 1280 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 1281 | "dev": true 1282 | } 1283 | } 1284 | }, 1285 | "once": { 1286 | "version": "1.3.2", 1287 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", 1288 | "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", 1289 | "dev": true, 1290 | "requires": { 1291 | "wrappy": "1" 1292 | }, 1293 | "dependencies": { 1294 | "wrappy": { 1295 | "version": "1.0.1", 1296 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 1297 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 1298 | "dev": true 1299 | } 1300 | } 1301 | } 1302 | } 1303 | }, 1304 | "minimatch": { 1305 | "version": "2.0.8", 1306 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.8.tgz", 1307 | "integrity": "sha1-C8IPa/NXCmmO8N3/kCBjxsq9pr8=", 1308 | "dev": true, 1309 | "requires": { 1310 | "brace-expansion": "^1.0.0" 1311 | }, 1312 | "dependencies": { 1313 | "brace-expansion": { 1314 | "version": "1.1.0", 1315 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", 1316 | "integrity": "sha1-ybfQPAPze8cEvhAOUitA249s/Nk=", 1317 | "dev": true, 1318 | "requires": { 1319 | "balanced-match": "^0.2.0", 1320 | "concat-map": "0.0.1" 1321 | }, 1322 | "dependencies": { 1323 | "balanced-match": { 1324 | "version": "0.2.0", 1325 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", 1326 | "integrity": "sha1-OPZzDAOqttXtu1K9k0iF51bXFnQ=", 1327 | "dev": true 1328 | }, 1329 | "concat-map": { 1330 | "version": "0.0.1", 1331 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1332 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1333 | "dev": true 1334 | } 1335 | } 1336 | } 1337 | } 1338 | }, 1339 | "stdin": { 1340 | "version": "0.0.1", 1341 | "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", 1342 | "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", 1343 | "dev": true 1344 | } 1345 | } 1346 | }, 1347 | "uniq": { 1348 | "version": "1.0.1", 1349 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 1350 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 1351 | "dev": true 1352 | }, 1353 | "xtend": { 1354 | "version": "4.0.0", 1355 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz", 1356 | "integrity": "sha1-i8Nv+Hrtvnzp6vC8o2sjVKdDhA8=", 1357 | "dev": true 1358 | } 1359 | } 1360 | }, 1361 | "tap": { 1362 | "version": "1.2.0", 1363 | "resolved": "https://registry.npmjs.org/tap/-/tap-1.2.0.tgz", 1364 | "integrity": "sha1-fU3D/6cL7M4WGVfS9Gh0UfjSH6o=", 1365 | "dev": true, 1366 | "requires": { 1367 | "buffer-equal": "~0.0.0", 1368 | "coveralls": "^2.11.2", 1369 | "deep-equal": "^1.0.0", 1370 | "foreground-child": "^1.2.0", 1371 | "glob": "^5.0.6", 1372 | "js-yaml": "^3.3.1", 1373 | "mkdirp": "^0.5.0", 1374 | "nyc": "^2.1.0", 1375 | "opener": "^1.4.1", 1376 | "readable-stream": "^1.1.13", 1377 | "signal-exit": "^2.0.0", 1378 | "supports-color": "^1.3.1", 1379 | "tap-mocha-reporter": "0.0 || 1", 1380 | "tap-parser": "^1.0.1" 1381 | }, 1382 | "dependencies": { 1383 | "buffer-equal": { 1384 | "version": "0.0.1", 1385 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 1386 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", 1387 | "dev": true 1388 | }, 1389 | "coveralls": { 1390 | "version": "2.11.2", 1391 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.11.2.tgz", 1392 | "integrity": "sha1-1NmCAWyy+dqJ13qyBNhqhTfmoS0=", 1393 | "dev": true, 1394 | "requires": { 1395 | "js-yaml": "3.0.1", 1396 | "lcov-parse": "0.0.6", 1397 | "log-driver": "1.2.4", 1398 | "request": "2.40.0" 1399 | }, 1400 | "dependencies": { 1401 | "js-yaml": { 1402 | "version": "3.0.1", 1403 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.0.1.tgz", 1404 | "integrity": "sha1-dkBf6lvOMPyPQF1Ixtyn8KMsav4=", 1405 | "dev": true, 1406 | "requires": { 1407 | "argparse": "~ 0.1.11", 1408 | "esprima": "~ 1.0.2" 1409 | }, 1410 | "dependencies": { 1411 | "argparse": { 1412 | "version": "0.1.16", 1413 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", 1414 | "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", 1415 | "dev": true, 1416 | "requires": { 1417 | "underscore": "~1.7.0", 1418 | "underscore.string": "~2.4.0" 1419 | }, 1420 | "dependencies": { 1421 | "underscore": { 1422 | "version": "1.7.0", 1423 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", 1424 | "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", 1425 | "dev": true 1426 | }, 1427 | "underscore.string": { 1428 | "version": "2.4.0", 1429 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", 1430 | "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", 1431 | "dev": true 1432 | } 1433 | } 1434 | }, 1435 | "esprima": { 1436 | "version": "1.0.4", 1437 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 1438 | "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", 1439 | "dev": true 1440 | } 1441 | } 1442 | }, 1443 | "lcov-parse": { 1444 | "version": "0.0.6", 1445 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.6.tgz", 1446 | "integrity": "sha1-gZ5dqL8HkfnT857qXtGGgYfxEXU=", 1447 | "dev": true 1448 | }, 1449 | "log-driver": { 1450 | "version": "1.2.4", 1451 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.4.tgz", 1452 | "integrity": "sha1-LWLX+u9F2KcTQZYaBLB2HsqZz6M=", 1453 | "dev": true 1454 | }, 1455 | "request": { 1456 | "version": "2.40.0", 1457 | "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", 1458 | "integrity": "sha1-TdZw9pbx5uhC5mtLXoOTAaub62c=", 1459 | "dev": true, 1460 | "requires": { 1461 | "aws-sign2": "~0.5.0", 1462 | "forever-agent": "~0.5.0", 1463 | "form-data": "~0.1.0", 1464 | "hawk": "1.1.1", 1465 | "http-signature": "~0.10.0", 1466 | "json-stringify-safe": "~5.0.0", 1467 | "mime-types": "~1.0.1", 1468 | "node-uuid": "~1.4.0", 1469 | "oauth-sign": "~0.3.0", 1470 | "qs": "~1.0.0", 1471 | "stringstream": "~0.0.4", 1472 | "tough-cookie": ">=0.12.0", 1473 | "tunnel-agent": "~0.4.0" 1474 | }, 1475 | "dependencies": { 1476 | "aws-sign2": { 1477 | "version": "0.5.0", 1478 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", 1479 | "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", 1480 | "dev": true, 1481 | "optional": true 1482 | }, 1483 | "forever-agent": { 1484 | "version": "0.5.2", 1485 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", 1486 | "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", 1487 | "dev": true 1488 | }, 1489 | "form-data": { 1490 | "version": "0.1.4", 1491 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", 1492 | "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", 1493 | "dev": true, 1494 | "optional": true, 1495 | "requires": { 1496 | "async": "~0.9.0", 1497 | "combined-stream": "~0.0.4", 1498 | "mime": "~1.2.11" 1499 | }, 1500 | "dependencies": { 1501 | "async": { 1502 | "version": "0.9.2", 1503 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 1504 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", 1505 | "dev": true, 1506 | "optional": true 1507 | }, 1508 | "combined-stream": { 1509 | "version": "0.0.7", 1510 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", 1511 | "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", 1512 | "dev": true, 1513 | "optional": true, 1514 | "requires": { 1515 | "delayed-stream": "0.0.5" 1516 | }, 1517 | "dependencies": { 1518 | "delayed-stream": { 1519 | "version": "0.0.5", 1520 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", 1521 | "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", 1522 | "dev": true, 1523 | "optional": true 1524 | } 1525 | } 1526 | }, 1527 | "mime": { 1528 | "version": "1.2.11", 1529 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", 1530 | "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", 1531 | "dev": true, 1532 | "optional": true 1533 | } 1534 | } 1535 | }, 1536 | "hawk": { 1537 | "version": "1.1.1", 1538 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", 1539 | "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", 1540 | "dev": true, 1541 | "optional": true, 1542 | "requires": { 1543 | "boom": "0.4.x", 1544 | "cryptiles": "0.2.x", 1545 | "hoek": "0.9.x", 1546 | "sntp": "0.2.x" 1547 | }, 1548 | "dependencies": { 1549 | "boom": { 1550 | "version": "0.4.2", 1551 | "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", 1552 | "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", 1553 | "dev": true, 1554 | "optional": true, 1555 | "requires": { 1556 | "hoek": "0.9.x" 1557 | } 1558 | }, 1559 | "cryptiles": { 1560 | "version": "0.2.2", 1561 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", 1562 | "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", 1563 | "dev": true, 1564 | "optional": true, 1565 | "requires": { 1566 | "boom": "0.4.x" 1567 | } 1568 | }, 1569 | "hoek": { 1570 | "version": "0.9.1", 1571 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", 1572 | "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", 1573 | "dev": true, 1574 | "optional": true 1575 | }, 1576 | "sntp": { 1577 | "version": "0.2.4", 1578 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", 1579 | "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", 1580 | "dev": true, 1581 | "optional": true, 1582 | "requires": { 1583 | "hoek": "0.9.x" 1584 | } 1585 | } 1586 | } 1587 | }, 1588 | "http-signature": { 1589 | "version": "0.10.1", 1590 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", 1591 | "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", 1592 | "dev": true, 1593 | "optional": true, 1594 | "requires": { 1595 | "asn1": "0.1.11", 1596 | "assert-plus": "^0.1.5", 1597 | "ctype": "0.5.3" 1598 | }, 1599 | "dependencies": { 1600 | "asn1": { 1601 | "version": "0.1.11", 1602 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", 1603 | "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", 1604 | "dev": true, 1605 | "optional": true 1606 | }, 1607 | "assert-plus": { 1608 | "version": "0.1.5", 1609 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", 1610 | "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", 1611 | "dev": true, 1612 | "optional": true 1613 | }, 1614 | "ctype": { 1615 | "version": "0.5.3", 1616 | "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", 1617 | "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", 1618 | "dev": true, 1619 | "optional": true 1620 | } 1621 | } 1622 | }, 1623 | "json-stringify-safe": { 1624 | "version": "5.0.1", 1625 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1626 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1627 | "dev": true 1628 | }, 1629 | "mime-types": { 1630 | "version": "1.0.2", 1631 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", 1632 | "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", 1633 | "dev": true 1634 | }, 1635 | "node-uuid": { 1636 | "version": "1.4.3", 1637 | "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz", 1638 | "integrity": "sha1-MZu3pW58tj8AtcDNeFHNS03fHfk=", 1639 | "dev": true 1640 | }, 1641 | "oauth-sign": { 1642 | "version": "0.3.0", 1643 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", 1644 | "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", 1645 | "dev": true, 1646 | "optional": true 1647 | }, 1648 | "qs": { 1649 | "version": "1.0.2", 1650 | "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", 1651 | "integrity": "sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g=", 1652 | "dev": true 1653 | }, 1654 | "stringstream": { 1655 | "version": "0.0.4", 1656 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz", 1657 | "integrity": "sha1-Dw40I/lClgtWkqwySlfdCTvEGpI=", 1658 | "dev": true, 1659 | "optional": true 1660 | }, 1661 | "tough-cookie": { 1662 | "version": "1.2.0", 1663 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-1.2.0.tgz", 1664 | "integrity": "sha1-m36dmOdp6AtaqJnZRP5E4C6/gq0=", 1665 | "dev": true, 1666 | "optional": true 1667 | }, 1668 | "tunnel-agent": { 1669 | "version": "0.4.0", 1670 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz", 1671 | "integrity": "sha1-sRhOMS/7z3CztMeOjCGd5+uxxVA=", 1672 | "dev": true, 1673 | "optional": true 1674 | } 1675 | } 1676 | } 1677 | } 1678 | }, 1679 | "deep-equal": { 1680 | "version": "1.0.0", 1681 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.0.tgz", 1682 | "integrity": "sha1-1FZPB9Lwqz5GEQvsFlkqvX3C4yY=", 1683 | "dev": true 1684 | }, 1685 | "foreground-child": { 1686 | "version": "1.2.0", 1687 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.2.0.tgz", 1688 | "integrity": "sha1-aEnUYPTvXbhUu2d3dhOmliJtjXU=", 1689 | "dev": true, 1690 | "requires": { 1691 | "signal-exit": "^2.0.0" 1692 | } 1693 | }, 1694 | "glob": { 1695 | "version": "5.0.10", 1696 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.10.tgz", 1697 | "integrity": "sha1-PuNQMZ8x81LO9omaSPa2t4NMaJk=", 1698 | "dev": true, 1699 | "requires": { 1700 | "inflight": "^1.0.4", 1701 | "inherits": "2", 1702 | "minimatch": "^2.0.1", 1703 | "once": "^1.3.0", 1704 | "path-is-absolute": "^1.0.0" 1705 | }, 1706 | "dependencies": { 1707 | "inflight": { 1708 | "version": "1.0.4", 1709 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", 1710 | "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", 1711 | "dev": true, 1712 | "requires": { 1713 | "once": "^1.3.0", 1714 | "wrappy": "1" 1715 | }, 1716 | "dependencies": { 1717 | "wrappy": { 1718 | "version": "1.0.1", 1719 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 1720 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 1721 | "dev": true 1722 | } 1723 | } 1724 | }, 1725 | "minimatch": { 1726 | "version": "2.0.8", 1727 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.8.tgz", 1728 | "integrity": "sha1-C8IPa/NXCmmO8N3/kCBjxsq9pr8=", 1729 | "dev": true, 1730 | "requires": { 1731 | "brace-expansion": "^1.0.0" 1732 | }, 1733 | "dependencies": { 1734 | "brace-expansion": { 1735 | "version": "1.1.0", 1736 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", 1737 | "integrity": "sha1-ybfQPAPze8cEvhAOUitA249s/Nk=", 1738 | "dev": true, 1739 | "requires": { 1740 | "balanced-match": "^0.2.0", 1741 | "concat-map": "0.0.1" 1742 | }, 1743 | "dependencies": { 1744 | "balanced-match": { 1745 | "version": "0.2.0", 1746 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", 1747 | "integrity": "sha1-OPZzDAOqttXtu1K9k0iF51bXFnQ=", 1748 | "dev": true 1749 | }, 1750 | "concat-map": { 1751 | "version": "0.0.1", 1752 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1753 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1754 | "dev": true 1755 | } 1756 | } 1757 | } 1758 | } 1759 | }, 1760 | "once": { 1761 | "version": "1.3.2", 1762 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", 1763 | "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", 1764 | "dev": true, 1765 | "requires": { 1766 | "wrappy": "1" 1767 | }, 1768 | "dependencies": { 1769 | "wrappy": { 1770 | "version": "1.0.1", 1771 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 1772 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 1773 | "dev": true 1774 | } 1775 | } 1776 | }, 1777 | "path-is-absolute": { 1778 | "version": "1.0.0", 1779 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", 1780 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", 1781 | "dev": true 1782 | } 1783 | } 1784 | }, 1785 | "js-yaml": { 1786 | "version": "3.3.1", 1787 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.3.1.tgz", 1788 | "integrity": "sha1-yhrNNCPsJ10SFAp7q1HbAVugs8A=", 1789 | "dev": true, 1790 | "requires": { 1791 | "argparse": "~1.0.2", 1792 | "esprima": "~2.2.0" 1793 | }, 1794 | "dependencies": { 1795 | "argparse": { 1796 | "version": "1.0.2", 1797 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.2.tgz", 1798 | "integrity": "sha1-vPrjkFllbRlz0LnmoadBVLWpoTY=", 1799 | "dev": true, 1800 | "requires": { 1801 | "lodash": ">= 3.2.0 < 4.0.0", 1802 | "sprintf-js": "~1.0.2" 1803 | }, 1804 | "dependencies": { 1805 | "lodash": { 1806 | "version": "3.9.3", 1807 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", 1808 | "integrity": "sha1-AVnoaDL+/8bWHYUrEqlTuZSWvTI=", 1809 | "dev": true 1810 | }, 1811 | "sprintf-js": { 1812 | "version": "1.0.2", 1813 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.2.tgz", 1814 | "integrity": "sha1-EeTYT/MhRONbC/Omb4WH842PmXg=", 1815 | "dev": true 1816 | } 1817 | } 1818 | }, 1819 | "esprima": { 1820 | "version": "2.2.0", 1821 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.2.0.tgz", 1822 | "integrity": "sha1-QpLB1o5Bc9gV+iKQ3Hr8ltgfzYM=", 1823 | "dev": true 1824 | } 1825 | } 1826 | }, 1827 | "nyc": { 1828 | "version": "2.2.1", 1829 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-2.2.1.tgz", 1830 | "integrity": "sha1-c+9FOmWun4gMd7lmw9gz9KMqgOk=", 1831 | "dev": true, 1832 | "requires": { 1833 | "foreground-child": "^1.2.0", 1834 | "istanbul": "^0.3.14", 1835 | "lodash": "^3.8.0", 1836 | "mkdirp": "^0.5.0", 1837 | "rimraf": "^2.3.3", 1838 | "signal-exit": "^2.1.1", 1839 | "spawn-wrap": "^1.0.1", 1840 | "strip-bom": "^1.0.0", 1841 | "yargs": "^3.8.0" 1842 | }, 1843 | "dependencies": { 1844 | "istanbul": { 1845 | "version": "0.3.14", 1846 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.14.tgz", 1847 | "integrity": "sha1-XgqhRM/d5rtxERJMi0Jca/U//B4=", 1848 | "dev": true, 1849 | "requires": { 1850 | "abbrev": "1.0.x", 1851 | "async": "0.9.x", 1852 | "escodegen": "1.6.x", 1853 | "esprima": "2.1.x", 1854 | "fileset": "0.1.x", 1855 | "handlebars": "3.0.0", 1856 | "js-yaml": "3.x", 1857 | "mkdirp": "0.5.x", 1858 | "nopt": "3.x", 1859 | "once": "1.x", 1860 | "resolve": "1.1.x", 1861 | "supports-color": "1.3.x", 1862 | "which": "1.0.x", 1863 | "wordwrap": "0.0.x" 1864 | }, 1865 | "dependencies": { 1866 | "abbrev": { 1867 | "version": "1.0.7", 1868 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", 1869 | "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", 1870 | "dev": true 1871 | }, 1872 | "async": { 1873 | "version": "0.9.2", 1874 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 1875 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", 1876 | "dev": true 1877 | }, 1878 | "escodegen": { 1879 | "version": "1.6.1", 1880 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.6.1.tgz", 1881 | "integrity": "sha1-Nn3hfYUQVA0SvG3Liz+Rg5EmWBU=", 1882 | "dev": true, 1883 | "requires": { 1884 | "esprima": "^1.2.2", 1885 | "estraverse": "^1.9.1", 1886 | "esutils": "^1.1.6", 1887 | "optionator": "^0.5.0", 1888 | "source-map": "~0.1.40" 1889 | }, 1890 | "dependencies": { 1891 | "esprima": { 1892 | "version": "1.2.5", 1893 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", 1894 | "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=", 1895 | "dev": true 1896 | }, 1897 | "estraverse": { 1898 | "version": "1.9.3", 1899 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 1900 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 1901 | "dev": true 1902 | }, 1903 | "esutils": { 1904 | "version": "1.1.6", 1905 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", 1906 | "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", 1907 | "dev": true 1908 | }, 1909 | "optionator": { 1910 | "version": "0.5.0", 1911 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz", 1912 | "integrity": "sha1-t1qJlaLUF98ltuTjhi9QqohlE2g=", 1913 | "dev": true, 1914 | "requires": { 1915 | "deep-is": "~0.1.2", 1916 | "fast-levenshtein": "~1.0.0", 1917 | "levn": "~0.2.5", 1918 | "prelude-ls": "~1.1.1", 1919 | "type-check": "~0.3.1", 1920 | "wordwrap": "~0.0.2" 1921 | }, 1922 | "dependencies": { 1923 | "deep-is": { 1924 | "version": "0.1.3", 1925 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 1926 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 1927 | "dev": true 1928 | }, 1929 | "fast-levenshtein": { 1930 | "version": "1.0.6", 1931 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.6.tgz", 1932 | "integrity": "sha1-O+2xhOOflcsNiJKGiOax7jJzRGo=", 1933 | "dev": true 1934 | }, 1935 | "levn": { 1936 | "version": "0.2.5", 1937 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", 1938 | "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", 1939 | "dev": true, 1940 | "requires": { 1941 | "prelude-ls": "~1.1.0", 1942 | "type-check": "~0.3.1" 1943 | } 1944 | }, 1945 | "prelude-ls": { 1946 | "version": "1.1.2", 1947 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1948 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1949 | "dev": true 1950 | }, 1951 | "type-check": { 1952 | "version": "0.3.1", 1953 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.1.tgz", 1954 | "integrity": "sha1-kjOSPE2hdNCsVIDs/W74TDSetY0=", 1955 | "dev": true, 1956 | "requires": { 1957 | "prelude-ls": "~1.1.0" 1958 | } 1959 | } 1960 | } 1961 | }, 1962 | "source-map": { 1963 | "version": "0.1.43", 1964 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 1965 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 1966 | "dev": true, 1967 | "optional": true, 1968 | "requires": { 1969 | "amdefine": ">=0.0.4" 1970 | }, 1971 | "dependencies": { 1972 | "amdefine": { 1973 | "version": "0.1.0", 1974 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz", 1975 | "integrity": "sha1-PKlzXPHd4O33pL9mQXCcgCT5sic=", 1976 | "dev": true, 1977 | "optional": true 1978 | } 1979 | } 1980 | } 1981 | } 1982 | }, 1983 | "esprima": { 1984 | "version": "2.1.0", 1985 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.1.0.tgz", 1986 | "integrity": "sha1-wcn7lJdd/MP8ccYPB088UVaijvU=", 1987 | "dev": true 1988 | }, 1989 | "fileset": { 1990 | "version": "0.1.5", 1991 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz", 1992 | "integrity": "sha1-rMQjv6+ShDOFxmv3WCImTRG3vZQ=", 1993 | "dev": true, 1994 | "requires": { 1995 | "glob": "3.x", 1996 | "minimatch": "0.x" 1997 | }, 1998 | "dependencies": { 1999 | "glob": { 2000 | "version": "3.2.11", 2001 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 2002 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 2003 | "dev": true, 2004 | "requires": { 2005 | "inherits": "2", 2006 | "minimatch": "0.3" 2007 | }, 2008 | "dependencies": { 2009 | "minimatch": { 2010 | "version": "0.3.0", 2011 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 2012 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 2013 | "dev": true, 2014 | "requires": { 2015 | "lru-cache": "2", 2016 | "sigmund": "~1.0.0" 2017 | }, 2018 | "dependencies": { 2019 | "lru-cache": { 2020 | "version": "2.6.4", 2021 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.4.tgz", 2022 | "integrity": "sha1-JnUZDM0bBwHsL2UqTQ09QA12wN0=", 2023 | "dev": true 2024 | }, 2025 | "sigmund": { 2026 | "version": "1.0.1", 2027 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2028 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2029 | "dev": true 2030 | } 2031 | } 2032 | } 2033 | } 2034 | }, 2035 | "minimatch": { 2036 | "version": "0.4.0", 2037 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz", 2038 | "integrity": "sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs=", 2039 | "dev": true, 2040 | "requires": { 2041 | "lru-cache": "2", 2042 | "sigmund": "~1.0.0" 2043 | }, 2044 | "dependencies": { 2045 | "lru-cache": { 2046 | "version": "2.6.4", 2047 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.4.tgz", 2048 | "integrity": "sha1-JnUZDM0bBwHsL2UqTQ09QA12wN0=", 2049 | "dev": true 2050 | }, 2051 | "sigmund": { 2052 | "version": "1.0.1", 2053 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2054 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2055 | "dev": true 2056 | } 2057 | } 2058 | } 2059 | } 2060 | }, 2061 | "handlebars": { 2062 | "version": "3.0.0", 2063 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.0.tgz", 2064 | "integrity": "sha1-f05Tf03WmShp1mwBt1BeujVhpdU=", 2065 | "dev": true, 2066 | "requires": { 2067 | "optimist": "^0.6.1", 2068 | "source-map": "^0.1.40", 2069 | "uglify-js": "~2.3" 2070 | }, 2071 | "dependencies": { 2072 | "optimist": { 2073 | "version": "0.6.1", 2074 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 2075 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 2076 | "dev": true, 2077 | "requires": { 2078 | "minimist": "~0.0.1", 2079 | "wordwrap": "~0.0.2" 2080 | }, 2081 | "dependencies": { 2082 | "minimist": { 2083 | "version": "0.0.10", 2084 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 2085 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 2086 | "dev": true 2087 | } 2088 | } 2089 | }, 2090 | "source-map": { 2091 | "version": "0.1.43", 2092 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 2093 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 2094 | "dev": true, 2095 | "requires": { 2096 | "amdefine": ">=0.0.4" 2097 | }, 2098 | "dependencies": { 2099 | "amdefine": { 2100 | "version": "0.1.0", 2101 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz", 2102 | "integrity": "sha1-PKlzXPHd4O33pL9mQXCcgCT5sic=", 2103 | "dev": true 2104 | } 2105 | } 2106 | }, 2107 | "uglify-js": { 2108 | "version": "2.3.6", 2109 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", 2110 | "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", 2111 | "dev": true, 2112 | "optional": true, 2113 | "requires": { 2114 | "async": "~0.2.6", 2115 | "optimist": "~0.3.5", 2116 | "source-map": "~0.1.7" 2117 | }, 2118 | "dependencies": { 2119 | "async": { 2120 | "version": "0.2.10", 2121 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 2122 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 2123 | "dev": true, 2124 | "optional": true 2125 | }, 2126 | "optimist": { 2127 | "version": "0.3.7", 2128 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 2129 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 2130 | "dev": true, 2131 | "optional": true, 2132 | "requires": { 2133 | "wordwrap": "~0.0.2" 2134 | } 2135 | } 2136 | } 2137 | } 2138 | } 2139 | }, 2140 | "nopt": { 2141 | "version": "3.0.2", 2142 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.2.tgz", 2143 | "integrity": "sha1-qCqH+djD3xQP54+yllenp3RAO14=", 2144 | "dev": true, 2145 | "requires": { 2146 | "abbrev": "1" 2147 | } 2148 | }, 2149 | "once": { 2150 | "version": "1.3.2", 2151 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", 2152 | "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", 2153 | "dev": true, 2154 | "requires": { 2155 | "wrappy": "1" 2156 | }, 2157 | "dependencies": { 2158 | "wrappy": { 2159 | "version": "1.0.1", 2160 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 2161 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 2162 | "dev": true 2163 | } 2164 | } 2165 | }, 2166 | "resolve": { 2167 | "version": "1.1.6", 2168 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.6.tgz", 2169 | "integrity": "sha1-00kq0FTKgA9b76YS5hvqwe7Jj48=", 2170 | "dev": true 2171 | }, 2172 | "which": { 2173 | "version": "1.0.9", 2174 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", 2175 | "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", 2176 | "dev": true 2177 | }, 2178 | "wordwrap": { 2179 | "version": "0.0.3", 2180 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2181 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2182 | "dev": true 2183 | } 2184 | } 2185 | }, 2186 | "lodash": { 2187 | "version": "3.9.3", 2188 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", 2189 | "integrity": "sha1-AVnoaDL+/8bWHYUrEqlTuZSWvTI=", 2190 | "dev": true 2191 | }, 2192 | "rimraf": { 2193 | "version": "2.3.4", 2194 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.3.4.tgz", 2195 | "integrity": "sha1-gtm8Gy/PMeIFrHsoE4oCXQjpFZo=", 2196 | "dev": true, 2197 | "requires": { 2198 | "glob": "^4.4.2" 2199 | }, 2200 | "dependencies": { 2201 | "glob": { 2202 | "version": "4.5.3", 2203 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", 2204 | "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", 2205 | "dev": true, 2206 | "requires": { 2207 | "inflight": "^1.0.4", 2208 | "inherits": "2", 2209 | "minimatch": "^2.0.1", 2210 | "once": "^1.3.0" 2211 | }, 2212 | "dependencies": { 2213 | "inflight": { 2214 | "version": "1.0.4", 2215 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", 2216 | "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", 2217 | "dev": true, 2218 | "requires": { 2219 | "once": "^1.3.0", 2220 | "wrappy": "1" 2221 | }, 2222 | "dependencies": { 2223 | "wrappy": { 2224 | "version": "1.0.1", 2225 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 2226 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 2227 | "dev": true 2228 | } 2229 | } 2230 | }, 2231 | "minimatch": { 2232 | "version": "2.0.8", 2233 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.8.tgz", 2234 | "integrity": "sha1-C8IPa/NXCmmO8N3/kCBjxsq9pr8=", 2235 | "dev": true, 2236 | "requires": { 2237 | "brace-expansion": "^1.0.0" 2238 | }, 2239 | "dependencies": { 2240 | "brace-expansion": { 2241 | "version": "1.1.0", 2242 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", 2243 | "integrity": "sha1-ybfQPAPze8cEvhAOUitA249s/Nk=", 2244 | "dev": true, 2245 | "requires": { 2246 | "balanced-match": "^0.2.0", 2247 | "concat-map": "0.0.1" 2248 | }, 2249 | "dependencies": { 2250 | "balanced-match": { 2251 | "version": "0.2.0", 2252 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", 2253 | "integrity": "sha1-OPZzDAOqttXtu1K9k0iF51bXFnQ=", 2254 | "dev": true 2255 | }, 2256 | "concat-map": { 2257 | "version": "0.0.1", 2258 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2259 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 2260 | "dev": true 2261 | } 2262 | } 2263 | } 2264 | } 2265 | }, 2266 | "once": { 2267 | "version": "1.3.2", 2268 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", 2269 | "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", 2270 | "dev": true, 2271 | "requires": { 2272 | "wrappy": "1" 2273 | }, 2274 | "dependencies": { 2275 | "wrappy": { 2276 | "version": "1.0.1", 2277 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", 2278 | "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", 2279 | "dev": true 2280 | } 2281 | } 2282 | } 2283 | } 2284 | } 2285 | } 2286 | }, 2287 | "spawn-wrap": { 2288 | "version": "1.0.1", 2289 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.0.1.tgz", 2290 | "integrity": "sha1-TJNU7So39+BbNnzAFifRaDPgbrs=", 2291 | "dev": true, 2292 | "requires": { 2293 | "foreground-child": "^1.2.0", 2294 | "mkdirp": "^0.5.0", 2295 | "rimraf": "^2.3.3", 2296 | "signal-exit": "^2.0.0" 2297 | } 2298 | }, 2299 | "strip-bom": { 2300 | "version": "1.0.0", 2301 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", 2302 | "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", 2303 | "dev": true, 2304 | "requires": { 2305 | "first-chunk-stream": "^1.0.0", 2306 | "is-utf8": "^0.2.0" 2307 | }, 2308 | "dependencies": { 2309 | "first-chunk-stream": { 2310 | "version": "1.0.0", 2311 | "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", 2312 | "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", 2313 | "dev": true 2314 | }, 2315 | "is-utf8": { 2316 | "version": "0.2.0", 2317 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.0.tgz", 2318 | "integrity": "sha1-uKpUElrmJr/k4765ZfFqicWKETc=", 2319 | "dev": true 2320 | } 2321 | } 2322 | }, 2323 | "yargs": { 2324 | "version": "3.10.0", 2325 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 2326 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 2327 | "dev": true, 2328 | "requires": { 2329 | "camelcase": "^1.0.2", 2330 | "cliui": "^2.1.0", 2331 | "decamelize": "^1.0.0", 2332 | "window-size": "0.1.0" 2333 | }, 2334 | "dependencies": { 2335 | "camelcase": { 2336 | "version": "1.1.0", 2337 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.1.0.tgz", 2338 | "integrity": "sha1-lTslw7yYZx7lmkTLnVQmctpzMbk=", 2339 | "dev": true 2340 | }, 2341 | "cliui": { 2342 | "version": "2.1.0", 2343 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 2344 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 2345 | "dev": true, 2346 | "requires": { 2347 | "center-align": "^0.1.1", 2348 | "right-align": "^0.1.1", 2349 | "wordwrap": "0.0.2" 2350 | }, 2351 | "dependencies": { 2352 | "center-align": { 2353 | "version": "0.1.1", 2354 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.1.tgz", 2355 | "integrity": "sha1-VNIEv6YbP++3hs/YSC98TgkCMc0=", 2356 | "dev": true, 2357 | "requires": { 2358 | "align-text": "^0.1.0" 2359 | }, 2360 | "dependencies": { 2361 | "align-text": { 2362 | "version": "0.1.1", 2363 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.1.tgz", 2364 | "integrity": "sha1-V2pW3tj8oKmEDAUGSg6T81dxsp8=", 2365 | "dev": true, 2366 | "requires": { 2367 | "kind-of": "^1.1.0", 2368 | "longest": "^1.0.0", 2369 | "repeat-string": "^1.5.0" 2370 | }, 2371 | "dependencies": { 2372 | "kind-of": { 2373 | "version": "1.1.0", 2374 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", 2375 | "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", 2376 | "dev": true 2377 | }, 2378 | "longest": { 2379 | "version": "1.0.1", 2380 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 2381 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 2382 | "dev": true 2383 | }, 2384 | "repeat-string": { 2385 | "version": "1.5.2", 2386 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", 2387 | "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=", 2388 | "dev": true 2389 | } 2390 | } 2391 | } 2392 | } 2393 | }, 2394 | "right-align": { 2395 | "version": "0.1.1", 2396 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.1.tgz", 2397 | "integrity": "sha1-3UE/tvdmqgA5vJYVwN8RpkXvWDg=", 2398 | "dev": true, 2399 | "requires": { 2400 | "align-text": "^0.1.0" 2401 | }, 2402 | "dependencies": { 2403 | "align-text": { 2404 | "version": "0.1.1", 2405 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.1.tgz", 2406 | "integrity": "sha1-V2pW3tj8oKmEDAUGSg6T81dxsp8=", 2407 | "dev": true, 2408 | "requires": { 2409 | "kind-of": "^1.1.0", 2410 | "longest": "^1.0.0", 2411 | "repeat-string": "^1.5.0" 2412 | }, 2413 | "dependencies": { 2414 | "kind-of": { 2415 | "version": "1.1.0", 2416 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", 2417 | "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", 2418 | "dev": true 2419 | }, 2420 | "longest": { 2421 | "version": "1.0.1", 2422 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 2423 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 2424 | "dev": true 2425 | }, 2426 | "repeat-string": { 2427 | "version": "1.5.2", 2428 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", 2429 | "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=", 2430 | "dev": true 2431 | } 2432 | } 2433 | } 2434 | } 2435 | }, 2436 | "wordwrap": { 2437 | "version": "0.0.2", 2438 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 2439 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 2440 | "dev": true 2441 | } 2442 | } 2443 | }, 2444 | "decamelize": { 2445 | "version": "1.0.0", 2446 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.0.0.tgz", 2447 | "integrity": "sha1-UocSL3FpHUUFsY/yJY3EAKWyOEc=", 2448 | "dev": true 2449 | }, 2450 | "window-size": { 2451 | "version": "0.1.0", 2452 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 2453 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 2454 | "dev": true 2455 | } 2456 | } 2457 | } 2458 | } 2459 | }, 2460 | "opener": { 2461 | "version": "1.4.1", 2462 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.1.tgz", 2463 | "integrity": "sha1-iXWQrNGu0zEbcDtYvMtNQ/VvKJU=", 2464 | "dev": true 2465 | }, 2466 | "readable-stream": { 2467 | "version": "1.1.13", 2468 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", 2469 | "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", 2470 | "dev": true, 2471 | "optional": true, 2472 | "requires": { 2473 | "core-util-is": "~1.0.0", 2474 | "inherits": "~2.0.1", 2475 | "isarray": "0.0.1", 2476 | "string_decoder": "~0.10.x" 2477 | }, 2478 | "dependencies": { 2479 | "core-util-is": { 2480 | "version": "1.0.1", 2481 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", 2482 | "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", 2483 | "dev": true, 2484 | "optional": true 2485 | }, 2486 | "inherits": { 2487 | "version": "2.0.1", 2488 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 2489 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 2490 | "dev": true, 2491 | "optional": true 2492 | }, 2493 | "isarray": { 2494 | "version": "0.0.1", 2495 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2496 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2497 | "dev": true, 2498 | "optional": true 2499 | }, 2500 | "string_decoder": { 2501 | "version": "0.10.31", 2502 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2503 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2504 | "dev": true, 2505 | "optional": true 2506 | } 2507 | } 2508 | }, 2509 | "signal-exit": { 2510 | "version": "2.1.2", 2511 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", 2512 | "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", 2513 | "dev": true 2514 | }, 2515 | "supports-color": { 2516 | "version": "1.3.1", 2517 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz", 2518 | "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", 2519 | "dev": true 2520 | }, 2521 | "tap-mocha-reporter": { 2522 | "version": "0.0.13", 2523 | "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-0.0.13.tgz", 2524 | "integrity": "sha1-4G9a/SpAHKlZ7+M1ygsVJqzuhoE=", 2525 | "dev": true, 2526 | "requires": { 2527 | "debug": "^2.1.3", 2528 | "diff": "^1.3.2", 2529 | "escape-string-regexp": "^1.0.3", 2530 | "glob": "^5.0.5", 2531 | "js-yaml": "^3.3.1", 2532 | "readable-stream": "^1.1.13", 2533 | "supports-color": "^1.3.1", 2534 | "tap-parser": "^1.0.4" 2535 | }, 2536 | "dependencies": { 2537 | "debug": { 2538 | "version": "2.2.0", 2539 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 2540 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 2541 | "dev": true, 2542 | "requires": { 2543 | "ms": "0.7.1" 2544 | }, 2545 | "dependencies": { 2546 | "ms": { 2547 | "version": "0.7.1", 2548 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 2549 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 2550 | "dev": true 2551 | } 2552 | } 2553 | }, 2554 | "diff": { 2555 | "version": "1.4.0", 2556 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 2557 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 2558 | "dev": true 2559 | }, 2560 | "escape-string-regexp": { 2561 | "version": "1.0.3", 2562 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz", 2563 | "integrity": "sha1-ni2LJbwlVcMzZyN1DgPwmcJzW7U=", 2564 | "dev": true 2565 | } 2566 | } 2567 | }, 2568 | "tap-parser": { 2569 | "version": "1.1.5", 2570 | "integrity": "sha1-BvHF1U1rmXsDxlUjF8SPt5kGk+M=", 2571 | "dev": true, 2572 | "requires": { 2573 | "events-to-array": "^1.0.1", 2574 | "inherits": "~2.0.1", 2575 | "js-yaml": "^3.2.7", 2576 | "readable-stream": "^1.1.13" 2577 | }, 2578 | "dependencies": { 2579 | "events-to-array": { 2580 | "version": "1.0.2", 2581 | "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.0.2.tgz", 2582 | "integrity": "sha1-s0hEZVNP5P9m+90ag7d3cTukBKo=", 2583 | "dev": true 2584 | }, 2585 | "inherits": { 2586 | "version": "2.0.1", 2587 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 2588 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 2589 | "dev": true 2590 | } 2591 | } 2592 | } 2593 | } 2594 | } 2595 | } 2596 | } 2597 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Isaac Z. Schlueter (http://blog.izs.me/)", 3 | "name": "fstream", 4 | "description": "Advanced file system stream things", 5 | "version": "1.0.12", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/npm/fstream.git" 9 | }, 10 | "main": "fstream.js", 11 | "engines": { 12 | "node": ">=0.6" 13 | }, 14 | "dependencies": { 15 | "graceful-fs": "^4.1.2", 16 | "inherits": "~2.0.0", 17 | "mkdirp": "^0.5 0", 18 | "rimraf": "2" 19 | }, 20 | "devDependencies": { 21 | "standard": "^4.0.0", 22 | "tap": "^1.2.0" 23 | }, 24 | "scripts": { 25 | "test": "standard && tap examples/*.js" 26 | }, 27 | "license": "ISC" 28 | } 29 | --------------------------------------------------------------------------------